chrome-devtools-frontend 1.0.1515446 → 1.0.1515988
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/docs/contributing/infrastructure.md +131 -82
- package/front_end/Tests.js +3 -29
- package/front_end/core/common/Progress.ts +73 -55
- package/front_end/core/host/UserMetrics.ts +0 -1
- package/front_end/core/protocol_client/InspectorBackend.ts +2 -0
- package/front_end/core/root/Runtime.ts +0 -1
- package/front_end/core/sdk/CSSMatchedStyles.ts +12 -10
- package/front_end/core/sdk/CSSModel.ts +1 -31
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +27 -7
- package/front_end/core/sdk/DebuggerModel.ts +1 -31
- package/front_end/core/sdk/EnhancedTracesParser.ts +81 -50
- package/front_end/core/sdk/NetworkManager.ts +1 -31
- package/front_end/core/sdk/NetworkRequest.ts +1 -31
- package/front_end/core/sdk/RehydratingConnection.snapshot.txt +1003 -0
- package/front_end/core/sdk/RehydratingConnection.ts +13 -18
- package/front_end/core/sdk/RehydratingObject.ts +8 -31
- package/front_end/core/sdk/RemoteObject.ts +1 -31
- package/front_end/core/sdk/ResourceTreeModel.ts +1 -31
- package/front_end/core/sdk/RuntimeModel.ts +1 -31
- package/front_end/core/sdk/ServiceWorkerManager.ts +1 -31
- package/front_end/core/sdk/SourceMap.ts +1 -31
- package/front_end/core/sdk/TraceObject.ts +8 -3
- package/front_end/entrypoints/main/MainImpl.ts +0 -2
- package/front_end/entrypoints/main/main-meta.ts +2 -2
- package/front_end/generated/InspectorBackendCommands.js +4 -4
- package/front_end/generated/SupportedCSSProperties.js +12 -0
- package/front_end/generated/protocol.ts +10 -1
- package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -3
- package/front_end/models/ai_assistance/ConversationHandler.ts +4 -6
- package/front_end/models/ai_assistance/agents/AiAgent.ts +4 -1
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +107 -72
- package/front_end/models/ai_assistance/agents/PerformanceAnnotationsAgent.ts +2 -2
- package/front_end/models/ai_assistance/agents/StylingAgent.ts +2 -2
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +178 -85
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +308 -218
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +161 -97
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +78 -58
- package/front_end/models/ai_assistance/data_formatters/UnitFormatters.ts +10 -1
- package/front_end/models/ai_assistance/performance/AIContext.ts +19 -21
- package/front_end/models/ai_code_completion/AiCodeCompletion.ts +123 -55
- package/front_end/models/bindings/ContentProviderBasedProject.ts +6 -4
- package/front_end/models/breakpoints/BreakpointManager.ts +3 -3
- package/front_end/models/har/Writer.ts +11 -11
- package/front_end/models/javascript_metadata/NativeFunctions.js +7 -7
- package/front_end/models/persistence/FileSystemWorkspaceBinding.ts +3 -3
- package/front_end/models/persistence/IsolatedFileSystem.ts +4 -4
- package/front_end/models/persistence/IsolatedFileSystemManager.ts +7 -7
- package/front_end/models/persistence/PersistenceImpl.ts +8 -8
- package/front_end/models/persistence/PlatformFileSystem.ts +1 -1
- package/front_end/models/text_utils/TextUtils.ts +26 -0
- package/front_end/models/trace/ModelImpl.ts +2 -16
- package/front_end/models/trace/Processor.ts +14 -8
- package/front_end/models/trace/handlers/AuctionWorkletsHandler.ts +4 -4
- package/front_end/models/trace/handlers/FramesHandler.ts +2 -2
- package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +7 -10
- package/front_end/models/trace/handlers/MetaHandler.ts +11 -9
- package/front_end/models/trace/handlers/ScreenshotsHandler.ts +1 -1
- package/front_end/models/trace/handlers/ScriptsHandler.ts +5 -5
- package/front_end/models/trace/handlers/UserInteractionsHandler.ts +2 -14
- package/front_end/models/trace/handlers/UserTimingsHandler.ts +3 -4
- package/front_end/models/trace/insights/CLSCulprits.ts +1 -1
- package/front_end/models/trace/insights/DocumentLatency.ts +8 -7
- 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 +1 -1
- package/front_end/models/trace/insights/LCPBreakdown.ts +1 -1
- package/front_end/models/trace/insights/LCPDiscovery.ts +1 -1
- package/front_end/models/trace/insights/ModernHTTP.ts +1 -1
- package/front_end/models/trace/insights/NetworkDependencyTree.ts +1 -1
- package/front_end/models/trace/insights/RenderBlocking.ts +1 -1
- package/front_end/models/trace/insights/types.ts +2 -0
- package/front_end/models/trace/types/Configuration.ts +12 -0
- package/front_end/models/trace/types/TraceEvents.ts +41 -64
- package/front_end/models/trace_source_maps_resolver/trace_source_maps_resolver.ts +1 -1
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +21 -99
- package/front_end/panels/application/ServiceWorkersView.ts +0 -1
- package/front_end/panels/application/components/BackForwardCacheStrings.ts +8 -2
- package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +2 -3
- package/front_end/panels/common/BadgeNotification.ts +10 -8
- package/front_end/panels/common/GdpSignUpDialog.ts +30 -14
- package/front_end/panels/common/gdpSignUpDialog.css +4 -0
- package/front_end/panels/console/ConsoleView.ts +23 -28
- package/front_end/panels/console/ConsoleViewport.ts +2 -2
- package/front_end/panels/console/consoleView.css +11 -1
- package/front_end/panels/coverage/CoverageView.ts +2 -2
- package/front_end/panels/elements/ElementsTreeOutline.ts +2 -2
- package/front_end/panels/elements/StyleEditorWidget.ts +8 -19
- package/front_end/panels/elements/StylePropertyTreeElement.ts +39 -25
- package/front_end/panels/elements/StylesSidebarPane.ts +2 -2
- package/front_end/panels/elements/stylePropertiesTreeOutline.css +4 -3
- package/front_end/panels/layer_viewer/Layers3DView.ts +2 -2
- package/front_end/panels/layers/LayerTreeModel.ts +3 -3
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +4 -4
- package/front_end/panels/network/NetworkLogView.ts +1 -1
- package/front_end/panels/network/NetworkLogViewColumns.ts +3 -3
- package/front_end/panels/network/NetworkSearchScope.ts +6 -6
- package/front_end/panels/search/SearchView.ts +220 -159
- package/front_end/panels/settings/components/SyncSection.ts +64 -10
- package/front_end/panels/settings/components/syncSection.css +6 -0
- package/front_end/panels/sources/AiCodeCompletionPlugin.ts +1 -4
- package/front_end/panels/sources/SourcesSearchScope.ts +4 -4
- package/front_end/panels/sources/TabbedEditorContainer.ts +5 -5
- package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +10 -5
- package/front_end/panels/timeline/TimelineFlameChartView.ts +18 -15
- package/front_end/panels/timeline/TimelinePanel.ts +41 -22
- package/front_end/panels/timeline/TracingLayerTree.ts +4 -5
- package/front_end/panels/timeline/components/ExportTraceOptions.ts +37 -22
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +17 -7
- package/front_end/panels/webauthn/WebauthnPane.ts +1 -1
- package/front_end/third_party/axe-core/README.chromium +1 -0
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/codemirror/README.chromium +1 -0
- package/front_end/third_party/codemirror.next/README.chromium +1 -0
- package/front_end/third_party/csp_evaluator/README.chromium +1 -0
- package/front_end/third_party/diff/README.chromium +1 -0
- package/front_end/third_party/i18n/README.chromium +1 -0
- package/front_end/third_party/intl-messageformat/README.chromium +1 -0
- package/front_end/third_party/json5/README.chromium +1 -0
- package/front_end/third_party/legacy-javascript/README.chromium +1 -0
- package/front_end/third_party/lighthouse/README.chromium +1 -0
- package/front_end/third_party/lit/README.chromium +1 -0
- package/front_end/third_party/marked/README.chromium +1 -0
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/README.md +6 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +11 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +5 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +30 -8
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +1 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Realm.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js +8 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +5 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +8 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js +5 -0
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +12 -2
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +22 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +11 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +5 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +30 -8
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +1 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js +8 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +5 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +8 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js +5 -0
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/types.d.ts +12 -2
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/api/Browser.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/api/Page.ts +13 -2
- package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +50 -8
- package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +0 -1
- package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +8 -1
- package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +21 -5
- package/front_end/third_party/puppeteer/package/src/generated/version.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +12 -0
- package/front_end/third_party/puppeteer-replay/README.chromium +1 -0
- package/front_end/third_party/third-party-web/README.chromium +1 -0
- package/front_end/third_party/vscode.web-custom-data/README.chromium +1 -0
- package/front_end/third_party/wasmparser/README.chromium +1 -0
- package/front_end/third_party/web-vitals/README.chromium +1 -0
- package/front_end/ui/components/text_editor/config.ts +66 -16
- package/front_end/ui/components/tooltips/Tooltip.ts +17 -1
- package/front_end/ui/legacy/ContextMenu.ts +2 -2
- package/front_end/ui/legacy/GlassPane.ts +7 -3
- package/front_end/ui/legacy/ProgressIndicator.ts +33 -21
- package/front_end/ui/legacy/TabbedPane.ts +2 -2
- package/front_end/ui/legacy/Treeoutline.ts +10 -5
- package/front_end/ui/legacy/UIUtils.ts +42 -10
- package/front_end/ui/legacy/components/color_picker/Spectrum.ts +14 -14
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +6 -6
- package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +4 -2
- package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +3 -29
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +14 -14
- package/front_end/ui/visual_logging/Debugging.ts +24 -12
- package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
- package/inspector_overlay/highlight_common.ts +1 -27
- package/inspector_overlay/highlight_grid_common.ts +1 -27
- package/inspector_overlay/tool_highlight.ts +1 -27
- package/inspector_overlay/tool_persistent.ts +1 -27
- package/inspector_overlay/tool_source_order.ts +1 -27
- package/package.json +3 -3
@@ -77,20 +77,56 @@ const UIStrings = {
|
|
77
77
|
* @description Label for Sign-Up button for the Google Developer Program profiles.
|
78
78
|
*/
|
79
79
|
signUp: 'Sign up',
|
80
|
+
/**
|
81
|
+
* @description Link text for opening the Google Developer Program profile page.
|
82
|
+
*/
|
83
|
+
viewProfile: 'View profile',
|
84
|
+
/**
|
85
|
+
* @description Text for tooltip shown on hovering over "Relevant Data" in the disclaimer text for AI code completion.
|
86
|
+
*/
|
87
|
+
tooltipDisclaimerText:
|
88
|
+
'When you qualify for a badge, the badge’s identifier and the type of activity you did to earn it are sent to Google',
|
80
89
|
/**
|
81
90
|
* @description Text for the data notice right after the settings checkbox.
|
82
91
|
*/
|
83
|
-
|
92
|
+
relevantData: 'Relevant data',
|
84
93
|
/**
|
85
|
-
* @description
|
94
|
+
* @description Text for the data notice right after the settings checkbox.
|
95
|
+
* @example {Relevant data} PH1
|
86
96
|
*/
|
87
|
-
|
97
|
+
dataDisclaimer: '({PH1} is sent to Google)',
|
88
98
|
} as const;
|
89
99
|
const str_ = i18n.i18n.registerUIStrings('panels/settings/components/SyncSection.ts', UIStrings);
|
90
100
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
91
101
|
|
92
102
|
const {html, Directives: {ref, createRef}} = Lit;
|
93
103
|
|
104
|
+
let cachedTooltipElement: HTMLElement|undefined;
|
105
|
+
|
106
|
+
function renderDataDisclaimer(): HTMLElement {
|
107
|
+
if (cachedTooltipElement) {
|
108
|
+
return cachedTooltipElement;
|
109
|
+
}
|
110
|
+
|
111
|
+
const relevantDataTooltipTemplate = html`
|
112
|
+
<span
|
113
|
+
tabIndex="0"
|
114
|
+
class="link"
|
115
|
+
aria-details="gdp-profile-tooltip"
|
116
|
+
aria-describedby="gdp-profile-tooltip"
|
117
|
+
>${i18nString(UIStrings.relevantData)}</span>
|
118
|
+
<devtools-tooltip id="gdp-profile-tooltip" variant=${'rich'}>
|
119
|
+
<div class="tooltip-content" tabindex="0">${i18nString(UIStrings.tooltipDisclaimerText)}</div>
|
120
|
+
</devtools-tooltip>`;
|
121
|
+
|
122
|
+
const container = document.createElement('span');
|
123
|
+
Lit.render(relevantDataTooltipTemplate, container);
|
124
|
+
cachedTooltipElement = i18n.i18n.getFormatLocalizedString(str_, UIStrings.dataDisclaimer, {
|
125
|
+
PH1: container,
|
126
|
+
});
|
127
|
+
return cachedTooltipElement;
|
128
|
+
}
|
129
|
+
|
94
130
|
function getGdpSubscriptionText(profile: Host.GdpClient.Profile): Platform.UIString.LocalizedString {
|
95
131
|
if (!profile.activeSubscription ||
|
96
132
|
profile.activeSubscription.subscriptionStatus !== Host.GdpClient.SubscriptionStatus.ENABLED) {
|
@@ -124,14 +160,19 @@ export class SyncSection extends HTMLElement {
|
|
124
160
|
#syncSetting?: Common.Settings.Setting<boolean>;
|
125
161
|
#receiveBadgesSetting?: Common.Settings.Setting<boolean>;
|
126
162
|
#receiveBadgesSettingContainerRef = createRef<HTMLElement>();
|
163
|
+
#isEligibleToCreateGdpProfile = false;
|
127
164
|
#gdpProfile?: Host.GdpClient.Profile;
|
128
165
|
|
129
166
|
set data(data: SyncSectionData) {
|
130
167
|
this.#syncInfo = data.syncInfo;
|
131
168
|
this.#syncSetting = data.syncSetting;
|
132
169
|
this.#receiveBadgesSetting = data.receiveBadgesSetting;
|
133
|
-
void this.#updateGdpProfile();
|
134
170
|
void ComponentHelpers.ScheduledRender.scheduleRender(this, this.#render);
|
171
|
+
|
172
|
+
// Trigger fetching GDP profile if the user is signed in.
|
173
|
+
if (data.syncInfo.accountEmail) {
|
174
|
+
void this.#fetchGdpDetails();
|
175
|
+
}
|
135
176
|
}
|
136
177
|
|
137
178
|
async highlightReceiveBadgesSetting(): Promise<void> {
|
@@ -161,15 +202,22 @@ export class SyncSection extends HTMLElement {
|
|
161
202
|
${renderGdpSectionIfNeeded({
|
162
203
|
receiveBadgesSetting: this.#receiveBadgesSetting,
|
163
204
|
receiveBadgesSettingContainerRef: this.#receiveBadgesSettingContainerRef,
|
164
|
-
gdpProfile: this.#gdpProfile
|
205
|
+
gdpProfile: this.#gdpProfile,
|
206
|
+
isEligibleToCreateProfile: this.#isEligibleToCreateGdpProfile,
|
207
|
+
onSignUpSuccess: this.#fetchGdpDetails.bind(this),
|
165
208
|
})}
|
166
209
|
</fieldset>
|
167
210
|
`, this.#shadow, {host: this});
|
168
211
|
// clang-format on
|
169
212
|
}
|
170
213
|
|
171
|
-
async #
|
214
|
+
async #fetchGdpDetails(): Promise<void> {
|
215
|
+
if (!Root.Runtime.hostConfig.devToolsGdpProfiles?.enabled) {
|
216
|
+
return;
|
217
|
+
}
|
218
|
+
|
172
219
|
this.#gdpProfile = await Host.GdpClient.GdpClient.instance().getProfile() ?? undefined;
|
220
|
+
this.#isEligibleToCreateGdpProfile = await Host.GdpClient.GdpClient.instance().isEligibleToCreateProfile();
|
173
221
|
void ComponentHelpers.ScheduledRender.scheduleRender(this, this.#render);
|
174
222
|
}
|
175
223
|
}
|
@@ -247,20 +295,24 @@ function renderGdpSectionIfNeeded({
|
|
247
295
|
receiveBadgesSetting,
|
248
296
|
receiveBadgesSettingContainerRef,
|
249
297
|
gdpProfile,
|
298
|
+
isEligibleToCreateProfile,
|
299
|
+
onSignUpSuccess,
|
250
300
|
}: {
|
251
301
|
receiveBadgesSettingContainerRef: Lit.Directives.Ref<HTMLElement>,
|
302
|
+
onSignUpSuccess: () => void,
|
252
303
|
receiveBadgesSetting?: Common.Settings.Setting<boolean>,
|
253
304
|
gdpProfile?: Host.GdpClient.Profile,
|
305
|
+
isEligibleToCreateProfile?: boolean,
|
254
306
|
}): Lit.LitTemplate {
|
255
307
|
// clang-format off
|
256
|
-
if (!Root.Runtime.hostConfig.devToolsGdpProfiles?.enabled) {
|
308
|
+
if (!Root.Runtime.hostConfig.devToolsGdpProfiles?.enabled || (!gdpProfile && !isEligibleToCreateProfile)) {
|
257
309
|
return Lit.nothing;
|
258
310
|
}
|
259
311
|
|
260
312
|
function renderBrand(): Lit.LitTemplate {
|
261
313
|
return html`
|
262
314
|
<div class="gdp-profile-header">
|
263
|
-
<div class="gdp-logo" role="img" aria-label="Google Developer Program"></div>
|
315
|
+
<div class="gdp-logo" role="img" tabindex="0" aria-label="Google Developer Program"></div>
|
264
316
|
</div>
|
265
317
|
`;
|
266
318
|
}
|
@@ -289,14 +341,16 @@ function renderGdpSectionIfNeeded({
|
|
289
341
|
Badges.UserBadges.instance().recordAction(Badges.BadgeAction.RECEIVE_BADGES_SETTING_ENABLED);
|
290
342
|
});
|
291
343
|
}}></setting-checkbox>
|
292
|
-
|
344
|
+
${renderDataDisclaimer()}
|
293
345
|
</div>` : Lit.nothing}
|
294
346
|
</div>
|
295
347
|
` : html`
|
296
348
|
<div class="gdp-profile-sign-up-content">
|
297
349
|
${renderBrand()}
|
298
350
|
<devtools-button
|
299
|
-
@click=${() => PanelCommon.GdpSignUpDialog.show(
|
351
|
+
@click=${() => PanelCommon.GdpSignUpDialog.show({
|
352
|
+
onSuccess: onSignUpSuccess
|
353
|
+
})}
|
300
354
|
.jslogContext=${'gdp.sign-up-dialog-open'}
|
301
355
|
.variant=${Buttons.Button.Variant.OUTLINED}>
|
302
356
|
${i18nString(UIStrings.signUp)}
|
@@ -87,10 +87,7 @@ export class AiCodeCompletionPlugin extends Plugin {
|
|
87
87
|
override editorExtension(): CodeMirror.Extension {
|
88
88
|
return [
|
89
89
|
CodeMirror.EditorView.updateListener.of(update => this.#editorUpdate(update)), this.#teaserCompartment.of([]),
|
90
|
-
|
91
|
-
// autocomplete menu are only activated after the first keyDown/keyUp events.
|
92
|
-
TextEditor.Config.conservativeCompletion, TextEditor.Config.aiAutoCompleteSuggestion,
|
93
|
-
CodeMirror.Prec.highest(CodeMirror.keymap.of(this.#editorKeymap()))
|
90
|
+
TextEditor.Config.aiAutoCompleteSuggestion, CodeMirror.Prec.highest(CodeMirror.keymap.of(this.#editorKeymap()))
|
94
91
|
];
|
95
92
|
}
|
96
93
|
|
@@ -184,12 +184,12 @@ export class SourcesSearchScope implements Search.SearchScope.SearchScope {
|
|
184
184
|
|
185
185
|
const files = this.searchResultCandidates;
|
186
186
|
if (!files.length) {
|
187
|
-
progress.done
|
187
|
+
progress.done = true;
|
188
188
|
callback();
|
189
189
|
return;
|
190
190
|
}
|
191
191
|
|
192
|
-
progress.
|
192
|
+
progress.totalWork = files.length;
|
193
193
|
|
194
194
|
let fileIndex = 0;
|
195
195
|
const maxFileContentRequests = 20;
|
@@ -213,7 +213,7 @@ export class SourcesSearchScope implements Search.SearchScope.SearchScope {
|
|
213
213
|
function scheduleSearchInNextFileOrFinish(this: SourcesSearchScope): void {
|
214
214
|
if (fileIndex >= files.length) {
|
215
215
|
if (!callbacksLeft) {
|
216
|
-
progress.done
|
216
|
+
progress.done = true;
|
217
217
|
callback();
|
218
218
|
return;
|
219
219
|
}
|
@@ -228,7 +228,7 @@ export class SourcesSearchScope implements Search.SearchScope.SearchScope {
|
|
228
228
|
function contentLoaded(
|
229
229
|
this: SourcesSearchScope, uiSourceCode: Workspace.UISourceCode.UISourceCode,
|
230
230
|
content: TextUtils.Text.Text): void {
|
231
|
-
progress.
|
231
|
+
++progress.worked;
|
232
232
|
let matches: TextUtils.ContentProvider.SearchMatch[] = [];
|
233
233
|
const searchConfig = (this.searchConfig as Workspace.SearchConfig.SearchConfig);
|
234
234
|
const queries = searchConfig.queries();
|
@@ -196,7 +196,7 @@ export class TabbedEditorContainer extends Common.ObjectWrapper.ObjectWrapper<Ev
|
|
196
196
|
frame?.currentUISourceCode() === uiSourceCode) {
|
197
197
|
Common.EventTarget.fireEvent('source-file-loaded', uiSourceCode.displayName(true));
|
198
198
|
} else {
|
199
|
-
this
|
199
|
+
this.#showFile(uiSourceCode, true);
|
200
200
|
}
|
201
201
|
}
|
202
202
|
|
@@ -279,7 +279,7 @@ export class TabbedEditorContainer extends Common.ObjectWrapper.ObjectWrapper<Ev
|
|
279
279
|
}
|
280
280
|
}
|
281
281
|
|
282
|
-
|
282
|
+
#showFile(uiSourceCode: Workspace.UISourceCode.UISourceCode, userGesture?: boolean): void {
|
283
283
|
if (this.reentrantShow) {
|
284
284
|
return;
|
285
285
|
}
|
@@ -430,7 +430,7 @@ export class TabbedEditorContainer extends Common.ObjectWrapper.ObjectWrapper<Ev
|
|
430
430
|
|
431
431
|
// Select tab if this file was the last to be shown.
|
432
432
|
if (!index) {
|
433
|
-
this
|
433
|
+
this.#showFile(uiSourceCode, false);
|
434
434
|
return;
|
435
435
|
}
|
436
436
|
|
@@ -441,7 +441,7 @@ export class TabbedEditorContainer extends Common.ObjectWrapper.ObjectWrapper<Ev
|
|
441
441
|
const currentProjectIsSnippets = Snippets.ScriptSnippetFileSystem.isSnippetsUISourceCode(this.#currentFile);
|
442
442
|
const addedProjectIsSnippets = Snippets.ScriptSnippetFileSystem.isSnippetsUISourceCode(uiSourceCode);
|
443
443
|
if (this.history.index(historyItemKey(this.#currentFile)) && currentProjectIsSnippets && !addedProjectIsSnippets) {
|
444
|
-
this
|
444
|
+
this.#showFile(uiSourceCode, false);
|
445
445
|
}
|
446
446
|
}
|
447
447
|
|
@@ -578,7 +578,7 @@ export class TabbedEditorContainer extends Common.ObjectWrapper.ObjectWrapper<Ev
|
|
578
578
|
|
579
579
|
const uiSourceCode = this.files.get(tabId);
|
580
580
|
if (uiSourceCode) {
|
581
|
-
this
|
581
|
+
this.#showFile(uiSourceCode, isUserGesture);
|
582
582
|
}
|
583
583
|
}
|
584
584
|
|
@@ -248,12 +248,17 @@ export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectW
|
|
248
248
|
|
249
249
|
const contextMenu = new UI.ContextMenu.ContextMenu(mouseEvent);
|
250
250
|
if (perfAIEntryPointEnabled && this.parsedTrace) {
|
251
|
-
const
|
252
|
-
if (
|
251
|
+
const callTree = AIAssistance.AICallTree.fromEvent(entry, this.parsedTrace);
|
252
|
+
if (callTree) {
|
253
|
+
let focus = UI.Context.Context.instance().flavor(AIAssistance.AgentFocus);
|
254
|
+
if (focus) {
|
255
|
+
focus = focus.withCallTree(callTree);
|
256
|
+
} else {
|
257
|
+
focus = AIAssistance.AgentFocus.fromCallTree(callTree);
|
258
|
+
}
|
259
|
+
UI.Context.Context.instance().setFlavor(AIAssistance.AgentFocus, focus);
|
260
|
+
|
253
261
|
const action = UI.ActionRegistry.ActionRegistry.instance().getAction(PERF_AI_ACTION_ID);
|
254
|
-
// The other side of setFlavor is handleTraceEntryNodeFlavorChange() in FreestylerPanel
|
255
|
-
const context = AIAssistance.AgentFocus.fromCallTree(aiCallTree);
|
256
|
-
UI.Context.Context.instance().setFlavor(AIAssistance.AgentFocus, context);
|
257
262
|
|
258
263
|
if (Root.Runtime.hostConfig.devToolsAiSubmenuPrompts?.enabled) {
|
259
264
|
function appendSubmenuPromptAction(
|
@@ -1510,22 +1510,25 @@ export class TimelineFlameChartView extends Common.ObjectWrapper.eventMixin<Even
|
|
1510
1510
|
// supports (currently, only main thread events), then set the context's
|
1511
1511
|
// "flavor" to be the AI Call Tree of the active event.
|
1512
1512
|
// This is listened to by the AI Assistance panel to update its state.
|
1513
|
-
// Note that we do not change the Context back to `null` if the user picks
|
1514
|
-
// an invalid event - we don't want to reset it back as it may be they are
|
1515
|
-
// clicking around in order to understand something.
|
1516
1513
|
// We also do this in a rAF to not block the UI updating to show the selected event first.
|
1517
|
-
|
1518
|
-
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
})
|
1528
|
-
|
1514
|
+
requestAnimationFrame(() => {
|
1515
|
+
if (!this.#parsedTrace) {
|
1516
|
+
return;
|
1517
|
+
}
|
1518
|
+
|
1519
|
+
const callTree =
|
1520
|
+
selectionIsEvent(selection) ? AIAssistance.AICallTree.fromEvent(selection.event, this.#parsedTrace) : null;
|
1521
|
+
let focus = UI.Context.Context.instance().flavor(AIAssistance.AgentFocus);
|
1522
|
+
if (focus) {
|
1523
|
+
focus = focus.withCallTree(callTree);
|
1524
|
+
} else if (callTree) {
|
1525
|
+
focus = AIAssistance.AgentFocus.fromCallTree(callTree);
|
1526
|
+
} else {
|
1527
|
+
focus = null;
|
1528
|
+
}
|
1529
|
+
|
1530
|
+
UI.Context.Context.instance().setFlavor(AIAssistance.AgentFocus, focus);
|
1531
|
+
});
|
1529
1532
|
}
|
1530
1533
|
|
1531
1534
|
// Only opens the details view of a selection. This is used for Timing Markers. Timing markers replace
|
@@ -940,9 +940,9 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
940
940
|
throw new Error('could not create performance agent focus');
|
941
941
|
}
|
942
942
|
|
943
|
-
const agent = conversationHandler.createAgent(AiAssistanceModel.ConversationType.
|
943
|
+
const agent = conversationHandler.createAgent(AiAssistanceModel.ConversationType.PERFORMANCE);
|
944
944
|
const conversation = new AiAssistanceModel.Conversation(
|
945
|
-
AiAssistanceModel.ConversationType.
|
945
|
+
AiAssistanceModel.ConversationType.PERFORMANCE,
|
946
946
|
[],
|
947
947
|
agent.id,
|
948
948
|
/* isReadOnly */ true,
|
@@ -950,6 +950,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
950
950
|
);
|
951
951
|
|
952
952
|
const selected = new AiAssistanceModel.PerformanceTraceContext(focus);
|
953
|
+
selected.external = true;
|
953
954
|
|
954
955
|
this.#externalAIConversationData = {
|
955
956
|
conversationHandler,
|
@@ -1373,18 +1374,17 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
1373
1374
|
void contextMenu.show();
|
1374
1375
|
}
|
1375
1376
|
|
1376
|
-
/**
|
1377
|
-
* Saves a trace file to disk.
|
1378
|
-
* Pass `config.savingEnhancedTrace === true` to include source maps in the resulting metadata.
|
1379
|
-
* Pass `config.addModifications === true` to include user modifications to the trace file, which includes:
|
1380
|
-
* 1. Annotations
|
1381
|
-
* 2. Filtering / collapsing of the flame chart.
|
1382
|
-
* 3. Visual track configuration (re-ordering or hiding tracks).
|
1383
|
-
*/
|
1384
1377
|
async saveToFile(config: {
|
1385
1378
|
includeScriptContent: boolean,
|
1386
1379
|
includeSourceMaps: boolean,
|
1380
|
+
/**
|
1381
|
+
* Includes many things:
|
1382
|
+
* 1. annotations
|
1383
|
+
* 2. filtering / collapsing of the flame chart
|
1384
|
+
* 3. visual track configuration (re-ordering or hiding tracks)
|
1385
|
+
**/
|
1387
1386
|
addModifications: boolean,
|
1387
|
+
shouldCompress: boolean,
|
1388
1388
|
}): Promise<void> {
|
1389
1389
|
if (this.state !== State.IDLE) {
|
1390
1390
|
return;
|
@@ -1407,7 +1407,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
1407
1407
|
}
|
1408
1408
|
|
1409
1409
|
const traceEvents = parsedTrace.traceEvents.map(event => {
|
1410
|
-
if (Trace.Types.Events.
|
1410
|
+
if (Trace.Types.Events.isAnyScriptSourceEvent(event) && event.name !== 'StubScriptCatchup') {
|
1411
1411
|
const mappedScript = scriptByIdMap.get(`${event.args.data.isolate}.${event.args.data.scriptId}`);
|
1412
1412
|
|
1413
1413
|
// If the checkbox to include script content is not checked or if it comes from and
|
@@ -1425,7 +1425,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
1425
1425
|
args: {
|
1426
1426
|
data: {isolate: event.args.data.isolate, scriptId: event.args.data.scriptId},
|
1427
1427
|
},
|
1428
|
-
} as Trace.Types.Events.
|
1428
|
+
} as Trace.Types.Events.RundownScriptStub;
|
1429
1429
|
}
|
1430
1430
|
}
|
1431
1431
|
|
@@ -1447,7 +1447,8 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
1447
1447
|
await this.innerSaveToFile(traceEvents, metadata, {
|
1448
1448
|
includeScriptContent: config.includeScriptContent,
|
1449
1449
|
includeSourceMaps: config.includeSourceMaps,
|
1450
|
-
addModifications: config.addModifications
|
1450
|
+
addModifications: config.addModifications,
|
1451
|
+
shouldCompress: config.shouldCompress,
|
1451
1452
|
});
|
1452
1453
|
} catch (e) {
|
1453
1454
|
// We expect the error to be an Error class, but this deals with any weird case where it's not.
|
@@ -1467,6 +1468,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
1467
1468
|
includeScriptContent: boolean,
|
1468
1469
|
includeSourceMaps: boolean,
|
1469
1470
|
addModifications: boolean,
|
1471
|
+
shouldCompress: boolean,
|
1470
1472
|
}): Promise<void> {
|
1471
1473
|
// Base the filename on the trace's time of recording
|
1472
1474
|
const isoDate =
|
@@ -1501,8 +1503,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
1501
1503
|
|
1502
1504
|
let blob = new Blob(blobParts, {type: 'application/json'});
|
1503
1505
|
|
1504
|
-
|
1505
|
-
if (Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.TIMELINE_SAVE_AS_GZ)) {
|
1506
|
+
if (config.shouldCompress) {
|
1506
1507
|
fileName = `${fileName}.gz` as Platform.DevToolsPath.RawPathString;
|
1507
1508
|
const gzStream = Common.Gzip.compressStream(blob.stream());
|
1508
1509
|
blob = await new Response(gzStream, {
|
@@ -1537,6 +1538,18 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
1537
1538
|
}
|
1538
1539
|
}
|
1539
1540
|
|
1541
|
+
async handleSaveToFileAction(): Promise<void> {
|
1542
|
+
const exportTraceOptionsElement =
|
1543
|
+
this.saveButton.element as TimelineComponents.ExportTraceOptions.ExportTraceOptions;
|
1544
|
+
const state = exportTraceOptionsElement.state;
|
1545
|
+
await this.saveToFile({
|
1546
|
+
includeScriptContent: state.includeScriptContent,
|
1547
|
+
includeSourceMaps: state.includeSourceMaps,
|
1548
|
+
addModifications: state.includeAnnotations,
|
1549
|
+
shouldCompress: state.shouldCompress,
|
1550
|
+
});
|
1551
|
+
}
|
1552
|
+
|
1540
1553
|
#filterMetadataSourceMaps(metadata: Trace.Types.File.MetaData): Trace.Types.File.MetadataSourceMap[]|undefined {
|
1541
1554
|
if (!metadata.sourceMaps) {
|
1542
1555
|
return undefined;
|
@@ -2125,8 +2138,9 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
2125
2138
|
|
2126
2139
|
const exclusiveFilter = this.#exclusiveFilterPerTrace.get(traceIndex) ?? null;
|
2127
2140
|
this.#applyActiveFilters(parsedTrace.data.Meta.traceIsGeneric, exclusiveFilter);
|
2128
|
-
(this.saveButton.element as TimelineComponents.ExportTraceOptions.ExportTraceOptions)
|
2129
|
-
|
2141
|
+
(this.saveButton.element as TimelineComponents.ExportTraceOptions.ExportTraceOptions).updateContentVisibility({
|
2142
|
+
annotationsExist: currentManager ? currentManager.getAnnotations()?.length > 0 : false
|
2143
|
+
});
|
2130
2144
|
|
2131
2145
|
// Add ModificationsManager listeners for annotations change to update the
|
2132
2146
|
// Annotation Overlays.
|
@@ -2226,6 +2240,9 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
2226
2240
|
Host.UserMetrics.TimelineNavigationSetting.MODERN_AT_SESSION_FIRST_TRACE);
|
2227
2241
|
}
|
2228
2242
|
}
|
2243
|
+
|
2244
|
+
UI.Context.Context.instance().setFlavor(
|
2245
|
+
AiAssistanceModel.AgentFocus, AiAssistanceModel.AgentFocus.full(parsedTrace));
|
2229
2246
|
}
|
2230
2247
|
|
2231
2248
|
#onAnnotationModifiedEvent(e: Event): void {
|
@@ -2258,8 +2275,9 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
2258
2275
|
const annotations = currentManager?.getAnnotations() ?? [];
|
2259
2276
|
const annotationEntryToColorMap = this.buildColorsAnnotationsMap(annotations);
|
2260
2277
|
this.#sideBar.setAnnotations(annotations, annotationEntryToColorMap);
|
2261
|
-
(this.saveButton.element as TimelineComponents.ExportTraceOptions.ExportTraceOptions)
|
2262
|
-
|
2278
|
+
(this.saveButton.element as TimelineComponents.ExportTraceOptions.ExportTraceOptions).updateContentVisibility({
|
2279
|
+
annotationsExist: currentManager ? currentManager.getAnnotations()?.length > 0 : false
|
2280
|
+
});
|
2263
2281
|
}
|
2264
2282
|
|
2265
2283
|
/**
|
@@ -2650,7 +2668,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
2650
2668
|
}
|
2651
2669
|
|
2652
2670
|
#createSourceMapResolver(isFreshRecording: boolean, metadata: Trace.Types.File.MetaData|null):
|
2653
|
-
Trace.
|
2671
|
+
Trace.Types.Configuration.ParseOptions['resolveSourceMap'] {
|
2654
2672
|
const debuggerModelForFrameId = new Map<string, SDK.DebuggerModel.DebuggerModel>();
|
2655
2673
|
for (const target of SDK.TargetManager.TargetManager.instance().targets()) {
|
2656
2674
|
const debuggerModel = target.model(SDK.DebuggerModel.DebuggerModel);
|
@@ -2742,6 +2760,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
2742
2760
|
metadata: metadata ?? undefined,
|
2743
2761
|
isFreshRecording,
|
2744
2762
|
resolveSourceMap: this.#createSourceMapResolver(isFreshRecording, metadata),
|
2763
|
+
isCPUProfile: metadata?.dataOrigin === Trace.Types.File.DataOrigin.CPU_PROFILE,
|
2745
2764
|
};
|
2746
2765
|
|
2747
2766
|
if (window.location.href.includes('devtools/bundled') || window.location.search.includes('debugFrontend')) {
|
@@ -3112,7 +3131,7 @@ ${responseTextForPassedInsights}`;
|
|
3112
3131
|
Promise<AsyncGenerator<AiAssistanceModel.ExternalRequestResponse, AiAssistanceModel.ExternalRequestResponse>> {
|
3113
3132
|
const data = TimelinePanel.instance().getOrCreateExternalAIConversationData();
|
3114
3133
|
return await data.conversationHandler.handleExternalRequest({
|
3115
|
-
conversationType: AiAssistanceModel.ConversationType.
|
3134
|
+
conversationType: AiAssistanceModel.ConversationType.PERFORMANCE,
|
3116
3135
|
prompt,
|
3117
3136
|
data,
|
3118
3137
|
});
|
@@ -3196,7 +3215,7 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
|
|
3196
3215
|
panel.recordReload();
|
3197
3216
|
return true;
|
3198
3217
|
case 'timeline.save-to-file':
|
3199
|
-
void panel.
|
3218
|
+
void panel.handleSaveToFileAction();
|
3200
3219
|
return true;
|
3201
3220
|
case 'timeline.load-from-file':
|
3202
3221
|
panel.selectFileToLoad();
|
@@ -38,10 +38,10 @@ export class TracingLayerTree extends SDK.LayerTreeBase.LayerTreeBase {
|
|
38
38
|
this.layersById = new Map();
|
39
39
|
this.setContentRoot(null);
|
40
40
|
if (root) {
|
41
|
-
const convertedLayers = this
|
41
|
+
const convertedLayers = this.#setLayers(oldLayersById, root);
|
42
42
|
this.setRoot(convertedLayers);
|
43
43
|
} else if (layers) {
|
44
|
-
const processedLayers = layers.map(this.
|
44
|
+
const processedLayers = layers.map(this.#setLayers.bind(this, oldLayersById));
|
45
45
|
const contentRoot = this.contentRoot();
|
46
46
|
if (!contentRoot) {
|
47
47
|
throw new Error('Content root is not set.');
|
@@ -86,8 +86,7 @@ export class TracingLayerTree extends SDK.LayerTreeBase.LayerTreeBase {
|
|
86
86
|
}
|
87
87
|
}
|
88
88
|
|
89
|
-
|
90
|
-
TracingLayer {
|
89
|
+
#setLayers(oldLayersById: Map<string|number, SDK.LayerTreeBase.Layer>, payload: TracingLayerPayload): TracingLayer {
|
91
90
|
let layer = (oldLayersById.get(payload.layer_id) as TracingLayer | null);
|
92
91
|
if (layer) {
|
93
92
|
layer.reset(payload);
|
@@ -102,7 +101,7 @@ export class TracingLayerTree extends SDK.LayerTreeBase.LayerTreeBase {
|
|
102
101
|
this.setContentRoot(layer);
|
103
102
|
}
|
104
103
|
for (let i = 0; payload.children && i < payload.children.length; ++i) {
|
105
|
-
layer.addChild(this
|
104
|
+
layer.addChild(this.#setLayers(oldLayersById, payload.children[i]));
|
106
105
|
}
|
107
106
|
return layer;
|
108
107
|
}
|