chrome-devtools-frontend 1.0.1602348 → 1.0.1603822

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/.agents/skills/version-control/SKILL.md +17 -2
  2. package/AUTHORS +1 -0
  3. package/front_end/core/common/Settings.ts +1 -871
  4. package/front_end/core/common/VersionController.ts +880 -0
  5. package/front_end/core/common/common.ts +2 -0
  6. package/front_end/core/platform/HostRuntime.ts +9 -3
  7. package/front_end/core/protocol_client/InspectorBackend.ts +8 -0
  8. package/front_end/core/root/Runtime.ts +5 -0
  9. package/front_end/core/sdk/OverlayModel.ts +13 -13
  10. package/front_end/core/sdk/OverlayPersistentHighlighter.ts +13 -10
  11. package/front_end/core/sdk/RuntimeModel.ts +5 -5
  12. package/front_end/core/sdk/ServiceWorkerManager.ts +4 -2
  13. package/front_end/core/sdk/Target.ts +5 -0
  14. package/front_end/core/sdk/TargetManager.ts +5 -0
  15. package/front_end/core/sdk/WebMCPModel.ts +104 -0
  16. package/front_end/core/sdk/sdk.ts +2 -0
  17. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +13 -19
  18. package/front_end/generated/InspectorBackendCommands.ts +3 -0
  19. package/front_end/generated/protocol-mapping.d.ts +8 -0
  20. package/front_end/generated/protocol-proxy-api.d.ts +10 -0
  21. package/front_end/generated/protocol.ts +57 -0
  22. package/front_end/models/ai_assistance/AiConversation.ts +3 -3
  23. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +50 -0
  24. package/front_end/models/ai_assistance/agents/AiAgent.ts +14 -1
  25. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +19 -4
  26. package/front_end/models/ai_assistance/agents/NetworkAgent.ts +7 -1
  27. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +30 -7
  28. package/front_end/models/ai_assistance/agents/StylingAgent.ts +0 -23
  29. package/front_end/models/ai_assistance/data_formatters/LighthouseFormatter.snapshot.txt +60 -9
  30. package/front_end/models/ai_assistance/data_formatters/LighthouseFormatter.ts +71 -15
  31. package/front_end/models/heap_snapshot_model/HeapSnapshotModel.ts +7 -7
  32. package/front_end/models/javascript_metadata/NativeFunctions.js +6 -2
  33. package/front_end/models/lighthouse/LighthouseReporterTypes.ts +10 -8
  34. package/front_end/models/lighthouse/RunTypes.ts +3 -1
  35. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +13 -5
  36. package/front_end/panels/ai_assistance/components/ChatMessage.ts +143 -18
  37. package/front_end/panels/ai_assistance/components/WalkthroughView.ts +30 -10
  38. package/front_end/panels/ai_assistance/components/chatMessage.css +58 -3
  39. package/front_end/panels/ai_assistance/components/walkthroughView.css +35 -5
  40. package/front_end/panels/application/AppManifestView.ts +2 -2
  41. package/front_end/panels/application/BackgroundServiceView.ts +9 -9
  42. package/front_end/panels/application/FrameDetailsView.ts +4 -13
  43. package/front_end/panels/application/IndexedDBViews.ts +1 -1
  44. package/front_end/panels/application/ServiceWorkerCacheViews.ts +3 -3
  45. package/front_end/panels/application/components/PermissionsPolicySection.ts +1 -1
  46. package/front_end/panels/application/components/permissionsPolicySection.css +54 -52
  47. package/front_end/panels/application/frameDetailsReportView.css +13 -1
  48. package/front_end/panels/common/ThrottlingUtils.ts +46 -0
  49. package/front_end/panels/common/common.ts +1 -0
  50. package/front_end/panels/elements/CSSValueTraceView.ts +9 -1
  51. package/front_end/panels/elements/ComputedStyleWidget.ts +11 -1
  52. package/front_end/panels/elements/PropertiesWidget.ts +14 -13
  53. package/front_end/panels/elements/PropertyRenderer.ts +10 -9
  54. package/front_end/panels/elements/StandaloneStylesContainer.ts +15 -5
  55. package/front_end/panels/elements/StylePropertiesSection.ts +0 -49
  56. package/front_end/panels/elements/StylePropertyTreeElement.ts +20 -0
  57. package/front_end/panels/elements/StylesContainer.ts +0 -1
  58. package/front_end/panels/elements/StylesSidebarPane.ts +65 -31
  59. package/front_end/panels/elements/stylePropertiesTreeOutline.css +5 -0
  60. package/front_end/panels/issues/AffectedSelectivePermissionsInterventionView.ts +2 -2
  61. package/front_end/panels/lighthouse/LighthouseController.ts +4 -1
  62. package/front_end/panels/media/EventDisplayTable.ts +3 -2
  63. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +14 -0
  64. package/front_end/panels/network/EventSourceMessagesView.ts +2 -2
  65. package/front_end/panels/network/ResourceChunkView.ts +1 -1
  66. package/front_end/panels/profiler/HeapDetachedElementsView.ts +9 -4
  67. package/front_end/panels/profiler/HeapProfileView.ts +8 -4
  68. package/front_end/panels/profiler/HeapSnapshotDataGrids.ts +40 -33
  69. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +1 -1
  70. package/front_end/panels/profiler/HeapSnapshotProxy.ts +1 -1
  71. package/front_end/panels/profiler/HeapSnapshotView.ts +12 -18
  72. package/front_end/panels/profiler/LiveHeapProfileView.ts +3 -4
  73. package/front_end/panels/profiler/ProfileHeader.ts +5 -11
  74. package/front_end/panels/profiler/ProfileView.ts +1 -10
  75. package/front_end/panels/sensors/SensorsView.ts +24 -43
  76. package/front_end/panels/settings/keybindsSettingsTab.css +25 -31
  77. package/front_end/panels/timeline/EventsTimelineTreeView.ts +2 -2
  78. package/front_end/panels/timeline/ThirdPartyTreeView.ts +8 -0
  79. package/front_end/panels/timeline/TimelinePanel.ts +14 -2
  80. package/front_end/panels/timeline/TimelineTreeView.ts +19 -17
  81. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +5 -9
  82. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -2
  83. package/front_end/panels/timeline/components/OriginMap.ts +176 -159
  84. package/front_end/panels/timeline/components/originMap.css +4 -51
  85. package/front_end/panels/timeline/components/timelineRangeSummaryView.css +3 -1
  86. package/front_end/panels/timeline/thirdPartyTreeView.css +6 -0
  87. package/front_end/panels/timeline/timeline-meta.ts +11 -0
  88. package/front_end/panels/timeline/utils/Helpers.ts +5 -25
  89. package/front_end/panels/webauthn/WebauthnPane.ts +52 -0
  90. package/front_end/third_party/acorn/README.chromium +1 -0
  91. package/front_end/third_party/chromium/README.chromium +1 -1
  92. package/front_end/ui/components/{list → lists}/List.ts +1 -1
  93. package/front_end/ui/components/{list → lists}/list.css +0 -1
  94. package/front_end/ui/legacy/Treeoutline.ts +7 -3
  95. package/front_end/ui/legacy/UIUtils.ts +13 -11
  96. package/front_end/ui/legacy/Widget.ts +5 -0
  97. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -1
  98. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +3 -3
  99. package/front_end/ui/legacy/components/data_grid/SortableDataGrid.ts +2 -2
  100. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +39 -23
  101. package/front_end/ui/legacy/components/perf_ui/GCActionDelegate.ts +20 -4
  102. package/front_end/ui/legacy/treeoutline.css +4 -0
  103. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  104. package/package.json +1 -1
  105. /package/front_end/ui/components/{list → lists}/lists.ts +0 -0
@@ -1779,20 +1779,21 @@ export class TreeViewElement extends HTMLElementWithLightDOMTemplate {
1779
1779
  return this.#treeOutline;
1780
1780
  }
1781
1781
 
1782
- #getParentTreeElement(element: HTMLLIElement|TreeElementWrapper): {treeElement: TreeElement, expanded: boolean}|null {
1782
+ #getParentTreeElement(element: HTMLLIElement|TreeElementWrapper):
1783
+ {treeElement: TreeElement, expanded: boolean, classes: DOMTokenList}|null {
1783
1784
  const subtreeRoot = element.parentElement;
1784
1785
  if (!(subtreeRoot instanceof HTMLUListElement)) {
1785
1786
  return null;
1786
1787
  }
1787
1788
  if (subtreeRoot.role === 'tree') {
1788
- return {treeElement: this.#treeOutline.rootElement(), expanded: false};
1789
+ return {treeElement: this.#treeOutline.rootElement(), expanded: false, classes: subtreeRoot.classList};
1789
1790
  }
1790
1791
  if (subtreeRoot.role !== 'group' || !subtreeRoot.parentElement) {
1791
1792
  return null;
1792
1793
  }
1793
1794
  const treeElement = TreeViewTreeElement.get(subtreeRoot.parentElement);
1794
1795
  const expanded = treeElement ? treeElement.expanded : hasBooleanAttribute(subtreeRoot.parentElement, 'open');
1795
- return treeElement ? {expanded, treeElement} : null;
1796
+ return treeElement ? {expanded, treeElement, classes: subtreeRoot.classList} : null;
1796
1797
  }
1797
1798
 
1798
1799
  protected override updateNode(node: Node, attributeName: string|null): void {
@@ -1825,6 +1826,9 @@ export class TreeViewElement extends HTMLElementWithLightDOMTemplate {
1825
1826
  if (!parent) {
1826
1827
  continue;
1827
1828
  }
1829
+ if (parent.treeElement.childCount() === 0) {
1830
+ parent.treeElement.childrenListElement.classList.add(...parent.classes.values());
1831
+ }
1828
1832
  while (nextSibling && nextSibling.nodeType !== Node.ELEMENT_NODE) {
1829
1833
  nextSibling = nextSibling.nextSibling;
1830
1834
  }
@@ -1691,19 +1691,21 @@ export function createSVGChild<K extends keyof SVGElementTagNameMap>(
1691
1691
  return child;
1692
1692
  }
1693
1693
 
1694
- export const enclosingNodeOrSelfWithNodeNameInArray = (initialNode: Node, nameArray: string[]): Node|null => {
1695
- let node: (Node|null)|Node = initialNode;
1696
- for (; node && node !== initialNode.ownerDocument; node = node.parentNodeOrShadowHost()) {
1697
- for (let i = 0; i < nameArray.length; ++i) {
1698
- if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase()) {
1699
- return node;
1694
+ export const enclosingNodeOrSelfWithNodeNameInArray =
1695
+ <T extends keyof HTMLElementTagNameMap>(initialNode: Node, nameArray: T[]): HTMLElementTagNameMap[T]|null => {
1696
+ let node: (Node|null)|Node = initialNode;
1697
+ for (; node && node !== initialNode.ownerDocument; node = node.parentNodeOrShadowHost()) {
1698
+ for (let i = 0; i < nameArray.length; ++i) {
1699
+ if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase()) {
1700
+ return node as HTMLElementTagNameMap[T];
1701
+ }
1702
+ }
1700
1703
  }
1701
- }
1702
- }
1703
- return null;
1704
- };
1704
+ return null;
1705
+ };
1705
1706
 
1706
- export const enclosingNodeOrSelfWithNodeName = function(node: Node, nodeName: string): Node|null {
1707
+ export const enclosingNodeOrSelfWithNodeName = function<T extends keyof HTMLElementTagNameMap>(
1708
+ node: Node, nodeName: T): HTMLElementTagNameMap[T]|null {
1707
1709
  return enclosingNodeOrSelfWithNodeNameInArray(node, [nodeName]);
1708
1710
  };
1709
1711
 
@@ -129,6 +129,10 @@ function runNextUpdate(): void {
129
129
  const controller = new AbortController();
130
130
  widget.addUpdateController(controller);
131
131
  await widget.performUpdate(controller.signal);
132
+ } catch (e) {
133
+ if (e.name !== 'AbortError') {
134
+ throw e;
135
+ }
132
136
  } finally {
133
137
  resolve();
134
138
  }
@@ -1055,6 +1059,7 @@ export class Widget {
1055
1059
  }
1056
1060
 
1057
1061
  addUpdateController(controller: AbortController): void {
1062
+ this.#updateController?.abort();
1058
1063
  this.#updateController = controller;
1059
1064
  }
1060
1065
 
@@ -2552,7 +2552,7 @@ export interface Parameters {
2552
2552
  refreshCallback?: (() => void);
2553
2553
  }
2554
2554
  export interface ColumnDescriptor {
2555
- id: Lowercase<string>;
2555
+ id: string;
2556
2556
  title?: Common.UIString.LocalizedString;
2557
2557
  titleDOMFragment?: DocumentFragment|null;
2558
2558
  sortable: boolean;
@@ -550,11 +550,11 @@ class DataGridElementNode extends SortableDataGridNode<DataGridElementNode> {
550
550
  }
551
551
  const cell = this.createTD(columnId);
552
552
  cell.setAttribute('part', `${columnId}-column`);
553
- if (this.isCreationNode) {
554
- return cell;
555
- }
556
553
  const configCells = [...this.#configElement.children].filter(c => c.tagName === 'TD') as HTMLTableCellElement[];
557
554
  const configCell = configCells[index];
555
+ if (this.isCreationNode && !configCell) {
556
+ return cell;
557
+ }
558
558
  if (!configCell) {
559
559
  throw new Error(`Column ${columnId} not found in the data grid`);
560
560
  }
@@ -3,7 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  /* eslint-disable @typescript-eslint/naming-convention */
6
-
6
+ import type * as Common from '../../../../core/common/common.js';
7
7
  import * as Platform from '../../../../core/platform/platform.js';
8
8
 
9
9
  import {type ColumnDescriptor, type DataGridData, Events, type Parameters} from './DataGrid.js';
@@ -61,7 +61,7 @@ export class SortableDataGrid<T> extends ViewportDataGrid<SortableDataGridNode<T
61
61
  const columns: ColumnDescriptor[] = [];
62
62
  for (let i = 0; i < columnNames.length; ++i) {
63
63
  const id = String(i);
64
- columns.push(({id, title: columnNames[i], sortable: true} as ColumnDescriptor));
64
+ columns.push(({id, title: columnNames[i] as Common.UIString.LocalizedString, sortable: true}));
65
65
  }
66
66
 
67
67
  const nodes = [];
@@ -50,6 +50,7 @@ import objectPropertiesSectionStyles from './objectPropertiesSection.css.js';
50
50
  import objectValueStyles from './objectValue.css.js';
51
51
  import {RemoteObjectPreviewFormatter, renderNodeTitle} from './RemoteObjectPreviewFormatter.js';
52
52
 
53
+ export {objectPropertiesSectionStyles, objectValueStyles};
53
54
  const {widget} = UI.Widget;
54
55
  const {ref, repeat, ifDefined, classMap} = Directives;
55
56
  const UIStrings = {
@@ -1369,10 +1370,18 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1369
1370
  }
1370
1371
  }
1371
1372
 
1372
- static populateWithProperties(
1373
- treeNode: UI.TreeOutline.TreeElement, {properties, internalProperties, accessors}: NodeChildren,
1374
- skipProto: boolean, skipGettersAndSetters: boolean, linkifier?: Components.Linkifier.Linkifier,
1375
- emptyPlaceholder?: string|null): void {
1373
+ static *
1374
+ createPropertyNodes(
1375
+ {properties, internalProperties, accessors, arrayRanges}: NodeChildren, skipProto: boolean,
1376
+ skipGettersAndSetters: boolean, linkifier?: Components.Linkifier.Linkifier, emptyPlaceholder?: string|null,
1377
+ isNotDisplayablePropertyCallback?: (property: SDK.RemoteObject.RemoteObjectProperty) => boolean):
1378
+ Generator<UI.TreeOutline.TreeElement> {
1379
+ let empty = true;
1380
+ // Arrays with large numbers of elements are paginated into arrayRanges.
1381
+ // If we have array ranges, the object is not empty.
1382
+ if (arrayRanges && arrayRanges.length > 0) {
1383
+ empty = false;
1384
+ }
1376
1385
  properties?.sort(ObjectPropertiesSection.compareProperties);
1377
1386
 
1378
1387
  const entriesProperty = internalProperties?.find(({property}) => property.name === '[[Entries]]');
@@ -1380,12 +1389,12 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1380
1389
  const treeElement = new ObjectPropertyTreeElement(entriesProperty, linkifier);
1381
1390
  treeElement.setExpandable(true);
1382
1391
  treeElement.expand();
1383
- treeNode.appendChild(treeElement);
1392
+ empty = false;
1393
+ yield treeElement;
1384
1394
  }
1385
1395
 
1386
1396
  for (const property of properties ?? []) {
1387
- if (treeNode instanceof ObjectPropertyTreeElement &&
1388
- !ObjectPropertiesSection.isDisplayableProperty(property.property, treeNode.property?.property)) {
1397
+ if (isNotDisplayablePropertyCallback?.(property.property)) {
1389
1398
  continue;
1390
1399
  }
1391
1400
 
@@ -1398,12 +1407,13 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1398
1407
  element.expand();
1399
1408
  }
1400
1409
  }
1401
- treeNode.appendChild(element);
1410
+ empty = false;
1411
+ yield element;
1402
1412
  }
1403
1413
  }
1404
1414
 
1405
1415
  for (const accessor of accessors ?? []) {
1406
- treeNode.appendChild(new ObjectPropertyTreeElement(accessor, linkifier));
1416
+ yield new ObjectPropertyTreeElement(accessor, linkifier);
1407
1417
  }
1408
1418
 
1409
1419
  for (const property of internalProperties ?? []) {
@@ -1414,10 +1424,28 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1414
1424
  if (property.property.name === '[[Prototype]]' && skipProto) {
1415
1425
  continue;
1416
1426
  }
1417
- treeNode.appendChild(treeElement);
1427
+ empty = false;
1428
+ yield treeElement;
1418
1429
  }
1419
1430
 
1420
- ObjectPropertyTreeElement.appendEmptyPlaceholderIfNeeded(treeNode, emptyPlaceholder);
1431
+ if (empty) {
1432
+ const title = document.createElement('div');
1433
+ title.classList.add('gray-info-message');
1434
+ title.textContent = emptyPlaceholder || i18nString(UIStrings.noProperties);
1435
+ const infoElement = new UI.TreeOutline.TreeElement(title);
1436
+ yield infoElement;
1437
+ }
1438
+ }
1439
+
1440
+ static populateWithProperties(
1441
+ treeNode: UI.TreeOutline.TreeElement, children: NodeChildren, skipProto: boolean, skipGettersAndSetters: boolean,
1442
+ linkifier?: Components.Linkifier.Linkifier, emptyPlaceholder?: string|null): void {
1443
+ for (const childNode of this.createPropertyNodes(
1444
+ children, skipProto, skipGettersAndSetters, linkifier, emptyPlaceholder,
1445
+ property => treeNode instanceof ObjectPropertyTreeElement &&
1446
+ !ObjectPropertiesSection.isDisplayableProperty(property, treeNode.property?.property))) {
1447
+ treeNode.appendChild(childNode);
1448
+ }
1421
1449
  }
1422
1450
 
1423
1451
  revertHighlightChanges(): void {
@@ -1450,18 +1478,6 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1450
1478
  await this.property.setValue(expression);
1451
1479
  }
1452
1480
 
1453
- private static appendEmptyPlaceholderIfNeeded(treeNode: UI.TreeOutline.TreeElement, emptyPlaceholder?: string|null):
1454
- void {
1455
- if (treeNode.childCount()) {
1456
- return;
1457
- }
1458
- const title = document.createElement('div');
1459
- title.classList.add('gray-info-message');
1460
- title.textContent = emptyPlaceholder || i18nString(UIStrings.noProperties);
1461
- const infoElement = new UI.TreeOutline.TreeElement(title);
1462
- treeNode.appendChild(infoElement);
1463
- }
1464
-
1465
1481
  private showAllPropertiesElementSelected(element: UI.TreeOutline.TreeElement): boolean {
1466
1482
  this.removeChild(element);
1467
1483
  this.children().forEach(x => {
@@ -2,15 +2,31 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
+ import * as i18n from '../../../../core/i18n/i18n.js';
5
6
  import * as SDK from '../../../../core/sdk/sdk.js';
7
+ import * as Snackbars from '../../../components/snackbars/snackbars.js';
6
8
  import type * as UI from '../../legacy.js';
7
9
 
10
+ const UIStrings = {
11
+ /**
12
+ * @description Notification message shown to the user when garbage collection has completed.
13
+ */
14
+ garbageCollectionCompleted: 'Garbage collection completed',
15
+ } as const;
16
+
17
+ const str_ = i18n.i18n.registerUIStrings('ui/legacy/components/perf_ui/GCActionDelegate.ts', UIStrings);
18
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
19
+
8
20
  export class GCActionDelegate implements UI.ActionRegistration.ActionDelegate {
9
21
  handleAction(_context: UI.Context.Context, _actionId: string): boolean {
10
- for (const heapProfilerModel of SDK.TargetManager.TargetManager.instance().models(
11
- SDK.HeapProfilerModel.HeapProfilerModel)) {
12
- void heapProfilerModel.collectGarbage();
13
- }
22
+ const promises = SDK.TargetManager.TargetManager.instance()
23
+ .models(SDK.HeapProfilerModel.HeapProfilerModel)
24
+ .map(heapProfilerModel => heapProfilerModel.collectGarbage());
25
+
26
+ void Promise.all(promises).then(() => {
27
+ Snackbars.Snackbar.Snackbar.show({message: i18nString(UIStrings.garbageCollectionCompleted)});
28
+ });
29
+
14
30
  return true;
15
31
  }
16
32
  }
@@ -9,6 +9,10 @@
9
9
  padding: 2px 0 0;
10
10
  }
11
11
 
12
+ :host(devtools-tree) {
13
+ display: inline-block;
14
+ }
15
+
12
16
  .tree-outline-disclosure:not(.tree-outline-disclosure-hide-overflow) {
13
17
  min-width: 100%;
14
18
  display: inline-block;
@@ -1909,6 +1909,8 @@ export const knownContextValues = new Set([
1909
1909
  'history',
1910
1910
  'historyRedo',
1911
1911
  'historyUndo',
1912
+ 'hmac-secret',
1913
+ 'hmac-secret-mc',
1912
1914
  'hostname',
1913
1915
  'hover',
1914
1916
  'hr',
package/package.json CHANGED
@@ -105,5 +105,5 @@
105
105
  "flat-cache": "6.1.12"
106
106
  }
107
107
  },
108
- "version": "1.0.1602348"
108
+ "version": "1.0.1603822"
109
109
  }