chrome-devtools-frontend 1.0.940255 → 1.0.942095

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 (133) hide show
  1. package/config/gni/all_devtools_files.gni +0 -13
  2. package/config/gni/devtools_grd_files.gni +13 -13
  3. package/config/gni/devtools_image_files.gni +1 -2
  4. package/front_end/.eslintrc.js +1 -0
  5. package/front_end/Images/src/feedback_button_icon.svg +3 -0
  6. package/front_end/Tests.js +15 -0
  7. package/front_end/core/common/Color.ts +5 -0
  8. package/front_end/core/i18n/locales/en-US.json +39 -30
  9. package/front_end/core/i18n/locales/en-XL.json +39 -30
  10. package/front_end/core/sdk/DOMDebuggerModel.ts +18 -1
  11. package/front_end/core/sdk/sdk-meta.ts +17 -3
  12. package/front_end/entrypoints/devtools_app/devtools_app.json +1 -7
  13. package/front_end/entrypoints/main/MainImpl.ts +26 -0
  14. package/front_end/entrypoints/shell/shell.js +0 -11
  15. package/front_end/entrypoints/shell/shell.json +0 -1
  16. package/front_end/entrypoints/worker_app/worker_app.json +0 -4
  17. package/front_end/generated/InspectorBackendCommands.js +1 -0
  18. package/front_end/generated/protocol.d.ts +2 -0
  19. package/front_end/global_typings/global_defs.d.ts +5 -0
  20. package/front_end/legacy_test_runner/console_test_runner/console_test_runner.js +14 -2
  21. package/front_end/legacy_test_runner/legacy_test_runner.ts +10 -1
  22. package/front_end/legacy_test_runner/test_runner/TestRunner.js +9 -0
  23. package/front_end/models/formatter/SourceFormatter.ts +0 -10
  24. package/front_end/models/workspace/UISourceCode.ts +9 -42
  25. package/front_end/panels/animation/AnimationTimeline.ts +3 -3
  26. package/front_end/panels/application/ApplicationPanelSidebar.ts +3 -3
  27. package/front_end/panels/application/application-meta.ts +0 -3
  28. package/front_end/panels/console/ConsolePinPane.ts +21 -26
  29. package/front_end/panels/coverage/CoverageDecorationManager.ts +4 -5
  30. package/front_end/panels/coverage/CoverageView.ts +2 -105
  31. package/front_end/panels/css_overview/components/CSSOverviewStartView.ts +11 -56
  32. package/front_end/panels/css_overview/components/cssOverviewStartView.css +1 -8
  33. package/front_end/panels/elements/ElementsTreeElement.ts +4 -9
  34. package/front_end/panels/elements/components/adornerSettingsPane.css +0 -4
  35. package/front_end/panels/emulation/emulation-meta.ts +2 -2
  36. package/front_end/panels/issues/IssueKindView.ts +22 -4
  37. package/front_end/panels/issues/issues-meta.ts +0 -2
  38. package/front_end/panels/layers/module.json +0 -1
  39. package/front_end/panels/lighthouse/lighthouseStartView.css +4 -0
  40. package/front_end/panels/media/media-meta.ts +0 -3
  41. package/front_end/panels/network/NetworkLogView.ts +3 -0
  42. package/front_end/panels/network/ResourceWebSocketFrameView.ts +2 -1
  43. package/front_end/panels/network/network-meta.ts +0 -3
  44. package/front_end/panels/profiler/module.json +1 -2
  45. package/front_end/panels/security/security-meta.ts +0 -3
  46. package/front_end/panels/sources/BreakpointEditDialog.ts +16 -30
  47. package/front_end/panels/sources/CSSPlugin.ts +310 -331
  48. package/front_end/panels/sources/CallStackSidebarPane.ts +28 -34
  49. package/front_end/panels/sources/CoveragePlugin.ts +121 -6
  50. package/front_end/panels/sources/DebuggerPlugin.ts +1166 -1243
  51. package/front_end/panels/sources/EditingLocationHistoryManager.ts +71 -101
  52. package/front_end/panels/sources/GoToLineQuickOpen.ts +4 -3
  53. package/front_end/panels/sources/InplaceFormatterEditorAction.ts +3 -3
  54. package/front_end/panels/sources/JavaScriptCompilerPlugin.ts +26 -23
  55. package/front_end/panels/sources/Plugin.ts +20 -4
  56. package/front_end/panels/sources/ProfilePlugin.ts +185 -0
  57. package/front_end/panels/sources/ScriptFormatterEditorAction.ts +3 -3
  58. package/front_end/panels/sources/ScriptOriginPlugin.ts +0 -10
  59. package/front_end/panels/sources/SnippetsPlugin.ts +1 -10
  60. package/front_end/panels/sources/SourcesPanel.ts +15 -10
  61. package/front_end/panels/sources/SourcesView.ts +10 -8
  62. package/front_end/panels/sources/TabbedEditorContainer.ts +31 -27
  63. package/front_end/panels/sources/UISourceCodeFrame.ts +335 -470
  64. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +3 -2
  65. package/front_end/panels/sources/sources-legacy.ts +0 -6
  66. package/front_end/panels/sources/sources.ts +0 -2
  67. package/front_end/panels/timeline/module.json +0 -2
  68. package/front_end/third_party/codemirror.next/bundle.ts +9 -13
  69. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  70. package/front_end/third_party/codemirror.next/chunk/javascript.js +2 -2
  71. package/front_end/third_party/codemirror.next/chunk/markdown.js +2 -6
  72. package/front_end/third_party/codemirror.next/chunk/php.js +2 -6
  73. package/front_end/third_party/codemirror.next/chunk/python.js +1 -1
  74. package/front_end/third_party/codemirror.next/chunk/wast.js +1 -1
  75. package/front_end/third_party/codemirror.next/chunk/xml.js +2 -2
  76. package/front_end/third_party/codemirror.next/codemirror.next.d.ts +279 -198
  77. package/front_end/third_party/codemirror.next/codemirror.next.js +1 -1
  78. package/front_end/third_party/codemirror.next/package.json +13 -11
  79. package/front_end/ui/components/code_highlighter/CodeHighlighter.ts +60 -68
  80. package/front_end/ui/components/data_grid/dataGrid.css +12 -10
  81. package/front_end/ui/components/docs/css_overview/start_view.html +25 -0
  82. package/front_end/ui/components/docs/css_overview/start_view.ts +14 -0
  83. package/front_end/ui/components/docs/panel_feedback/basic.html +25 -0
  84. package/front_end/ui/components/docs/panel_feedback/basic.ts +20 -0
  85. package/front_end/ui/components/docs/panel_feedback/button.html +25 -0
  86. package/front_end/ui/components/docs/panel_feedback/button.ts +18 -0
  87. package/front_end/ui/components/helpers/get-stylesheet.ts +1 -0
  88. package/front_end/ui/components/panel_feedback/FeedbackButton.ts +67 -0
  89. package/front_end/ui/components/panel_feedback/PanelFeedback.ts +100 -0
  90. package/front_end/ui/components/panel_feedback/panelFeedback.css +76 -0
  91. package/front_end/ui/components/panel_feedback/panel_feedback.ts +6 -0
  92. package/front_end/ui/components/report_view/reportValue.css +1 -0
  93. package/front_end/ui/components/text_editor/TextEditor.ts +79 -36
  94. package/front_end/ui/components/text_editor/config.ts +42 -26
  95. package/front_end/ui/components/text_editor/javascript.ts +2 -3
  96. package/front_end/ui/components/text_editor/position.ts +17 -0
  97. package/front_end/ui/components/text_editor/text_editor.ts +1 -0
  98. package/front_end/ui/components/text_editor/theme.ts +5 -1
  99. package/front_end/ui/legacy/Infobar.ts +2 -6
  100. package/front_end/ui/legacy/ShortcutRegistry.ts +11 -7
  101. package/front_end/ui/legacy/Widget.ts +1 -1
  102. package/front_end/ui/legacy/components/perf_ui/ChartViewport.ts +2 -1
  103. package/front_end/ui/legacy/components/perf_ui/FilmStripView.ts +3 -1
  104. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +2 -1
  105. package/front_end/ui/legacy/components/perf_ui/LineLevelProfile.ts +35 -131
  106. package/front_end/ui/legacy/components/perf_ui/OverviewGrid.ts +2 -1
  107. package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +3 -1
  108. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +2 -1
  109. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +3 -6
  110. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +18 -14
  111. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +502 -252
  112. package/front_end/ui/legacy/components/source_frame/source_frame-legacy.ts +0 -11
  113. package/front_end/ui/legacy/components/source_frame/source_frame.ts +0 -2
  114. package/front_end/ui/legacy/components/text_editor/cmdevtools.css +3 -1
  115. package/front_end/ui/legacy/radioButton.css +1 -13
  116. package/front_end/ui/legacy/softContextMenu.css +1 -0
  117. package/front_end/ui/legacy/themeColors.css +36 -0
  118. package/front_end/ui/legacy/utils/append-style.ts +9 -4
  119. package/package.json +1 -1
  120. package/scripts/build/generate_css_js_files.js +23 -9
  121. package/scripts/build/ninja/generate_css.gni +10 -1
  122. package/scripts/eslint_rules/lib/check_css_import.js +2 -2
  123. package/scripts/eslint_rules/tests/check_css_import_test.js +12 -0
  124. package/front_end/Images/radioDot-dark-theme.png +0 -0
  125. package/front_end/Images/radioDot.png +0 -0
  126. package/front_end/panels/application/module.json +0 -7
  127. package/front_end/panels/issues/module.json +0 -6
  128. package/front_end/panels/layer_viewer/module.json +0 -6
  129. package/front_end/panels/media/module.json +0 -6
  130. package/front_end/panels/network/module.json +0 -6
  131. package/front_end/panels/security/module.json +0 -5
  132. package/front_end/ui/legacy/components/perf_ui/module.json +0 -13
  133. package/front_end/ui/legacy/components/source_frame/SourcesTextEditor.ts +0 -1030
@@ -146,6 +146,7 @@ export class MainImpl {
146
146
  });
147
147
 
148
148
  console.timeStamp('Main._gotPreferences');
149
+ this.initializeGlobalsForLayoutTests();
149
150
  this.createSettings(prefs);
150
151
  await this.requestAndRegisterLocaleData();
151
152
 
@@ -157,6 +158,31 @@ export class MainImpl {
157
158
  this.createAppUI();
158
159
  }
159
160
 
161
+ private initializeGlobalsForLayoutTests(): void {
162
+ // @ts-ignore layout test global
163
+ self.Common = self.Common || {};
164
+ // @ts-ignore layout test global
165
+ self.UI = self.UI || {};
166
+ // @ts-ignore layout test global
167
+ self.UI.panels = self.UI.panels || {};
168
+ // @ts-ignore layout test global
169
+ self.SDK = self.SDK || {};
170
+ // @ts-ignore layout test global
171
+ self.Bindings = self.Bindings || {};
172
+ // @ts-ignore layout test global
173
+ self.Persistence = self.Persistence || {};
174
+ // @ts-ignore layout test global
175
+ self.Workspace = self.Workspace || {};
176
+ // @ts-ignore layout test global
177
+ self.Extensions = self.Extensions || {};
178
+ // @ts-ignore e2e test global
179
+ self.Host = self.Host || {};
180
+ // @ts-ignore e2e test global
181
+ self.Host.userMetrics = self.Host.userMetrics || Host.userMetrics;
182
+ // @ts-ignore e2e test global
183
+ self.Host.UserMetrics = self.Host.UserMetrics || Host.UserMetrics;
184
+ }
185
+
160
186
  async requestAndRegisterLocaleData(): Promise<void> {
161
187
  const settingLanguage = Common.Settings.Settings.instance().moduleSetting<string>('language').get();
162
188
  const devToolsLocale = i18n.DevToolsLocale.DevToolsLocale.instance({
@@ -6,18 +6,7 @@ import '../../Images/Images.js';
6
6
  import '../startup/startup.js';
7
7
  import '../../core/root/root-legacy.js';
8
8
  import '../../core/platform/platform.js';
9
- import '../../core/common/common-legacy.js';
10
- import '../../models/text_utils/text_utils-legacy.js';
11
9
  import '../../core/dom_extension/dom_extension.js';
12
- import '../../core/host/host-legacy.js';
13
- import '../../core/protocol_client/protocol_client-legacy.js';
14
- import '../../core/sdk/sdk-legacy.js';
15
- import '../../ui/legacy/legacy-legacy.js';
16
- import '../../models/workspace/workspace-legacy.js';
17
- import '../../models/bindings/bindings-legacy.js';
18
- import '../../ui/legacy/components/utils/utils-legacy.js';
19
- import '../../models/persistence/persistence-legacy.js';
20
- import '../../models/extensions/extensions-legacy.js';
21
10
 
22
11
  import './shell-meta-files.js';
23
12
  import '../main/main.js';
@@ -4,7 +4,6 @@
4
4
  { "name": "ui/legacy/components/text_editor", "type": "autostart" },
5
5
  { "name": "ui/legacy/components/source_frame", "type": "autostart" },
6
6
 
7
- { "name": "ui/legacy/components/perf_ui" },
8
7
  { "name": "panels/profiler" }
9
8
  ]
10
9
  }
@@ -1,9 +1,5 @@
1
1
  {
2
2
  "modules" : [
3
- { "name": "panels/issues" },
4
- { "name": "panels/layer_viewer" },
5
- { "name": "panels/network" },
6
- { "name": "panels/application" },
7
3
  { "name": "panels/timeline" }
8
4
  ],
9
5
  "extends": "shell"
@@ -1970,6 +1970,7 @@ export function registerCommands(inspectorBackend) {
1970
1970
  ChUaModel: 'ch-ua-model',
1971
1971
  ChUaMobile: 'ch-ua-mobile',
1972
1972
  ChUaFullVersion: 'ch-ua-full-version',
1973
+ ChUaFullVersionList: 'ch-ua-full-version-list',
1973
1974
  ChUaPlatformVersion: 'ch-ua-platform-version',
1974
1975
  ChUaReduced: 'ch-ua-reduced',
1975
1976
  ChViewportHeight: 'ch-viewport-height',
@@ -4879,6 +4879,7 @@ declare namespace Protocol {
4879
4879
  export interface UserAgentMetadata {
4880
4880
  brands?: UserAgentBrandVersion[];
4881
4881
  fullVersion?: string;
4882
+ fullVersionList?: UserAgentBrandVersion[];
4882
4883
  platform: string;
4883
4884
  platformVersion: string;
4884
4885
  architecture: string;
@@ -9844,6 +9845,7 @@ declare namespace Protocol {
9844
9845
  ChUaModel = 'ch-ua-model',
9845
9846
  ChUaMobile = 'ch-ua-mobile',
9846
9847
  ChUaFullVersion = 'ch-ua-full-version',
9848
+ ChUaFullVersionList = 'ch-ua-full-version-list',
9847
9849
  ChUaPlatformVersion = 'ch-ua-platform-version',
9848
9850
  ChUaReduced = 'ch-ua-reduced',
9849
9851
  ChViewportHeight = 'ch-viewport-height',
@@ -25,3 +25,8 @@ declare module '*.css.js' {
25
25
  const styles: CSSStyleSheet;
26
26
  export default styles;
27
27
  }
28
+
29
+ declare module '*.css.legacy.js' {
30
+ const styles: {cssContent: string};
31
+ export default styles;
32
+ }
@@ -113,6 +113,14 @@ ConsoleTestRunner.prepareConsoleMessageText = function(messageElement) {
113
113
  return messageText;
114
114
  };
115
115
 
116
+ /**
117
+ * @param {!Element} messageElement
118
+ * @return {string}
119
+ */
120
+ ConsoleTestRunner.prepareConsoleMessageTextTrimmed = function(messageElement) {
121
+ return ConsoleTestRunner.prepareConsoleMessageText(messageElement).replace(/[ ]+/g, ' ');
122
+ };
123
+
116
124
  /**
117
125
  * @param {!Console.ConsoleViewMessage} viewMessage
118
126
  * @param {boolean} forceInvalidate
@@ -334,15 +342,19 @@ ConsoleTestRunner.dumpConsoleMessagesWithStyles = function() {
334
342
 
335
343
  /**
336
344
  * @param {boolean=} sortMessages
345
+ * @param {boolean=} trimMessages
337
346
  */
338
- ConsoleTestRunner.dumpConsoleMessagesWithClasses = async function(sortMessages) {
347
+ ConsoleTestRunner.dumpConsoleMessagesWithClasses = async function(sortMessages, trimMessages) {
339
348
  const result = [];
340
349
  const messageViews = Console.ConsoleView.instance().visibleViewMessages;
341
350
  for (let i = 0; i < messageViews.length; ++i) {
342
351
  const element = messageViews[i].element();
343
352
  const contentElement = messageViews[i].contentElement();
344
353
  await TestRunner.waitForPendingLiveLocationUpdates();
345
- const messageText = ConsoleTestRunner.prepareConsoleMessageText(element);
354
+ let messageText = ConsoleTestRunner.prepareConsoleMessageText(element);
355
+ if (trimMessages) {
356
+ messageText = messageText.replace(/[ ]+/g, ' ');
357
+ }
346
358
  result.push(messageText + ' ' + element.getAttribute('class') + ' > ' + contentElement.getAttribute('class'));
347
359
  }
348
360
  if (sortMessages) {
@@ -2,6 +2,16 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
+ import '../core/common/common-legacy.js';
6
+ import '../models/text_utils/text_utils-legacy.js';
7
+ import '../core/host/host-legacy.js';
8
+ import '../core/protocol_client/protocol_client-legacy.js';
9
+ import '../ui/legacy/legacy-legacy.js';
10
+ import '../models/workspace/workspace-legacy.js';
11
+ import '../models/bindings/bindings-legacy.js';
12
+ import '../ui/legacy/components/utils/utils-legacy.js';
13
+ import '../models/persistence/persistence-legacy.js';
14
+ import '../models/extensions/extensions-legacy.js';
5
15
  import '../entrypoints/devtools_app/devtools_app.js';
6
16
  import '../panels/accessibility/accessibility-legacy.js';
7
17
  import '../panels/animation/animation-legacy.js';
@@ -12,7 +22,6 @@ import '../ui/legacy/components/data_grid/data_grid-legacy.js';
12
22
  import '../third_party/diff/diff-legacy.js';
13
23
  import '../models/extensions/extensions-legacy.js';
14
24
  import '../models/formatter/formatter-legacy.js';
15
- import '../core/host/host-legacy.js';
16
25
  import '../ui/legacy/components/inline_editor/inline_editor-legacy.js';
17
26
  import '../core/root/root-legacy.js';
18
27
  import '../core/sdk/sdk-legacy.js';
@@ -393,6 +393,14 @@ export function textContentWithLineBreaks(node) {
393
393
  return buffer;
394
394
  }
395
395
 
396
+ /**
397
+ * @param {!Node} node
398
+ * @return {string}
399
+ */
400
+ export function textContentWithLineBreaksTrimmed(node) {
401
+ return textContentWithLineBreaks(node).replace(/[ ]+/g, ' ');
402
+ }
403
+
396
404
  /**
397
405
  * @param {!Node} node
398
406
  * @return {string}
@@ -1459,6 +1467,7 @@ TestRunner.showPanel = showPanel;
1459
1467
  TestRunner.createKeyEvent = createKeyEvent;
1460
1468
  TestRunner.safeWrap = safeWrap;
1461
1469
  TestRunner.textContentWithLineBreaks = textContentWithLineBreaks;
1470
+ TestRunner.textContentWithLineBreaksTrimmed = textContentWithLineBreaksTrimmed;
1462
1471
  TestRunner.textContentWithoutStyles = textContentWithoutStyles;
1463
1472
  TestRunner.evaluateInPagePromise = evaluateInPagePromise;
1464
1473
  TestRunner.callFunctionInPageAsync = callFunctionInPageAsync;
@@ -142,16 +142,6 @@ export class SourceFormatter {
142
142
  await this.scriptMapping.setSourceMappingEnabled(formatData, true);
143
143
  await this.styleMapping.setSourceMappingEnabled(formatData, true);
144
144
  cacheEntry.formatData = formatData;
145
-
146
- for (const decoration of uiSourceCode.allDecorations()) {
147
- const range = decoration.range();
148
- const startLocation = formattedMapping.originalToFormatted(range.startLine, range.startColumn);
149
- const endLocation = formattedMapping.originalToFormatted(range.endLine, range.endColumn);
150
- formattedUISourceCode.addDecoration(
151
- new TextUtils.TextRange.TextRange(startLocation[0], startLocation[1], endLocation[0], endLocation[1]),
152
- (decoration.type() as string), decoration.data());
153
- }
154
-
155
145
  resolve(formatData);
156
146
  } catch (e) {
157
147
  reject(e);
@@ -60,7 +60,7 @@ export class UISourceCode extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
60
60
  private nameInternal: string;
61
61
  private contentTypeInternal: Common.ResourceType.ResourceType;
62
62
  private requestContentPromise: Promise<TextUtils.ContentProvider.DeferredContent>|null;
63
- private decorations: Platform.MapUtilities.Multimap<string, LineMarker>|null;
63
+ private decorations: Map<string, any> = new Map();
64
64
  private hasCommitsInternal: boolean;
65
65
  private messagesInternal: Set<Message>|null;
66
66
  private contentLoadedInternal: boolean;
@@ -94,7 +94,6 @@ export class UISourceCode extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
94
94
 
95
95
  this.contentTypeInternal = contentType;
96
96
  this.requestContentPromise = null;
97
- this.decorations = null;
98
97
  this.hasCommitsInternal = false;
99
98
  this.messagesInternal = null;
100
99
  this.contentLoadedInternal = false;
@@ -455,45 +454,15 @@ export class UISourceCode extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
455
454
  this.messagesInternal = null;
456
455
  }
457
456
 
458
- addLineDecoration(lineNumber: number, type: string, data: any): void {
459
- this.addDecoration(TextUtils.TextRange.TextRange.createFromLocation(lineNumber, 0), type, data);
460
- }
461
-
462
- addDecoration(range: TextUtils.TextRange.TextRange, type: string, data: any): void {
463
- const marker = new LineMarker(range, type, data);
464
- if (!this.decorations) {
465
- this.decorations = new Platform.MapUtilities.Multimap();
466
- }
467
- this.decorations.set(type, marker);
468
- this.dispatchEventToListeners(Events.LineDecorationAdded, marker);
469
- }
470
-
471
- removeDecorationsForType(type: string): void {
472
- if (!this.decorations) {
473
- return;
474
- }
475
- const markers = this.decorations.get(type);
476
- this.decorations.deleteAll(type);
477
- markers.forEach(marker => {
478
- this.dispatchEventToListeners(Events.LineDecorationRemoved, marker);
479
- });
480
- }
481
-
482
- allDecorations(): LineMarker[] {
483
- return this.decorations ? this.decorations.valuesArray() : [];
484
- }
485
-
486
- removeAllDecorations(): void {
487
- if (!this.decorations) {
488
- return;
457
+ setDecorationData(type: string, data: any): void {
458
+ if (data !== this.decorations.get(type)) {
459
+ this.decorations.set(type, data);
460
+ this.dispatchEventToListeners(Events.DecorationChanged, type);
489
461
  }
490
- const decorationList = this.decorations.valuesArray();
491
- this.decorations.clear();
492
- decorationList.forEach(marker => this.dispatchEventToListeners(Events.LineDecorationRemoved, marker));
493
462
  }
494
463
 
495
- decorationsForType(type: string): Set<LineMarker>|null {
496
- return this.decorations ? this.decorations.get(type) : null;
464
+ getDecorationData(type: string): any {
465
+ return this.decorations.get(type);
497
466
  }
498
467
 
499
468
  disableEdit(): void {
@@ -513,8 +482,7 @@ export enum Events {
513
482
  TitleChanged = 'TitleChanged',
514
483
  MessageAdded = 'MessageAdded',
515
484
  MessageRemoved = 'MessageRemoved',
516
- LineDecorationAdded = 'LineDecorationAdded',
517
- LineDecorationRemoved = 'LineDecorationRemoved',
485
+ DecorationChanged = 'DecorationChanged',
518
486
  }
519
487
 
520
488
  export interface WorkingCopyCommitedEvent {
@@ -529,8 +497,7 @@ export type EventTypes = {
529
497
  [Events.TitleChanged]: UISourceCode,
530
498
  [Events.MessageAdded]: Message,
531
499
  [Events.MessageRemoved]: Message,
532
- [Events.LineDecorationAdded]: LineMarker,
533
- [Events.LineDecorationRemoved]: LineMarker,
500
+ [Events.DecorationChanged]: string,
534
501
  };
535
502
 
536
503
  export class UILocation {
@@ -438,9 +438,6 @@ export class AnimationTimeline extends UI.Widget.VBox implements SDK.TargetManag
438
438
  }
439
439
 
440
440
  private togglePause(pause: boolean): void {
441
- if (this.#scrubberPlayer) {
442
- this.#scrubberPlayer.playbackRate = this.effectivePlaybackRate();
443
- }
444
441
  if (this.#selectedGroup) {
445
442
  this.#selectedGroup.togglePause(pause);
446
443
  const preview = this.#previewMap.get(this.#selectedGroup);
@@ -448,6 +445,9 @@ export class AnimationTimeline extends UI.Widget.VBox implements SDK.TargetManag
448
445
  preview.element.classList.toggle('paused', pause);
449
446
  }
450
447
  }
448
+ if (this.#scrubberPlayer) {
449
+ this.#scrubberPlayer.playbackRate = this.effectivePlaybackRate();
450
+ }
451
451
  this.updateControlButton();
452
452
  }
453
453
 
@@ -1970,13 +1970,13 @@ export class FrameResourceTreeElement extends ApplicationPanelTreeElement {
1970
1970
  contextMenu.show();
1971
1971
  }
1972
1972
 
1973
- async revealResource(line?: number, column?: number): Promise<void> {
1973
+ async revealResource(lineNumber?: number, columnNumber?: number): Promise<void> {
1974
1974
  this.revealAndSelect(true);
1975
1975
  const view = await this.panel.scheduleShowView(this.preparePreview());
1976
- if (!(view instanceof SourceFrame.ResourceSourceFrame.ResourceSourceFrame) || typeof line !== 'number') {
1976
+ if (!(view instanceof SourceFrame.ResourceSourceFrame.ResourceSourceFrame) || typeof lineNumber !== 'number') {
1977
1977
  return;
1978
1978
  }
1979
- view.revealPosition(line, column, true);
1979
+ view.revealPosition({lineNumber, columnNumber}, true);
1980
1980
  }
1981
1981
  }
1982
1982
 
@@ -3,7 +3,6 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import * as Common from '../../core/common/common.js';
6
- import * as Root from '../../core/root/root.js';
7
6
  import * as SDK from '../../core/sdk/sdk.js';
8
7
  import * as UI from '../../ui/legacy/legacy.js';
9
8
 
@@ -47,8 +46,6 @@ let loadedResourcesModule: (typeof Resources|undefined);
47
46
 
48
47
  async function loadResourcesModule(): Promise<typeof Resources> {
49
48
  if (!loadedResourcesModule) {
50
- // Side-effect import resources in module.json
51
- await Root.Runtime.Runtime.instance().loadModulePromise('panels/application');
52
49
  loadedResourcesModule = await import('./application.js');
53
50
  }
54
51
  return loadedResourcesModule;
@@ -5,11 +5,11 @@
5
5
  import * as Common from '../../core/common/common.js';
6
6
  import * as i18n from '../../core/i18n/i18n.js';
7
7
  import * as SDK from '../../core/sdk/sdk.js';
8
+ import * as CodeMirror from '../../third_party/codemirror.next/codemirror.next.js';
9
+ import * as TextEditor from '../../ui/components/text_editor/text_editor.js';
8
10
  import * as ObjectUI from '../../ui/legacy/components/object_ui/object_ui.js';
9
11
  // eslint-disable-next-line rulesdir/es_modules_import
10
12
  import objectValueStyles from '../../ui/legacy/components/object_ui/objectValue.css.js';
11
- import type * as CodeMirror from '../../third_party/codemirror.next/codemirror.next.js';
12
- import type * as TextEditor from '../../ui/components/text_editor/text_editor.js';
13
13
  import * as UI from '../../ui/legacy/legacy.js';
14
14
 
15
15
  import consolePinPaneStyles from './consolePinPane.css.js';
@@ -171,11 +171,10 @@ export class ConsolePin {
171
171
  private readonly pinPreview: HTMLElement;
172
172
  private lastResult: SDK.RuntimeModel.EvaluationResult|null;
173
173
  private lastExecutionContext: SDK.RuntimeModel.ExecutionContext|null;
174
- private editor: TextEditor.TextEditor.TextEditor|null;
174
+ private editor: TextEditor.TextEditor.TextEditor;
175
175
  private committedExpression: string;
176
176
  private hovered: boolean;
177
177
  private lastNode: SDK.RemoteObject.RemoteObject|null;
178
- private readonly editorPromise: Promise<TextEditor.TextEditor.TextEditor>;
179
178
  private consolePinNumber: number;
180
179
  private deletePinIcon: UI.UIUtils.DevToolsCloseButton;
181
180
 
@@ -209,10 +208,10 @@ export class ConsolePin {
209
208
 
210
209
  this.lastResult = null;
211
210
  this.lastExecutionContext = null;
212
- this.editor = null;
213
211
  this.committedExpression = expression;
214
212
  this.hovered = false;
215
213
  this.lastNode = null;
214
+ this.editor = this.createEditor(expression, nameElement);
216
215
 
217
216
  this.pinPreview.addEventListener('mouseenter', this.setHovered.bind(this, true), false);
218
217
  this.pinPreview.addEventListener('mouseleave', this.setHovered.bind(this, false), false);
@@ -229,22 +228,19 @@ export class ConsolePin {
229
228
  event.consume();
230
229
  }
231
230
  });
232
- this.editorPromise = this.createEditor(expression, nameElement);
233
231
  }
234
232
 
235
- async createEditor(expression: string, parent: HTMLElement): Promise<TextEditor.TextEditor.TextEditor> {
236
- const CM = await import('../../third_party/codemirror.next/codemirror.next.js');
237
- const TE = await import('../../ui/components/text_editor/text_editor.js');
238
- this.editor = new TE.TextEditor.TextEditor(CM.EditorState.create({
233
+ createEditor(expression: string, parent: HTMLElement): TextEditor.TextEditor.TextEditor {
234
+ const editor = new TextEditor.TextEditor.TextEditor(CodeMirror.EditorState.create({
239
235
  doc: expression,
240
236
  extensions: [
241
- CM.EditorView.contentAttributes.of({'aria-label': i18nString(UIStrings.liveExpressionEditor)}),
242
- CM.EditorView.lineWrapping,
243
- (await CM.javascript()).javascriptLanguage,
244
- await TE.JavaScript.completion(),
245
- TE.Config.showCompletionHint,
246
- CM.placeholder(i18nString(UIStrings.expression)),
247
- CM.keymap.of([
237
+ CodeMirror.EditorView.contentAttributes.of({'aria-label': i18nString(UIStrings.liveExpressionEditor)}),
238
+ CodeMirror.EditorView.lineWrapping,
239
+ CodeMirror.javascript.javascriptLanguage,
240
+ TextEditor.JavaScript.completion(),
241
+ TextEditor.Config.showCompletionHint,
242
+ CodeMirror.placeholder(i18nString(UIStrings.expression)),
243
+ CodeMirror.keymap.of([
248
244
  {
249
245
  key: 'Escape',
250
246
  run: (view: CodeMirror.EditorView): boolean => {
@@ -261,13 +257,13 @@ export class ConsolePin {
261
257
  },
262
258
  },
263
259
  ]),
264
- CM.EditorView.domEventHandlers({blur: (_e, view) => this.onBlur(view)}),
265
- TE.Config.baseConfiguration(expression),
266
- TE.Config.autocompletion,
260
+ CodeMirror.EditorView.domEventHandlers({blur: (_e, view) => this.onBlur(view)}),
261
+ TextEditor.Config.baseConfiguration(expression),
262
+ TextEditor.Config.autocompletion,
267
263
  ],
268
264
  }));
269
- parent.appendChild(this.editor);
270
- return this.editor;
265
+ parent.appendChild(editor);
266
+ return editor;
271
267
  }
272
268
 
273
269
  onBlur(editor: CodeMirror.EditorView): void {
@@ -305,9 +301,9 @@ export class ConsolePin {
305
301
  }
306
302
 
307
303
  async focus(): Promise<void> {
308
- const editor = this.editor || await this.editorPromise;
304
+ const editor = this.editor;
309
305
  editor.editor.focus();
310
- editor.editor.dispatch({selection: {anchor: editor.state.doc.length}});
306
+ editor.dispatch({selection: {anchor: editor.state.doc.length}});
311
307
  }
312
308
 
313
309
  appendToContextMenu(contextMenu: UI.ContextMenu.ContextMenu): void {
@@ -322,8 +318,7 @@ export class ConsolePin {
322
318
  if (!this.editor) {
323
319
  return;
324
320
  }
325
- const TE = await import('../../ui/components/text_editor/text_editor.js');
326
- const text = TE.Config.contentIncludingHint(this.editor.editor);
321
+ const text = TextEditor.Config.contentIncludingHint(this.editor.editor);
327
322
  const isEditing = this.pinElement.hasFocus();
328
323
  const throwOnSideEffect = isEditing && text !== this.committedExpression;
329
324
  const timeout = throwOnSideEffect ? 250 : undefined;
@@ -24,7 +24,7 @@ export class CoverageDecorationManager {
24
24
  this.uiSourceCodeByContentProvider = new Platform.MapUtilities.Multimap();
25
25
 
26
26
  for (const uiSourceCode of Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodes()) {
27
- uiSourceCode.addLineDecoration(0, decoratorType, this);
27
+ uiSourceCode.setDecorationData(decoratorType, this);
28
28
  }
29
29
  Workspace.Workspace.WorkspaceImpl.instance().addEventListener(
30
30
  Workspace.Workspace.Events.UISourceCodeAdded, this.onUISourceCodeAdded, this);
@@ -32,7 +32,7 @@ export class CoverageDecorationManager {
32
32
 
33
33
  reset(): void {
34
34
  for (const uiSourceCode of Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodes()) {
35
- uiSourceCode.removeDecorationsForType(decoratorType);
35
+ uiSourceCode.setDecorationData(decoratorType, undefined);
36
36
  }
37
37
  }
38
38
 
@@ -45,8 +45,7 @@ export class CoverageDecorationManager {
45
45
  update(updatedEntries: CoverageInfo[]): void {
46
46
  for (const entry of updatedEntries) {
47
47
  for (const uiSourceCode of this.uiSourceCodeByContentProvider.get(entry.getContentProvider())) {
48
- uiSourceCode.removeDecorationsForType(decoratorType);
49
- uiSourceCode.addLineDecoration(0, decoratorType, this);
48
+ uiSourceCode.setDecorationData(decoratorType, this);
50
49
  }
51
50
  }
52
51
  }
@@ -185,7 +184,7 @@ export class CoverageDecorationManager {
185
184
 
186
185
  private onUISourceCodeAdded(event: Common.EventTarget.EventTargetEvent<Workspace.UISourceCode.UISourceCode>): void {
187
186
  const uiSourceCode = event.data;
188
- uiSourceCode.addLineDecoration(0, decoratorType, this);
187
+ uiSourceCode.setDecorationData(decoratorType, this);
189
188
  }
190
189
  }
191
190
  export interface RawLocation {
@@ -8,15 +8,12 @@ import * as i18n from '../../core/i18n/i18n.js';
8
8
  import * as Platform from '../../core/platform/platform.js';
9
9
  import * as SDK from '../../core/sdk/sdk.js';
10
10
  import * as Bindings from '../../models/bindings/bindings.js';
11
- import * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
12
11
  import * as UI from '../../ui/legacy/legacy.js';
13
12
 
13
+ import {CoverageDecorationManager} from './CoverageDecorationManager.js';
14
+ import {CoverageListView} from './CoverageListView.js';
14
15
  import coverageViewStyles from './coverageView.css.js';
15
16
 
16
- import type * as Workspace from '../../models/workspace/workspace.js';
17
-
18
- import {CoverageDecorationManager, decoratorType} from './CoverageDecorationManager.js';
19
- import {CoverageListView} from './CoverageListView.js';
20
17
  import type {CoverageInfo, URLCoverageInfo} from './CoverageModel.js';
21
18
  import {CoverageModel, Events, CoverageType} from './CoverageModel.js';
22
19
 
@@ -564,103 +561,3 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
564
561
  }
565
562
  }
566
563
  }
567
- let lineDecoratorInstance: LineDecorator;
568
- export class LineDecorator implements SourceFrame.SourceFrame.LineDecorator {
569
- static instance({forceNew}: {forceNew: boolean} = {forceNew: false}): LineDecorator {
570
- if (!lineDecoratorInstance || forceNew) {
571
- lineDecoratorInstance = new LineDecorator();
572
- }
573
-
574
- return lineDecoratorInstance;
575
- }
576
-
577
- private readonly listeners: WeakMap<
578
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
579
- SourceFrame.SourcesTextEditor.SourcesTextEditor, (arg0: Common.EventTarget.EventTargetEvent<any>) => void>;
580
- constructor() {
581
- this.listeners = new WeakMap();
582
- }
583
-
584
- decorate(
585
- uiSourceCode: Workspace.UISourceCode.UISourceCode,
586
- textEditor: SourceFrame.SourcesTextEditor.SourcesTextEditor): void {
587
- const decorations = uiSourceCode.decorationsForType(decoratorType);
588
- if (!decorations || !decorations.size) {
589
- this.uninstallGutter(textEditor);
590
- return;
591
- }
592
- const decorationManager = decorations.values().next().value.data() as CoverageDecorationManager;
593
- decorationManager.usageByLine(uiSourceCode).then(lineUsage => {
594
- textEditor.operation(() => this.innerDecorate(uiSourceCode, textEditor, lineUsage));
595
- });
596
- }
597
-
598
- private innerDecorate(
599
- uiSourceCode: Workspace.UISourceCode.UISourceCode, textEditor: SourceFrame.SourcesTextEditor.SourcesTextEditor,
600
- lineUsage: (boolean|undefined)[]): void {
601
- const gutterType = LineDecorator.GUTTER_TYPE;
602
- this.uninstallGutter(textEditor);
603
- if (lineUsage.length) {
604
- this.installGutter(textEditor, uiSourceCode.url());
605
- }
606
- for (let line = 0; line < lineUsage.length; ++line) {
607
- // Do not decorate the line if we don't have data.
608
- if (typeof lineUsage[line] !== 'boolean') {
609
- continue;
610
- }
611
- const className = lineUsage[line] ? 'text-editor-coverage-used-marker' : 'text-editor-coverage-unused-marker';
612
- const gutterElement = document.createElement('div');
613
- gutterElement.classList.add(className);
614
- textEditor.setGutterDecoration(line, gutterType, gutterElement);
615
- }
616
- }
617
-
618
- makeGutterClickHandler(url: string):
619
- (arg0: Common.EventTarget.EventTargetEvent<SourceFrame.SourcesTextEditor.GutterClickEventData>) => void {
620
- function handleGutterClick(
621
- event: Common.EventTarget.EventTargetEvent<SourceFrame.SourcesTextEditor.GutterClickEventData>): void {
622
- if (event.data.gutterType !== LineDecorator.GUTTER_TYPE) {
623
- return;
624
- }
625
- const coverageViewId = 'coverage';
626
- UI.ViewManager.ViewManager.instance()
627
- .showView(coverageViewId)
628
- .then(() => {
629
- const view = UI.ViewManager.ViewManager.instance().view(coverageViewId);
630
- return view && view.widget();
631
- })
632
- .then(widget => {
633
- const matchFormattedSuffix = url.match(/(.*):formatted$/);
634
- const urlWithoutFormattedSuffix = (matchFormattedSuffix && matchFormattedSuffix[1]) || url;
635
- (widget as CoverageView).selectCoverageItemByUrl(urlWithoutFormattedSuffix);
636
- });
637
- }
638
- return handleGutterClick;
639
- }
640
-
641
- private installGutter(textEditor: SourceFrame.SourcesTextEditor.SourcesTextEditor, url: string): void {
642
- let listener = this.listeners.get(textEditor);
643
- if (!listener) {
644
- listener = this.makeGutterClickHandler(url);
645
- this.listeners.set(textEditor, listener);
646
- }
647
- textEditor.installGutter(LineDecorator.GUTTER_TYPE, false);
648
- textEditor.addEventListener(SourceFrame.SourcesTextEditor.Events.GutterClick, listener, this);
649
- }
650
-
651
- private uninstallGutter(textEditor: SourceFrame.SourcesTextEditor.SourcesTextEditor): void {
652
- textEditor.uninstallGutter(LineDecorator.GUTTER_TYPE);
653
- const listener = this.listeners.get(textEditor);
654
- if (listener) {
655
- textEditor.removeEventListener(SourceFrame.SourcesTextEditor.Events.GutterClick, listener, this);
656
- this.listeners.delete(textEditor);
657
- }
658
- }
659
-
660
- static readonly GUTTER_TYPE = 'CodeMirror-gutter-coverage';
661
- }
662
-
663
- SourceFrame.SourceFrame.registerLineDecorator({
664
- lineDecorator: LineDecorator.instance,
665
- decoratorType: SourceFrame.SourceFrame.DecoratorType.COVERAGE,
666
- });