chrome-devtools-frontend 1.0.1583146 → 1.0.1585538
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/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
- package/front_end/core/host/InspectorFrontendHostStub.ts +2 -0
- package/front_end/core/root/Runtime.ts +12 -6
- package/front_end/core/sdk/CSSMatchedStyles.ts +3 -0
- package/front_end/core/sdk/CSSMetadata.ts +3 -0
- package/front_end/entrypoints/main/MainImpl.ts +1 -0
- package/front_end/generated/Deprecation.ts +21 -0
- package/front_end/generated/InspectorBackendCommands.ts +5 -3
- package/front_end/generated/SupportedCSSProperties.js +6 -2
- package/front_end/generated/protocol-mapping.d.ts +2 -1
- package/front_end/generated/protocol-proxy-api.d.ts +2 -1
- package/front_end/generated/protocol.ts +14 -0
- package/front_end/models/ai_assistance/AiConversation.ts +34 -2
- package/front_end/models/ai_assistance/BuiltInAi.ts +1 -2
- package/front_end/models/ai_assistance/agents/AiAgent.ts +3 -10
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.snapshot.txt +1 -1
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +17 -9
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -24
- package/front_end/models/ai_code_generation/AiCodeGeneration.ts +5 -0
- package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +16 -8
- package/front_end/models/computed_style/ComputedStyleModel.ts +20 -15
- package/front_end/models/greendev/Prototypes.ts +1 -5
- package/front_end/models/issues_manager/CorsIssue.ts +2 -9
- package/front_end/models/issues_manager/descriptions/corsLocalNetworkAccessPermissionDenied.md +2 -2
- package/front_end/models/javascript_metadata/NativeFunctions.js +20 -0
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +13 -36
- package/front_end/panels/ai_assistance/components/ChatInput.ts +73 -95
- package/front_end/panels/ai_assistance/components/ChatView.ts +0 -2
- package/front_end/panels/common/AiCodeGenerationTeaser.ts +10 -0
- package/front_end/panels/console/ConsoleView.ts +1 -2
- package/front_end/panels/console/ConsoleViewMessage.ts +18 -11
- package/front_end/panels/elements/ComputedStyleWidget.ts +41 -21
- package/front_end/panels/elements/ElementsPanel.ts +18 -5
- package/front_end/panels/elements/ElementsTreeElement.ts +27 -64
- package/front_end/panels/elements/NodeStackTraceWidget.ts +1 -3
- package/front_end/panels/elements/computedStyleWidget.css +1 -6
- package/front_end/panels/issues/AffectedResourcesView.ts +1 -2
- package/front_end/panels/network/NetworkDataGridNode.ts +0 -8
- package/front_end/panels/network/RequestConditionsDrawer.ts +138 -112
- package/front_end/panels/settings/SettingsScreen.ts +12 -4
- package/front_end/panels/snippets/SnippetsQuickOpen.ts +6 -9
- package/front_end/panels/sources/CallStackSidebarPane.ts +4 -6
- package/front_end/panels/sources/DebuggerPlugin.ts +2 -1
- package/front_end/panels/sources/GoToLineQuickOpen.ts +0 -4
- package/front_end/panels/sources/OpenFileQuickOpen.ts +0 -4
- package/front_end/panels/sources/OutlineQuickOpen.ts +0 -4
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +3 -1
- package/front_end/panels/sources/sources-meta.ts +9 -6
- package/front_end/panels/timeline/TimelineFlameChartView.ts +0 -12
- package/front_end/panels/timeline/TimelinePanel.ts +35 -15
- package/front_end/panels/timeline/components/Sidebar.ts +21 -0
- package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +1 -20
- package/front_end/panels/timeline/components/insights/InsightRenderer.ts +0 -1
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts +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 -1
- 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/node/ChromeLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js +2 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/encoding.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/encoding.js +5 -3
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/encoding.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +8 -6
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts +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 -1
- 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/node/ChromeLauncher.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js +2 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/encoding.d.ts.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/encoding.js +5 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/encoding.js.map +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/package.json +4 -4
- package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +1 -1
- package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/node/ChromeLauncher.ts +4 -3
- package/front_end/third_party/puppeteer/package/src/revisions.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/util/encoding.ts +5 -3
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/ui/components/linkifier/LinkifierImpl.ts +3 -0
- package/front_end/ui/components/linkifier/LinkifierUtils.ts +3 -0
- package/front_end/ui/components/text_editor/AiCodeGenerationParser.ts +29 -7
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +34 -18
- package/front_end/ui/legacy/InspectorView.ts +41 -15
- package/front_end/ui/legacy/UIUtils.ts +30 -6
- package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +4 -3
- package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +2 -1
- package/front_end/ui/legacy/components/quick_open/HelpQuickOpen.ts +8 -2
- package/front_end/ui/legacy/components/quick_open/QuickOpen.ts +8 -8
- package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +12 -9
- package/front_end/ui/legacy/components/utils/Linkifier.ts +116 -87
- package/front_end/ui/legacy/legacy.ts +0 -2
- package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
- package/mcp/HostBindings.ts +3 -0
- package/package.json +1 -1
- package/front_end/models/issues_manager/descriptions/corsInsecurePrivateNetwork.md +0 -10
- package/front_end/models/issues_manager/descriptions/corsPreflightAllowPrivateNetworkError.md +0 -10
- package/front_end/models/issues_manager/descriptions/corsPrivateNetworkPermissionDenied.md +0 -10
- package/front_end/ui/legacy/Floaty.ts +0 -438
- package/front_end/ui/legacy/floaty.css +0 -77
|
@@ -182,20 +182,11 @@ export class AiCodeGenerationProvider {
|
|
|
182
182
|
},
|
|
183
183
|
{
|
|
184
184
|
key: 'Tab',
|
|
185
|
-
run: ()
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if (!accepted) {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
if (suggestion?.rpcGlobalId) {
|
|
194
|
-
this.#aiCodeGeneration.registerUserAcceptance(suggestion.rpcGlobalId, suggestion.sampleId);
|
|
195
|
-
}
|
|
196
|
-
this.#aiCodeGenerationConfig?.onSuggestionAccepted(this.#aiCodeGenerationCitations);
|
|
197
|
-
return true;
|
|
198
|
-
},
|
|
185
|
+
run: this.#acceptAiSuggestion.bind(this),
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
key: 'Enter',
|
|
189
|
+
run: this.#acceptAiSuggestion.bind(this),
|
|
199
190
|
},
|
|
200
191
|
{
|
|
201
192
|
any: (_view: unknown, event: KeyboardEvent) => {
|
|
@@ -248,6 +239,21 @@ export class AiCodeGenerationProvider {
|
|
|
248
239
|
});
|
|
249
240
|
}
|
|
250
241
|
|
|
242
|
+
#acceptAiSuggestion(): boolean {
|
|
243
|
+
if (!this.#aiCodeGeneration || !this.#editor || !hasActiveAiSuggestion(this.#editor.state)) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
const {accepted, suggestion} = acceptAiAutoCompleteSuggestion(this.#editor.editor);
|
|
247
|
+
if (!accepted) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
if (suggestion?.rpcGlobalId) {
|
|
251
|
+
this.#aiCodeGeneration.registerUserAcceptance(suggestion.rpcGlobalId, suggestion.sampleId);
|
|
252
|
+
}
|
|
253
|
+
this.#aiCodeGenerationConfig?.onSuggestionAccepted(this.#aiCodeGenerationCitations);
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
|
|
251
257
|
#activateTeaser(update: CodeMirror.ViewUpdate): void {
|
|
252
258
|
const currentTeaserMode = update.state.field(aiCodeGenerationTeaserModeState);
|
|
253
259
|
if (currentTeaserMode === AiCodeGenerationTeaserMode.ACTIVE) {
|
|
@@ -342,7 +348,7 @@ export class AiCodeGenerationProvider {
|
|
|
342
348
|
this.#editor.dispatch({
|
|
343
349
|
effects: [
|
|
344
350
|
setAiAutoCompleteSuggestion.of({
|
|
345
|
-
text: '\n' + suggestionText,
|
|
351
|
+
text: '\n' + suggestionText + '\n',
|
|
346
352
|
from: commentNodeInfo.to,
|
|
347
353
|
rpcGlobalId: generationResponse.metadata.rpcGlobalId,
|
|
348
354
|
sampleId: topSample.sampleId,
|
|
@@ -449,9 +455,19 @@ function aiCodeGenerationTeaserExtension(teaser: PanelCommon.AiCodeGenerationTea
|
|
|
449
455
|
// Required for mouse hover to propagate to the info button in teaser.
|
|
450
456
|
return (event.target instanceof Node && teaser.contentElement.contains(event.target));
|
|
451
457
|
},
|
|
452
|
-
mousedown(event: MouseEvent): boolean {
|
|
453
|
-
|
|
454
|
-
|
|
458
|
+
mousedown(event: MouseEvent, view: CodeMirror.EditorView): boolean {
|
|
459
|
+
if (!(event.target instanceof Node) || !teaser.contentElement.contains(event.target)) {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
// On mouse click, move the cursor position to the end of the line.
|
|
463
|
+
const cursorPosition = view.state.selection.main.head;
|
|
464
|
+
const line = view.state.doc.lineAt(cursorPosition);
|
|
465
|
+
if (cursorPosition !== line.to) {
|
|
466
|
+
view.dispatch({selection: {anchor: line.to, head: line.to}});
|
|
467
|
+
}
|
|
468
|
+
// Explicitly focus the editor.
|
|
469
|
+
view.focus();
|
|
470
|
+
return true;
|
|
455
471
|
},
|
|
456
472
|
keydown(event: KeyboardEvent): boolean {
|
|
457
473
|
if (!UI.KeyboardShortcut.KeyboardShortcut.eventHasCtrlEquivalentKey(event) ||
|
|
@@ -8,7 +8,6 @@ import * as Host from '../../core/host/host.js';
|
|
|
8
8
|
import * as i18n from '../../core/i18n/i18n.js';
|
|
9
9
|
import * as Root from '../../core/root/root.js';
|
|
10
10
|
import * as SDK from '../../core/sdk/sdk.js';
|
|
11
|
-
import * as GreenDev from '../../models/greendev/greendev.js';
|
|
12
11
|
import * as Buttons from '../../ui/components/buttons/buttons.js';
|
|
13
12
|
import {createIcon, type Icon} from '../kit/kit.js';
|
|
14
13
|
import * as VisualLogging from '../visual_logging/visual_logging.js';
|
|
@@ -20,7 +19,6 @@ import type {Context} from './Context.js';
|
|
|
20
19
|
import type {ContextMenu} from './ContextMenu.js';
|
|
21
20
|
import {Dialog} from './Dialog.js';
|
|
22
21
|
import {DockController, DockState, Events as DockControllerEvents} from './DockController.js';
|
|
23
|
-
import {Floaty} from './Floaty.js';
|
|
24
22
|
import {GlassPane} from './GlassPane.js';
|
|
25
23
|
import {Infobar, Type as InfobarType} from './Infobar.js';
|
|
26
24
|
import {KeyboardShortcut} from './KeyboardShortcut.js';
|
|
@@ -54,6 +52,14 @@ const UIStrings = {
|
|
|
54
52
|
* @description Title of an action that reloads the DevTools
|
|
55
53
|
*/
|
|
56
54
|
reloadDevtools: 'Reload DevTools',
|
|
55
|
+
/**
|
|
56
|
+
* @description Title of an action that restarts Chrome
|
|
57
|
+
*/
|
|
58
|
+
restartChrome: 'Restart Chrome',
|
|
59
|
+
/**
|
|
60
|
+
* @description Confirmation dialog text for restarting Chrome
|
|
61
|
+
*/
|
|
62
|
+
areYouSureYouWantToRestartChrome: 'Are you sure you want to restart Chrome?',
|
|
57
63
|
/**
|
|
58
64
|
* @description Text for context menu action to move a tab to the main tab bar
|
|
59
65
|
*/
|
|
@@ -155,6 +161,7 @@ export class InspectorView extends VBox implements ViewLocationResolver {
|
|
|
155
161
|
private focusRestorer?: WidgetFocusRestorer|null;
|
|
156
162
|
private ownerSplitWidget?: SplitWidget;
|
|
157
163
|
private reloadRequiredInfobar?: Infobar;
|
|
164
|
+
#chromeRestartRequiredInfobar?: Infobar;
|
|
158
165
|
#debuggedTabReloadRequiredInfobar?: Infobar;
|
|
159
166
|
#selectOverrideFolderInfobar?: Infobar;
|
|
160
167
|
#resizeObserver: ResizeObserver;
|
|
@@ -362,10 +369,6 @@ export class InspectorView extends VBox implements ViewLocationResolver {
|
|
|
362
369
|
this.element.style.setProperty('--devtools-window-top', `${rect.top}px`);
|
|
363
370
|
this.element.style.setProperty('--devtools-window-bottom', `${window.innerHeight - rect.bottom}px`);
|
|
364
371
|
this.element.style.setProperty('--devtools-window-height', `${rect.height}px`);
|
|
365
|
-
|
|
366
|
-
if (Floaty.exists()) {
|
|
367
|
-
Floaty.instance().setDevToolsRect(rect);
|
|
368
|
-
}
|
|
369
372
|
}
|
|
370
373
|
|
|
371
374
|
override wasShown(): void {
|
|
@@ -376,13 +379,6 @@ export class InspectorView extends VBox implements ViewLocationResolver {
|
|
|
376
379
|
DockController.instance().addEventListener(
|
|
377
380
|
DockControllerEvents.DOCK_SIDE_CHANGED, this.#applyDrawerOrientationForDockSide, this);
|
|
378
381
|
this.#applyDrawerOrientationForDockSide();
|
|
379
|
-
|
|
380
|
-
if (GreenDev.Prototypes.instance().isEnabled('inDevToolsFloaty')) {
|
|
381
|
-
Floaty.instance({
|
|
382
|
-
forceNew: true,
|
|
383
|
-
document: this.element.ownerDocument,
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
382
|
}
|
|
387
383
|
|
|
388
384
|
override willHide(): void {
|
|
@@ -676,7 +672,7 @@ export class InspectorView extends VBox implements ViewLocationResolver {
|
|
|
676
672
|
}
|
|
677
673
|
|
|
678
674
|
displayReloadRequiredWarning(message: string): void {
|
|
679
|
-
if (!this.reloadRequiredInfobar) {
|
|
675
|
+
if (!this.reloadRequiredInfobar && !this.#chromeRestartRequiredInfobar) {
|
|
680
676
|
const infobar = new Infobar(
|
|
681
677
|
InfobarType.INFO, message,
|
|
682
678
|
[
|
|
@@ -693,7 +689,37 @@ export class InspectorView extends VBox implements ViewLocationResolver {
|
|
|
693
689
|
this.attachInfobar(infobar);
|
|
694
690
|
this.reloadRequiredInfobar = infobar;
|
|
695
691
|
infobar.setCloseCallback(() => {
|
|
696
|
-
|
|
692
|
+
this.reloadRequiredInfobar = undefined;
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
displayChromeRestartRequiredWarning(message: string): void {
|
|
698
|
+
if (this.reloadRequiredInfobar) {
|
|
699
|
+
this.reloadRequiredInfobar.dispose();
|
|
700
|
+
}
|
|
701
|
+
if (!this.#chromeRestartRequiredInfobar) {
|
|
702
|
+
const infobar = new Infobar(
|
|
703
|
+
InfobarType.INFO, message,
|
|
704
|
+
[
|
|
705
|
+
{
|
|
706
|
+
text: i18nString(UIStrings.restartChrome),
|
|
707
|
+
delegate: () => {
|
|
708
|
+
if (confirm(i18nString(UIStrings.areYouSureYouWantToRestartChrome))) {
|
|
709
|
+
Host.InspectorFrontendHost.InspectorFrontendHostInstance.requestRestart();
|
|
710
|
+
}
|
|
711
|
+
},
|
|
712
|
+
dismiss: false,
|
|
713
|
+
buttonVariant: Buttons.Button.Variant.PRIMARY,
|
|
714
|
+
jslogContext: 'main.chrome-restart-chrome',
|
|
715
|
+
},
|
|
716
|
+
],
|
|
717
|
+
undefined, 'reload-required');
|
|
718
|
+
infobar.setParentView(this);
|
|
719
|
+
this.attachInfobar(infobar);
|
|
720
|
+
this.#chromeRestartRequiredInfobar = infobar;
|
|
721
|
+
infobar.setCloseCallback(() => {
|
|
722
|
+
this.#chromeRestartRequiredInfobar = undefined;
|
|
697
723
|
});
|
|
698
724
|
}
|
|
699
725
|
}
|
|
@@ -697,19 +697,42 @@ export class ElementFocusRestorer {
|
|
|
697
697
|
export function runCSSAnimationOnce(element: Element, className: string): void {
|
|
698
698
|
function animationEndCallback(): void {
|
|
699
699
|
element.classList.remove(className);
|
|
700
|
-
element.removeEventListener('
|
|
700
|
+
element.removeEventListener('animationend', animationEndCallback, false);
|
|
701
701
|
element.removeEventListener('animationcancel', animationEndCallback, false);
|
|
702
702
|
}
|
|
703
703
|
|
|
704
|
-
if
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
element.addEventListener('webkitAnimationEnd', animationEndCallback, false);
|
|
704
|
+
// Remove class if it exists.
|
|
705
|
+
element.classList.toggle(className, /* force=*/ false);
|
|
706
|
+
element.addEventListener('animationend', animationEndCallback, false);
|
|
709
707
|
element.addEventListener('animationcancel', animationEndCallback, false);
|
|
710
708
|
element.classList.add(className);
|
|
711
709
|
}
|
|
712
710
|
|
|
711
|
+
class AnimateOnDirective extends Lit.Directive.Directive {
|
|
712
|
+
#previousValue = false;
|
|
713
|
+
|
|
714
|
+
render(_condition: boolean, _className: string): void {
|
|
715
|
+
return undefined; // Directives don't have to render HTML
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
override update(part: Lit.Directive.ElementPart, [condition, className]: [boolean, string]): void {
|
|
719
|
+
const el = part.element as HTMLElement;
|
|
720
|
+
|
|
721
|
+
// Only trigger if the condition transitioned from false -> true
|
|
722
|
+
if (condition && !this.#previousValue) {
|
|
723
|
+
this.#animate(el, className);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
this.#previousValue = condition;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
#animate(el: HTMLElement, className: string): void {
|
|
730
|
+
runCSSAnimationOnce(el, className);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
export const animateOn = Lit.Directive.directive(AnimateOnDirective);
|
|
735
|
+
|
|
713
736
|
export function measurePreferredSize(element: Element, containerElement?: Element|null): Geometry.Size {
|
|
714
737
|
const oldParent = element.parentElement;
|
|
715
738
|
const oldNextSibling = element.nextSibling;
|
|
@@ -1530,6 +1553,7 @@ export function createFileSelectorElement(callback: (arg0: File) => void, accept
|
|
|
1530
1553
|
}
|
|
1531
1554
|
|
|
1532
1555
|
export const MaxLengthForDisplayedURLs = 150;
|
|
1556
|
+
export const MaxLengthForDisplayedURLsInConsole = 40;
|
|
1533
1557
|
|
|
1534
1558
|
export class MessageDialog {
|
|
1535
1559
|
static async show(header: string, message: string, where?: Element|Document, jslogContext?: string): Promise<void> {
|
|
@@ -275,8 +275,8 @@ export const enum PanelOrDrawer {
|
|
|
275
275
|
export class CommandMenuProvider extends Provider {
|
|
276
276
|
private commands: Command[];
|
|
277
277
|
|
|
278
|
-
constructor(commandsForTest: Command[] = []) {
|
|
279
|
-
super(
|
|
278
|
+
constructor(jslogContext: string, commandsForTest: Command[] = []) {
|
|
279
|
+
super(jslogContext);
|
|
280
280
|
this.commands = commandsForTest;
|
|
281
281
|
}
|
|
282
282
|
|
|
@@ -455,8 +455,9 @@ export class ShowActionDelegate implements UI.ActionRegistration.ActionDelegate
|
|
|
455
455
|
registerProvider({
|
|
456
456
|
prefix: '>',
|
|
457
457
|
iconName: 'chevron-right',
|
|
458
|
-
provider: () => Promise.resolve(new CommandMenuProvider()),
|
|
458
|
+
provider: (jslogContext: string) => Promise.resolve(new CommandMenuProvider(jslogContext)),
|
|
459
459
|
helpTitle: () => i18nString(UIStrings.runCommand),
|
|
460
460
|
titlePrefix: () => i18nString(UIStrings.run),
|
|
461
461
|
titleSuggestion: () => i18nString(UIStrings.command),
|
|
462
|
+
jslogContext: 'command',
|
|
462
463
|
});
|
|
@@ -657,8 +657,9 @@ export function getRegisteredProviders(): ProviderRegistration[] {
|
|
|
657
657
|
export interface ProviderRegistration {
|
|
658
658
|
prefix: string;
|
|
659
659
|
iconName: string;
|
|
660
|
-
provider: () => Promise<Provider>;
|
|
660
|
+
provider: (jslogContext: string) => Promise<Provider>;
|
|
661
661
|
helpTitle: (() => string);
|
|
662
662
|
titlePrefix: (() => string);
|
|
663
663
|
titleSuggestion?: (() => string);
|
|
664
|
+
jslogContext: string;
|
|
664
665
|
}
|
|
@@ -24,11 +24,16 @@ export class HelpQuickOpen extends Provider {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
private async addProvider(extension: ProviderRegistration): Promise<void> {
|
|
27
|
+
// We want to exclude Help menu as we are already in it.
|
|
28
|
+
if (extension.prefix === '?') {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
27
32
|
this.providers.push({
|
|
28
33
|
prefix: extension.prefix || '',
|
|
29
34
|
iconName: extension.iconName,
|
|
30
35
|
title: extension.helpTitle(),
|
|
31
|
-
jslogContext:
|
|
36
|
+
jslogContext: extension.jslogContext,
|
|
32
37
|
});
|
|
33
38
|
}
|
|
34
39
|
|
|
@@ -69,8 +74,9 @@ export class HelpQuickOpen extends Provider {
|
|
|
69
74
|
registerProvider({
|
|
70
75
|
prefix: '?',
|
|
71
76
|
iconName: 'help',
|
|
72
|
-
provider:
|
|
77
|
+
provider: jslogContext => Promise.resolve(new HelpQuickOpen(jslogContext)),
|
|
73
78
|
helpTitle: () => 'Help',
|
|
74
79
|
titlePrefix: () => 'Help',
|
|
75
80
|
titleSuggestion: undefined,
|
|
81
|
+
jslogContext: 'help'
|
|
76
82
|
});
|
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
import * as i18n from '../../../../core/i18n/i18n.js';
|
|
6
6
|
import type * as UI from '../../legacy.js';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
FilteredListWidget,
|
|
10
|
+
getRegisteredProviders,
|
|
11
|
+
type Provider,
|
|
12
|
+
type ProviderRegistration
|
|
13
|
+
} from './FilteredListWidget.js';
|
|
9
14
|
|
|
10
15
|
const UIStrings = {
|
|
11
16
|
/**
|
|
@@ -42,19 +47,14 @@ export class QuickOpenImpl {
|
|
|
42
47
|
filteredListWidget.setQuery(query);
|
|
43
48
|
}
|
|
44
49
|
|
|
45
|
-
private addProvider(extension: {
|
|
46
|
-
prefix: string,
|
|
47
|
-
provider: () => Promise<Provider>,
|
|
48
|
-
titlePrefix: () => string,
|
|
49
|
-
titleSuggestion?: (() => string),
|
|
50
|
-
}): void {
|
|
50
|
+
private addProvider(extension: ProviderRegistration): void {
|
|
51
51
|
const prefix = extension.prefix;
|
|
52
52
|
if (prefix === null) {
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
55
|
this.prefixes.push(prefix);
|
|
56
56
|
this.providers.set(prefix, {
|
|
57
|
-
provider: extension.provider,
|
|
57
|
+
provider: () => extension.provider(extension.jslogContext),
|
|
58
58
|
titlePrefix: extension.titlePrefix,
|
|
59
59
|
titleSuggestion: extension.titleSuggestion,
|
|
60
60
|
});
|
|
@@ -183,11 +183,12 @@ function buildStackTraceRows(
|
|
|
183
183
|
let previousStackFrameWasBreakpointCondition = false;
|
|
184
184
|
for (const frame of fragment.frames) {
|
|
185
185
|
const functionName = UI.UIUtils.beautifyFunctionName(frame.name ?? '');
|
|
186
|
-
const link =
|
|
186
|
+
const link = Linkifier.linkifyStackTraceFrame(frame, {
|
|
187
187
|
showColumnNumber,
|
|
188
188
|
tabStop: Boolean(tabStops),
|
|
189
189
|
inlineFrameIndex: 0,
|
|
190
190
|
revealBreakpoint: previousStackFrameWasBreakpointCondition,
|
|
191
|
+
maxLength: UI.UIUtils.MaxLengthForDisplayedURLsInConsole,
|
|
191
192
|
});
|
|
192
193
|
link.setAttribute('jslog', `${VisualLogging.link('stack-trace').track({click: true})}`);
|
|
193
194
|
link.addEventListener('contextmenu', populateContextMenu.bind(null, link));
|
|
@@ -370,14 +371,16 @@ export class StackTracePreviewContent extends UI.Widget.Widget {
|
|
|
370
371
|
return;
|
|
371
372
|
}
|
|
372
373
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
374
|
+
if (runtimeStackTrace) {
|
|
375
|
+
// TODO(crbug.com/456517732): remove when all usages of runtimeStackTrace are migrated.
|
|
376
|
+
const updateCallback =
|
|
377
|
+
renderStackTraceTable.bind(null, this.#table, this.element, this.#options.expandable ?? false);
|
|
378
|
+
const stackTraceRows = buildStackTraceRowsForLegacyRuntimeStackTrace(
|
|
379
|
+
runtimeStackTrace ?? {callFrames: []}, this.#target ?? null, this.#linkifier, tabStops, updateCallback,
|
|
380
|
+
this.#options.showColumnNumber);
|
|
381
|
+
this.#hasRows = stackTraceRows.length > 0;
|
|
382
|
+
this.#links = renderStackTraceTable(this.#table, this.element, this.#options.expandable ?? false, stackTraceRows);
|
|
383
|
+
}
|
|
381
384
|
}
|
|
382
385
|
|
|
383
386
|
get linkElements(): readonly HTMLElement[] {
|