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.
- package/eslint.config.mjs +4 -1
- package/front_end/core/common/Base64.ts +14 -4
- package/front_end/core/common/Gzip.ts +1 -1
- package/front_end/core/common/Object.ts +0 -1
- package/front_end/core/platform/Size.ts +43 -0
- package/front_end/core/platform/api/HostRuntime.ts +14 -0
- package/front_end/core/platform/browser/HostRuntime.ts +66 -0
- package/front_end/core/platform/node/HostRuntime.ts +12 -3
- package/front_end/core/platform/platform.ts +1 -0
- package/front_end/core/sdk/AccessibilityModel.ts +2 -2
- package/front_end/core/sdk/CSSMatchedStyles.ts +2 -0
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +29 -0
- package/front_end/core/sdk/CSSStyleSheetHeader.ts +2 -2
- package/front_end/core/sdk/ConsoleModel.ts +3 -3
- package/front_end/core/sdk/DOMModel.ts +10 -6
- package/front_end/core/sdk/DebuggerModel.ts +6 -0
- package/front_end/core/sdk/NetworkRequest.ts +19 -19
- package/front_end/core/sdk/RuntimeModel.ts +5 -0
- package/front_end/core/sdk/Script.ts +2 -2
- package/front_end/core/sdk/ServerTiming.ts +6 -6
- package/front_end/core/sdk/SourceMap.ts +112 -14
- package/front_end/core/sdk/SourceMapRangeMappings.ts +43 -0
- package/front_end/core/sdk/SourceMapScopeChainEntry.ts +15 -10
- package/front_end/core/sdk/SourceMapScopesInfo.ts +92 -10
- package/front_end/core/sdk/sdk.ts +2 -0
- package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +1 -1
- package/front_end/entrypoints/inspector_main/RenderingOptions.ts +6 -6
- package/front_end/entrypoints/main/MainImpl.ts +1 -1
- package/front_end/generated/InspectorBackendCommands.ts +6 -3
- package/front_end/generated/protocol-mapping.d.ts +7 -0
- package/front_end/generated/protocol-proxy-api.d.ts +5 -0
- package/front_end/generated/protocol.ts +36 -3
- package/front_end/models/ai_assistance/AiAgent2.ts +27 -27
- package/front_end/models/ai_assistance/agents/AiAgent.ts +4 -0
- package/front_end/models/ai_assistance/agents/PerformanceAgent.snapshot.txt +2 -2
- package/front_end/models/ai_assistance/contexts/AccessibilityContext.ts +1 -0
- package/front_end/models/ai_assistance/contexts/DOMNodeContext.ts +5 -4
- package/front_end/models/ai_assistance/contexts/FileContext.ts +1 -0
- package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +1 -0
- package/front_end/models/ai_assistance/contexts/RequestContext.ts +1 -0
- package/front_end/models/ai_assistance/contexts/StorageContext.ts +1 -0
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +5 -5
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +6 -6
- package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +5 -8
- package/front_end/models/ai_assistance/tools/GetNetworkRequestDetails.ts +4 -8
- package/front_end/models/ai_assistance/tools/GetSourceContent.ts +7 -5
- package/front_end/models/ai_assistance/tools/GetStyles.ts +10 -6
- package/front_end/models/ai_assistance/tools/ListSources.ts +26 -7
- package/front_end/models/ai_assistance/tools/ResolveDevtoolsNodePath.ts +5 -10
- package/front_end/models/ai_assistance/tools/Tool.ts +8 -1
- package/front_end/models/bindings/FileUtils.ts +18 -40
- package/front_end/models/bindings/TempFile.ts +5 -12
- package/front_end/models/comment_manager/CommentManager.ts +30 -6
- package/front_end/models/crux-manager/CrUXManager.ts +8 -5
- package/front_end/models/emulation/DeviceModeModel.ts +55 -105
- package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +1 -1
- package/front_end/models/issues_manager/CookieIssue.ts +1 -1
- package/front_end/models/issues_manager/DeprecationIssue.ts +2 -2
- package/front_end/models/javascript_metadata/NativeFunctions.ts +1 -5
- package/front_end/models/live-metrics/LiveMetrics.ts +1 -1
- package/front_end/models/persistence/IsolatedFileSystem.ts +16 -23
- package/front_end/models/trace/insights/DuplicatedJavaScript.ts +1 -1
- package/front_end/models/trace/insights/INPBreakdown.ts +1 -1
- package/front_end/models/trace/insights/ImageDelivery.ts +3 -3
- package/front_end/models/trace/insights/LCPDiscovery.ts +2 -2
- package/front_end/models/trace/insights/NetworkDependencyTree.ts +3 -3
- package/front_end/models/trace/insights/Viewport.ts +1 -1
- package/front_end/models/trace/types/Overlays.ts +2 -2
- package/front_end/panels/accessibility/AccessibilityNodeView.ts +2 -2
- package/front_end/panels/accessibility/AccessibilitySubPane.ts +0 -1
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +74 -18
- package/front_end/panels/ai_assistance/components/AIv2MarkdownRenderer.ts +14 -3
- package/front_end/panels/ai_assistance/components/ChatInput.ts +1 -1
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +1 -1
- package/front_end/panels/animation/AnimationUI.ts +1 -1
- package/front_end/panels/application/AppManifestView.ts +9 -11
- package/front_end/panels/application/ApplicationPanelSidebar.ts +9 -9
- package/front_end/panels/application/BackgroundServiceView.ts +1 -1
- package/front_end/panels/application/CookieItemsView.ts +1 -1
- package/front_end/panels/application/DOMStorageItemsView.ts +1 -1
- package/front_end/panels/application/DeviceBoundSessionsView.ts +2 -2
- package/front_end/panels/application/FrameDetailsView.ts +5 -5
- package/front_end/panels/application/IndexedDBViews.ts +2 -2
- package/front_end/panels/application/KeyValueStorageItemsView.ts +1 -2
- package/front_end/panels/application/ReportingApiView.ts +1 -1
- package/front_end/panels/application/ServiceWorkerCacheTreeElement.ts +1 -1
- package/front_end/panels/application/ServiceWorkersView.ts +1 -1
- package/front_end/panels/application/StorageBucketsTreeElement.ts +1 -1
- package/front_end/panels/application/WebMCPView.ts +1 -1
- package/front_end/panels/application/components/AdsView.ts +136 -7
- package/front_end/panels/application/components/BackForwardCacheStrings.ts +116 -117
- package/front_end/panels/application/components/BackForwardCacheView.ts +7 -7
- package/front_end/panels/application/components/BounceTrackingMitigationsView.ts +2 -2
- package/front_end/panels/application/components/PermissionsPolicySection.ts +2 -2
- package/front_end/panels/application/components/ProtocolHandlersView.ts +1 -1
- package/front_end/panels/application/components/ReportsGrid.ts +1 -1
- package/front_end/panels/application/components/StorageMetadataView.ts +1 -1
- package/front_end/panels/application/components/TrustTokensView.ts +3 -3
- package/front_end/panels/application/components/adScriptsTable.css +22 -0
- package/front_end/panels/application/preloading/PreloadingView.ts +20 -22
- package/front_end/panels/application/preloading/components/MismatchedPreloadingGrid.ts +9 -9
- package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +31 -33
- package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +23 -23
- package/front_end/panels/application/preloading/components/PreloadingGrid.ts +4 -4
- package/front_end/panels/application/preloading/components/PreloadingString.ts +161 -161
- package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -6
- package/front_end/panels/application/preloading/components/RuleSetGrid.ts +8 -8
- package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +32 -32
- package/front_end/panels/application/resourcesPanel.css +17 -17
- package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +1 -1
- package/front_end/panels/changes/ChangesView.ts +1 -1
- package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +1 -1
- package/front_end/panels/common/CPUThrottlingOption.ts +0 -1
- package/front_end/panels/common/GdpSignUpDialog.ts +3 -4
- package/front_end/panels/common/GeminiRebrandPromoDialog.ts +1 -1
- package/front_end/panels/console/ConsoleInsightTeaser.ts +1 -1
- package/front_end/panels/console/ConsolePinPane.ts +0 -1
- package/front_end/panels/console/ConsoleView.ts +2 -3
- package/front_end/panels/console/ConsoleViewMessage.ts +2 -3
- package/front_end/panels/coverage/CoverageListView.ts +6 -6
- package/front_end/panels/coverage/CoverageView.ts +7 -7
- package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +1 -1
- package/front_end/panels/elements/CSSRuleValidator.ts +10 -10
- package/front_end/panels/elements/ElementsPanel.ts +3 -3
- package/front_end/panels/elements/ElementsTreeElement.ts +1 -1
- package/front_end/panels/elements/ElementsTreeOutline.ts +1 -1
- package/front_end/panels/elements/LayoutPane.ts +1 -1
- package/front_end/panels/elements/StylePropertyTreeElement.ts +85 -2
- package/front_end/panels/elements/StylesSidebarPane.ts +3 -3
- package/front_end/panels/elements/stylePropertiesTreeOutline.css +2 -1
- package/front_end/panels/emulation/DeviceModeView.ts +1 -1
- package/front_end/panels/event_listeners/EventListenersView.ts +57 -89
- package/front_end/panels/explain/components/ConsoleInsight.ts +4 -4
- package/front_end/panels/issues/AffectedPartitioningBlobURLView.ts +3 -3
- package/front_end/panels/issues/IssuesPane.ts +1 -1
- package/front_end/panels/layer_viewer/Layers3DView.ts +4 -4
- package/front_end/panels/layers/LayerTreeModel.ts +1 -1
- package/front_end/panels/lighthouse/LighthouseController.ts +4 -4
- package/front_end/panels/lighthouse/LighthouseStatusView.ts +10 -10
- package/front_end/panels/lighthouse/LighthouseTimespanView.ts +2 -2
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +1 -1
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +1 -1
- package/front_end/panels/media/MainView.ts +2 -2
- package/front_end/panels/mobile_throttling/CalibrationController.ts +4 -1
- package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +1 -1
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +10 -0
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +3 -3
- package/front_end/panels/network/NetworkConfigView.ts +26 -16
- package/front_end/panels/network/NetworkItemView.ts +1 -1
- package/front_end/panels/network/NetworkLogView.ts +4 -5
- package/front_end/panels/network/NetworkPanel.ts +1 -1
- package/front_end/panels/network/RequestConditionsDrawer.ts +3 -3
- package/front_end/panels/network/RequestCookiesView.ts +2 -2
- package/front_end/panels/network/RequestPayloadView.ts +0 -2
- package/front_end/panels/network/RequestTimingView.ts +1 -1
- package/front_end/panels/network/ResourceChunkView.ts +1 -1
- package/front_end/panels/network/components/HeaderSectionRow.ts +2 -2
- package/front_end/panels/network/components/RequestHeaderSection.ts +1 -1
- package/front_end/panels/network/components/RequestTrustTokensView.ts +7 -7
- package/front_end/panels/network/components/ResponseHeaderSection.ts +3 -4
- package/front_end/panels/network/network-meta.ts +1 -1
- package/front_end/panels/profiler/HeapDetachedElementsView.ts +1 -1
- package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +10 -10
- package/front_end/panels/profiler/HeapSnapshotView.ts +1 -1
- package/front_end/panels/profiler/IsolateSelector.ts +4 -4
- package/front_end/panels/profiler/ModuleUIStrings.ts +1 -1
- package/front_end/panels/profiler/ProfilesPanel.ts +2 -3
- package/front_end/panels/recorder/RecorderPanel.ts +1 -1
- package/front_end/panels/search/SearchView.ts +6 -6
- package/front_end/panels/security/SecurityModel.ts +4 -4
- package/front_end/panels/security/SecurityPanel.ts +83 -54
- package/front_end/panels/security/SecurityPanelSidebar.ts +41 -5
- package/front_end/panels/security/sidebar.css +9 -10
- package/front_end/panels/sensors/SensorsView.ts +1 -1
- package/front_end/panels/settings/AISettingsTab.ts +9 -9
- package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +1 -1
- package/front_end/panels/settings/KeybindsSettingsTab.ts +2 -2
- package/front_end/panels/settings/SettingsScreen.ts +156 -109
- package/front_end/panels/settings/WorkspaceSettingsTab.ts +1 -1
- package/front_end/panels/settings/components/SyncSection.ts +3 -3
- package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +13 -13
- package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +2 -2
- package/front_end/panels/snippets/SnippetsQuickOpen.ts +1 -1
- package/front_end/panels/sources/CSSPlugin.ts +3 -3
- package/front_end/panels/sources/DebuggerPlugin.ts +4 -4
- package/front_end/panels/sources/NavigatorView.ts +3 -3
- package/front_end/panels/sources/OutlineQuickOpen.ts +1 -1
- package/front_end/panels/sources/PersistenceActions.ts +2 -2
- package/front_end/panels/sources/SourcesNavigator.ts +5 -5
- package/front_end/panels/sources/TabbedEditorContainer.ts +1 -1
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +0 -1
- package/front_end/panels/sources/components/HeadersView.ts +1 -1
- package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +1 -1
- package/front_end/panels/timeline/TimelinePaintProfilerView.ts +1 -1
- package/front_end/panels/timeline/TimelineUIUtils.ts +0 -1
- package/front_end/panels/timeline/components/ExportTraceOptions.ts +2 -2
- package/front_end/panels/timeline/components/FieldSettingsDialog.ts +4 -4
- package/front_end/panels/timeline/components/IgnoreListSetting.ts +1 -1
- package/front_end/panels/timeline/components/LiveMetricsView.ts +7 -7
- package/front_end/panels/timeline/components/MetricCard.ts +3 -3
- package/front_end/panels/timeline/components/MetricCompareStrings.ts +12 -14
- package/front_end/panels/timeline/components/OriginMap.ts +3 -3
- package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +4 -4
- package/front_end/panels/timeline/overlays/OverlaysImpl.ts +6 -0
- package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +1 -1
- package/front_end/panels/timeline/overlays/components/TimespanBreakdownOverlay.ts +3 -1
- package/front_end/panels/timeline/timelineMiniMap.css +9 -9
- package/front_end/panels/timeline/timelineStatusDialog.css +9 -9
- package/front_end/panels/web_audio/WebAudioView.ts +1 -1
- package/front_end/panels/webauthn/WebauthnPane.ts +1 -1
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/comments/CommentAnchorResolver.ts +114 -3
- package/front_end/ui/comments/CommentOverlayManager.ts +95 -16
- package/front_end/ui/components/dialogs/TypeToAllowDialog.ts +1 -1
- package/front_end/ui/components/markdown_view/codeBlock.css +3 -8
- package/front_end/ui/components/markdown_view/markdownView.css +2 -7
- package/front_end/ui/components/panel_feedback/PanelFeedback.ts +2 -2
- package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
- package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +1 -1
- package/front_end/ui/components/text_editor/AiCodeCompletionTeaser.ts +4 -4
- package/front_end/ui/components/text_editor/AiCodeGenerationTeaser.ts +3 -3
- package/front_end/{models → ui}/geometry/GeometryImpl.ts +4 -40
- package/front_end/ui/legacy/GlassPane.ts +1 -1
- package/front_end/ui/legacy/RemoteDebuggingTerminatedScreen.ts +2 -2
- package/front_end/ui/legacy/SoftDropDown.ts +1 -1
- package/front_end/ui/legacy/SplitWidget.ts +1 -1
- package/front_end/ui/legacy/SuggestBox.ts +1 -1
- package/front_end/ui/legacy/TabbedPane.ts +1 -1
- package/front_end/ui/legacy/TargetCrashedScreen.ts +2 -2
- package/front_end/ui/legacy/Treeoutline.ts +5 -1
- package/front_end/ui/legacy/UIUtils.ts +1 -1
- package/front_end/ui/legacy/Widget.ts +1 -1
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -1
- package/front_end/ui/legacy/components/inline_editor/AnimationTimingModel.ts +1 -1
- package/front_end/ui/legacy/components/inline_editor/AnimationTimingUI.ts +1 -1
- package/front_end/ui/legacy/components/inline_editor/BezierUI.ts +1 -1
- package/front_end/ui/legacy/components/inline_editor/CSSAngleUtils.ts +1 -1
- package/front_end/ui/legacy/components/inline_editor/CSSShadowEditor.ts +1 -1
- package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.ts +204 -17
- package/front_end/ui/legacy/components/inline_editor/positionAreaEditor.css +6 -0
- package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
- package/front_end/ui/legacy/components/perf_ui/FilmStripView.ts +1 -1
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +7 -9
- package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +1 -1
- package/front_end/ui/visual_logging/KnownContextValues.ts +12 -0
- package/package.json +7 -4
- /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
|
-
${
|
|
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 #
|
|
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.#
|
|
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.#
|
|
665
|
+
if (this.#urlToLinkElement.has(url)) {
|
|
542
666
|
continue;
|
|
543
667
|
}
|
|
544
|
-
this.#
|
|
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
|
}
|