chrome-devtools-frontend 1.0.1660788 → 1.0.1662289
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/.agents/skills/evaluate-ai-css-completion/SKILL.md +143 -0
- package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +104 -0
- package/.agents/skills/migrate-chromium-test/SKILL.md +7 -2
- package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +7 -1
- package/docs/ui_engineering.md +75 -42
- package/eslint.config.mjs +7 -0
- package/extension-api/ExtensionAPI.d.ts +88 -0
- package/front_end/core/common/SettingRegistration.ts +0 -5
- package/front_end/core/host/InspectorFrontendHost.ts +1 -0
- package/front_end/core/host/InspectorFrontendHostStub.ts +2 -0
- package/front_end/core/platform/ArrayUtilities.ts +10 -0
- package/front_end/core/platform/StringUtilities.ts +20 -4
- package/front_end/core/sdk/CPUThrottlingManager.ts +2 -0
- package/front_end/core/sdk/DOMDebuggerModel.ts +2 -0
- package/front_end/core/sdk/DOMModel.ts +1 -0
- package/front_end/core/sdk/DebuggerModel.ts +4 -4
- package/front_end/core/sdk/EventBreakpointsModel.ts +2 -0
- package/front_end/core/sdk/FrameManager.ts +1 -0
- package/front_end/core/sdk/IsolateManager.ts +1 -0
- package/front_end/core/sdk/NetworkManager.ts +2 -0
- package/front_end/core/sdk/NetworkRequest.ts +1 -0
- package/front_end/core/sdk/PageResourceLoader.ts +2 -0
- package/front_end/core/sdk/SourceMap.ts +5 -5
- package/front_end/core/sdk/SourceMapManager.ts +3 -2
- package/front_end/core/sdk/TargetManager.ts +4 -0
- package/front_end/entrypoints/main/MainImpl.ts +2 -1
- package/front_end/foundation/README.md +86 -0
- package/front_end/generated/InspectorBackendCommands.ts +4 -5
- package/front_end/generated/protocol.ts +20 -38
- package/front_end/models/bindings/CompilerScriptMapping.ts +5 -5
- package/front_end/models/bindings/ContentProviderBasedProject.ts +2 -3
- package/front_end/models/bindings/DebuggerLanguagePlugins.ts +3 -3
- package/front_end/models/bindings/DefaultScriptMapping.ts +3 -3
- package/front_end/models/bindings/ResourceMapping.ts +3 -3
- package/front_end/models/bindings/ResourceScriptMapping.ts +2 -2
- package/front_end/models/bindings/SASSSourceMapping.ts +3 -3
- package/front_end/models/bindings/TempFile.ts +8 -3
- package/front_end/models/extensions/ExtensionAPI.ts +110 -46
- package/front_end/models/extensions/RecorderExtensionEndpoint.ts +7 -5
- package/front_end/models/formatter/ScriptFormatter.ts +8 -11
- package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +14 -5
- package/front_end/models/issues_manager/CheckFormsIssuesTrigger.ts +8 -9
- package/front_end/models/issues_manager/CookieIssue.ts +21 -9
- package/front_end/models/issues_manager/Issue.ts +3 -4
- package/front_end/models/issues_manager/IssueAggregator.ts +0 -9
- package/front_end/models/issues_manager/IssueResolver.ts +2 -2
- package/front_end/models/issues_manager/IssuesManager.ts +136 -137
- package/front_end/models/issues_manager/RelatedIssue.ts +10 -8
- package/front_end/models/issues_manager/issues_manager.ts +0 -2
- package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
- package/front_end/models/logs/RequestResolver.ts +2 -2
- package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +12 -9
- package/front_end/models/trace/handlers/FramesHandler.ts +4 -7
- package/front_end/models/trace/handlers/ModelHandlers.ts +0 -1
- package/front_end/models/trace/handlers/RendererHandler.ts +2 -15
- package/front_end/models/trace/handlers/Threads.ts +4 -11
- package/front_end/models/trace/insights/DOMSize.ts +1 -1
- package/front_end/models/workspace_diff/WorkspaceDiff.ts +10 -4
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +2 -1
- package/front_end/panels/application/ApplicationPanelSidebar.ts +0 -44
- package/front_end/panels/application/CookieItemsView.ts +1 -1
- package/front_end/panels/application/ServiceWorkersView.ts +494 -411
- package/front_end/panels/application/WebMCPView.ts +38 -43
- package/front_end/panels/application/application.ts +0 -6
- package/front_end/panels/application/components/AdsView.ts +201 -30
- package/front_end/panels/application/components/adsView.css +25 -0
- package/front_end/panels/application/components/components.ts +0 -2
- package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +1 -1
- package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -2
- package/front_end/panels/application/serviceWorkersView.css +40 -4
- package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +147 -123
- package/front_end/panels/common/ExtensionServer.ts +3 -3
- package/front_end/panels/console/ConsoleView.ts +3 -2
- package/front_end/panels/console/PromptBuilder.ts +2 -1
- package/front_end/panels/emulation/DeviceModeView.ts +164 -113
- package/front_end/panels/issues/AffectedResourcesView.ts +1 -1
- package/front_end/panels/issues/IssueView.ts +0 -2
- package/front_end/panels/issues/IssuesPane.ts +1 -8
- package/front_end/panels/js_timeline/js_timeline-meta.ts +3 -2
- package/front_end/panels/lighthouse/LighthouseProtocolService.ts +53 -12
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +3 -3
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +5 -5
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +4 -4
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +2 -2
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +6 -6
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +3 -3
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +8 -9
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +2 -2
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
- package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +2 -2
- package/front_end/panels/network/RequestPayloadView.ts +92 -52
- package/front_end/panels/network/RequestTimingView.ts +95 -127
- package/front_end/panels/network/components/ResponseHeaderSection.ts +5 -3
- package/front_end/panels/profiler/HeapSnapshotView.ts +3 -3
- package/front_end/panels/profiler/WritableProfileHeader.ts +2 -2
- package/front_end/panels/recorder/{components/ControlButton.ts → ControlButton.ts} +9 -10
- package/front_end/panels/recorder/{components/CreateRecordingView.ts → CreateRecordingView.ts} +48 -47
- package/front_end/panels/recorder/{components/ExtensionView.ts → ExtensionView.ts} +8 -8
- package/front_end/panels/recorder/RecorderController.ts +302 -127
- package/front_end/panels/recorder/RecorderPanel.ts +1 -1
- package/front_end/panels/recorder/{components/RecordingListView.ts → RecordingListView.ts} +19 -20
- package/front_end/panels/recorder/{components/RecordingView.ts → RecordingView.ts} +88 -88
- package/front_end/panels/recorder/{components/ReplaySection.ts → ReplaySection.ts} +11 -11
- package/front_end/panels/recorder/{components/SelectorPicker.ts → SelectorPicker.ts} +13 -13
- package/front_end/panels/recorder/{components/StepEditor.ts → StepEditor.ts} +15 -15
- package/front_end/panels/recorder/{components/StepView.ts → StepView.ts} +10 -10
- package/front_end/panels/recorder/{components/TimelineSection.ts → TimelineSection.ts} +2 -2
- package/front_end/panels/recorder/recorder.ts +23 -1
- package/front_end/panels/recorder/util/util.ts +113 -0
- package/front_end/panels/sources/SourcesView.ts +0 -17
- package/front_end/panels/sources/TabbedEditorContainer.ts +1 -1
- package/front_end/panels/sources/UISourceCodeFrame.ts +42 -0
- package/front_end/panels/sources/sources.ts +0 -2
- package/front_end/panels/timeline/CompatibilityTracksAppender.ts +0 -17
- package/front_end/panels/timeline/IsolateSelector.ts +10 -8
- package/front_end/panels/timeline/ThreadAppender.ts +0 -106
- package/front_end/panels/timeline/TimelinePanel.ts +18 -7
- package/front_end/panels/timeline/TimelineUIUtils.ts +144 -129
- package/front_end/panels/timeline/timeline-meta.ts +3 -2
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/report_view/ReportView.ts +11 -5
- package/front_end/ui/components/report_view/report.css +4 -1
- package/front_end/ui/legacy/TextPrompt.ts +49 -1
- package/front_end/ui/legacy/Treeoutline.ts +3 -0
- package/front_end/ui/legacy/UIUtils.ts +11 -1
- package/front_end/ui/legacy/Widget.ts +14 -15
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +2 -2
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +11 -7
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -1
- package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +10 -1
- package/front_end/ui/legacy/textPrompt.css +10 -0
- package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
- package/package.json +1 -1
- package/front_end/models/issues_manager/AttributionReportingIssue.ts +0 -247
- package/front_end/models/issues_manager/descriptions/arInsecureContext.md +0 -7
- package/front_end/models/issues_manager/descriptions/arInvalidInfoHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +0 -6
- package/front_end/models/issues_manager/descriptions/arNoRegisterOsSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterOsTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoWebOrOsSupport.md +0 -4
- package/front_end/models/issues_manager/descriptions/arOsSourceIgnored.md +0 -18
- package/front_end/models/issues_manager/descriptions/arOsTriggerIgnored.md +0 -19
- package/front_end/models/issues_manager/descriptions/arPermissionPolicyDisabled.md +0 -8
- package/front_end/models/issues_manager/descriptions/arSourceAndTriggerHeaders.md +0 -9
- package/front_end/models/issues_manager/descriptions/arSourceIgnored.md +0 -13
- package/front_end/models/issues_manager/descriptions/arTriggerIgnored.md +0 -12
- package/front_end/models/issues_manager/descriptions/arUntrustworthyReportingOrigin.md +0 -10
- package/front_end/models/issues_manager/descriptions/arWebAndOsHeaders.md +0 -11
- package/front_end/models/trace/handlers/AuctionWorkletsHandler.ts +0 -183
- package/front_end/panels/application/InterestGroupStorageModel.ts +0 -81
- package/front_end/panels/application/InterestGroupStorageView.ts +0 -151
- package/front_end/panels/application/InterestGroupTreeElement.ts +0 -65
- package/front_end/panels/application/components/InterestGroupAccessGrid.ts +0 -135
- package/front_end/panels/application/components/interestGroupAccessGrid.css +0 -27
- package/front_end/panels/application/interestGroupStorageView.css +0 -9
- package/front_end/panels/issues/AttributionReportingIssueDetailsView.ts +0 -182
- package/front_end/panels/recorder/components/components.ts +0 -25
- package/front_end/panels/recorder/components/util.ts +0 -116
- package/front_end/panels/sources/InplaceFormatterEditorAction.ts +0 -149
- /package/front_end/panels/recorder/{components/controlButton.css → controlButton.css} +0 -0
- /package/front_end/panels/recorder/{components/createRecordingView.css → createRecordingView.css} +0 -0
- /package/front_end/panels/recorder/{components/extensionView.css → extensionView.css} +0 -0
- /package/front_end/panels/recorder/{components/recordingListView.css → recordingListView.css} +0 -0
- /package/front_end/panels/recorder/{components/recordingView.css → recordingView.css} +0 -0
- /package/front_end/panels/recorder/{components/replaySection.css → replaySection.css} +0 -0
- /package/front_end/panels/recorder/{components/selectorPicker.css → selectorPicker.css} +0 -0
- /package/front_end/panels/recorder/{components/startView.css → startView.css} +0 -0
- /package/front_end/panels/recorder/{components/stepEditor.css → stepEditor.css} +0 -0
- /package/front_end/panels/recorder/{components/stepView.css → stepView.css} +0 -0
- /package/front_end/panels/recorder/{components/timelineSection.css → timelineSection.css} +0 -0
|
@@ -345,9 +345,6 @@ export class SourcesView extends Common.ObjectWrapper.eventMixin<EventTypes, typ
|
|
|
345
345
|
if (view instanceof UI.View.SimpleView) {
|
|
346
346
|
void view.toolbarItems().then(items => {
|
|
347
347
|
this.#scriptViewToolbar.removeToolbarItems();
|
|
348
|
-
for (const action of getRegisteredEditorActions()) {
|
|
349
|
-
this.#scriptViewToolbar.appendToolbarItem(action.getOrCreateButton(this));
|
|
350
|
-
}
|
|
351
348
|
if (Array.isArray(items)) {
|
|
352
349
|
items.map(item => this.#scriptViewToolbar.appendToolbarItem(item));
|
|
353
350
|
} else {
|
|
@@ -657,20 +654,6 @@ export interface EventTypes {
|
|
|
657
654
|
[Events.EDITOR_SELECTED]: Workspace.UISourceCode.UISourceCode;
|
|
658
655
|
}
|
|
659
656
|
|
|
660
|
-
export interface EditorAction {
|
|
661
|
-
getOrCreateButton(sourcesView: SourcesView): UI.Toolbar.ToolbarButton;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
const registeredEditorActions: Array<() => EditorAction> = [];
|
|
665
|
-
|
|
666
|
-
export function registerEditorAction(editorAction: () => EditorAction): void {
|
|
667
|
-
registeredEditorActions.push(editorAction);
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
export function getRegisteredEditorActions(): EditorAction[] {
|
|
671
|
-
return registeredEditorActions.map(editorAction => editorAction());
|
|
672
|
-
}
|
|
673
|
-
|
|
674
657
|
export class SwitchFileActionDelegate implements UI.ActionRegistration.ActionDelegate {
|
|
675
658
|
private static nextFile(currentUISourceCode: Workspace.UISourceCode.UISourceCode): Workspace.UISourceCode.UISourceCode
|
|
676
659
|
|null {
|
|
@@ -718,7 +718,7 @@ export interface EventTypes {
|
|
|
718
718
|
const MAX_PREVIOUSLY_VIEWED_FILES_COUNT = 30;
|
|
719
719
|
const MAX_SERIALIZABLE_URL_LENGTH = 4096;
|
|
720
720
|
|
|
721
|
-
interface SerializedHistoryItem {
|
|
721
|
+
export interface SerializedHistoryItem {
|
|
722
722
|
url: string;
|
|
723
723
|
resourceTypeName: string;
|
|
724
724
|
selectionRange?: TextUtils.TextRange.SerializedTextRange;
|
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
import * as Common from '../../core/common/common.js';
|
|
8
8
|
import * as Host from '../../core/host/host.js';
|
|
9
|
+
import * as i18n from '../../core/i18n/i18n.js';
|
|
9
10
|
import * as FormatterActions from '../../entrypoints/formatter_worker/FormatterActions.js'; // eslint-disable-line @devtools/es-modules-import
|
|
10
11
|
import * as AiCodeCompletion from '../../models/ai_code_completion/ai_code_completion.js';
|
|
12
|
+
import * as Formatter from '../../models/formatter/formatter.js';
|
|
11
13
|
import * as IssuesManager from '../../models/issues_manager/issues_manager.js';
|
|
12
14
|
import * as Persistence from '../../models/persistence/persistence.js';
|
|
13
15
|
import * as TextUtils from '../../models/text_utils/text_utils.js';
|
|
@@ -30,6 +32,15 @@ import {ResourceOriginPlugin} from './ResourceOriginPlugin.js';
|
|
|
30
32
|
import {SnippetsPlugin} from './SnippetsPlugin.js';
|
|
31
33
|
import {SourcesPanel} from './SourcesPanel.js';
|
|
32
34
|
|
|
35
|
+
const UIStrings = {
|
|
36
|
+
/**
|
|
37
|
+
* @description Title of the format button
|
|
38
|
+
*/
|
|
39
|
+
format: 'Format',
|
|
40
|
+
} as const;
|
|
41
|
+
const str_ = i18n.i18n.registerUIStrings('panels/sources/UISourceCodeFrame.ts', UIStrings);
|
|
42
|
+
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
43
|
+
|
|
33
44
|
export class UISourceCodeFrame extends Common.ObjectWrapper
|
|
34
45
|
.eventMixin<EventTypes, typeof SourceFrame.SourceFrame.SourceFrameImpl>(
|
|
35
46
|
SourceFrame.SourceFrame.SourceFrameImpl) {
|
|
@@ -290,6 +301,24 @@ export class UISourceCodeFrame extends Common.ObjectWrapper
|
|
|
290
301
|
this.maybeSetContent(this.#uiSourceCode.workingCopyContentData());
|
|
291
302
|
}
|
|
292
303
|
|
|
304
|
+
async #formatSourceInPlace(): Promise<void> {
|
|
305
|
+
const contentDataOrError = await this.workingCopy();
|
|
306
|
+
if (TextUtils.ContentData.ContentData.isError(contentDataOrError)) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const content = TextUtils.ContentData.ContentData.textOr(contentDataOrError, '');
|
|
310
|
+
const {formattedContent, formattedMapping} = await Formatter.ScriptFormatter.format(
|
|
311
|
+
Common.Settings.Settings.instance(), this.#uiSourceCode.contentType(), this.contentType, content);
|
|
312
|
+
if (this.#uiSourceCode.workingCopy() === formattedContent) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const selection = this.textEditor.toLineColumn(this.textEditor.state.selection.main.head);
|
|
316
|
+
const [lineNumber, columnNumber] =
|
|
317
|
+
formattedMapping.originalToFormatted(selection.lineNumber, selection.columnNumber);
|
|
318
|
+
this.#uiSourceCode.setWorkingCopy(formattedContent);
|
|
319
|
+
this.revealPosition({lineNumber, columnNumber});
|
|
320
|
+
}
|
|
321
|
+
|
|
293
322
|
private onWorkingCopyCommitted(): void {
|
|
294
323
|
if (!this.#muteSourceCodeEvents) {
|
|
295
324
|
this.maybeSetContent(this.uiSourceCode().workingCopyContentData());
|
|
@@ -433,6 +462,19 @@ export class UISourceCodeFrame extends Common.ObjectWrapper
|
|
|
433
462
|
|
|
434
463
|
override async toolbarItems(): Promise<UI.Toolbar.ToolbarItem[]> {
|
|
435
464
|
const leftToolbarItems = await super.toolbarItems();
|
|
465
|
+
|
|
466
|
+
const isEditable = Persistence.Persistence.PersistenceImpl.instance().hasEditableContent(this.#uiSourceCode);
|
|
467
|
+
const isJavaScript = Common.ResourceType.ResourceType.isJavaScriptMimeType(this.contentType);
|
|
468
|
+
const isInplaceFormattable = isEditable && isJavaScript;
|
|
469
|
+
|
|
470
|
+
if (isInplaceFormattable) {
|
|
471
|
+
const formatButton = new UI.Toolbar.ToolbarButton(i18nString(UIStrings.format), 'brackets');
|
|
472
|
+
formatButton.addEventListener(UI.Toolbar.ToolbarButton.Events.CLICK, () => {
|
|
473
|
+
void this.#formatSourceInPlace();
|
|
474
|
+
});
|
|
475
|
+
leftToolbarItems.unshift(formatButton);
|
|
476
|
+
}
|
|
477
|
+
|
|
436
478
|
const rightToolbarItems = [];
|
|
437
479
|
for (const plugin of this.plugins) {
|
|
438
480
|
leftToolbarItems.push(...plugin.leftToolbarItems());
|
|
@@ -18,7 +18,6 @@ import * as EditingLocationHistoryManager from './EditingLocationHistoryManager.
|
|
|
18
18
|
import * as FilePathScoreFunction from './FilePathScoreFunction.js';
|
|
19
19
|
import * as FilteredUISourceCodeListProvider from './FilteredUISourceCodeListProvider.js';
|
|
20
20
|
import * as GoToLineQuickOpen from './GoToLineQuickOpen.js';
|
|
21
|
-
import * as InplaceFormatterEditorAction from './InplaceFormatterEditorAction.js';
|
|
22
21
|
import * as NavigatorView from './NavigatorView.js';
|
|
23
22
|
import * as OpenFileQuickOpen from './OpenFileQuickOpen.js';
|
|
24
23
|
import * as OutlineQuickOpen from './OutlineQuickOpen.js';
|
|
@@ -54,7 +53,6 @@ export {
|
|
|
54
53
|
FilePathScoreFunction,
|
|
55
54
|
FilteredUISourceCodeListProvider,
|
|
56
55
|
GoToLineQuickOpen,
|
|
57
|
-
InplaceFormatterEditorAction,
|
|
58
56
|
NavigatorView,
|
|
59
57
|
OpenFileQuickOpen,
|
|
60
58
|
OutlineQuickOpen,
|
|
@@ -168,7 +168,6 @@ export const enum VisualLoggingTrackName {
|
|
|
168
168
|
THREAD_MAIN = 'thread.main',
|
|
169
169
|
THREAD_FRAME = 'thread.frame',
|
|
170
170
|
THREAD_WORKER = 'thread.worker',
|
|
171
|
-
THREAD_AUCTION_WORKLET = 'thread.auction-worklet',
|
|
172
171
|
THREAD_RASTERIZER = 'thread.rasterizer',
|
|
173
172
|
THREAD_POOL = 'thread.pool',
|
|
174
173
|
THREAD_OTHER = 'thread.other',
|
|
@@ -301,8 +300,6 @@ export class CompatibilityTracksAppender {
|
|
|
301
300
|
}
|
|
302
301
|
case Trace.Handlers.Threads.ThreadType.WORKER:
|
|
303
302
|
return 3;
|
|
304
|
-
case Trace.Handlers.Threads.ThreadType.AUCTION_WORKLET:
|
|
305
|
-
return 3;
|
|
306
303
|
case Trace.Handlers.Threads.ThreadType.RASTERIZER:
|
|
307
304
|
return 4;
|
|
308
305
|
case Trace.Handlers.Threads.ThreadType.THREAD_POOL:
|
|
@@ -328,20 +325,6 @@ export class CompatibilityTracksAppender {
|
|
|
328
325
|
continue;
|
|
329
326
|
}
|
|
330
327
|
|
|
331
|
-
const matchingWorklet = this.#parsedTrace.data.AuctionWorklets.worklets.get(pid);
|
|
332
|
-
if (matchingWorklet) {
|
|
333
|
-
// Each AuctionWorklet has two key threads:
|
|
334
|
-
// 1. the Utility Thread
|
|
335
|
-
// 2. the V8 Helper Thread - either a bidder or seller. see buildNameForAuctionWorklet()
|
|
336
|
-
// There are other threads in a worklet process, but we don't render them.
|
|
337
|
-
const tids = [matchingWorklet.args.data.utilityThread.tid, matchingWorklet.args.data.v8HelperThread.tid];
|
|
338
|
-
if (tids.includes(tid)) {
|
|
339
|
-
this.#threadAppenders.push(new ThreadAppender(
|
|
340
|
-
this, this.#parsedTrace, pid, tid, '', Trace.Handlers.Threads.ThreadType.AUCTION_WORKLET, entries, tree));
|
|
341
|
-
}
|
|
342
|
-
continue;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
328
|
// The Common case… Add the main thread, or iframe, or thread pool, etc.
|
|
346
329
|
this.#threadAppenders.push(new ThreadAppender(this, this.#parsedTrace, pid, tid, name, type, entries, tree));
|
|
347
330
|
}
|
|
@@ -26,10 +26,14 @@ export class IsolateSelector extends UI.Toolbar.ToolbarItem implements SDK.Isola
|
|
|
26
26
|
options?: Array<{index: number, isolate: SDK.IsolateManager.Isolate}>;
|
|
27
27
|
items?: Menus.Menu.MenuItem[];
|
|
28
28
|
readonly itemByIsolate = new Map<SDK.IsolateManager.Isolate, Menus.Menu.MenuItem>();
|
|
29
|
+
readonly #targetManager: SDK.TargetManager.TargetManager;
|
|
30
|
+
readonly #isolateManager: SDK.IsolateManager.IsolateManager;
|
|
29
31
|
|
|
30
|
-
constructor() {
|
|
32
|
+
constructor(targetManager: SDK.TargetManager.TargetManager, isolateManager: SDK.IsolateManager.IsolateManager) {
|
|
31
33
|
const menu = new Menus.SelectMenu.SelectMenu();
|
|
32
34
|
super(menu);
|
|
35
|
+
this.#targetManager = targetManager;
|
|
36
|
+
this.#isolateManager = isolateManager;
|
|
33
37
|
|
|
34
38
|
this.menu = menu;
|
|
35
39
|
menu.buttonTitle = i18nString(UIStrings.selectJavascriptVmInstance);
|
|
@@ -38,18 +42,16 @@ export class IsolateSelector extends UI.Toolbar.ToolbarItem implements SDK.Isola
|
|
|
38
42
|
|
|
39
43
|
menu.addEventListener('selectmenuselected', this.#onSelectMenuSelected.bind(this));
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
SDK.TargetManager.
|
|
43
|
-
|
|
44
|
-
SDK.TargetManager.TargetManager.instance().addEventListener(
|
|
45
|
-
SDK.TargetManager.Events.INSPECTED_URL_CHANGED, this.targetChanged, this);
|
|
45
|
+
this.#isolateManager.observeIsolates(this);
|
|
46
|
+
this.#targetManager.addEventListener(SDK.TargetManager.Events.NAME_CHANGED, this.targetChanged, this);
|
|
47
|
+
this.#targetManager.addEventListener(SDK.TargetManager.Events.INSPECTED_URL_CHANGED, this.targetChanged, this);
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
#updateIsolateItem(isolate: SDK.IsolateManager.Isolate, itemForIsolate: Menus.Menu.MenuItem): void {
|
|
49
51
|
const modelCountByName = new Map<string, number>();
|
|
50
52
|
for (const model of isolate.models()) {
|
|
51
53
|
const target = model.target();
|
|
52
|
-
const name =
|
|
54
|
+
const name = this.#targetManager.rootTarget() !== target ? target.name() : '';
|
|
53
55
|
const parsedURL = new Common.ParsedURL.ParsedURL(target.inspectedURL());
|
|
54
56
|
const domain = parsedURL.isValid ? parsedURL.domain() : '';
|
|
55
57
|
const title =
|
|
@@ -117,7 +119,7 @@ export class IsolateSelector extends UI.Toolbar.ToolbarItem implements SDK.Isola
|
|
|
117
119
|
if (!model) {
|
|
118
120
|
return;
|
|
119
121
|
}
|
|
120
|
-
const isolate =
|
|
122
|
+
const isolate = this.#isolateManager.isolateByModel(model);
|
|
121
123
|
if (isolate) {
|
|
122
124
|
this.isolateChanged(isolate);
|
|
123
125
|
}
|
|
@@ -87,48 +87,7 @@ const UIStrings = {
|
|
|
87
87
|
* @example {2} PH1
|
|
88
88
|
*/
|
|
89
89
|
threadPoolThreadS: 'Thread pool worker {PH1}',
|
|
90
|
-
/**
|
|
91
|
-
* @description Title of a bidder auction worklet with known URL in the timeline flame chart of the Performance panel
|
|
92
|
-
* @example {https://google.com} PH1
|
|
93
|
-
*/
|
|
94
|
-
bidderWorkletS: 'Bidder Worklet — {PH1}',
|
|
95
|
-
/**
|
|
96
|
-
* @description Title of a bidder auction worklet in the timeline flame chart of the Performance panel with an unknown URL
|
|
97
|
-
*/
|
|
98
|
-
bidderWorklet: 'Bidder Worklet',
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* @description Title of a seller auction worklet in the timeline flame chart of the Performance panel with an unknown URL
|
|
102
|
-
*/
|
|
103
|
-
sellerWorklet: 'Seller Worklet',
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @description Title of an auction worklet in the timeline flame chart of the Performance panel with an unknown URL
|
|
107
|
-
*/
|
|
108
|
-
unknownWorklet: 'Auction Worklet',
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* @description Title of control thread of a service process for an auction worklet in the timeline flame chart of the Performance panel with an unknown URL
|
|
112
|
-
*/
|
|
113
|
-
workletService: 'Auction Worklet service',
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* @description Title of a seller auction worklet with known URL in the timeline flame chart of the Performance panel
|
|
117
|
-
* @example {https://google.com} PH1
|
|
118
|
-
*/
|
|
119
|
-
sellerWorkletS: 'Seller Worklet — {PH1}',
|
|
120
90
|
|
|
121
|
-
/**
|
|
122
|
-
* @description Title of an auction worklet with known URL in the timeline flame chart of the Performance panel
|
|
123
|
-
* @example {https://google.com} PH1
|
|
124
|
-
*/
|
|
125
|
-
unknownWorkletS: 'Auction Worklet — {PH1}',
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* @description Title of control thread of a service process for an auction worklet with known URL in the timeline flame chart of the Performance panel
|
|
129
|
-
* @example {https://google.com} PH1
|
|
130
|
-
*/
|
|
131
|
-
workletServiceS: 'Auction Worklet service — {PH1}',
|
|
132
91
|
} as const;
|
|
133
92
|
|
|
134
93
|
const str_ = i18n.i18n.registerUIStrings('panels/timeline/ThreadAppender.ts', UIStrings);
|
|
@@ -181,12 +140,6 @@ export class ThreadAppender implements TrackAppender {
|
|
|
181
140
|
this.#threadDefaultName = threadName || i18nString(UIStrings.threadS, {PH1: threadId});
|
|
182
141
|
this.isOnMainFrame = Boolean(this.#parsedTrace.data.Renderer?.processes.get(processId)?.isOnMainFrame);
|
|
183
142
|
this.threadType = type;
|
|
184
|
-
// AuctionWorklets are threads, so we re-use this appender rather than
|
|
185
|
-
// duplicate it, but we change the name because we want to render these
|
|
186
|
-
// lower down than other threads.
|
|
187
|
-
if (this.#parsedTrace.data.AuctionWorklets.worklets.has(processId)) {
|
|
188
|
-
this.appenderName = 'Thread_AuctionWorklet';
|
|
189
|
-
}
|
|
190
143
|
this.#url = this.#parsedTrace.data.Renderer?.processes.get(this.#processId)?.url || '';
|
|
191
144
|
}
|
|
192
145
|
|
|
@@ -279,8 +232,6 @@ export class ThreadAppender implements TrackAppender {
|
|
|
279
232
|
return VisualLoggingTrackName.THREAD_WORKER;
|
|
280
233
|
case Trace.Handlers.Threads.ThreadType.RASTERIZER:
|
|
281
234
|
return VisualLoggingTrackName.THREAD_RASTERIZER;
|
|
282
|
-
case Trace.Handlers.Threads.ThreadType.AUCTION_WORKLET:
|
|
283
|
-
return VisualLoggingTrackName.THREAD_AUCTION_WORKLET;
|
|
284
235
|
case Trace.Handlers.Threads.ThreadType.OTHER:
|
|
285
236
|
return VisualLoggingTrackName.THREAD_OTHER;
|
|
286
237
|
case Trace.Handlers.Threads.ThreadType.CPU_PROFILE:
|
|
@@ -350,9 +301,6 @@ export class ThreadAppender implements TrackAppender {
|
|
|
350
301
|
break;
|
|
351
302
|
case Trace.Handlers.Threads.ThreadType.OTHER:
|
|
352
303
|
break;
|
|
353
|
-
case Trace.Handlers.Threads.ThreadType.AUCTION_WORKLET:
|
|
354
|
-
threadTypeLabel = this.#buildNameForAuctionWorklet();
|
|
355
|
-
break;
|
|
356
304
|
default:
|
|
357
305
|
return Platform.assertNever(this.threadType, `Unknown thread type: ${this.threadType}`);
|
|
358
306
|
}
|
|
@@ -371,60 +319,6 @@ export class ThreadAppender implements TrackAppender {
|
|
|
371
319
|
return this.#entries;
|
|
372
320
|
}
|
|
373
321
|
|
|
374
|
-
#buildNameForAuctionWorklet(): string {
|
|
375
|
-
const workletMetadataEvent = this.#parsedTrace.data.AuctionWorklets.worklets.get(this.#processId);
|
|
376
|
-
// We should always have this event - if we do not, we were instantiated with invalid data.
|
|
377
|
-
if (!workletMetadataEvent) {
|
|
378
|
-
return i18nString(UIStrings.unknownWorklet);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Host could be empty - in which case we do not want to add it.
|
|
382
|
-
const host = workletMetadataEvent.host ? `https://${workletMetadataEvent.host}` : '';
|
|
383
|
-
const shouldAddHost = host.length > 0;
|
|
384
|
-
|
|
385
|
-
// For each Auction Worklet in a page there are two threads we care about on the same process.
|
|
386
|
-
// 1. The "Worklet Service" which is a generic helper service. This thread
|
|
387
|
-
// is always named "auction_worklet.CrUtilityMain".
|
|
388
|
-
//
|
|
389
|
-
// 2. The "Seller/Bidder" service. This thread is always named
|
|
390
|
-
// "AuctionV8HelperThread". The AuctionWorkets handler does the job of
|
|
391
|
-
// figuring this out for us - the metadata event it provides for each
|
|
392
|
-
// worklet process will have a `type` already set.
|
|
393
|
-
//
|
|
394
|
-
// Therefore, for this given thread, which we know is part of
|
|
395
|
-
// an AuctionWorklet process, we need to figure out if this thread is the
|
|
396
|
-
// generic service, or a seller/bidder worklet.
|
|
397
|
-
//
|
|
398
|
-
// Note that the worklet could also have the "unknown" type - this is not
|
|
399
|
-
// expected but implemented to prevent trace event changes causing DevTools
|
|
400
|
-
// to break with unknown worklet types.
|
|
401
|
-
const isUtilityThread = workletMetadataEvent.args.data.utilityThread.tid === this.#threadId;
|
|
402
|
-
const isBidderOrSeller = workletMetadataEvent.args.data.v8HelperThread.tid === this.#threadId;
|
|
403
|
-
|
|
404
|
-
if (isUtilityThread) {
|
|
405
|
-
return shouldAddHost ? i18nString(UIStrings.workletServiceS, {PH1: host}) : i18nString(UIStrings.workletService);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if (isBidderOrSeller) {
|
|
409
|
-
switch (workletMetadataEvent.type) {
|
|
410
|
-
case Trace.Types.Events.AuctionWorkletType.SELLER:
|
|
411
|
-
return shouldAddHost ? i18nString(UIStrings.sellerWorkletS, {PH1: host}) :
|
|
412
|
-
i18nString(UIStrings.sellerWorklet);
|
|
413
|
-
case Trace.Types.Events.AuctionWorkletType.BIDDER:
|
|
414
|
-
return shouldAddHost ? i18nString(UIStrings.bidderWorkletS, {PH1: host}) :
|
|
415
|
-
i18nString(UIStrings.bidderWorklet);
|
|
416
|
-
case Trace.Types.Events.AuctionWorkletType.UNKNOWN:
|
|
417
|
-
return shouldAddHost ? i18nString(UIStrings.unknownWorkletS, {PH1: host}) :
|
|
418
|
-
i18nString(UIStrings.unknownWorklet);
|
|
419
|
-
default:
|
|
420
|
-
Platform.assertNever(
|
|
421
|
-
workletMetadataEvent.type, `Unexpected Auction Worklet Type ${workletMetadataEvent.type}`);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
// We should never reach here, but just in case!
|
|
425
|
-
return shouldAddHost ? i18nString(UIStrings.unknownWorkletS, {PH1: host}) : i18nString(UIStrings.unknownWorklet);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
322
|
#buildNameForWorker(): string {
|
|
429
323
|
const url = this.#parsedTrace.data.Renderer?.processes.get(this.#processId)?.url || '';
|
|
430
324
|
const workerId = this.#parsedTrace.data.Workers.workerIdByThread.get(this.#threadId);
|
|
@@ -453,10 +453,15 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
453
453
|
#hiddenTracksInfoBarByParsedTrace = new WeakMap<Trace.TraceModel.ParsedTrace, UI.Infobar.Infobar|'DISMISSED'>();
|
|
454
454
|
|
|
455
455
|
readonly #resourceLoader: SDK.PageResourceLoader.ResourceLoader;
|
|
456
|
+
readonly #targetManager: SDK.TargetManager.TargetManager;
|
|
457
|
+
readonly #isolateManager: SDK.IsolateManager.IsolateManager;
|
|
456
458
|
|
|
457
|
-
constructor(resourceLoader: SDK.PageResourceLoader.ResourceLoader,
|
|
459
|
+
constructor(resourceLoader: SDK.PageResourceLoader.ResourceLoader, targetManager: SDK.TargetManager.TargetManager,
|
|
460
|
+
isolateManager: SDK.IsolateManager.IsolateManager, traceModel?: Trace.TraceModel.Model) {
|
|
458
461
|
super('timeline');
|
|
459
462
|
this.#resourceLoader = resourceLoader;
|
|
463
|
+
this.#targetManager = targetManager;
|
|
464
|
+
this.#isolateManager = isolateManager;
|
|
460
465
|
this.registerRequiredCSS(timelinePanelStyles);
|
|
461
466
|
const adornerContent = document.createElement('span');
|
|
462
467
|
adornerContent.innerHTML = `<div style="
|
|
@@ -717,10 +722,13 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
717
722
|
static instance(opts: {
|
|
718
723
|
forceNew: true,
|
|
719
724
|
resourceLoader: SDK.PageResourceLoader.ResourceLoader,
|
|
725
|
+
targetManager: SDK.TargetManager.TargetManager,
|
|
726
|
+
isolateManager: SDK.IsolateManager.IsolateManager,
|
|
720
727
|
traceModel?: Trace.TraceModel.Model,
|
|
721
728
|
}|undefined = undefined): TimelinePanel {
|
|
722
729
|
if (opts) {
|
|
723
|
-
timelinePanelInstance =
|
|
730
|
+
timelinePanelInstance =
|
|
731
|
+
new TimelinePanel(opts.resourceLoader, opts.targetManager, opts.isolateManager, opts.traceModel);
|
|
724
732
|
}
|
|
725
733
|
|
|
726
734
|
if (!timelinePanelInstance) {
|
|
@@ -1149,7 +1157,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
1149
1157
|
|
|
1150
1158
|
// Isolate selector
|
|
1151
1159
|
if (this.#isNode) {
|
|
1152
|
-
const isolateSelector = new IsolateSelector();
|
|
1160
|
+
const isolateSelector = new IsolateSelector(this.#targetManager, this.#isolateManager);
|
|
1153
1161
|
this.panelToolbar.appendSeparator();
|
|
1154
1162
|
this.panelToolbar.appendToolbarItem(isolateSelector);
|
|
1155
1163
|
}
|
|
@@ -2703,8 +2711,8 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
2703
2711
|
const {scriptId, scriptUrl, sourceUrl, sourceMapUrl, frame, cachedRawSourceMap} = params;
|
|
2704
2712
|
|
|
2705
2713
|
if (cachedRawSourceMap) {
|
|
2706
|
-
return new SDK.SourceMap.SourceMap(
|
|
2707
|
-
|
|
2714
|
+
return new SDK.SourceMap.SourceMap(sourceUrl, sourceMapUrl ?? '' as Platform.DevToolsPath.UrlString,
|
|
2715
|
+
cachedRawSourceMap, Common.Console.Console.instance());
|
|
2708
2716
|
}
|
|
2709
2717
|
|
|
2710
2718
|
// For still-active frames, the source map is likely already fetched or at least in-flight.
|
|
@@ -2725,7 +2733,8 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
2725
2733
|
if (!isFreshRecording && metadata?.sourceMaps && !isDataUrl) {
|
|
2726
2734
|
const cachedSourceMap = metadata.sourceMaps.find(m => m.sourceMapUrl === sourceMapUrl);
|
|
2727
2735
|
if (cachedSourceMap) {
|
|
2728
|
-
return new SDK.SourceMap.SourceMap(sourceUrl, sourceMapUrl, cachedSourceMap.sourceMap
|
|
2736
|
+
return new SDK.SourceMap.SourceMap(sourceUrl, sourceMapUrl, cachedSourceMap.sourceMap,
|
|
2737
|
+
Common.Console.Console.instance());
|
|
2729
2738
|
}
|
|
2730
2739
|
}
|
|
2731
2740
|
|
|
@@ -2755,7 +2764,9 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
|
|
|
2755
2764
|
};
|
|
2756
2765
|
const payload = await SDK.SourceMapManager.tryLoadSourceMap(
|
|
2757
2766
|
TimelinePanel.instance().#resourceLoader, sourceMapUrl, initiator);
|
|
2758
|
-
return payload ?
|
|
2767
|
+
return payload ?
|
|
2768
|
+
new SDK.SourceMap.SourceMap(sourceUrl, sourceMapUrl, payload, Common.Console.Console.instance()) :
|
|
2769
|
+
null;
|
|
2759
2770
|
}
|
|
2760
2771
|
|
|
2761
2772
|
const timeout = new Promise<null>(resolve => setTimeout(() => resolve(null), SOURCE_MAP_LOAD_TIMEOUT_MS));
|