chrome-devtools-frontend 1.0.1652307 → 1.0.1654411

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 (94) hide show
  1. package/.agents/skills/fixing-skipped-tests/SKILL.md +32 -0
  2. package/.agents/skills/migrate-chromium-test/SKILL.md +144 -0
  3. package/docs/get_the_code.md +1 -2
  4. package/docs/ui_engineering.md +3 -1
  5. package/eslint.config.mjs +0 -5
  6. package/front_end/core/sdk/CPUThrottlingManager.ts +13 -8
  7. package/front_end/core/sdk/CSSMetadata.ts +23 -0
  8. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +8 -4
  9. package/front_end/core/sdk/DOMModel.ts +4 -0
  10. package/front_end/core/sdk/EmulationModel.ts +4 -0
  11. package/front_end/core/sdk/ResourceTreeModel.ts +3 -2
  12. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +459 -74
  13. package/front_end/entrypoints/main/MainImpl.ts +0 -6
  14. package/front_end/foundation/Universe.ts +18 -0
  15. package/front_end/generated/InspectorBackendCommands.ts +6 -5
  16. package/front_end/generated/SupportedCSSProperties.js +122 -28
  17. package/front_end/generated/protocol.ts +58 -0
  18. package/front_end/models/ai_assistance/AiConversation.ts +2 -1
  19. package/front_end/models/ai_assistance/README.md +4 -3
  20. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +1 -1
  21. package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +2 -2
  22. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +11 -164
  23. package/front_end/models/ai_assistance/ai_assistance.ts +6 -2
  24. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +295 -0
  25. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +10 -10
  26. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +12 -11
  27. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +6 -6
  28. package/front_end/models/ai_assistance/skills/accessibility.md +4 -2
  29. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +142 -0
  30. package/front_end/models/ai_assistance/tools/GetStyles.ts +1 -1
  31. package/front_end/models/ai_assistance/tools/README.md +21 -1
  32. package/front_end/models/ai_assistance/tools/{ResolveLighthousePath.ts → ResolveDevtoolsNodePath.ts} +18 -17
  33. package/front_end/models/ai_assistance/tools/Tool.ts +6 -1
  34. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +4 -2
  35. package/front_end/models/autofill_manager/AutofillManager.ts +7 -15
  36. package/front_end/models/bindings/NetworkProject.ts +4 -8
  37. package/front_end/models/breakpoints/BreakpointManager.ts +9 -9
  38. package/front_end/models/emulation/DeviceModeModel.ts +24 -0
  39. package/front_end/models/emulation/EmulatedDevices.ts +108 -0
  40. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +36 -0
  41. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +8 -0
  42. package/front_end/models/issues_manager/IssuesManager.ts +10 -6
  43. package/front_end/models/javascript_metadata/JavaScriptMetadata.ts +4 -5
  44. package/front_end/models/live-metrics/LiveMetrics.ts +6 -6
  45. package/front_end/models/live-metrics/web-vitals-injected/spec/spec.ts +5 -5
  46. package/front_end/models/live-metrics/web-vitals-injected/web-vitals-injected.ts +3 -3
  47. package/front_end/models/logs/LogManager.ts +25 -10
  48. package/front_end/models/logs/NetworkLog.ts +24 -19
  49. package/front_end/models/persistence/AutomaticFileSystemWorkspaceBinding.ts +14 -5
  50. package/front_end/models/persistence/IsolatedFileSystem.ts +9 -11
  51. package/front_end/models/persistence/IsolatedFileSystemManager.ts +5 -3
  52. package/front_end/models/persistence/NetworkPersistenceManager.ts +73 -44
  53. package/front_end/models/persistence/PersistenceImpl.ts +4 -5
  54. package/front_end/models/trace/EntityMapper.ts +1 -1
  55. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +9 -9
  56. package/front_end/panels/ai_assistance/ExportConversation.ts +4 -1
  57. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  58. package/front_end/panels/application/IndexedDBViews.ts +38 -36
  59. package/front_end/panels/application/components/AdsView.ts +4 -0
  60. package/front_end/panels/autofill/AutofillView.ts +1 -1
  61. package/front_end/panels/autofill/autofill-meta.ts +3 -2
  62. package/front_end/panels/elements/AccessibilityTreeUtils.ts +26 -15
  63. package/front_end/panels/elements/AccessibilityTreeView.ts +12 -9
  64. package/front_end/panels/elements/ElementsTreeOutline.ts +5 -0
  65. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +118 -68
  66. package/front_end/panels/layer_viewer/Layers3DView.ts +1 -1
  67. package/front_end/panels/layer_viewer/layerTreeOutline.css +20 -13
  68. package/front_end/panels/layers/LayersPanel.ts +1 -1
  69. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +64 -17
  70. package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +5 -0
  71. package/front_end/panels/network/LinkPreloadGenerator.ts +101 -0
  72. package/front_end/panels/network/NetworkLogView.ts +28 -0
  73. package/front_end/panels/network/network.ts +2 -0
  74. package/front_end/panels/profiler/HeapSnapshotView.ts +121 -33
  75. package/front_end/panels/profiler/ModuleUIStrings.ts +4 -0
  76. package/front_end/panels/timeline/TimelineHistoryManager.ts +38 -37
  77. package/front_end/panels/timeline/TimelinePanel.ts +32 -8
  78. package/front_end/panels/timeline/components/CPUThrottlingSelector.ts +7 -6
  79. package/front_end/panels/timeline/components/LiveMetricsView.ts +38 -38
  80. package/front_end/panels/timeline/components/MetricCard.ts +18 -18
  81. package/front_end/panels/timeline/components/liveMetricsView.css +6 -6
  82. package/front_end/panels/timeline/components/metricCard.css +4 -4
  83. package/front_end/panels/whats_new/ReleaseNoteText.ts +3 -3
  84. package/front_end/panels/whats_new/resources/WNDT.md +1 -1
  85. package/front_end/third_party/chromium/README.chromium +1 -1
  86. package/front_end/ui/legacy/InspectorDrawerView.ts +7 -5
  87. package/front_end/ui/legacy/ListWidget.ts +12 -0
  88. package/front_end/ui/legacy/SplitWidget.ts +12 -11
  89. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +23 -19
  90. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +8 -1
  91. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +110 -17
  92. package/front_end/ui/legacy/treeoutline.css +1 -1
  93. package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
  94. package/package.json +4 -3
@@ -142,7 +142,7 @@ const UIStrings = {
142
142
  } as const;
143
143
  const str_ = i18n.i18n.registerUIStrings('ui/legacy/components/object_ui/ObjectPropertiesSection.ts', UIStrings);
144
144
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
145
- const EXPANDABLE_MAX_DEPTH = 100;
145
+ export const EXPANDABLE_MAX_DEPTH = 100;
146
146
 
147
147
  const objectPropertiesSectionMap = new WeakMap<Element, ObjectPropertiesSection>();
148
148
 
@@ -406,7 +406,10 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
406
406
  } else {
407
407
  this.options.expansionTracker?.collapse(this);
408
408
  }
409
- this.#expanded = val;
409
+ if (this.#expanded !== val) {
410
+ this.#expanded = val;
411
+ this.dispatchEventToListeners(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, val);
412
+ }
410
413
  }
411
414
 
412
415
  get readOnly(): boolean {
@@ -425,6 +428,10 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
425
428
  this.setFilter({includeNullOrUndefinedValues: value, regex: this.filter?.regex ?? null});
426
429
  }
427
430
 
431
+ get canExpandRecursively(): boolean {
432
+ return true;
433
+ }
434
+
428
435
  get sortPropertiesAlphabetically(): boolean {
429
436
  if (this.isWasm) {
430
437
  return false;
@@ -440,14 +447,16 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
440
447
  setting.set(value);
441
448
  this.removeChildren();
442
449
  }
443
-
444
450
  // Performs a pre-order tree traversal over the populated children. If any children need to be populated, callers must
445
451
  // do that while walking (pre-order visitation enables that).
446
- * #walk(maxDepth = -1): Generator<ObjectTreeNodeBase> {
452
+ * #walk(maxDepth = -1, filter?: (node: ObjectTreeNodeBase) => boolean): Generator<ObjectTreeNodeBase> {
453
+ if (filter && !filter(this)) {
454
+ return;
455
+ }
447
456
  function* walkChildren(children: ObjectTreeNodeBase[]|undefined): Generator<ObjectTreeNodeBase> {
448
457
  if (children) {
449
458
  for (const child of children) {
450
- yield* child.#walk(Math.max(-1, maxDepth - 1));
459
+ yield* child.#walk(Math.max(-1, maxDepth - 1), filter);
451
460
  }
452
461
  }
453
462
  }
@@ -460,7 +469,7 @@ export abstract class ObjectTreeNodeBase extends Common.ObjectWrapper.ObjectWrap
460
469
  }
461
470
 
462
471
  async expandRecursively(maxDepth: number): Promise<void> {
463
- for (const node of this.#walk(maxDepth)) {
472
+ for (const node of this.#walk(maxDepth, n => n.canExpandRecursively)) {
464
473
  await node.populateChildrenIfNeeded();
465
474
  node.expanded = true;
466
475
  }
@@ -655,11 +664,13 @@ export namespace ObjectTreeNodeBase {
655
664
  VALUE_CHANGED = 'value-changed',
656
665
  CHILDREN_CHANGED = 'children-changed',
657
666
  FILTER_CHANGED = 'filter-changed',
667
+ EXPANDED_CHANGED = 'expanded-changed',
658
668
  }
659
669
  export interface EventTypes {
660
670
  [Events.VALUE_CHANGED]: void;
661
671
  [Events.CHILDREN_CHANGED]: void;
662
672
  [Events.FILTER_CHANGED]: void;
673
+ [Events.EXPANDED_CHANGED]: boolean;
663
674
  }
664
675
  }
665
676
 
@@ -758,6 +769,10 @@ export class ObjectTreeNode extends ObjectTreeNodeBase {
758
769
  return Boolean(this.filter && !this.property.match(this.filter));
759
770
  }
760
771
 
772
+ override get canExpandRecursively(): boolean {
773
+ return this.property.name !== '[[Prototype]]';
774
+ }
775
+
761
776
  get name(): string {
762
777
  return this.property.name;
763
778
  }
@@ -1664,6 +1679,7 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1664
1679
  this.property.addEventListener(ObjectTreeNodeBase.Events.VALUE_CHANGED, this.#updateValue, this);
1665
1680
  this.property.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.#updateChildren, this);
1666
1681
  this.property.addEventListener(ObjectTreeNodeBase.Events.FILTER_CHANGED, this.#updateFilter, this);
1682
+ this.property.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.#onExpandedChanged, this);
1667
1683
  this.toggleOnClick = true;
1668
1684
  this.linkifier = linkifier;
1669
1685
  this.maxNumPropertiesToShow = InitialVisibleChildrenLimit;
@@ -1684,12 +1700,51 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1684
1700
  linkifier?: Components.Linkifier.Linkifier,
1685
1701
  emptyPlaceholder?: string|null,
1686
1702
  ): Promise<void> {
1687
- const properties = await value.populateChildrenIfNeeded();
1703
+ await ObjectPropertyTreeElement.populateChildrenIfNeeded(value);
1704
+ ObjectPropertyTreeElement.populateImpl(treeElement, value, skipProto, skipGettersAndSetters, linkifier,
1705
+ emptyPlaceholder);
1706
+ }
1707
+
1708
+ static async populateChildrenIfNeeded(value: ObjectTreeNodeBase): Promise<void> {
1709
+ const children = await value.populateChildrenIfNeeded();
1710
+ await ArrayGroupingTreeElement.populateChildrenIfNeeded(children);
1711
+ }
1712
+
1713
+ static populateImpl(
1714
+ treeElement: UI.TreeOutline.TreeElement,
1715
+ value: ObjectTreeNodeBase,
1716
+ skipProto: boolean,
1717
+ skipGettersAndSetters: boolean,
1718
+ linkifier?: Components.Linkifier.Linkifier,
1719
+ emptyPlaceholder?: string|null,
1720
+ ): void {
1721
+ for (const childNode of ObjectPropertyTreeElement.createNodes(
1722
+ value, skipProto, skipGettersAndSetters, linkifier, emptyPlaceholder,
1723
+ property => treeElement instanceof ObjectPropertyTreeElement &&
1724
+ !ObjectPropertiesSection.isDisplayableProperty(property, treeElement.property?.property))) {
1725
+ treeElement.appendChild(childNode);
1726
+ }
1727
+ }
1728
+
1729
+ static *
1730
+ createNodes(
1731
+ value: ObjectTreeNodeBase,
1732
+ skipProto: boolean,
1733
+ skipGettersAndSetters: boolean,
1734
+ linkifier?: Components.Linkifier.Linkifier,
1735
+ emptyPlaceholder?: string|null,
1736
+ isNotDisplayablePropertyCallback?: (property: SDK.RemoteObject.RemoteObjectProperty) => boolean,
1737
+ ): Generator<UI.TreeOutline.TreeElement> {
1738
+ const properties = value.children;
1739
+ if (!properties) {
1740
+ return;
1741
+ }
1688
1742
  if (properties.arrayRanges) {
1689
- await ArrayGroupingTreeElement.populate(treeElement, properties, linkifier);
1743
+ yield* ArrayGroupingTreeElement.createNodes(properties, linkifier, isNotDisplayablePropertyCallback);
1690
1744
  } else {
1691
- ObjectPropertyTreeElement.populateWithProperties(
1692
- treeElement, properties, skipProto, skipGettersAndSetters, linkifier, emptyPlaceholder);
1745
+ yield*
1746
+ ObjectPropertyTreeElement.createPropertyNodes(properties, skipProto, skipGettersAndSetters, linkifier,
1747
+ emptyPlaceholder, isNotDisplayablePropertyCallback);
1693
1748
  }
1694
1749
  }
1695
1750
 
@@ -1869,6 +1924,15 @@ export class ObjectPropertyTreeElement extends UI.TreeOutline.TreeElement {
1869
1924
  this.hidden = this.property.isFiltered;
1870
1925
  }
1871
1926
 
1927
+ #onExpandedChanged(event: Common.EventTarget.EventTargetEvent<boolean>): void {
1928
+ const expanded = event.data;
1929
+ if (expanded) {
1930
+ this.expand();
1931
+ } else {
1932
+ this.collapse();
1933
+ }
1934
+ }
1935
+
1872
1936
  getContextMenu(event: Event): UI.ContextMenu.ContextMenu {
1873
1937
  const contextMenu = new UI.ContextMenu.ContextMenu(event);
1874
1938
  contextMenu.appendApplicableItems(this);
@@ -2082,6 +2146,7 @@ export class ArrayGroupingTreeElement extends UI.TreeOutline.TreeElement {
2082
2146
  super(Platform.StringUtilities.sprintf('[%d … %d]', child.range.fromIndex, child.range.toIndex), true);
2083
2147
  this.#child = child;
2084
2148
  this.#child.addEventListener(ObjectTreeNodeBase.Events.CHILDREN_CHANGED, this.onpopulate, this);
2149
+ this.#child.addEventListener(ObjectTreeNodeBase.Events.EXPANDED_CHANGED, this.#onExpandedChanged, this);
2085
2150
  this.toggleOnClick = true;
2086
2151
  this.linkifier = linkifier;
2087
2152
  if (child.expanded) {
@@ -2089,25 +2154,53 @@ export class ArrayGroupingTreeElement extends UI.TreeOutline.TreeElement {
2089
2154
  }
2090
2155
  }
2091
2156
 
2092
- static async populate(
2093
- treeNode: UI.TreeOutline.TreeElement, children: NodeChildren,
2094
- linkifier?: Components.Linkifier.Linkifier): Promise<void> {
2157
+ #onExpandedChanged(event: Common.EventTarget.EventTargetEvent<boolean>): void {
2158
+ const expanded = event.data;
2159
+ if (expanded) {
2160
+ this.expand();
2161
+ } else {
2162
+ this.collapse();
2163
+ }
2164
+ }
2165
+
2166
+ static *
2167
+ createNodes(children: NodeChildren, linkifier?: Components.Linkifier.Linkifier,
2168
+ isNotDisplayablePropertyCallback?: (property: SDK.RemoteObject.RemoteObjectProperty) => boolean):
2169
+ Generator<UI.TreeOutline.TreeElement> {
2095
2170
  if (!children.arrayRanges) {
2096
2171
  return;
2097
2172
  }
2098
2173
  if (children.arrayRanges.length === 1) {
2099
- await ObjectPropertyTreeElement.populate(treeNode, children.arrayRanges[0], false, false, linkifier);
2174
+ yield*
2175
+ ObjectPropertyTreeElement.createNodes(children.arrayRanges[0], false, false, linkifier, null,
2176
+ isNotDisplayablePropertyCallback);
2100
2177
  } else {
2101
2178
  for (const child of children.arrayRanges) {
2102
2179
  if (child.singular) {
2103
- await ObjectPropertyTreeElement.populate(treeNode, child, false, false, linkifier);
2180
+ yield*
2181
+ ObjectPropertyTreeElement.createNodes(child, false, false, linkifier, null,
2182
+ isNotDisplayablePropertyCallback);
2104
2183
  } else {
2105
- treeNode.appendChild(new ArrayGroupingTreeElement(child, linkifier));
2184
+ yield new ArrayGroupingTreeElement(child, linkifier);
2106
2185
  }
2107
2186
  }
2108
2187
  }
2109
2188
 
2110
- ObjectPropertyTreeElement.populateWithProperties(treeNode, children, false, false, linkifier);
2189
+ yield*
2190
+ ObjectPropertyTreeElement.createPropertyNodes(children, false, false, linkifier, null,
2191
+ isNotDisplayablePropertyCallback);
2192
+ }
2193
+
2194
+ static async populateChildrenIfNeeded(children: NodeChildren): Promise<void> {
2195
+ if (!children.arrayRanges) {
2196
+ return;
2197
+ }
2198
+ if (children.arrayRanges.length === 1) {
2199
+ await ObjectPropertyTreeElement.populateChildrenIfNeeded(children.arrayRanges[0]);
2200
+ } else {
2201
+ await Promise.all(children.arrayRanges.filter(child => child.singular)
2202
+ .map(child => ObjectPropertyTreeElement.populateChildrenIfNeeded(child)));
2203
+ }
2111
2204
  }
2112
2205
 
2113
2206
  override onexpand(): void {
@@ -98,7 +98,7 @@ ol.tree-outline:not(.hide-selection-when-blurred) li.selected:focus {
98
98
  color: currentcolor;
99
99
  }
100
100
 
101
- & *:not(devtools-icon) {
101
+ & *:not(devtools-icon, .new-badge) {
102
102
  color: inherit;
103
103
  }
104
104
  }
@@ -1038,6 +1038,7 @@ export const knownContextValues = new Set([
1038
1038
  'copy-as-hex',
1039
1039
  'copy-as-nodejs-fetch',
1040
1040
  'copy-as-powershell',
1041
+ 'copy-as-preload',
1041
1042
  'copy-as-utf',
1042
1043
  'copy-color',
1043
1044
  'copy-console',
package/package.json CHANGED
@@ -30,7 +30,8 @@
30
30
  "start": "vpython3 third_party/node/node.py --output scripts/run_start.mjs",
31
31
  "webtest": "vpython3 third_party/node/node.py --output scripts/npm_test.js",
32
32
  "watch": "npm run build -- --watch",
33
- "test": "vpython3 third_party/node/node.py --output scripts/run_on_target.mjs gen/test/run.js"
33
+ "test": "vpython3 third_party/node/node.py --output scripts/run_on_target.mjs gen/test/run.js",
34
+ "test-health": "node scripts/test_health.ts"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@rollup/plugin-node-resolve": "16.0.3",
@@ -75,7 +76,7 @@
75
76
  "mocha": "11.7.5",
76
77
  "ora": "9.0.0",
77
78
  "postcss": "8.5.15",
78
- "puppeteer-core": "25.0.4",
79
+ "puppeteer-core": "25.2.0",
79
80
  "rollup": "4.60.4",
80
81
  "rollup-plugin-sourcemaps2": "0.5.4",
81
82
  "sinon": "22.0.0",
@@ -91,5 +92,5 @@
91
92
  "webidl2": "24.5.0",
92
93
  "yargs": "17.7.2"
93
94
  },
94
- "version": "1.0.1652307"
95
+ "version": "1.0.1654411"
95
96
  }