chrome-devtools-frontend 1.0.1695017 → 1.0.1696961

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 (247) hide show
  1. package/eslint.config.mjs +4 -1
  2. package/front_end/core/common/Base64.ts +14 -4
  3. package/front_end/core/common/Gzip.ts +1 -1
  4. package/front_end/core/common/Object.ts +0 -1
  5. package/front_end/core/platform/Size.ts +43 -0
  6. package/front_end/core/platform/api/HostRuntime.ts +14 -0
  7. package/front_end/core/platform/browser/HostRuntime.ts +66 -0
  8. package/front_end/core/platform/node/HostRuntime.ts +12 -3
  9. package/front_end/core/platform/platform.ts +1 -0
  10. package/front_end/core/sdk/AccessibilityModel.ts +2 -2
  11. package/front_end/core/sdk/CSSMatchedStyles.ts +2 -0
  12. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +29 -0
  13. package/front_end/core/sdk/CSSStyleSheetHeader.ts +2 -2
  14. package/front_end/core/sdk/ConsoleModel.ts +3 -3
  15. package/front_end/core/sdk/DOMModel.ts +10 -6
  16. package/front_end/core/sdk/DebuggerModel.ts +6 -0
  17. package/front_end/core/sdk/NetworkRequest.ts +19 -19
  18. package/front_end/core/sdk/RuntimeModel.ts +5 -0
  19. package/front_end/core/sdk/Script.ts +2 -2
  20. package/front_end/core/sdk/ServerTiming.ts +6 -6
  21. package/front_end/core/sdk/SourceMap.ts +112 -14
  22. package/front_end/core/sdk/SourceMapRangeMappings.ts +43 -0
  23. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +15 -10
  24. package/front_end/core/sdk/SourceMapScopesInfo.ts +92 -10
  25. package/front_end/core/sdk/sdk.ts +2 -0
  26. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +1 -1
  27. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +6 -6
  28. package/front_end/entrypoints/main/MainImpl.ts +1 -1
  29. package/front_end/generated/InspectorBackendCommands.ts +6 -3
  30. package/front_end/generated/protocol-mapping.d.ts +7 -0
  31. package/front_end/generated/protocol-proxy-api.d.ts +5 -0
  32. package/front_end/generated/protocol.ts +36 -3
  33. package/front_end/models/ai_assistance/AiAgent2.ts +27 -27
  34. package/front_end/models/ai_assistance/agents/AiAgent.ts +4 -0
  35. package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +2 -2
  36. package/front_end/models/ai_assistance/contexts/AccessibilityContext.ts +1 -0
  37. package/front_end/models/ai_assistance/contexts/DOMNodeContext.ts +5 -4
  38. package/front_end/models/ai_assistance/contexts/FileContext.ts +1 -0
  39. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +1 -0
  40. package/front_end/models/ai_assistance/contexts/RequestContext.ts +1 -0
  41. package/front_end/models/ai_assistance/contexts/StorageContext.ts +1 -0
  42. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +5 -5
  43. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +6 -6
  44. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +5 -8
  45. package/front_end/models/ai_assistance/tools/GetNetworkRequestDetails.ts +4 -8
  46. package/front_end/models/ai_assistance/tools/GetSourceContent.ts +7 -5
  47. package/front_end/models/ai_assistance/tools/GetStyles.ts +10 -6
  48. package/front_end/models/ai_assistance/tools/ListSources.ts +26 -7
  49. package/front_end/models/ai_assistance/tools/ResolveDevtoolsNodePath.ts +5 -10
  50. package/front_end/models/ai_assistance/tools/Tool.ts +8 -1
  51. package/front_end/models/bindings/FileUtils.ts +18 -40
  52. package/front_end/models/bindings/TempFile.ts +5 -12
  53. package/front_end/models/comment_manager/CommentManager.ts +30 -6
  54. package/front_end/models/crux-manager/CrUXManager.ts +8 -5
  55. package/front_end/models/emulation/DeviceModeModel.ts +55 -105
  56. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +1 -1
  57. package/front_end/models/issues_manager/CookieIssue.ts +1 -1
  58. package/front_end/models/issues_manager/DeprecationIssue.ts +2 -2
  59. package/front_end/models/javascript_metadata/NativeFunctions.ts +1 -5
  60. package/front_end/models/live-metrics/LiveMetrics.ts +1 -1
  61. package/front_end/models/persistence/IsolatedFileSystem.ts +16 -23
  62. package/front_end/models/trace/insights/DuplicatedJavaScript.ts +1 -1
  63. package/front_end/models/trace/insights/INPBreakdown.ts +1 -1
  64. package/front_end/models/trace/insights/ImageDelivery.ts +3 -3
  65. package/front_end/models/trace/insights/LCPDiscovery.ts +2 -2
  66. package/front_end/models/trace/insights/NetworkDependencyTree.ts +3 -3
  67. package/front_end/models/trace/insights/Viewport.ts +1 -1
  68. package/front_end/models/trace/types/Overlays.ts +2 -2
  69. package/front_end/panels/accessibility/AccessibilityNodeView.ts +2 -2
  70. package/front_end/panels/accessibility/AccessibilitySubPane.ts +0 -1
  71. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +74 -18
  72. package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +14 -3
  73. package/front_end/panels/ai_assistance/components/ChatInput.ts +1 -1
  74. package/front_end/panels/ai_assistance/components/ChatMessage.ts +1 -1
  75. package/front_end/panels/animation/AnimationUI.ts +1 -1
  76. package/front_end/panels/application/AppManifestView.ts +9 -11
  77. package/front_end/panels/application/ApplicationPanelSidebar.ts +9 -9
  78. package/front_end/panels/application/BackgroundServiceView.ts +1 -1
  79. package/front_end/panels/application/CookieItemsView.ts +1 -1
  80. package/front_end/panels/application/DOMStorageItemsView.ts +1 -1
  81. package/front_end/panels/application/DeviceBoundSessionsView.ts +2 -2
  82. package/front_end/panels/application/FrameDetailsView.ts +5 -5
  83. package/front_end/panels/application/IndexedDBViews.ts +2 -2
  84. package/front_end/panels/application/KeyValueStorageItemsView.ts +1 -2
  85. package/front_end/panels/application/ReportingApiView.ts +1 -1
  86. package/front_end/panels/application/ServiceWorkerCacheTreeElement.ts +1 -1
  87. package/front_end/panels/application/ServiceWorkersView.ts +1 -1
  88. package/front_end/panels/application/StorageBucketsTreeElement.ts +1 -1
  89. package/front_end/panels/application/WebMCPView.ts +1 -1
  90. package/front_end/panels/application/components/AdsView.ts +136 -7
  91. package/front_end/panels/application/components/BackForwardCacheStrings.ts +116 -117
  92. package/front_end/panels/application/components/BackForwardCacheView.ts +7 -7
  93. package/front_end/panels/application/components/BounceTrackingMitigationsView.ts +2 -2
  94. package/front_end/panels/application/components/PermissionsPolicySection.ts +2 -2
  95. package/front_end/panels/application/components/ProtocolHandlersView.ts +1 -1
  96. package/front_end/panels/application/components/ReportsGrid.ts +1 -1
  97. package/front_end/panels/application/components/StorageMetadataView.ts +1 -1
  98. package/front_end/panels/application/components/TrustTokensView.ts +3 -3
  99. package/front_end/panels/application/components/adScriptsTable.css +22 -0
  100. package/front_end/panels/application/preloading/PreloadingView.ts +20 -22
  101. package/front_end/panels/application/preloading/components/MismatchedPreloadingGrid.ts +9 -9
  102. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +31 -33
  103. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +23 -23
  104. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +4 -4
  105. package/front_end/panels/application/preloading/components/PreloadingString.ts +161 -161
  106. package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -6
  107. package/front_end/panels/application/preloading/components/RuleSetGrid.ts +8 -8
  108. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +32 -32
  109. package/front_end/panels/application/resourcesPanel.css +17 -17
  110. package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +1 -1
  111. package/front_end/panels/changes/ChangesView.ts +1 -1
  112. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +1 -1
  113. package/front_end/panels/common/CPUThrottlingOption.ts +0 -1
  114. package/front_end/panels/common/GdpSignUpDialog.ts +3 -4
  115. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +1 -1
  116. package/front_end/panels/console/ConsoleInsightTeaser.ts +1 -1
  117. package/front_end/panels/console/ConsolePinPane.ts +0 -1
  118. package/front_end/panels/console/ConsoleView.ts +2 -3
  119. package/front_end/panels/console/ConsoleViewMessage.ts +2 -3
  120. package/front_end/panels/coverage/CoverageListView.ts +6 -6
  121. package/front_end/panels/coverage/CoverageView.ts +7 -7
  122. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +1 -1
  123. package/front_end/panels/elements/CSSRuleValidator.ts +10 -10
  124. package/front_end/panels/elements/ElementsPanel.ts +3 -3
  125. package/front_end/panels/elements/ElementsTreeElement.ts +1 -1
  126. package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
  127. package/front_end/panels/elements/LayoutPane.ts +1 -1
  128. package/front_end/panels/elements/StylePropertyTreeElement.ts +85 -2
  129. package/front_end/panels/elements/StylesSidebarPane.ts +3 -3
  130. package/front_end/panels/elements/stylePropertiesTreeOutline.css +2 -1
  131. package/front_end/panels/emulation/DeviceModeView.ts +1 -1
  132. package/front_end/panels/event_listeners/EventListenersView.ts +57 -89
  133. package/front_end/panels/explain/components/ConsoleInsight.ts +4 -4
  134. package/front_end/panels/issues/AffectedPartitioningBlobURLView.ts +3 -3
  135. package/front_end/panels/issues/IssuesPane.ts +1 -1
  136. package/front_end/panels/layer_viewer/Layers3DView.ts +4 -4
  137. package/front_end/panels/layers/LayerTreeModel.ts +1 -1
  138. package/front_end/panels/lighthouse/LighthouseController.ts +4 -4
  139. package/front_end/panels/lighthouse/LighthouseStatusView.ts +10 -10
  140. package/front_end/panels/lighthouse/LighthouseTimespanView.ts +2 -2
  141. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +1 -1
  142. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +1 -1
  143. package/front_end/panels/media/MainView.ts +2 -2
  144. package/front_end/panels/mobile_throttling/CalibrationController.ts +4 -1
  145. package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +1 -1
  146. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +10 -0
  147. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +3 -3
  148. package/front_end/panels/network/NetworkConfigView.ts +26 -16
  149. package/front_end/panels/network/NetworkItemView.ts +1 -1
  150. package/front_end/panels/network/NetworkLogView.ts +4 -5
  151. package/front_end/panels/network/NetworkPanel.ts +1 -1
  152. package/front_end/panels/network/RequestConditionsDrawer.ts +3 -3
  153. package/front_end/panels/network/RequestCookiesView.ts +2 -2
  154. package/front_end/panels/network/RequestPayloadView.ts +0 -2
  155. package/front_end/panels/network/RequestTimingView.ts +1 -1
  156. package/front_end/panels/network/ResourceChunkView.ts +1 -1
  157. package/front_end/panels/network/components/HeaderSectionRow.ts +2 -2
  158. package/front_end/panels/network/components/RequestHeaderSection.ts +1 -1
  159. package/front_end/panels/network/components/RequestTrustTokensView.ts +7 -7
  160. package/front_end/panels/network/components/ResponseHeaderSection.ts +3 -4
  161. package/front_end/panels/network/network-meta.ts +1 -1
  162. package/front_end/panels/profiler/HeapDetachedElementsView.ts +1 -1
  163. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +10 -10
  164. package/front_end/panels/profiler/HeapSnapshotView.ts +1 -1
  165. package/front_end/panels/profiler/IsolateSelector.ts +4 -4
  166. package/front_end/panels/profiler/ModuleUIStrings.ts +1 -1
  167. package/front_end/panels/profiler/ProfilesPanel.ts +2 -3
  168. package/front_end/panels/recorder/RecorderPanel.ts +1 -1
  169. package/front_end/panels/search/SearchView.ts +6 -6
  170. package/front_end/panels/security/SecurityModel.ts +4 -4
  171. package/front_end/panels/security/SecurityPanel.ts +83 -54
  172. package/front_end/panels/security/SecurityPanelSidebar.ts +41 -5
  173. package/front_end/panels/security/sidebar.css +9 -10
  174. package/front_end/panels/sensors/SensorsView.ts +1 -1
  175. package/front_end/panels/settings/AISettingsTab.ts +9 -9
  176. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +1 -1
  177. package/front_end/panels/settings/KeybindsSettingsTab.ts +2 -2
  178. package/front_end/panels/settings/SettingsScreen.ts +156 -109
  179. package/front_end/panels/settings/WorkspaceSettingsTab.ts +1 -1
  180. package/front_end/panels/settings/components/SyncSection.ts +3 -3
  181. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +13 -13
  182. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +2 -2
  183. package/front_end/panels/snippets/SnippetsQuickOpen.ts +1 -1
  184. package/front_end/panels/sources/CSSPlugin.ts +3 -3
  185. package/front_end/panels/sources/DebuggerPlugin.ts +4 -4
  186. package/front_end/panels/sources/NavigatorView.ts +3 -3
  187. package/front_end/panels/sources/OutlineQuickOpen.ts +1 -1
  188. package/front_end/panels/sources/PersistenceActions.ts +2 -2
  189. package/front_end/panels/sources/SourcesNavigator.ts +5 -5
  190. package/front_end/panels/sources/TabbedEditorContainer.ts +1 -1
  191. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +0 -1
  192. package/front_end/panels/sources/components/HeadersView.ts +1 -1
  193. package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +1 -1
  194. package/front_end/panels/timeline/TimelinePaintProfilerView.ts +1 -1
  195. package/front_end/panels/timeline/TimelineUIUtils.ts +0 -1
  196. package/front_end/panels/timeline/components/ExportTraceOptions.ts +2 -2
  197. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +4 -4
  198. package/front_end/panels/timeline/components/IgnoreListSetting.ts +1 -1
  199. package/front_end/panels/timeline/components/LiveMetricsView.ts +7 -7
  200. package/front_end/panels/timeline/components/MetricCard.ts +3 -3
  201. package/front_end/panels/timeline/components/MetricCompareStrings.ts +12 -14
  202. package/front_end/panels/timeline/components/OriginMap.ts +3 -3
  203. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +4 -4
  204. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +6 -0
  205. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +1 -1
  206. package/front_end/panels/timeline/overlays/components/TimespanBreakdownOverlay.ts +3 -1
  207. package/front_end/panels/timeline/timelineMiniMap.css +9 -9
  208. package/front_end/panels/timeline/timelineStatusDialog.css +9 -9
  209. package/front_end/panels/web_audio/WebAudioView.ts +1 -1
  210. package/front_end/panels/webauthn/WebauthnPane.ts +1 -1
  211. package/front_end/third_party/chromium/README.chromium +1 -1
  212. package/front_end/ui/comments/CommentAnchorResolver.ts +114 -3
  213. package/front_end/ui/comments/CommentOverlayManager.ts +95 -16
  214. package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +1 -1
  215. package/front_end/ui/components/markdown_view/codeBlock.css +3 -8
  216. package/front_end/ui/components/markdown_view/markdownView.css +2 -7
  217. package/front_end/ui/components/panel_feedback/PanelFeedback.ts +2 -2
  218. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
  219. package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +1 -1
  220. package/front_end/ui/components/text_editor/AiCodeCompletionTeaser.ts +4 -4
  221. package/front_end/ui/components/text_editor/AiCodeGenerationTeaser.ts +3 -3
  222. package/front_end/{models → ui}/geometry/GeometryImpl.ts +4 -40
  223. package/front_end/ui/legacy/GlassPane.ts +1 -1
  224. package/front_end/ui/legacy/RemoteDebuggingTerminatedScreen.ts +2 -2
  225. package/front_end/ui/legacy/SoftDropDown.ts +1 -1
  226. package/front_end/ui/legacy/SplitWidget.ts +1 -1
  227. package/front_end/ui/legacy/SuggestBox.ts +1 -1
  228. package/front_end/ui/legacy/TabbedPane.ts +1 -1
  229. package/front_end/ui/legacy/TargetCrashedScreen.ts +2 -2
  230. package/front_end/ui/legacy/Treeoutline.ts +5 -1
  231. package/front_end/ui/legacy/UIUtils.ts +1 -1
  232. package/front_end/ui/legacy/Widget.ts +1 -1
  233. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -1
  234. package/front_end/ui/legacy/components/inline_editor/AnimationTimingModel.ts +1 -1
  235. package/front_end/ui/legacy/components/inline_editor/AnimationTimingUI.ts +1 -1
  236. package/front_end/ui/legacy/components/inline_editor/BezierUI.ts +1 -1
  237. package/front_end/ui/legacy/components/inline_editor/CSSAngleUtils.ts +1 -1
  238. package/front_end/ui/legacy/components/inline_editor/CSSShadowEditor.ts +1 -1
  239. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.ts +204 -17
  240. package/front_end/ui/legacy/components/inline_editor/positionAreaEditor.css +6 -0
  241. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
  242. package/front_end/ui/legacy/components/perf_ui/FilmStripView.ts +1 -1
  243. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +7 -9
  244. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +1 -1
  245. package/front_end/ui/visual_logging/KnownContextValues.ts +12 -0
  246. package/package.json +7 -4
  247. /package/front_end/{models → ui}/geometry/geometry.ts +0 -0
@@ -4,6 +4,7 @@
4
4
 
5
5
  import '../../../ui/legacy/components/data_grid/data_grid.js';
6
6
  import '../../../ui/kit/kit.js';
7
+ import '../../../ui/components/tooltips/tooltips.js';
7
8
 
8
9
  import * as Common from '../../../core/common/common.js';
9
10
  import * as i18n from '../../../core/i18n/i18n.js';
@@ -15,6 +16,7 @@ import * as UI from '../../../ui/legacy/legacy.js';
15
16
  import * as Lit from '../../../ui/lit/lit.js';
16
17
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
17
18
 
19
+ import adScriptsTableStyles from './adScriptsTable.css.js';
18
20
  import adsViewStyles from './adsView.css.js';
19
21
 
20
22
  const {html} = Lit;
@@ -93,6 +95,30 @@ const UIStrings = {
93
95
  * @description Accessible name for the ad scripts table.
94
96
  */
95
97
  adScripts: 'Ad scripts',
98
+ /**
99
+ * @description Title for the ad provenance column in the ad scripts table.
100
+ */
101
+ adProvenance: 'Ad provenance',
102
+ /**
103
+ * @description Text to display when a script has no provenance.
104
+ */
105
+ noProvenance: '<no provenance>',
106
+ /**
107
+ * @description Text to display in the tooltip when a script has no provenance.
108
+ */
109
+ noProvenanceTooltip: 'No provenance data is available',
110
+ /**
111
+ * @description Title for the filter list rule in the ad provenance tooltip.
112
+ */
113
+ filterListRule: 'Filter list rule',
114
+ /**
115
+ * @description Title for the root script filter list rule in the ad provenance tooltip.
116
+ */
117
+ rootScriptFilterListRule: 'Root script filter list rule',
118
+ /**
119
+ * @description Title for the creator ad script ancestry in the ad provenance tooltip.
120
+ */
121
+ creatorAdScriptAncestry: 'Creator ad script ancestry',
96
122
  /**
97
123
  * @description Title for the settings section.
98
124
  */
@@ -105,11 +131,11 @@ const UIStrings = {
105
131
  /**
106
132
  * @description Explanation text for the 'Highlight ads' setting.
107
133
  */
108
- highlightsElementsRedDetectedToBe: 'Highlights elements (red) detected to be ads.',
134
+ highlightsElementsRedDetectedToBe: 'Highlights elements (red) detected to be ads',
109
135
  /**
110
136
  * @description Text explaining that ad detection is not perfect.
111
137
  */
112
- adDetectionMistakes: 'Chrome’s ad detection can make mistakes.',
138
+ adDetectionMistakes: 'Chrome’s ad detection can make mistakes',
113
139
  /**
114
140
  * @description Link text for learning more about ad detection in Chrome.
115
141
  */
@@ -134,12 +160,16 @@ interface AdFrameNodeData {
134
160
 
135
161
  interface AdScriptNodeData {
136
162
  url: Platform.DevToolsPath.UrlString;
163
+ parsedProvenance: Protocol.Network.AdProvenance|null;
164
+ scriptId: Protocol.Runtime.ScriptId;
137
165
  }
138
166
 
139
167
  export interface ViewInput {
140
168
  metrics: Protocol.Ads.AdMetrics;
141
169
  adFrames: AdFrameNodeData[];
142
170
  adScripts: AdScriptNodeData[];
171
+ target: SDK.Target.Target|null;
172
+ getLinkElement: (url: string) => HTMLElement;
143
173
  }
144
174
 
145
175
  export type View = (input: ViewInput, output: undefined, target: HTMLElement|DocumentFragment) => void;
@@ -159,6 +189,11 @@ const formatNetwork = (val: number|undefined): string => {
159
189
  return formatMetric(val, (v: number): string => i18n.ByteUtilities.bytesToString(v));
160
190
  };
161
191
 
192
+ const SCRIPT_LINK_OPTIONS = {
193
+ jslogContext: 'ad-script',
194
+ };
195
+ const stopPropagation = (e: Event): void => e.stopPropagation();
196
+
162
197
  const DEFAULT_VIEW: View = (input, output, target) => {
163
198
  const metrics = input.metrics;
164
199
 
@@ -268,13 +303,55 @@ const DEFAULT_VIEW: View = (input, output, target) => {
268
303
  <div class="ad-scripts-container">
269
304
  <devtools-data-grid striped resize="last" class="ad-scripts-data-grid" name=${i18nString(UIStrings.adScripts)}>
270
305
  <table>
306
+ ${Lit.Directives.unsafeHTML(`<style>${adScriptsTableStyles}</style>`)}
271
307
  <tr>
272
308
  <th id="url" weight="1" sortable>${i18nString(UIStrings.url)}</th>
309
+ <th id="provenance" weight="1" sortable>${i18nString(UIStrings.adProvenance)}</th>
273
310
  </tr>
274
311
  ${repeat(input.adScripts, script => script.url, script => html`
275
312
  <tr>
276
313
  <td title=${script.url}>
277
- ${Components.Linkifier.Linkifier.renderLinkifiedUrl(script.url, {text: script.url})}
314
+ ${input.getLinkElement(script.url)}
315
+ </td>
316
+ <td>
317
+ <devtools-tooltip id=${`ad-tooltip-${script.scriptId}`} variant=rich @copy=${stopPropagation}>
318
+ <div class="ad-provenance-tooltip">
319
+ ${script.parsedProvenance?.filterlistRule ? html`
320
+ <div class="ad-provenance-tooltip-title">${i18nString(UIStrings.filterListRule)}</div>
321
+ <div class="ad-provenance-tooltip-content">${script.parsedProvenance.filterlistRule}</div>
322
+ ` : Lit.nothing}
323
+ ${script.parsedProvenance?.adScriptAncestry ? html`
324
+ <div class="ad-provenance-tooltip-title">${i18nString(UIStrings.creatorAdScriptAncestry)}</div>
325
+ <div class="ad-provenance-tooltip-content">
326
+ ${input.target ? script.parsedProvenance.adScriptAncestry.ancestryChain.map(ancestor => html`
327
+ <div>
328
+ ${UI.Widget.widget(Components.Linkifier.ScriptLocationLink, {
329
+ target: input.target ?? undefined,
330
+ scriptId: ancestor.scriptId,
331
+ options: SCRIPT_LINK_OPTIONS,
332
+ })}
333
+ </div>
334
+ `) : Lit.nothing}
335
+ </div>
336
+ ${script.parsedProvenance.adScriptAncestry.rootScriptFilterlistRule ? html`
337
+ <div class="ad-provenance-tooltip-title">${i18nString(UIStrings.rootScriptFilterListRule)}</div>
338
+ <div class="ad-provenance-tooltip-content">${script.parsedProvenance.adScriptAncestry.rootScriptFilterlistRule}</div>
339
+ ` : Lit.nothing}
340
+ ` : Lit.nothing}
341
+ ${!script.parsedProvenance?.adScriptAncestry && !script.parsedProvenance?.filterlistRule ? i18nString(UIStrings.noProvenanceTooltip) : Lit.nothing}
342
+ </div>
343
+ </devtools-tooltip>
344
+ <div aria-details=${`ad-tooltip-${script.scriptId}`}>
345
+ ${script.parsedProvenance?.filterlistRule ? html`<span>${script.parsedProvenance.filterlistRule}</span>` : Lit.nothing}
346
+ ${script.parsedProvenance?.filterlistRule && script.parsedProvenance?.adScriptAncestry && input.target ? html`<span>, </span>` : Lit.nothing}
347
+ ${script.parsedProvenance?.adScriptAncestry && input.target ?
348
+ UI.Widget.widget(Components.Linkifier.ScriptLocationLink, {
349
+ target: input.target ?? undefined,
350
+ scriptId: script.parsedProvenance.adScriptAncestry.ancestryChain[0].scriptId,
351
+ options: SCRIPT_LINK_OPTIONS,
352
+ }) : Lit.nothing}
353
+ ${!script.parsedProvenance?.adScriptAncestry && !script.parsedProvenance?.filterlistRule ? i18nString(UIStrings.noProvenance) : Lit.nothing}
354
+ </div>
278
355
  </td>
279
356
  </tr>
280
357
  `)}
@@ -319,7 +396,8 @@ export class AdsView extends UI.Widget.Widget {
319
396
  readonly #fetchingElementIds = new Set<Protocol.Page.FrameId>();
320
397
  readonly #unresolvedScriptIds = new Set<Protocol.Runtime.ScriptId>();
321
398
  readonly #adScriptNodeData: AdScriptNodeData[] = [];
322
- readonly #seenUrls = new Set<string>();
399
+ readonly #urlToLinkElement = new Map<string, HTMLElement>();
400
+ readonly #reconstructedProvenance = new Map<Protocol.Runtime.ScriptId, Protocol.Network.AdProvenance>();
323
401
 
324
402
  constructor(view: View = DEFAULT_VIEW) {
325
403
  super({useShadowDom: true});
@@ -447,9 +525,54 @@ export class AdsView extends UI.Widget.Widget {
447
525
  }
448
526
  }
449
527
 
528
+ // Lazily reconstructs the full script ancestry chain for a given script.
529
+ // The backend guarantees that scripts across different batches are ordered
530
+ // correctly (i.e., an ancestor script will always be sent in the same or an
531
+ // earlier batch than its descendants). However, scripts arriving within the
532
+ // same batch may be out of order. This recursive, topological approach ensures
533
+ // we can resolve those in-batch ordering issues while maintaining O(N)
534
+ // complexity overall via memoization in #reconstructedProvenance.
535
+ #reconstructProvenance(scriptId: Protocol.Runtime.ScriptId,
536
+ newScriptsMap: Map<Protocol.Runtime.ScriptId, Protocol.Ads.AdScript>):
537
+ Protocol.Network.AdProvenance|null {
538
+ if (this.#reconstructedProvenance.has(scriptId)) {
539
+ return this.#reconstructedProvenance.get(scriptId) ?? null;
540
+ }
541
+ const script = newScriptsMap.get(scriptId);
542
+ if (!script || !script.provenance) {
543
+ return null;
544
+ }
545
+
546
+ let fullProvenance: Protocol.Network.AdProvenance = script.provenance;
547
+ if (script.provenance.adScriptAncestry) {
548
+ const immediateAncestor = script.provenance.adScriptAncestry.ancestryChain[0];
549
+ const ancestorProvenance =
550
+ immediateAncestor ? this.#reconstructProvenance(immediateAncestor.scriptId, newScriptsMap) : null;
551
+ if (ancestorProvenance) {
552
+ const newChain = [immediateAncestor];
553
+ if (ancestorProvenance.adScriptAncestry) {
554
+ newChain.push(...ancestorProvenance.adScriptAncestry.ancestryChain);
555
+ }
556
+ const rootScriptFilterlistRule =
557
+ ancestorProvenance.filterlistRule || ancestorProvenance.adScriptAncestry?.rootScriptFilterlistRule;
558
+ fullProvenance = {
559
+ ...script.provenance,
560
+ adScriptAncestry: {
561
+ ancestryChain: newChain,
562
+ ...(rootScriptFilterlistRule ? {rootScriptFilterlistRule} : {}),
563
+ },
564
+ };
565
+ }
566
+ }
567
+ this.#reconstructedProvenance.set(scriptId, fullProvenance);
568
+ return fullProvenance;
569
+ }
570
+
450
571
  #processAdScripts(newScripts: Protocol.Ads.AdScript[]): void {
572
+ const newScriptsMap = new Map(newScripts.map(s => [s.scriptId, s]));
451
573
  for (const script of newScripts) {
452
574
  this.#unresolvedScriptIds.add(script.scriptId);
575
+ this.#reconstructProvenance(script.scriptId, newScriptsMap);
453
576
  }
454
577
  }
455
578
 
@@ -482,7 +605,8 @@ export class AdsView extends UI.Widget.Widget {
482
605
  this.#fetchingElementIds.clear();
483
606
  this.#unresolvedScriptIds.clear();
484
607
  this.#adScriptNodeData.length = 0;
485
- this.#seenUrls.clear();
608
+ this.#urlToLinkElement.clear();
609
+ this.#reconstructedProvenance.clear();
486
610
  this.requestUpdate();
487
611
  }
488
612
 
@@ -538,13 +662,16 @@ export class AdsView extends UI.Widget.Widget {
538
662
  // De-duplicate scripts by URL. V8 frequently generates multiple
539
663
  // ScriptIds for the same URL (e.g., when the same external script
540
664
  // is loaded into multiple iframes).
541
- if (this.#seenUrls.has(url)) {
665
+ if (this.#urlToLinkElement.has(url)) {
542
666
  continue;
543
667
  }
544
- this.#seenUrls.add(url);
668
+ this.#urlToLinkElement.set(url, Components.Linkifier.Linkifier.linkifyURL(url, {text: url}));
545
669
 
670
+ const parsedProvenance = this.#reconstructedProvenance.get(scriptId) ?? null;
546
671
  this.#adScriptNodeData.push({
547
672
  url,
673
+ parsedProvenance,
674
+ scriptId,
548
675
  });
549
676
  }
550
677
 
@@ -552,6 +679,8 @@ export class AdsView extends UI.Widget.Widget {
552
679
  metrics: this.#currentMetrics,
553
680
  adFrames: adFramesArray,
554
681
  adScripts: this.#adScriptNodeData,
682
+ target: target || null,
683
+ getLinkElement: (url: string) => this.#urlToLinkElement.get(url) as HTMLElement,
555
684
  };
556
685
  this.#view(viewInput, undefined, this.contentElement);
557
686
  }