chrome-devtools-frontend 1.0.1703574 → 1.0.1705227

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 (85) hide show
  1. package/AUTHORS +2 -0
  2. package/docs/architecture_of_devtools.md +1 -1
  3. package/docs/cookbook/localization.md +2 -2
  4. package/front_end/core/common/ParsedURL.ts +54 -0
  5. package/front_end/core/common/README.md +4 -3
  6. package/front_end/core/platform/StringUtilities.ts +65 -0
  7. package/front_end/core/sdk/CPUThrottlingManager.ts +3 -3
  8. package/front_end/core/sdk/SourceMap.ts +3 -3
  9. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +4 -3
  10. package/front_end/core/sdk/SourceMapScopesInfo.ts +17 -5
  11. package/front_end/entrypoints/formatter_actions/formatter_actions.ts +18 -0
  12. package/front_end/entrypoints/formatter_worker/Substitute.ts +9 -8
  13. package/front_end/entrypoints/formatter_worker/formatter_worker-entrypoint.ts +2 -2
  14. package/front_end/entrypoints/main/MainImpl.ts +3 -3
  15. package/front_end/foundation/Universe.ts +9 -0
  16. package/front_end/generated/InspectorBackendCommands.ts +3 -2
  17. package/front_end/generated/protocol.ts +16 -0
  18. package/front_end/models/bindings/CompilerScriptMapping.ts +1 -1
  19. package/front_end/models/formatter/FormatterWorkerPool.ts +8 -3
  20. package/front_end/models/har/HARFormat.ts +7 -2
  21. package/front_end/models/source_map_scopes/NamesResolver.ts +75 -38
  22. package/front_end/models/source_map_scopes/ScopeChainModel.ts +13 -45
  23. package/front_end/models/source_map_scopes/ScopeChainResolver.ts +101 -0
  24. package/front_end/models/source_map_scopes/source_map_scopes.ts +2 -0
  25. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingListView.ts +33 -1
  26. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +4 -12
  27. package/front_end/panels/application/ApplicationPanelSidebar.ts +58 -60
  28. package/front_end/panels/application/BackForwardCacheTreeElement.ts +1 -1
  29. package/front_end/panels/application/FrameDetailsView.ts +64 -82
  30. package/front_end/panels/application/OpenedWindowDetailsView.ts +20 -21
  31. package/front_end/panels/application/PreloadingTreeElement.ts +3 -3
  32. package/front_end/panels/common/CommentsOverlayWidget.ts +145 -72
  33. package/front_end/panels/common/commentsOverlay.css +34 -23
  34. package/front_end/panels/console/ConsolePrompt.ts +2 -1
  35. package/front_end/panels/elements/DOMTreeWidget.ts +29 -10
  36. package/front_end/panels/network/RequestPayloadView.ts +7 -2
  37. package/front_end/panels/network/ShowMoreDetailsWidget.ts +12 -9
  38. package/front_end/panels/sources/DebuggerPlugin.ts +52 -20
  39. package/front_end/panels/sources/ScopeChainSidebarPane.ts +2 -2
  40. package/front_end/panels/sources/SourcesPanel.ts +1 -1
  41. package/front_end/panels/sources/SourcesView.ts +3 -12
  42. package/front_end/panels/sources/TabbedEditorContainer.ts +0 -3
  43. package/front_end/panels/sources/components/HeadersView.ts +193 -123
  44. package/front_end/third_party/chromium/README.chromium +1 -1
  45. package/front_end/third_party/puppeteer/README.chromium +2 -2
  46. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +5 -0
  47. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +24 -32
  48. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ElementHandle.d.ts +1 -1
  49. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ElementHandle.d.ts.map +1 -1
  50. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ElementHandle.js +15 -1
  51. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/ElementHandle.js.map +1 -1
  52. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js +8 -1
  53. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js.map +1 -1
  54. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts +0 -8
  55. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts.map +1 -1
  56. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js +0 -24
  57. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js.map +1 -1
  58. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts +12 -0
  59. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  60. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +79 -17
  61. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  62. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.js +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.js.map +1 -1
  64. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  65. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  66. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  67. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  68. package/front_end/third_party/puppeteer/package/lib/types.d.ts +5 -0
  69. package/front_end/third_party/puppeteer/package/package.json +4 -4
  70. package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +15 -2
  71. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +10 -1
  72. package/front_end/third_party/puppeteer/package/src/common/Debug.ts +0 -27
  73. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +96 -17
  74. package/front_end/third_party/puppeteer/package/src/node-env-setup.ts +1 -1
  75. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  76. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  77. package/front_end/ui/comments/CommentAnchorResolver.ts +60 -22
  78. package/front_end/ui/comments/CommentOverlayManager.ts +78 -25
  79. package/front_end/ui/legacy/README.md +12 -12
  80. package/front_end/ui/legacy/components/data_grid/DataGridExporter.ts +7 -13
  81. package/front_end/ui/legacy/components/inline_editor/PositionAreaEditor.ts +51 -57
  82. package/front_end/ui/legacy/components/source_frame/ImageView.ts +101 -42
  83. package/front_end/ui/legacy/components/utils/Linkifier.ts +1 -2
  84. package/front_end/ui/visual_logging/KnownContextValues.ts +7 -0
  85. package/package.json +1 -1
@@ -11,6 +11,10 @@ const UIStrings = {
11
11
  * @description Text to show more content
12
12
  */
13
13
  showMore: 'Show more',
14
+ /**
15
+ * @description Context menu item to copy the shown text to the clipboard
16
+ */
17
+ copy: 'Copy',
14
18
  } as const;
15
19
  const str_ = i18n.i18n.registerUIStrings('panels/network/ShowMoreDetailsWidget.ts', UIStrings);
16
20
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -20,7 +24,7 @@ interface ViewInput {
20
24
  text: string;
21
25
  showMore: boolean;
22
26
  onToggle: () => void;
23
- copy: CopyMenuItem|null;
27
+ copy: (() => void)|null;
24
28
  }
25
29
  type View = (input: ViewInput, output: object, target: HTMLElement) => void;
26
30
  const MAX_LENGTH = 3000;
@@ -29,7 +33,7 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
29
33
  const onContextMenuShowMore = (event: Event): void => {
30
34
  const contextMenu = new UI.ContextMenu.ContextMenu(event);
31
35
  if (input.copy) {
32
- contextMenu.clipboardSection().appendItem(input.copy.menuItem, input.copy.handler);
36
+ contextMenu.clipboardSection().appendItem(i18nString(UIStrings.copy), input.copy, {jslogContext: 'copy'});
33
37
  }
34
38
  if (!input.showMore) {
35
39
  contextMenu.newSection().appendItem(i18nString(UIStrings.showMore), input.onToggle, {jslogContext: 'show-more'});
@@ -51,16 +55,11 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
51
55
  target);
52
56
  };
53
57
 
54
- interface CopyMenuItem {
55
- menuItem: UI.ContextMenu.Item;
56
- handler: () => void;
57
- }
58
-
59
58
  export class ShowMoreDetailsWidget extends UI.Widget.Widget {
60
59
  readonly #view: View;
61
60
  #text = '';
62
61
  #showMore = false;
63
- #copy: CopyMenuItem|null = null;
62
+ #copy: (() => void)|null = null;
64
63
  constructor(target?: HTMLElement, view: View = DEFAULT_VIEW) {
65
64
  super(target);
66
65
  this.#view = view;
@@ -75,7 +74,11 @@ export class ShowMoreDetailsWidget extends UI.Widget.Widget {
75
74
  this.requestUpdate();
76
75
  }
77
76
 
78
- set copy(copy: CopyMenuItem) {
77
+ get copy(): (() => void)|null {
78
+ return this.#copy;
79
+ }
80
+
81
+ set copy(copy: () => void) {
79
82
  this.#copy = copy;
80
83
  this.requestUpdate();
81
84
  }
@@ -583,6 +583,7 @@ export class DebuggerPlugin extends Plugin {
583
583
  }
584
584
 
585
585
  private workingCopyChanged(): void {
586
+ this.#scopeMappingsCache.clear();
586
587
  this.setMuted(this.uiSourceCode.isDirty());
587
588
  }
588
589
 
@@ -666,7 +667,7 @@ export class DebuggerPlugin extends Plugin {
666
667
  return {
667
668
  box,
668
669
  show: async (popover: UI.GlassPane.GlassPane) => {
669
- const scopeMappings = await this.#getScopeMappings(selectedCallFrame);
670
+ const scopeMappings = await this.#getScopeMappings(debuggableFrame) ?? [];
670
671
  const scopedVariable = findVariableInScopeMappings(evaluationText, highlightRange.from, scopeMappings);
671
672
  if (scopedVariable.found) {
672
673
  if (!scopedVariable.value) {
@@ -967,21 +968,18 @@ export class DebuggerPlugin extends Plugin {
967
968
  return offset ?? null;
968
969
  }
969
970
 
970
- #cachedScopeMappings?: {callFrame: SDK.DebuggerModel.CallFrame, promise: Promise<ScopeMapping[]>};
971
+ readonly #scopeMappingsCache = new ScopeMappingsCache(this.uiSourceCode);
971
972
 
972
- #getScopeMappings(callFrame: SDK.DebuggerModel.CallFrame,
973
- resolvedScopeChain?: SDK.DebuggerModel.ScopeChainEntry[]): Promise<ScopeMapping[]> {
974
- if (this.#cachedScopeMappings?.callFrame !== callFrame) {
975
- const url = this.uiSourceCode.url();
976
- this.#cachedScopeMappings = {
977
- callFrame,
978
- promise: computeScopeMappings(
979
- callFrame, location => this.#rawLocationToEditorOffset(location, url),
973
+ /** @returns `null` if the scope mappings can't be used because the file has unsaved edits. */
974
+ #getScopeMappings(debuggableFrame: StackTrace.StackTrace.DebuggableFrameFlavor,
975
+ resolvedScopeChain?: SDK.DebuggerModel.ScopeChainEntry[]): Promise<ScopeMapping[]>|null {
976
+ const url = this.uiSourceCode.url();
977
+ return this.#scopeMappingsCache.get(
978
+ debuggableFrame,
979
+ () => computeScopeMappings(
980
+ debuggableFrame.sdkFrame, location => this.#rawLocationToEditorOffset(location, url),
980
981
  (line, col) => this.editor?.toOffset(this.transformer.uiLocationToEditorLocation(line, col)) ?? null,
981
- resolvedScopeChain),
982
- };
983
- }
984
- return this.#cachedScopeMappings.promise;
982
+ resolvedScopeChain));
985
983
  }
986
984
 
987
985
  private async computeValueDecorations(): Promise<CodeMirror.DecorationSet|null> {
@@ -1004,8 +1002,8 @@ export class DebuggerPlugin extends Plugin {
1004
1002
 
1005
1003
  const uiPositionToEditorOffset = (lineNumber: number, columnNumber: number): number|null =>
1006
1004
  this.editor?.toOffset(this.transformer.uiLocationToEditorLocation(lineNumber, columnNumber)) ?? null;
1007
- const scopeChain = await SourceMapScopes.ScopeChainModel.ScopeChainModel.resolveScopeChain(
1008
- callFrame, Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance());
1005
+ const scopeChain =
1006
+ await SourceMapScopes.ScopeChainResolver.ScopeChainResolver.instance().resolveScopeChain(callFrame);
1009
1007
  const localOriginalScope = scopeChain
1010
1008
  .find((s): s is SDK.SourceMapScopeChainEntry.SourceMapScopeChainEntry =>
1011
1009
  s instanceof SDK.SourceMapScopeChainEntry.SourceMapScopeChainEntry &&
@@ -1040,9 +1038,9 @@ export class DebuggerPlugin extends Plugin {
1040
1038
  return null;
1041
1039
  }
1042
1040
 
1043
- const scopeMappings = await this.#getScopeMappings(callFrame, scopeChain);
1041
+ const scopeMappings = await this.#getScopeMappings(debuggableFrame, scopeChain);
1044
1042
  // After the `await` the DebuggerPlugin could have been disposed. Re-check `this.editor`.
1045
- if (!this.editor || scopeMappings.length === 0) {
1043
+ if (!this.editor || !scopeMappings?.length) {
1046
1044
  return null;
1047
1045
  }
1048
1046
 
@@ -2144,6 +2142,41 @@ export interface ScopeMapping {
2144
2142
  variableMap: Map<string, SDK.RemoteObject.RemoteObject|null>;
2145
2143
  }
2146
2144
 
2145
+ /**
2146
+ * Caches the {@link ScopeMapping}s for the selected frame of a single {@link DebuggerPlugin}.
2147
+ *
2148
+ * The editor offsets in a {@link ScopeMapping} are derived from raw and UI locations, which describe
2149
+ * the committed script content. Once the user edits the file, these offsets no longer match the
2150
+ * editor content. So no mappings are handed out while the UISourceCode has unsaved edits.
2151
+ *
2152
+ * The cache is keyed on the DebuggableFrameFlavor rather than the SDK CallFrame: Re-translating a
2153
+ * frame (e.g. after a source map is attached) produces a new flavor for the same SDK CallFrame.
2154
+ */
2155
+ export class ScopeMappingsCache {
2156
+ readonly #uiSourceCode: Workspace.UISourceCode.UISourceCode;
2157
+ #cached?: {frame: StackTrace.StackTrace.DebuggableFrameFlavor, promise: Promise<ScopeMapping[]>};
2158
+
2159
+ constructor(uiSourceCode: Workspace.UISourceCode.UISourceCode) {
2160
+ this.#uiSourceCode = uiSourceCode;
2161
+ }
2162
+
2163
+ /** @returns the (cached) scope mappings for `frame`, or `null` if the UISourceCode has unsaved edits. */
2164
+ get(frame: StackTrace.StackTrace.DebuggableFrameFlavor,
2165
+ compute: () => Promise<ScopeMapping[]>): Promise<ScopeMapping[]>|null {
2166
+ if (this.#uiSourceCode.isDirty()) {
2167
+ return null;
2168
+ }
2169
+ if (this.#cached?.frame !== frame) {
2170
+ this.#cached = {frame, promise: compute()};
2171
+ }
2172
+ return this.#cached.promise;
2173
+ }
2174
+
2175
+ clear(): void {
2176
+ this.#cached = undefined;
2177
+ }
2178
+ }
2179
+
2147
2180
  export async function computeScopeMappings(
2148
2181
  callFrame: SDK.DebuggerModel.CallFrame,
2149
2182
  rawLocationToEditorOffset: (l: SDK.DebuggerModel.Location|null) => Promise<number|null>,
@@ -2151,8 +2184,7 @@ export async function computeScopeMappings(
2151
2184
  resolvedScopeChain?: SDK.DebuggerModel.ScopeChainEntry[]): Promise<ScopeMapping[]> {
2152
2185
  const scopeMappings: ScopeMapping[] = [];
2153
2186
  const scopeChain = resolvedScopeChain ??
2154
- await SourceMapScopes.ScopeChainModel.ScopeChainModel.resolveScopeChain(
2155
- callFrame, Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance());
2187
+ await SourceMapScopes.ScopeChainResolver.ScopeChainResolver.instance().resolveScopeChain(callFrame);
2156
2188
  const activeScopes =
2157
2189
  new Set(scopeChain.filter(s => s instanceof SDK.SourceMapScopeChainEntry.SourceMapScopeChainEntry)
2158
2190
  .map(s => s.originalScope()));
@@ -31,7 +31,6 @@
31
31
  import * as i18n from '../../core/i18n/i18n.js';
32
32
  import type * as SDK from '../../core/sdk/sdk.js';
33
33
  import * as Protocol from '../../generated/protocol.js';
34
- import * as Bindings from '../../models/bindings/bindings.js';
35
34
  import * as SourceMapScopes from '../../models/source_map_scopes/source_map_scopes.js';
36
35
  import * as StackTrace from '../../models/stack_trace/stack_trace.js';
37
36
  import * as ObjectUI from '../../ui/legacy/components/object_ui/object_ui.js';
@@ -214,8 +213,9 @@ export class ScopeChainSidebarPane extends UI.Widget.VBox implements UI.ContextF
214
213
  this.#linkifier.reset();
215
214
 
216
215
  if (callFrame) {
216
+ // TODO(crbug.com/458180550): Receive the ScopeChainResolver via constructor.
217
217
  const scopeChainModel = new SourceMapScopes.ScopeChainModel.ScopeChainModel(
218
- callFrame.sdkFrame, Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance());
218
+ callFrame.sdkFrame, SourceMapScopes.ScopeChainResolver.ScopeChainResolver.instance());
219
219
  this.#scopeChainModel = scopeChainModel;
220
220
  this.#scopeChainModel.addEventListener(SourceMapScopes.ScopeChainModel.Events.SCOPE_CHAIN_UPDATED, event => {
221
221
  if (this.#scopeChainModel === scopeChainModel) {
@@ -327,7 +327,7 @@ export class SourcesPanel extends UI.Panel.Panel implements
327
327
  static updateResizerAndSidebarButtons(panel: SourcesPanel): void {
328
328
  const isInWrapper = Boolean(UI.Context.Context.instance().flavor(QuickSourceView)) &&
329
329
  !UI.InspectorView.InspectorView.instance().isDrawerMinimized();
330
- panel.#sourcesView.setLayoutMode(panel.splitWidget, panel.splitWidget.isVertical(), isInWrapper);
330
+ panel.#sourcesView.setLayoutMode(panel.splitWidget.isVertical(), isInWrapper);
331
331
  }
332
332
 
333
333
  targetAdded(_target: SDK.Target.Target): void {
@@ -16,7 +16,7 @@ import * as Buttons from '../../ui/components/buttons/buttons.js';
16
16
  import * as QuickOpen from '../../ui/legacy/components/quick_open/quick_open.js';
17
17
  import type * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
18
18
  import * as UI from '../../ui/legacy/legacy.js';
19
- import {Directives, html, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
19
+ import {html, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
20
20
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
21
21
 
22
22
  import {EditingLocationHistoryManager} from './EditingLocationHistoryManager.js';
@@ -69,7 +69,6 @@ const UIStrings = {
69
69
  const str_ = i18n.i18n.registerUIStrings('panels/sources/SourcesView.ts', UIStrings);
70
70
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
71
71
 
72
- const {ref} = Directives;
73
72
  const {widget, widgetRef} = UI.Widget;
74
73
 
75
74
  export interface ViewInput {
@@ -83,7 +82,6 @@ export interface ViewInput {
83
82
  isVertical: boolean;
84
83
  isInWrapper: boolean;
85
84
  isTraceApp: boolean;
86
- splitWidget?: UI.SplitWidget.SplitWidget;
87
85
  onToggleNavigatorSidebar?: () => void;
88
86
  onToggleDebuggerSidebar?: () => void;
89
87
  breakpointsActive: boolean;
@@ -170,11 +168,7 @@ export const DEFAULT_VIEW: View = (input, output, target): void => {
170
168
  </devtools-widget>
171
169
  </devtools-widget>
172
170
  <div class="sources-toolbar" jslog=${VisualLogging.toolbar('bottom')}>
173
- <devtools-toolbar class="script-view-toolbar" style="flex: auto;" ${ref(el => {
174
- if (el && input.splitWidget) {
175
- input.splitWidget.toggleResizer(el, !input.isVertical && !input.isInWrapper);
176
- }
177
- })}>
171
+ <devtools-toolbar class="script-view-toolbar" style="flex: auto;">
178
172
  ${Array.isArray(input.scriptViewToolbarItems)
179
173
  ? input.scriptViewToolbarItems.map(item => item.element)
180
174
  : input.scriptViewToolbarItems}
@@ -218,7 +212,6 @@ export class SourcesView extends SourcesViewBase implements UI.SearchableView.Se
218
212
  #debuggerSidebarInitialized = false;
219
213
  #isVertical = false;
220
214
  #isInWrapper = true;
221
- #splitWidget?: UI.SplitWidget.SplitWidget;
222
215
  #breakpointsActive = true;
223
216
  #editorContainerPromise: Promise<TabbedEditorContainer>;
224
217
  #editorContainerResolve!: (container: TabbedEditorContainer) => void;
@@ -295,7 +288,6 @@ export class SourcesView extends SourcesViewBase implements UI.SearchableView.Se
295
288
  isVertical: this.#isVertical,
296
289
  isInWrapper: this.#isInWrapper,
297
290
  isTraceApp: Root.Runtime.Runtime.isTraceApp(),
298
- splitWidget: this.#splitWidget,
299
291
  onToggleNavigatorSidebar: this.#onToggleNavigatorSidebar,
300
292
  onToggleDebuggerSidebar: this.#onToggleDebuggerSidebar,
301
293
  breakpointsActive: this.#breakpointsActive,
@@ -390,8 +382,7 @@ export class SourcesView extends SourcesViewBase implements UI.SearchableView.Se
390
382
  this.requestUpdate();
391
383
  }
392
384
 
393
- setLayoutMode(splitWidget: UI.SplitWidget.SplitWidget, isVertical: boolean, isInWrapper: boolean): void {
394
- this.#splitWidget = splitWidget;
385
+ setLayoutMode(isVertical: boolean, isInWrapper: boolean): void {
395
386
  this.#isVertical = isVertical;
396
387
  this.#isInWrapper = isInWrapper;
397
388
  this.requestUpdate();
@@ -291,9 +291,6 @@ export class TabbedEditorContainer extends TabbedEditorContainerBase {
291
291
  }
292
292
 
293
293
  override performUpdate(): void {
294
- if (false) {
295
- return;
296
- }
297
294
  const shortcuts = [
298
295
  {actionId: 'quick-open.show', description: i18nString(UIStrings.openFile)},
299
296
  {actionId: 'quick-open.show-command-menu', description: i18nString(UIStrings.runCommand)},