chrome-devtools-frontend 1.0.1555174 → 1.0.1556696

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 (156) hide show
  1. package/front_end/core/protocol_client/InspectorBackend.ts +1 -1
  2. package/front_end/core/root/Runtime.ts +0 -4
  3. package/front_end/core/sdk/DOMModel.ts +101 -7
  4. package/front_end/entrypoints/formatter_worker/FormatterActions.ts +2 -0
  5. package/front_end/entrypoints/formatter_worker/ScopeParser.ts +75 -7
  6. package/front_end/entrypoints/formatter_worker/Substitute.ts +1 -1
  7. package/front_end/generated/InspectorBackendCommands.ts +1 -1
  8. package/front_end/generated/protocol.ts +0 -1
  9. package/front_end/models/ai_assistance/AiConversation.ts +71 -10
  10. package/front_end/models/ai_assistance/ArtifactsManager.ts +67 -0
  11. package/front_end/models/ai_assistance/ConversationHandler.ts +3 -2
  12. package/front_end/models/ai_assistance/agents/AiAgent.ts +17 -27
  13. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +152 -4
  14. package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -2
  15. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  16. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +1 -1
  17. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +0 -2
  18. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -1
  19. package/front_end/{ui/components → models}/annotations/AnnotationRepository.ts +4 -4
  20. package/front_end/models/annotations/README.md +7 -0
  21. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +8 -0
  22. package/front_end/models/greendev/Prototypes.ts +56 -0
  23. package/front_end/models/greendev/README.md +5 -0
  24. package/front_end/models/greendev/greendev.ts +5 -0
  25. package/front_end/models/stack_trace/StackTrace.ts +13 -2
  26. package/front_end/models/stack_trace/StackTraceImpl.ts +81 -6
  27. package/front_end/models/stack_trace/StackTraceModel.ts +35 -3
  28. package/front_end/models/trace/extras/TraceTree.ts +4 -2
  29. package/front_end/models/trace/insights/LCPDiscovery.ts +0 -2
  30. package/front_end/models/trace/types/TraceEvents.ts +0 -1
  31. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +116 -70
  32. package/front_end/panels/ai_assistance/aiAssistancePanel.css +16 -0
  33. package/front_end/panels/ai_assistance/components/ArtifactsViewer.ts +159 -0
  34. package/front_end/panels/ai_assistance/components/ChatView.ts +3 -2
  35. package/front_end/panels/ai_assistance/components/CollapsibleAssistanceContentWidget.ts +7 -8
  36. package/front_end/panels/ai_assistance/components/PerformanceAgentFlameChart.ts +15 -8
  37. package/front_end/panels/ai_assistance/components/PerformanceAgentMarkdownRenderer.ts +9 -9
  38. package/front_end/panels/ai_assistance/components/artifactsViewer.css +15 -0
  39. package/front_end/panels/ai_assistance/components/collapsibleAssistanceContentWidget.css +5 -6
  40. package/front_end/panels/application/AppManifestView.ts +263 -205
  41. package/front_end/panels/application/ApplicationPanelSidebar.ts +24 -57
  42. package/front_end/panels/application/OpenedWindowDetailsView.ts +2 -0
  43. package/front_end/panels/application/ServiceWorkersView.ts +2 -0
  44. package/front_end/panels/application/StorageView.ts +1 -0
  45. package/front_end/panels/application/appManifestView.css +48 -0
  46. package/front_end/panels/application/components/ProtocolHandlersView.ts +2 -2
  47. package/front_end/panels/application/preloading/PreloadingView.ts +12 -6
  48. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +230 -237
  49. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +96 -79
  50. package/front_end/panels/application/preloading/components/preloadingGrid.css +26 -29
  51. package/front_end/panels/application/preloading/preloadingView.css +6 -0
  52. package/front_end/panels/common/Annotation.ts +1 -1
  53. package/front_end/panels/common/AnnotationManager.ts +1 -1
  54. package/front_end/panels/common/ExtensionView.ts +1 -0
  55. package/front_end/panels/console/ConsoleContextSelector.ts +74 -9
  56. package/front_end/panels/console/consoleContextSelector.css +31 -29
  57. package/front_end/panels/coverage/coverageListView.css +59 -57
  58. package/front_end/panels/elements/ElementsPanel.ts +1 -1
  59. package/front_end/panels/elements/ElementsTreeElement.ts +39 -1
  60. package/front_end/panels/elements/ElementsTreeOutline.ts +23 -21
  61. package/front_end/panels/elements/TopLayerContainer.ts +26 -91
  62. package/front_end/panels/explain/components/ConsoleInsight.ts +3 -3
  63. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +4 -8
  64. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +148 -97
  65. package/front_end/panels/linear_memory_inspector/components/LinearMemoryViewer.ts +1 -1
  66. package/front_end/panels/linear_memory_inspector/components/linearMemoryValueInterpreter.css +37 -35
  67. package/front_end/panels/network/NetworkItemView.ts +1 -1
  68. package/front_end/panels/network/NetworkLogView.ts +1 -1
  69. package/front_end/panels/network/NetworkPanel.ts +1 -1
  70. package/front_end/panels/recorder/RecorderController.ts +0 -1
  71. package/front_end/panels/security/SecurityPanelSidebar.ts +5 -0
  72. package/front_end/panels/settings/SettingsScreen.ts +133 -1
  73. package/front_end/panels/settings/settings-meta.ts +24 -0
  74. package/front_end/panels/settings/settingsScreen.css +4 -0
  75. package/front_end/panels/sources/UISourceCodeFrame.ts +3 -17
  76. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -8
  77. package/front_end/panels/timeline/components/TimelineSummary.ts +75 -54
  78. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +18 -26
  79. package/front_end/panels/timeline/components/insights/Cache.ts +12 -8
  80. package/front_end/panels/timeline/components/insights/DOMSize.ts +25 -21
  81. package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +7 -7
  82. package/front_end/panels/timeline/components/insights/FontDisplay.ts +7 -5
  83. package/front_end/panels/timeline/components/insights/ForcedReflow.ts +11 -9
  84. package/front_end/panels/timeline/components/insights/INPBreakdown.ts +7 -6
  85. package/front_end/panels/timeline/components/insights/ImageDelivery.ts +7 -5
  86. package/front_end/panels/timeline/components/insights/InsightRenderer.ts +20 -18
  87. package/front_end/panels/timeline/components/insights/LCPBreakdown.ts +12 -12
  88. package/front_end/panels/timeline/components/insights/LegacyJavaScript.ts +7 -7
  89. package/front_end/panels/timeline/components/insights/ModernHTTP.ts +7 -5
  90. package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +15 -13
  91. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +2 -2
  92. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +15 -14
  93. package/front_end/panels/timeline/components/insights/Table.ts +152 -130
  94. package/front_end/panels/timeline/components/insights/ThirdParties.ts +11 -9
  95. package/front_end/panels/timeline/components/timelineSummary.css +58 -57
  96. package/front_end/panels/timeline/thirdPartyTreeView.css +109 -0
  97. package/front_end/panels/timeline/timelineDetailsView.css +2 -4
  98. package/front_end/panels/timeline/timelinePanel.css +0 -110
  99. package/front_end/third_party/acorn/estree-legacy.d.ts +2 -0
  100. package/front_end/third_party/chromium/README.chromium +1 -1
  101. package/front_end/third_party/puppeteer/README.chromium +2 -2
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/CDPSession.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.d.ts.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Connection.d.ts.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js +21 -7
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/EventEmitter.d.ts.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +15 -6
  119. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.d.ts.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/CDPSession.js.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.d.ts.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Connection.d.ts.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js +21 -7
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/BrowserConnector.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/EventEmitter.d.ts.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  133. package/front_end/third_party/puppeteer/package/package.json +2 -2
  134. package/front_end/third_party/puppeteer/package/src/api/CDPSession.ts +1 -2
  135. package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +2 -4
  136. package/front_end/third_party/puppeteer/package/src/api/Frame.ts +2 -4
  137. package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -4
  138. package/front_end/third_party/puppeteer/package/src/bidi/core/Connection.ts +3 -2
  139. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +29 -10
  140. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +3 -3
  141. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  142. package/front_end/ui/components/report_view/ReportView.docs.ts +37 -0
  143. package/front_end/ui/components/report_view/ReportView.ts +1 -4
  144. package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
  145. package/front_end/ui/legacy/Floaty.ts +5 -9
  146. package/front_end/ui/legacy/InspectorView.ts +2 -1
  147. package/front_end/ui/legacy/ReportView.ts +5 -4
  148. package/front_end/ui/legacy/TabbedPane.ts +1 -1
  149. package/front_end/ui/legacy/ViewManager.ts +2 -32
  150. package/front_end/ui/legacy/Widget.ts +7 -0
  151. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +0 -1
  152. package/front_end/ui/legacy/reportView.css +0 -24
  153. package/front_end/ui/visual_logging/KnownContextValues.ts +7 -0
  154. package/package.json +1 -1
  155. /package/front_end/{ui/components → models}/annotations/AnnotationType.ts +0 -0
  156. /package/front_end/{ui/components → models}/annotations/annotations.ts +0 -0
@@ -342,6 +342,10 @@ const UIStrings = {
342
342
  * @description Context menu item in Elements panel to explain container context via AI.
343
343
  */
344
344
  explainContainerContext: 'Explain container context',
345
+ /**
346
+ * @description Link text content in Elements Tree Outline of the Elements panel. When clicked, it "reveals" the true location of an element.
347
+ */
348
+ reveal: 'reveal',
345
349
  } as const;
346
350
  const str_ = i18n.i18n.registerUIStrings('panels/elements/ElementsTreeElement.ts', UIStrings);
347
351
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -379,10 +383,12 @@ export interface ViewInput {
379
383
  showGridLanesAdorner: boolean;
380
384
  showMediaAdorner: boolean;
381
385
  showPopoverAdorner: boolean;
386
+ showTopLayerAdorner: boolean;
382
387
  isSubgrid: boolean;
383
388
 
384
389
  adorners?: Set<Adorners.Adorner.Adorner>;
385
390
  nodeInfo?: DocumentFragment;
391
+ topLayerIndex: number;
386
392
 
387
393
  onGutterClick: (e: Event) => void;
388
394
  onAdornerAdded: (adorner: Adorners.Adorner.Adorner) => void;
@@ -392,6 +398,7 @@ export interface ViewInput {
392
398
  onGridAdornerClick: (e: Event) => void;
393
399
  onMediaAdornerClick: (e: Event) => void;
394
400
  onPopoverAdornerClick: (e: Event) => void;
401
+ onTopLayerAdornerClick: (e: Event) => void;
395
402
  }
396
403
 
397
404
  export interface ViewOutput {
@@ -436,9 +443,11 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
436
443
  ElementsComponents.AdornerManager.RegisteredAdorners.MEDIA);
437
444
  const popoverAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
438
445
  ElementsComponents.AdornerManager.RegisteredAdorners.POPOVER);
446
+ const topLayerAdornerConfig = ElementsComponents.AdornerManager.getRegisteredAdorner(
447
+ ElementsComponents.AdornerManager.RegisteredAdorners.TOP_LAYER);
439
448
  const hasAdorners = input.adorners?.size || input.showAdAdorner || input.showContainerAdorner ||
440
449
  input.showFlexAdorner || input.showGridAdorner || input.showGridLanesAdorner || input.showMediaAdorner ||
441
- input.showPopoverAdorner;
450
+ input.showPopoverAdorner || input.showTopLayerAdorner;
442
451
  // clang-format off
443
452
  render(html`
444
453
  <div ${ref(el => { output.contentElement = el as HTMLElement; })}>
@@ -571,6 +580,25 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
571
580
  ${adornerRef(input)}>
572
581
  <span>${popoverAdornerConfig.name}</span>
573
582
  </devtools-adorner>`: nothing}
583
+ ${input.showTopLayerAdorner ? html`<devtools-adorner
584
+ class=clickable
585
+ role=button
586
+ tabindex=0
587
+ .data=${{name: topLayerAdornerConfig.name, jslogContext: topLayerAdornerConfig.name}}
588
+ jslog=${VisualLogging.adorner(topLayerAdornerConfig.name).track({click: true})}
589
+ aria-label=${i18nString(UIStrings.reveal)}
590
+ @click=${input.onTopLayerAdornerClick}
591
+ @keydown=${(event: KeyboardEvent) => {
592
+ if (event.code === 'Enter' || event.code === 'Space') {
593
+ input.onTopLayerAdornerClick(event);
594
+ event.stopPropagation();
595
+ }
596
+ }}
597
+ ${adornerRef(input)}>
598
+ <span class="adorner-with-icon">
599
+ ${`top-layer (${input.topLayerIndex})`}<devtools-icon name="select-element"></devtools-icon>
600
+ </span>
601
+ </devtools-adorner>`: nothing}
574
602
  ${repeat(Array.from((input.adorners ?? new Set()).values()).sort(adornerComparator), adorner => {
575
603
  return adorner;
576
604
  })}
@@ -768,10 +796,12 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
768
796
  showMediaAdorner: this.node().isMediaNode() && !this.isClosingTag(),
769
797
  showPopoverAdorner: Boolean(Root.Runtime.hostConfig.devToolsAllowPopoverForcing?.enabled) &&
770
798
  Boolean(this.node().attributes().find(attr => attr.name === 'popover')) && !this.isClosingTag(),
799
+ showTopLayerAdorner: this.node().topLayerIndex() !== -1 && !this.isClosingTag(),
771
800
  gridAdornerActive: this.#gridAdornerActive,
772
801
  popoverAdornerActive: this.#popoverAdornerActive,
773
802
  isSubgrid: Boolean(this.#layout?.isSubgrid),
774
803
  nodeInfo: this.#nodeInfo,
804
+ topLayerIndex: this.node().topLayerIndex(),
775
805
  onGutterClick: this.showContextMenu.bind(this),
776
806
  onAdornerAdded: adorner => {
777
807
  ElementsPanel.instance().registerAdorner(adorner);
@@ -784,6 +814,12 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
784
814
  onGridAdornerClick: (event: Event) => this.#onGridAdornerClick(event),
785
815
  onMediaAdornerClick: (event: Event) => this.#onMediaAdornerClick(event),
786
816
  onPopoverAdornerClick: (event: Event) => this.#onPopoverAdornerClick(event),
817
+ onTopLayerAdornerClick: () => {
818
+ if (!this.treeOutline) {
819
+ return;
820
+ }
821
+ this.treeOutline.revealInTopLayer(this.node());
822
+ },
787
823
  },
788
824
  this, this.listItemElement);
789
825
  }
@@ -1069,6 +1105,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1069
1105
  override onbind(): void {
1070
1106
  if (this.treeOutline && !this.isClosingTag()) {
1071
1107
  this.treeOutline.treeElementByNode.set(this.nodeInternal, this);
1108
+ this.nodeInternal.addEventListener(SDK.DOMModel.DOMNodeEvents.TOP_LAYER_INDEX_CHANGED, this.performUpdate, this);
1072
1109
  }
1073
1110
  }
1074
1111
 
@@ -1079,6 +1116,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
1079
1116
  if (this.treeOutline && this.treeOutline.treeElementByNode.get(this.nodeInternal) === this) {
1080
1117
  this.treeOutline.treeElementByNode.delete(this.nodeInternal);
1081
1118
  }
1119
+ this.nodeInternal.removeEventListener(SDK.DOMModel.DOMNodeEvents.TOP_LAYER_INDEX_CHANGED, this.performUpdate, this);
1082
1120
  }
1083
1121
 
1084
1122
  override onattach(): void {
@@ -486,7 +486,7 @@ export class ElementsTreeOutline extends
486
486
  private treeElementBeingDragged?: ElementsTreeElement;
487
487
  private dragOverTreeElement?: ElementsTreeElement;
488
488
  private updateModifiedNodesTimeout?: number;
489
- #topLayerContainerByParent = new Map<UI.TreeOutline.TreeElement, TopLayerContainer>();
489
+ #topLayerContainerByDocument = new WeakMap<SDK.DOMModel.DOMDocument, TopLayerContainer>();
490
490
  #issuesManager?: IssuesManager.IssuesManager.IssuesManager;
491
491
  #popupHelper?: UI.PopoverHelper.PopoverHelper;
492
492
  #nodeElementToIssues = new Map<Element, IssuesManager.Issue.Issue[]>();
@@ -1526,7 +1526,6 @@ export class ElementsTreeOutline extends
1526
1526
  domModel.addEventListener(SDK.DOMModel.Events.DocumentUpdated, this.documentUpdated, this);
1527
1527
  domModel.addEventListener(SDK.DOMModel.Events.ChildNodeCountUpdated, this.childNodeCountUpdated, this);
1528
1528
  domModel.addEventListener(SDK.DOMModel.Events.DistributedNodesChanged, this.distributedNodesChanged, this);
1529
- domModel.addEventListener(SDK.DOMModel.Events.TopLayerElementsChanged, this.topLayerElementsChanged, this);
1530
1529
  domModel.addEventListener(SDK.DOMModel.Events.ScrollableFlagUpdated, this.scrollableFlagUpdated, this);
1531
1530
  domModel.addEventListener(
1532
1531
  SDK.DOMModel.Events.AffectedByStartingStylesFlagUpdated, this.affectedByStartingStylesFlagUpdated, this);
@@ -1543,7 +1542,6 @@ export class ElementsTreeOutline extends
1543
1542
  domModel.removeEventListener(SDK.DOMModel.Events.DocumentUpdated, this.documentUpdated, this);
1544
1543
  domModel.removeEventListener(SDK.DOMModel.Events.ChildNodeCountUpdated, this.childNodeCountUpdated, this);
1545
1544
  domModel.removeEventListener(SDK.DOMModel.Events.DistributedNodesChanged, this.distributedNodesChanged, this);
1546
- domModel.removeEventListener(SDK.DOMModel.Events.TopLayerElementsChanged, this.topLayerElementsChanged, this);
1547
1545
  domModel.removeEventListener(SDK.DOMModel.Events.ScrollableFlagUpdated, this.scrollableFlagUpdated, this);
1548
1546
  domModel.removeEventListener(
1549
1547
  SDK.DOMModel.Events.AffectedByStartingStylesFlagUpdated, this.affectedByStartingStylesFlagUpdated, this);
@@ -1719,16 +1717,24 @@ export class ElementsTreeOutline extends
1719
1717
  });
1720
1718
  }
1721
1719
 
1722
- async createTopLayerContainer(parent: UI.TreeOutline.TreeElement, document: SDK.DOMModel.DOMDocument): Promise<void> {
1720
+ createTopLayerContainer(parent: UI.TreeOutline.TreeElement, document: SDK.DOMModel.DOMDocument): void {
1723
1721
  if (!parent.treeOutline || !(parent.treeOutline instanceof ElementsTreeOutline)) {
1724
1722
  return;
1725
1723
  }
1726
1724
  const container = new TopLayerContainer(parent.treeOutline, document);
1727
- await container.throttledUpdateTopLayerElements();
1728
- if (container.currentTopLayerDOMNodes.size > 0) {
1729
- parent.appendChild(container);
1725
+ this.#topLayerContainerByDocument.set(document, container);
1726
+ parent.appendChild(container);
1727
+ }
1728
+
1729
+ revealInTopLayer(node: SDK.DOMModel.DOMNode): void {
1730
+ const document = node.ownerDocument;
1731
+ if (!document) {
1732
+ return;
1733
+ }
1734
+ const container = this.#topLayerContainerByDocument.get(document);
1735
+ if (container) {
1736
+ container.revealInTopLayer(node);
1730
1737
  }
1731
- this.#topLayerContainerByParent.set(parent, container);
1732
1738
  }
1733
1739
 
1734
1740
  private createElementTreeElement(node: SDK.DOMModel.DOMNode|SDK.DOMModel.AdoptedStyleSheet, isClosingTag?: boolean):
@@ -1898,9 +1904,6 @@ export class ElementsTreeOutline extends
1898
1904
  index: number, isClosingTag?: boolean): UI.TreeOutline.TreeElement {
1899
1905
  const newElement = this.createElementTreeElement(child, isClosingTag);
1900
1906
  treeElement.insertChild(newElement, index);
1901
- if (child instanceof SDK.DOMModel.DOMDocument) {
1902
- void this.createTopLayerContainer(newElement, child);
1903
- }
1904
1907
  return newElement;
1905
1908
  }
1906
1909
 
@@ -1997,6 +2000,15 @@ export class ElementsTreeOutline extends
1997
2000
  this.insertChildElement(treeElement, node, treeElement.childCount(), true);
1998
2001
  }
1999
2002
 
2003
+ if (node instanceof SDK.DOMModel.DOMDocument && !this.isXMLMimeType) {
2004
+ let topLayerContainer = this.#topLayerContainerByDocument.get(node);
2005
+ if (!topLayerContainer) {
2006
+ topLayerContainer = new TopLayerContainer(this, node);
2007
+ this.#topLayerContainerByDocument.set(node, topLayerContainer);
2008
+ }
2009
+ treeElement.appendChild(topLayerContainer);
2010
+ }
2011
+
2000
2012
  this.treeElementsBeingUpdated.delete(treeElement);
2001
2013
  }
2002
2014
 
@@ -2008,16 +2020,6 @@ export class ElementsTreeOutline extends
2008
2020
  }
2009
2021
  }
2010
2022
 
2011
- private async topLayerElementsChanged(): Promise<void> {
2012
- for (const [parent, container] of this.#topLayerContainerByParent) {
2013
- await container.throttledUpdateTopLayerElements();
2014
- if (container.currentTopLayerDOMNodes.size > 0 && container.parent !== parent) {
2015
- parent.appendChild(container);
2016
- }
2017
- container.hidden = container.currentTopLayerDOMNodes.size === 0;
2018
- }
2019
- }
2020
-
2021
2023
  private scrollableFlagUpdated(event: Common.EventTarget.EventTargetEvent<{node: SDK.DOMModel.DOMNode}>): void {
2022
2024
  let {node} = event.data;
2023
2025
  if (node.nodeName() === '#document') {
@@ -1,119 +1,54 @@
1
1
  // Copyright 2022 The Chromium Authors
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
- /* eslint-disable @devtools/no-imperative-dom-api */
5
4
 
6
- import * as Common from '../../core/common/common.js';
7
- import * as i18n from '../../core/i18n/i18n.js';
5
+ import type * as Common from '../../core/common/common.js';
8
6
  import * as SDK from '../../core/sdk/sdk.js';
9
- import {createIcon} from '../../ui/kit/kit.js';
10
7
  import * as UI from '../../ui/legacy/legacy.js';
11
8
 
12
- import * as ElementsComponents from './components/components.js';
13
- import type {ElementsTreeElement} from './ElementsTreeElement.js';
14
9
  import type {ElementsTreeOutline} from './ElementsTreeOutline.js';
15
10
  import {ShortcutTreeElement} from './ShortcutTreeElement.js';
16
11
 
17
- const UIStrings = {
18
- /**
19
- * @description Link text content in Elements Tree Outline of the Elements panel. When clicked, it "reveals" the true location of an element.
20
- */
21
- reveal: 'reveal',
22
- } as const;
23
-
24
- const str_ = i18n.i18n.registerUIStrings('panels/elements/TopLayerContainer.ts', UIStrings);
25
- const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
26
-
27
12
  export class TopLayerContainer extends UI.TreeOutline.TreeElement {
28
13
  tree: ElementsTreeOutline;
29
14
  document: SDK.DOMModel.DOMDocument;
30
- currentTopLayerDOMNodes = new Set<SDK.DOMModel.DOMNode>();
31
- topLayerUpdateThrottler: Common.Throttler.Throttler;
32
15
 
33
16
  constructor(tree: ElementsTreeOutline, document: SDK.DOMModel.DOMDocument) {
34
17
  super('#top-layer');
35
18
  this.tree = tree;
36
19
  this.document = document;
37
- this.topLayerUpdateThrottler = new Common.Throttler.Throttler(1);
38
- }
39
-
40
- async throttledUpdateTopLayerElements(): Promise<void> {
41
- await this.topLayerUpdateThrottler.schedule(() => this.updateTopLayerElements());
20
+ this.document.domModel().addEventListener(
21
+ SDK.DOMModel.Events.TopLayerElementsChanged, this.topLayerElementsChanged, this);
22
+ this.topLayerElementsChanged({
23
+ data: {
24
+ document,
25
+ documentShortcuts: [],
26
+ },
27
+ });
42
28
  }
43
29
 
44
- async updateTopLayerElements(): Promise<void> {
45
- this.removeChildren();
46
- this.removeCurrentTopLayerElementsAdorners();
47
- this.currentTopLayerDOMNodes = new Set();
48
- const domModel = this.document.domModel();
49
- const newTopLayerElementsIDs = await domModel.getTopLayerElements();
50
- if (!newTopLayerElementsIDs || newTopLayerElementsIDs.length === 0) {
30
+ topLayerElementsChanged(
31
+ event: Common.EventTarget.EventTargetEvent<SDK.DOMModel.EventTypes['TopLayerElementsChanged']>): void {
32
+ if (this.document !== event.data.document) {
51
33
  return;
52
34
  }
53
-
54
- let topLayerElementIndex = 0;
55
- for (let i = 0; i < newTopLayerElementsIDs.length; i++) {
56
- const topLayerDOMNode = domModel.idToDOMNode.get(newTopLayerElementsIDs[i]);
57
- if (!topLayerDOMNode || topLayerDOMNode.ownerDocument !== this.document) {
58
- continue;
59
- }
60
-
61
- if (topLayerDOMNode.nodeName() !== '::backdrop') {
62
- const topLayerElementShortcut = new SDK.DOMModel.DOMNodeShortcut(
63
- domModel.target(), topLayerDOMNode.backendNodeId(), 0, topLayerDOMNode.nodeName());
64
- const topLayerElementRepresentation = new ShortcutTreeElement(topLayerElementShortcut);
65
- this.appendChild(topLayerElementRepresentation);
66
- this.currentTopLayerDOMNodes.add(topLayerDOMNode);
67
-
68
- // Add the element's backdrop if previous top layer element is a backdrop.
69
- const previousTopLayerDOMNode = (i > 0) ? domModel.idToDOMNode.get(newTopLayerElementsIDs[i - 1]) : undefined;
70
- if (previousTopLayerDOMNode && previousTopLayerDOMNode.nodeName() === '::backdrop') {
71
- const backdropElementShortcut = new SDK.DOMModel.DOMNodeShortcut(
72
- domModel.target(), previousTopLayerDOMNode.backendNodeId(), 0, previousTopLayerDOMNode.nodeName());
73
- const backdropElementRepresentation = new ShortcutTreeElement(backdropElementShortcut);
74
- topLayerElementRepresentation.appendChild(backdropElementRepresentation);
75
- }
76
-
77
- // TODO(changhaohan): store not-yet-inserted DOMNodes and adorn them when inserted.
78
- const topLayerTreeElement = this.tree.treeElementByNode.get(topLayerDOMNode);
79
- if (topLayerTreeElement) {
80
- this.addTopLayerAdorner(topLayerTreeElement, topLayerElementRepresentation, ++topLayerElementIndex);
81
- }
35
+ this.removeChildren();
36
+ const shortcuts = event.data.documentShortcuts;
37
+ this.hidden = shortcuts.length === 0;
38
+ for (const shortcut of shortcuts) {
39
+ const element = new ShortcutTreeElement(shortcut);
40
+ this.appendChild(element);
41
+ for (const child of shortcut.childShortcuts) {
42
+ element.appendChild(new ShortcutTreeElement(child));
82
43
  }
83
44
  }
84
45
  }
85
46
 
86
- private removeCurrentTopLayerElementsAdorners(): void {
87
- for (const node of this.currentTopLayerDOMNodes) {
88
- const topLayerTreeElement = this.tree.treeElementByNode.get(node);
89
- topLayerTreeElement?.removeAdornersByType(ElementsComponents.AdornerManager.RegisteredAdorners.TOP_LAYER);
90
- }
91
- }
92
-
93
- private addTopLayerAdorner(
94
- element: ElementsTreeElement, topLayerElementRepresentation: ShortcutTreeElement,
95
- topLayerElementIndex: number): void {
96
- const config = ElementsComponents.AdornerManager.getRegisteredAdorner(
97
- ElementsComponents.AdornerManager.RegisteredAdorners.TOP_LAYER);
98
- const adornerContent = document.createElement('span');
99
- adornerContent.classList.add('adorner-with-icon');
100
- const linkIcon = createIcon('select-element');
101
- const adornerText = document.createElement('span');
102
- adornerText.textContent = `top-layer (${topLayerElementIndex})`;
103
- adornerContent.append(linkIcon);
104
- adornerContent.append(adornerText);
105
- const adorner = element?.adorn(config, adornerContent);
106
- if (adorner) {
107
- const onClick = ((() => {
108
- topLayerElementRepresentation.revealAndSelect();
109
- }) as EventListener);
110
- adorner.addInteraction(onClick, {
111
- isToggle: false,
112
- shouldPropagateOnKeydown: false,
113
- ariaLabelDefault: i18nString(UIStrings.reveal),
114
- ariaLabelActive: i18nString(UIStrings.reveal),
115
- });
116
- adorner.addEventListener('mousedown', e => e.consume(), false);
117
- }
47
+ revealInTopLayer(node: SDK.DOMModel.DOMNode): void {
48
+ this.children().forEach(child => {
49
+ if (child instanceof ShortcutTreeElement && child.deferredNode().backendNodeId() === node.backendNodeId()) {
50
+ child.revealAndSelect();
51
+ }
52
+ });
118
53
  }
119
54
  }
@@ -200,7 +200,7 @@ export interface ViewInput {
200
200
  onAnimationEnd: () => void,
201
201
  onCitationAnimationEnd: () => void,
202
202
  onSearch: () => void,
203
- onRating: (isPositive: boolean) => void,
203
+ onRating: (isPositive: boolean) => Promise<Host.InspectorFrontendHostAPI.AidaClientResult>| undefined,
204
204
  onReport: () => void,
205
205
  onGoToSignIn: () => void,
206
206
  onConsentReminderConfirmed: () => Promise<void>,
@@ -989,7 +989,7 @@ export class ConsoleInsight extends UI.Widget.Widget {
989
989
  }
990
990
  }
991
991
 
992
- #onRating(isPositive: boolean): void {
992
+ #onRating(isPositive: boolean): Promise<Host.InspectorFrontendHostAPI.AidaClientResult>|undefined {
993
993
  if (this.#state.type !== State.INSIGHT) {
994
994
  throw new Error('Unexpected state');
995
995
  }
@@ -1009,7 +1009,7 @@ export class ConsoleInsight extends UI.Widget.Widget {
1009
1009
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.InsightRatedNegative);
1010
1010
  }
1011
1011
  const disallowLogging = Root.Runtime.hostConfig.aidaAvailability?.disallowLogging ?? true;
1012
- void this.#aidaClient.registerClientEvent({
1012
+ return this.#aidaClient.registerClientEvent({
1013
1013
  corresponding_aida_rpc_global_id: this.#state.metadata.rpcGlobalId,
1014
1014
  disable_user_content_logging: disallowLogging,
1015
1015
  do_conversation_client_event: {
@@ -2,7 +2,6 @@
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 './LinearMemoryValueInterpreter.js';
6
5
  import './LinearMemoryViewer.js';
7
6
 
8
7
  import * as Common from '../../../core/common/common.js';
@@ -20,6 +19,7 @@ import {
20
19
  Navigation,
21
20
  type PageNavigationEvent,
22
21
  } from './LinearMemoryNavigator.js';
22
+ import {LinearMemoryValueInterpreter} from './LinearMemoryValueInterpreter.js';
23
23
  import type {ByteSelectedEvent, ResizeEvent} from './LinearMemoryViewer.js';
24
24
  import type {HighlightInfo} from './LinearMemoryViewerUtils.js';
25
25
  import {
@@ -186,10 +186,8 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: Record<string, unknown>,
186
186
  ${
187
187
  input.hideValueInspector ? nothing : html`
188
188
  <div class="value-interpreter">
189
- <devtools-linear-memory-inspector-interpreter
190
- .data=${
191
- {
192
- value: input.memory
189
+ <devtools-widget .widgetConfig=${widgetConfig(LinearMemoryValueInterpreter, {
190
+ buffer: input.memory
193
191
  .slice(
194
192
  input.address - input.memoryOffset,
195
193
  input.address + VALUE_INTEPRETER_MAX_NUM_BYTES,
@@ -203,9 +201,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: Record<string, unknown>,
203
201
  onJumpToAddressClicked: input.onJumpToAddress,
204
202
  onValueTypeToggled: input.onValueTypeToggled,
205
203
  onEndiannessChanged: input.onEndiannessChanged,
206
- }}
207
- >
208
- </devtools-linear-memory-inspector-interpreter>
204
+ })}></devtools-widget>
209
205
  </div>`}
210
206
  `,
211
207
  target);