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.
Files changed (112) hide show
  1. package/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
  2. package/front_end/core/host/InspectorFrontendHostStub.ts +2 -0
  3. package/front_end/core/root/Runtime.ts +12 -6
  4. package/front_end/core/sdk/CSSMatchedStyles.ts +3 -0
  5. package/front_end/core/sdk/CSSMetadata.ts +3 -0
  6. package/front_end/entrypoints/main/MainImpl.ts +1 -0
  7. package/front_end/generated/Deprecation.ts +21 -0
  8. package/front_end/generated/InspectorBackendCommands.ts +5 -3
  9. package/front_end/generated/SupportedCSSProperties.js +6 -2
  10. package/front_end/generated/protocol-mapping.d.ts +2 -1
  11. package/front_end/generated/protocol-proxy-api.d.ts +2 -1
  12. package/front_end/generated/protocol.ts +14 -0
  13. package/front_end/models/ai_assistance/AiConversation.ts +34 -2
  14. package/front_end/models/ai_assistance/BuiltInAi.ts +1 -2
  15. package/front_end/models/ai_assistance/agents/AiAgent.ts +3 -10
  16. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.snapshot.txt +1 -1
  17. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +17 -9
  18. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +0 -24
  19. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +5 -0
  20. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +16 -8
  21. package/front_end/models/computed_style/ComputedStyleModel.ts +20 -15
  22. package/front_end/models/greendev/Prototypes.ts +1 -5
  23. package/front_end/models/issues_manager/CorsIssue.ts +2 -9
  24. package/front_end/models/issues_manager/descriptions/corsLocalNetworkAccessPermissionDenied.md +2 -2
  25. package/front_end/models/javascript_metadata/NativeFunctions.js +20 -0
  26. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +13 -36
  27. package/front_end/panels/ai_assistance/components/ChatInput.ts +73 -95
  28. package/front_end/panels/ai_assistance/components/ChatView.ts +0 -2
  29. package/front_end/panels/common/AiCodeGenerationTeaser.ts +10 -0
  30. package/front_end/panels/console/ConsoleView.ts +1 -2
  31. package/front_end/panels/console/ConsoleViewMessage.ts +18 -11
  32. package/front_end/panels/elements/ComputedStyleWidget.ts +41 -21
  33. package/front_end/panels/elements/ElementsPanel.ts +18 -5
  34. package/front_end/panels/elements/ElementsTreeElement.ts +27 -64
  35. package/front_end/panels/elements/NodeStackTraceWidget.ts +1 -3
  36. package/front_end/panels/elements/computedStyleWidget.css +1 -6
  37. package/front_end/panels/issues/AffectedResourcesView.ts +1 -2
  38. package/front_end/panels/network/NetworkDataGridNode.ts +0 -8
  39. package/front_end/panels/network/RequestConditionsDrawer.ts +138 -112
  40. package/front_end/panels/settings/SettingsScreen.ts +12 -4
  41. package/front_end/panels/snippets/SnippetsQuickOpen.ts +6 -9
  42. package/front_end/panels/sources/CallStackSidebarPane.ts +4 -6
  43. package/front_end/panels/sources/DebuggerPlugin.ts +2 -1
  44. package/front_end/panels/sources/GoToLineQuickOpen.ts +0 -4
  45. package/front_end/panels/sources/OpenFileQuickOpen.ts +0 -4
  46. package/front_end/panels/sources/OutlineQuickOpen.ts +0 -4
  47. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +3 -1
  48. package/front_end/panels/sources/sources-meta.ts +9 -6
  49. package/front_end/panels/timeline/TimelineFlameChartView.ts +0 -12
  50. package/front_end/panels/timeline/TimelinePanel.ts +35 -15
  51. package/front_end/panels/timeline/components/Sidebar.ts +21 -0
  52. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +1 -20
  53. package/front_end/panels/timeline/components/insights/InsightRenderer.ts +0 -1
  54. package/front_end/third_party/chromium/README.chromium +1 -1
  55. package/front_end/third_party/puppeteer/README.chromium +2 -2
  56. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts +1 -1
  57. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  58. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js +1 -1
  59. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  60. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  61. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js +2 -3
  62. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/ChromeLauncher.js.map +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +2 -2
  64. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +2 -2
  65. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/encoding.d.ts.map +1 -1
  66. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/encoding.js +5 -3
  67. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/encoding.js.map +1 -1
  68. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  69. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  70. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +8 -6
  71. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts +1 -1
  72. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js +1 -1
  74. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js +2 -3
  77. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/ChromeLauncher.js.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +2 -2
  79. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +2 -2
  80. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/encoding.d.ts.map +1 -1
  81. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/encoding.js +5 -3
  82. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/encoding.js.map +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  84. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  85. package/front_end/third_party/puppeteer/package/package.json +4 -4
  86. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +1 -1
  87. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +2 -2
  88. package/front_end/third_party/puppeteer/package/src/node/ChromeLauncher.ts +4 -3
  89. package/front_end/third_party/puppeteer/package/src/revisions.ts +2 -2
  90. package/front_end/third_party/puppeteer/package/src/util/encoding.ts +5 -3
  91. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  92. package/front_end/ui/components/linkifier/LinkifierImpl.ts +3 -0
  93. package/front_end/ui/components/linkifier/LinkifierUtils.ts +3 -0
  94. package/front_end/ui/components/text_editor/AiCodeGenerationParser.ts +29 -7
  95. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +34 -18
  96. package/front_end/ui/legacy/InspectorView.ts +41 -15
  97. package/front_end/ui/legacy/UIUtils.ts +30 -6
  98. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +4 -3
  99. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +2 -1
  100. package/front_end/ui/legacy/components/quick_open/HelpQuickOpen.ts +8 -2
  101. package/front_end/ui/legacy/components/quick_open/QuickOpen.ts +8 -8
  102. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +12 -9
  103. package/front_end/ui/legacy/components/utils/Linkifier.ts +116 -87
  104. package/front_end/ui/legacy/legacy.ts +0 -2
  105. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  106. package/mcp/HostBindings.ts +3 -0
  107. package/package.json +1 -1
  108. package/front_end/models/issues_manager/descriptions/corsInsecurePrivateNetwork.md +0 -10
  109. package/front_end/models/issues_manager/descriptions/corsPreflightAllowPrivateNetworkError.md +0 -10
  110. package/front_end/models/issues_manager/descriptions/corsPrivateNetworkPermissionDenied.md +0 -10
  111. package/front_end/ui/legacy/Floaty.ts +0 -438
  112. 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: (): boolean => {
186
- if (!this.#aiCodeGeneration || !this.#editor || !hasActiveAiSuggestion(this.#editor.state)) {
187
- return false;
188
- }
189
- const {accepted, suggestion} = acceptAiAutoCompleteSuggestion(this.#editor.editor);
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
- // Required for mouse click to propagate to the info tooltip in teaser.
454
- return (event.target instanceof Node && teaser.contentElement.contains(event.target));
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
- delete this.reloadRequiredInfobar;
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('webkitAnimationEnd', animationEndCallback, false);
700
+ element.removeEventListener('animationend', animationEndCallback, false);
701
701
  element.removeEventListener('animationcancel', animationEndCallback, false);
702
702
  }
703
703
 
704
- if (element.classList.contains(className)) {
705
- element.classList.remove(className);
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('command');
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: (await extension.provider()).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: () => Promise.resolve(new HelpQuickOpen('help')),
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 {FilteredListWidget, getRegisteredProviders, type Provider} from './FilteredListWidget.js';
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 = linkifier.maybeLinkifyStackTraceFrame(target, frame, {
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
- // TODO(crbug.com/456517732): remove when all usages of runtimeStackTrace are migrated.
374
- const updateCallback =
375
- renderStackTraceTable.bind(null, this.#table, this.element, this.#options.expandable ?? false);
376
- const stackTraceRows = buildStackTraceRowsForLegacyRuntimeStackTrace(
377
- runtimeStackTrace ?? {callFrames: []}, this.#target ?? null, this.#linkifier, tabStops, updateCallback,
378
- this.#options.showColumnNumber);
379
- this.#hasRows = stackTraceRows.length > 0;
380
- this.#links = renderStackTraceTable(this.#table, this.element, this.#options.expandable ?? false, stackTraceRows);
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[] {