chrome-devtools-frontend 1.0.938678 → 1.0.939473

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 (135) hide show
  1. package/.stylelintrc.json +8 -10
  2. package/config/gni/all_devtools_files.gni +0 -1
  3. package/config/gni/devtools_grd_files.gni +2 -0
  4. package/docs/triage_guidelines.md +13 -11
  5. package/front_end/Tests.js +63 -29
  6. package/front_end/core/host/InspectorFrontendHost.ts +16 -30
  7. package/front_end/core/host/UserMetrics.ts +1 -0
  8. package/front_end/core/i18n/locales/en-US.json +19 -1
  9. package/front_end/core/i18n/locales/en-XL.json +19 -1
  10. package/front_end/core/protocol_client/InspectorBackend.ts +4 -0
  11. package/front_end/core/root/Runtime.ts +4 -0
  12. package/front_end/core/sdk/CSSModel.ts +64 -50
  13. package/front_end/core/sdk/CategorizedBreakpoint.ts +35 -0
  14. package/front_end/core/sdk/DOMDebuggerModel.ts +10 -41
  15. package/front_end/core/sdk/EmulationModel.ts +11 -0
  16. package/front_end/core/sdk/EventBreakpointsModel.ts +178 -0
  17. package/front_end/core/sdk/Target.ts +2 -1
  18. package/front_end/core/sdk/sdk-meta.ts +30 -1
  19. package/front_end/core/sdk/sdk.ts +4 -0
  20. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +9 -2
  21. package/front_end/entrypoints/inspector_main/renderingOptions.css +2 -2
  22. package/front_end/entrypoints/main/main-meta.ts +0 -4
  23. package/front_end/entrypoints/node_main/nodeConnectionsPanel.css +2 -2
  24. package/front_end/entrypoints/shell/shell.js +1 -0
  25. package/front_end/entrypoints/shell/shell.json +0 -1
  26. package/front_end/models/persistence/editFileSystemView.css +1 -1
  27. package/front_end/models/persistence/workspaceSettingsTab.css +1 -1
  28. package/front_end/panels/accessibility/accessibilityNode.css +2 -2
  29. package/front_end/panels/accessibility/axBreadcrumbs.css +1 -1
  30. package/front_end/panels/animation/animationTimeline.css +5 -5
  31. package/front_end/panels/application/components/frameDetailsReportView.css +1 -1
  32. package/front_end/panels/application/resourcesPanel.css +1 -1
  33. package/front_end/panels/application/resourcesSidebar.css +1 -1
  34. package/front_end/panels/browser_debugger/CSPViolationBreakpointsSidebarPane.ts +2 -2
  35. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +7 -7
  36. package/front_end/panels/browser_debugger/EventListenerBreakpointsSidebarPane.ts +14 -6
  37. package/front_end/panels/browser_debugger/xhrBreakpointsSidebarPane.css +2 -5
  38. package/front_end/panels/changes/changesSidebar.css +1 -1
  39. package/front_end/panels/changes/changesView.css +2 -2
  40. package/front_end/panels/console/consolePrompt.css +1 -1
  41. package/front_end/panels/console/consoleSidebar.css +4 -4
  42. package/front_end/panels/console/consoleView.css +2 -2
  43. package/front_end/panels/css_overview/components/cssOverviewStartView.css +1 -1
  44. package/front_end/panels/css_overview/cssOverviewCompletedView.css +8 -8
  45. package/front_end/panels/elements/classesPaneWidget.css +1 -1
  46. package/front_end/panels/elements/components/adornerSettingsPane.css +1 -1
  47. package/front_end/panels/elements/computedStyleWidgetTree.css +1 -1
  48. package/front_end/panels/elements/elementsPanel.css +1 -1
  49. package/front_end/panels/elements/elementsTreeOutline.css +1 -1
  50. package/front_end/panels/elements/layoutPane.css +1 -1
  51. package/front_end/panels/elements/platformFontsWidget.css +1 -1
  52. package/front_end/panels/elements/stylesSectionTree.css +1 -1
  53. package/front_end/panels/event_listeners/EventListenersView.ts +5 -4
  54. package/front_end/panels/event_listeners/eventListenersView.css +3 -2
  55. package/front_end/panels/issues/IssueKindView.ts +0 -6
  56. package/front_end/panels/issues/IssueView.ts +19 -27
  57. package/front_end/panels/issues/components/HideIssuesMenu.ts +7 -11
  58. package/front_end/panels/issues/components/hideIssuesMenu.css +8 -0
  59. package/front_end/panels/issues/issuesTree.css +17 -5
  60. package/front_end/panels/lighthouse/lighthouseStartView.css +2 -2
  61. package/front_end/panels/media/playerListView.css +1 -1
  62. package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +1 -1
  63. package/front_end/panels/network/NetworkLogView.ts +13 -0
  64. package/front_end/panels/network/NetworkSearchScope.ts +3 -1
  65. package/front_end/panels/network/RequestPayloadView.ts +2 -0
  66. package/front_end/panels/network/blockedURLsPane.css +1 -1
  67. package/front_end/panels/network/networkConfigView.css +1 -1
  68. package/front_end/panels/network/networkLogView.css +3 -3
  69. package/front_end/panels/network/requestPayloadTree.css +5 -0
  70. package/front_end/panels/profiler/profileLauncherView.css +3 -3
  71. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +1 -0
  72. package/front_end/panels/security/mainView.css +2 -2
  73. package/front_end/panels/security/originView.css +1 -1
  74. package/front_end/panels/sensors/sensors.css +2 -2
  75. package/front_end/panels/settings/emulation/components/userAgentClientHintsForm.css +1 -1
  76. package/front_end/panels/settings/emulation/devicesSettingsTab.css +4 -4
  77. package/front_end/panels/settings/frameworkIgnoreListSettingsTab.css +1 -1
  78. package/front_end/panels/settings/settingsScreen.css +2 -2
  79. package/front_end/panels/sources/CoveragePlugin.ts +7 -2
  80. package/front_end/panels/sources/DebuggerPausedMessage.ts +14 -7
  81. package/front_end/panels/sources/callStackSidebarPane.css +1 -1
  82. package/front_end/panels/sources/dialog.css +1 -1
  83. package/front_end/panels/sources/javaScriptBreakpointsSidebarPane.css +1 -1
  84. package/front_end/panels/sources/navigatorTree.css +4 -4
  85. package/front_end/panels/sources/sourcesPanel.css +2 -2
  86. package/front_end/panels/sources/threadsSidebarPane.css +1 -1
  87. package/front_end/panels/timeline/components/WebVitalsTooltip.css +1 -1
  88. package/front_end/panels/timeline/historyToolbarButton.css +1 -1
  89. package/front_end/panels/timeline/timelineStatusDialog.css +1 -1
  90. package/front_end/panels/webauthn/webauthnPane.css +2 -2
  91. package/front_end/ui/components/adorners/adorner.css +1 -1
  92. package/front_end/ui/components/expandable_list/expandableList.css +1 -1
  93. package/front_end/ui/components/linear_memory_inspector/valueInterpreterDisplay.css +1 -2
  94. package/front_end/ui/components/linear_memory_inspector/valueInterpreterSettings.css +1 -1
  95. package/front_end/ui/components/report_view/reportKey.css +1 -1
  96. package/front_end/ui/components/report_view/reportValue.css +1 -1
  97. package/front_end/ui/legacy/ContextMenu.ts +5 -1
  98. package/front_end/ui/legacy/SoftContextMenu.ts +5 -1
  99. package/front_end/ui/legacy/checkboxTextLabel.css +1 -1
  100. package/front_end/ui/legacy/components/color_picker/spectrum.css +9 -9
  101. package/front_end/ui/legacy/components/data_grid/dataGrid.css +2 -2
  102. package/front_end/ui/legacy/components/inline_editor/cssAngleEditor.css +3 -3
  103. package/front_end/ui/legacy/components/inline_editor/cssLength.css +1 -1
  104. package/front_end/ui/legacy/components/inline_editor/cssShadowEditor.css +1 -1
  105. package/front_end/ui/legacy/components/inline_editor/fontEditor.css +1 -1
  106. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +2 -2
  107. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +13 -7
  108. package/front_end/ui/legacy/components/quick_open/filteredListWidget.css +2 -2
  109. package/front_end/ui/legacy/components/source_frame/imageView.css +1 -1
  110. package/front_end/ui/legacy/components/text_editor/cmdevtools.css +6 -14
  111. package/front_end/ui/legacy/emptyWidget.css +1 -1
  112. package/front_end/ui/legacy/filter.css +1 -1
  113. package/front_end/ui/legacy/infobar.css +2 -2
  114. package/front_end/ui/legacy/inspectorCommon.css +45 -45
  115. package/front_end/ui/legacy/inspectorSyntaxHighlight.css +3 -3
  116. package/front_end/ui/legacy/inspectorViewTabbedPane.css +1 -1
  117. package/front_end/ui/legacy/searchableView.css +1 -1
  118. package/front_end/ui/legacy/softContextMenu.css +1 -1
  119. package/front_end/ui/legacy/textPrompt.css +1 -1
  120. package/front_end/ui/legacy/toolbar.css +8 -8
  121. package/front_end/ui/legacy/treeoutline.css +4 -4
  122. package/inspector_overlay/common.css +2 -2
  123. package/inspector_overlay/tool_highlight.css +1 -1
  124. package/inspector_overlay/tool_paused.css +2 -2
  125. package/package.json +1 -1
  126. package/scripts/eslint_rules/lib/check_component_naming.js +1 -1
  127. package/scripts/eslint_rules/lib/enforce_custom_event_names.js +1 -1
  128. package/scripts/eslint_rules/lib/es_modules_import.js +21 -20
  129. package/scripts/eslint_rules/lib/l10n_filename_matches.js +4 -3
  130. package/scripts/eslint_rules/lib/l10n_no_i18nString_calls_module_instantiation.js +1 -1
  131. package/scripts/eslint_rules/lib/migrate_create_shadow_root_with_styles.js +2 -2
  132. package/scripts/eslint_rules/lib/migrate_register_required_css.js +1 -1
  133. package/scripts/eslint_rules/lib/no_underscored_properties.js +1 -1
  134. package/scripts/eslint_rules/tests/es_modules_import_test.js +3 -2
  135. package/front_end/entrypoints/main/module.json +0 -5
@@ -47,6 +47,7 @@ import {CSSStyleDeclaration, Type} from './CSSStyleDeclaration.js';
47
47
  import {CSSStyleSheetHeader} from './CSSStyleSheetHeader.js';
48
48
  import type {DOMNode} from './DOMModel.js';
49
49
  import {DOMModel} from './DOMModel.js';
50
+ import type {ResourceTreeFrame} from './ResourceTreeModel.js';
50
51
  import {Events as ResourceTreeModelEvents, ResourceTreeModel} from './ResourceTreeModel.js';
51
52
  import type {Target} from './Target.js';
52
53
  import {Capability} from './Target.js';
@@ -54,37 +55,37 @@ import {SDKModel} from './SDKModel.js';
54
55
  import {SourceMapManager} from './SourceMapManager.js';
55
56
 
56
57
  export class CSSModel extends SDKModel<EventTypes> {
57
- #isEnabledInternal: boolean;
58
- #cachedMatchedCascadeNode: DOMNode|null;
59
- #cachedMatchedCascadePromise: Promise<CSSMatchedStyles|null>|null;
60
- readonly #domModelInternal: DOMModel;
61
- readonly #sourceMapManagerInternal: SourceMapManager<CSSStyleSheetHeader>;
62
- agent: ProtocolProxyApi.CSSApi;
63
- readonly #styleLoader: ComputedStyleLoader;
58
+ readonly agent: ProtocolProxyApi.CSSApi;
59
+ readonly #domModel: DOMModel;
60
+ readonly #fontFaces: Map<string, CSSFontFace>;
61
+ readonly #originalStyleSheetText: Map<CSSStyleSheetHeader, Promise<string|null>>;
64
62
  readonly #resourceTreeModel: ResourceTreeModel|null;
65
- #styleSheetIdToHeader: Map<Protocol.CSS.StyleSheetId, CSSStyleSheetHeader>;
63
+ readonly #sourceMapManager: SourceMapManager<CSSStyleSheetHeader>;
64
+ readonly #styleLoader: ComputedStyleLoader;
65
+ readonly #stylePollingThrottler: Common.Throttler.Throttler;
66
66
  readonly #styleSheetIdsForURL: Map<string, Map<string, Set<Protocol.CSS.StyleSheetId>>>;
67
- readonly #originalStyleSheetTextInternal: Map<CSSStyleSheetHeader, Promise<string|null>>;
68
- #isRuleUsageTrackingEnabled: boolean;
69
- readonly #fontFacesInternal: Map<string, CSSFontFace>;
67
+ readonly #styleSheetIdToHeader: Map<Protocol.CSS.StyleSheetId, CSSStyleSheetHeader>;
68
+ #cachedMatchedCascadeNode: DOMNode|null;
69
+ #cachedMatchedCascadePromise: Promise<CSSMatchedStyles|null>|null;
70
70
  #cssPropertyTracker: CSSPropertyTracker|null;
71
71
  #isCSSPropertyTrackingEnabled: boolean;
72
+ #isEnabled: boolean;
73
+ #isRuleUsageTrackingEnabled: boolean;
72
74
  #isTrackingRequestPending: boolean;
73
- readonly #trackedCSSProperties: Map<number, Protocol.CSS.CSSComputedStyleProperty[]>;
74
- readonly #stylePollingThrottler: Common.Throttler.Throttler;
75
75
 
76
76
  constructor(target: Target) {
77
77
  super(target);
78
- this.#isEnabledInternal = false;
78
+ this.#isEnabled = false;
79
79
  this.#cachedMatchedCascadeNode = null;
80
80
  this.#cachedMatchedCascadePromise = null;
81
- this.#domModelInternal = (target.model(DOMModel) as DOMModel);
82
- this.#sourceMapManagerInternal = new SourceMapManager(target);
81
+ this.#domModel = (target.model(DOMModel) as DOMModel);
82
+ this.#sourceMapManager = new SourceMapManager(target);
83
83
  this.agent = target.cssAgent();
84
84
  this.#styleLoader = new ComputedStyleLoader(this);
85
85
  this.#resourceTreeModel = target.model(ResourceTreeModel);
86
86
  if (this.#resourceTreeModel) {
87
- this.#resourceTreeModel.addEventListener(ResourceTreeModelEvents.MainFrameNavigated, this.resetStyleSheets, this);
87
+ this.#resourceTreeModel.addEventListener(
88
+ ResourceTreeModelEvents.MainFrameNavigated, this.onMainFrameNavigated, this);
88
89
  }
89
90
  target.registerCSSDispatcher(new CSSDispatcher(this));
90
91
  if (!target.suspended()) {
@@ -93,23 +94,21 @@ export class CSSModel extends SDKModel<EventTypes> {
93
94
  this.#styleSheetIdToHeader = new Map();
94
95
  this.#styleSheetIdsForURL = new Map();
95
96
 
96
- this.#originalStyleSheetTextInternal = new Map();
97
+ this.#originalStyleSheetText = new Map();
97
98
 
98
99
  this.#isRuleUsageTrackingEnabled = false;
99
100
 
100
- this.#fontFacesInternal = new Map();
101
+ this.#fontFaces = new Map();
101
102
 
102
103
  this.#cssPropertyTracker = null; // TODO: support multiple trackers when we refactor the backend
103
104
  this.#isCSSPropertyTrackingEnabled = false;
104
105
  this.#isTrackingRequestPending = false;
105
- this.#trackedCSSProperties = new Map();
106
106
  this.#stylePollingThrottler = new Common.Throttler.Throttler(StylePollingInterval);
107
107
 
108
- this.#sourceMapManagerInternal.setEnabled(
109
- Common.Settings.Settings.instance().moduleSetting('cssSourceMapsEnabled').get());
108
+ this.#sourceMapManager.setEnabled(Common.Settings.Settings.instance().moduleSetting('cssSourceMapsEnabled').get());
110
109
  Common.Settings.Settings.instance()
111
110
  .moduleSetting('cssSourceMapsEnabled')
112
- .addChangeListener(event => this.#sourceMapManagerInternal.setEnabled((event.data as boolean)));
111
+ .addChangeListener(event => this.#sourceMapManager.setEnabled((event.data as boolean)));
113
112
  }
114
113
 
115
114
  headersForSourceURL(sourceURL: string): CSSStyleSheetHeader[] {
@@ -148,7 +147,7 @@ export class CSSModel extends SDKModel<EventTypes> {
148
147
  }
149
148
 
150
149
  sourceMapManager(): SourceMapManager<CSSStyleSheetHeader> {
151
- return this.#sourceMapManagerInternal;
150
+ return this.#sourceMapManager;
152
151
  }
153
152
 
154
153
  static trimSourceURL(text: string): string {
@@ -172,7 +171,7 @@ export class CSSModel extends SDKModel<EventTypes> {
172
171
  }
173
172
 
174
173
  domModel(): DOMModel {
175
- return this.#domModelInternal;
174
+ return this.#domModel;
176
175
  }
177
176
 
178
177
  async setStyleText(
@@ -187,7 +186,7 @@ export class CSSModel extends SDKModel<EventTypes> {
187
186
  return false;
188
187
  }
189
188
 
190
- this.#domModelInternal.markUndoableState(!majorChange);
189
+ this.#domModel.markUndoableState(!majorChange);
191
190
  const edit = new Edit(styleSheetId, range, text, styles[0]);
192
191
  this.fireStyleSheetChanged(styleSheetId, edit);
193
192
  return true;
@@ -207,7 +206,7 @@ export class CSSModel extends SDKModel<EventTypes> {
207
206
  if (!selectorList) {
208
207
  return false;
209
208
  }
210
- this.#domModelInternal.markUndoableState();
209
+ this.#domModel.markUndoableState();
211
210
  const edit = new Edit(styleSheetId, range, text, selectorList);
212
211
  this.fireStyleSheetChanged(styleSheetId, edit);
213
212
  return true;
@@ -227,7 +226,7 @@ export class CSSModel extends SDKModel<EventTypes> {
227
226
  if (!keyText) {
228
227
  return false;
229
228
  }
230
- this.#domModelInternal.markUndoableState();
229
+ this.#domModel.markUndoableState();
231
230
  const edit = new Edit(styleSheetId, range, text, keyText);
232
231
  this.fireStyleSheetChanged(styleSheetId, edit);
233
232
  return true;
@@ -268,12 +267,12 @@ export class CSSModel extends SDKModel<EventTypes> {
268
267
  }
269
268
 
270
269
  isEnabled(): boolean {
271
- return this.#isEnabledInternal;
270
+ return this.#isEnabled;
272
271
  }
273
272
 
274
273
  private async enable(): Promise<void> {
275
274
  await this.agent.invoke_enable();
276
- this.#isEnabledInternal = true;
275
+ this.#isEnabled = true;
277
276
  if (this.#isRuleUsageTrackingEnabled) {
278
277
  await this.startCoverage();
279
278
  }
@@ -287,7 +286,7 @@ export class CSSModel extends SDKModel<EventTypes> {
287
286
  return null;
288
287
  }
289
288
 
290
- const node = this.#domModelInternal.nodeForId(nodeId);
289
+ const node = this.#domModel.nodeForId(nodeId);
291
290
  if (!node) {
292
291
  return null;
293
292
  }
@@ -399,7 +398,7 @@ export class CSSModel extends SDKModel<EventTypes> {
399
398
  if (!media) {
400
399
  return false;
401
400
  }
402
- this.#domModelInternal.markUndoableState();
401
+ this.#domModel.markUndoableState();
403
402
  const edit = new Edit(styleSheetId, range, newMediaText, media);
404
403
  this.fireStyleSheetChanged(styleSheetId, edit);
405
404
  return true;
@@ -421,7 +420,7 @@ export class CSSModel extends SDKModel<EventTypes> {
421
420
  if (!containerQuery) {
422
421
  return false;
423
422
  }
424
- this.#domModelInternal.markUndoableState();
423
+ this.#domModel.markUndoableState();
425
424
  const edit = new Edit(styleSheetId, range, newContainerQueryText, containerQuery);
426
425
  this.fireStyleSheetChanged(styleSheetId, edit);
427
426
  return true;
@@ -439,7 +438,7 @@ export class CSSModel extends SDKModel<EventTypes> {
439
438
  if (!rule) {
440
439
  return null;
441
440
  }
442
- this.#domModelInternal.markUndoableState();
441
+ this.#domModel.markUndoableState();
443
442
  const edit = new Edit(styleSheetId, ruleLocation, ruleText, rule);
444
443
  this.fireStyleSheetChanged(styleSheetId, edit);
445
444
  return new CSSStyleRule(this, rule);
@@ -477,13 +476,13 @@ export class CSSModel extends SDKModel<EventTypes> {
477
476
 
478
477
  fontsUpdated(fontFace?: Protocol.CSS.FontFace|null): void {
479
478
  if (fontFace) {
480
- this.#fontFacesInternal.set(fontFace.src, new CSSFontFace(fontFace));
479
+ this.#fontFaces.set(fontFace.src, new CSSFontFace(fontFace));
481
480
  }
482
481
  this.dispatchEventToListeners(Events.FontsUpdated);
483
482
  }
484
483
 
485
484
  fontFaces(): CSSFontFace[] {
486
- return [...this.#fontFacesInternal.values()];
485
+ return [...this.#fontFaces.values()];
487
486
  }
488
487
 
489
488
  styleSheetHeaderForId(id: Protocol.CSS.StyleSheetId): CSSStyleSheetHeader|null {
@@ -503,10 +502,10 @@ export class CSSModel extends SDKModel<EventTypes> {
503
502
  if (!header) {
504
503
  return Promise.resolve(null);
505
504
  }
506
- let promise = this.#originalStyleSheetTextInternal.get(header);
505
+ let promise = this.#originalStyleSheetText.get(header);
507
506
  if (!promise) {
508
507
  promise = this.getStyleSheetText(header.id);
509
- this.#originalStyleSheetTextInternal.set(header, promise);
508
+ this.#originalStyleSheetText.set(header, promise);
510
509
  this.originalContentRequestedForTest(header);
511
510
  }
512
511
  return promise;
@@ -541,8 +540,7 @@ export class CSSModel extends SDKModel<EventTypes> {
541
540
  }
542
541
  styleSheetIds.add(styleSheetHeader.id);
543
542
  }
544
- this.#sourceMapManagerInternal.attachSourceMap(
545
- styleSheetHeader, styleSheetHeader.sourceURL, styleSheetHeader.sourceMapURL);
543
+ this.#sourceMapManager.attachSourceMap(styleSheetHeader, styleSheetHeader.sourceURL, styleSheetHeader.sourceMapURL);
546
544
  this.dispatchEventToListeners(Events.StyleSheetAdded, styleSheetHeader);
547
545
  }
548
546
 
@@ -569,8 +567,8 @@ export class CSSModel extends SDKModel<EventTypes> {
569
567
  }
570
568
  }
571
569
  }
572
- this.#originalStyleSheetTextInternal.delete(header);
573
- this.#sourceMapManagerInternal.detachSourceMap(header);
570
+ this.#originalStyleSheetText.delete(header);
571
+ this.#sourceMapManager.detachSourceMap(header);
574
572
  this.dispatchEventToListeners(Events.StyleSheetRemoved, header);
575
573
  }
576
574
 
@@ -602,13 +600,13 @@ export class CSSModel extends SDKModel<EventTypes> {
602
600
  const response = await this.agent.invoke_setStyleSheetText({styleSheetId: header.id, text: newText});
603
601
  const sourceMapURL = response.sourceMapURL;
604
602
 
605
- this.#sourceMapManagerInternal.detachSourceMap(header);
603
+ this.#sourceMapManager.detachSourceMap(header);
606
604
  header.setSourceMapURL(sourceMapURL);
607
- this.#sourceMapManagerInternal.attachSourceMap(header, header.sourceURL, header.sourceMapURL);
605
+ this.#sourceMapManager.attachSourceMap(header, header.sourceURL, header.sourceMapURL);
608
606
  if (sourceMapURL === null) {
609
607
  return 'Error in CSS.setStyleSheetText';
610
608
  }
611
- this.#domModelInternal.markUndoableState(!majorChange);
609
+ this.#domModel.markUndoableState(!majorChange);
612
610
  this.fireStyleSheetChanged(styleSheetId);
613
611
  return null;
614
612
  }
@@ -622,22 +620,38 @@ export class CSSModel extends SDKModel<EventTypes> {
622
620
  }
623
621
  }
624
622
 
623
+ private async onMainFrameNavigated(event: Common.EventTarget.EventTargetEvent<ResourceTreeFrame>): Promise<void> {
624
+ // If the main frame was restored from the back-forward cache, the order of CDP
625
+ // is different from the regular navigations. In this case, events about CSS
626
+ // stylesheet has already been received and they are mixed with the previous page
627
+ // stylesheets. Therefore, we re-enable the CSS agent to get fresh events.
628
+ // For the regular navigatons, we can just clear the local data because events about
629
+ // stylesheets will arrive later.
630
+ if (event.data.backForwardCacheDetails.restoredFromCache) {
631
+ await this.suspendModel();
632
+ await this.resumeModel();
633
+ } else {
634
+ this.resetStyleSheets();
635
+ this.resetFontFaces();
636
+ }
637
+ }
638
+
625
639
  private resetStyleSheets(): void {
626
640
  const headers = [...this.#styleSheetIdToHeader.values()];
627
641
  this.#styleSheetIdsForURL.clear();
628
642
  this.#styleSheetIdToHeader.clear();
629
643
  for (const header of headers) {
630
- this.#sourceMapManagerInternal.detachSourceMap(header);
644
+ this.#sourceMapManager.detachSourceMap(header);
631
645
  this.dispatchEventToListeners(Events.StyleSheetRemoved, header);
632
646
  }
633
647
  }
634
648
 
635
649
  private resetFontFaces(): void {
636
- this.#fontFacesInternal.clear();
650
+ this.#fontFaces.clear();
637
651
  }
638
652
 
639
653
  async suspendModel(): Promise<void> {
640
- this.#isEnabledInternal = false;
654
+ this.#isEnabled = false;
641
655
  await this.agent.invoke_disable();
642
656
  this.resetStyleSheets();
643
657
  this.resetFontFaces();
@@ -713,7 +727,7 @@ export class CSSModel extends SDKModel<EventTypes> {
713
727
  if (this.#cssPropertyTracker) {
714
728
  this.#cssPropertyTracker.dispatchEventToListeners(
715
729
  CSSPropertyTrackerEvents.TrackedCSSPropertiesUpdated,
716
- result.nodeIds.map(nodeId => this.#domModelInternal.nodeForId(nodeId)));
730
+ result.nodeIds.map(nodeId => this.#domModel.nodeForId(nodeId)));
717
731
  }
718
732
  }
719
733
 
@@ -725,7 +739,7 @@ export class CSSModel extends SDKModel<EventTypes> {
725
739
  dispose(): void {
726
740
  this.disableCSSPropertyTracker();
727
741
  super.dispose();
728
- this.#sourceMapManagerInternal.dispose();
742
+ this.#sourceMapManager.dispose();
729
743
  }
730
744
 
731
745
  getAgent(): ProtocolProxyApi.CSSApi {
@@ -0,0 +1,35 @@
1
+ // Copyright 2021 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ export class CategorizedBreakpoint {
6
+ readonly #categoryInternal: string;
7
+ titleInternal: string;
8
+ enabledInternal: boolean;
9
+
10
+ constructor(category: string, title: string) {
11
+ this.#categoryInternal = category;
12
+ this.titleInternal = title;
13
+ this.enabledInternal = false;
14
+ }
15
+
16
+ category(): string {
17
+ return this.#categoryInternal;
18
+ }
19
+
20
+ enabled(): boolean {
21
+ return this.enabledInternal;
22
+ }
23
+
24
+ setEnabled(enabled: boolean): void {
25
+ this.enabledInternal = enabled;
26
+ }
27
+
28
+ title(): string {
29
+ return this.titleInternal;
30
+ }
31
+
32
+ setTitle(title: string): void {
33
+ this.titleInternal = title;
34
+ }
35
+ }
@@ -7,6 +7,7 @@ import * as i18n from '../i18n/i18n.js';
7
7
  import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
8
8
  import * as Protocol from '../../generated/protocol.js';
9
9
 
10
+ import {CategorizedBreakpoint} from './CategorizedBreakpoint.js';
10
11
  import type {Location} from './DebuggerModel.js';
11
12
  import type {DOMNode} from './DOMModel.js';
12
13
  import {DOMModel, Events as DOMModelEvents} from './DOMModel.js';
@@ -690,38 +691,6 @@ export namespace EventListener {
690
691
  }
691
692
  }
692
693
 
693
- export class CategorizedBreakpoint {
694
- readonly #categoryInternal: string;
695
- titleInternal: string;
696
- enabledInternal: boolean;
697
-
698
- constructor(category: string, title: string) {
699
- this.#categoryInternal = category;
700
- this.titleInternal = title;
701
- this.enabledInternal = false;
702
- }
703
-
704
- category(): string {
705
- return this.#categoryInternal;
706
- }
707
-
708
- enabled(): boolean {
709
- return this.enabledInternal;
710
- }
711
-
712
- setEnabled(enabled: boolean): void {
713
- this.enabledInternal = enabled;
714
- }
715
-
716
- title(): string {
717
- return this.titleInternal;
718
- }
719
-
720
- setTitle(title: string): void {
721
- this.titleInternal = title;
722
- }
723
- }
724
-
725
694
  export class CSPViolationBreakpoint extends CategorizedBreakpoint {
726
695
  readonly #typeInternal: Protocol.DOMDebugger.CSPViolationType;
727
696
  constructor(category: string, title: string, type: Protocol.DOMDebugger.CSPViolationType) {
@@ -734,7 +703,7 @@ export class CSPViolationBreakpoint extends CategorizedBreakpoint {
734
703
  }
735
704
  }
736
705
 
737
- export class EventListenerBreakpoint extends CategorizedBreakpoint {
706
+ export class DOMEventListenerBreakpoint extends CategorizedBreakpoint {
738
707
  readonly instrumentationName: string;
739
708
  readonly eventName: string;
740
709
  readonly eventTargetNames: string[];
@@ -784,7 +753,7 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
784
753
  readonly #xhrBreakpointsSetting: Common.Settings.Setting<{url: string, enabled: boolean}[]>;
785
754
  readonly #xhrBreakpointsInternal: Map<string, boolean>;
786
755
  readonly #cspViolationsToBreakOn: CSPViolationBreakpoint[];
787
- readonly #eventListenerBreakpointsInternal: EventListenerBreakpoint[];
756
+ readonly #eventListenerBreakpointsInternal: DOMEventListenerBreakpoint[];
788
757
 
789
758
  constructor() {
790
759
  this.#xhrBreakpointsSetting = Common.Settings.Settings.instance().createLocalSetting('xhrBreakpoints', []);
@@ -933,19 +902,19 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
933
902
  private createInstrumentationBreakpoints(category: string, instrumentationNames: string[]): void {
934
903
  for (const instrumentationName of instrumentationNames) {
935
904
  this.#eventListenerBreakpointsInternal.push(
936
- new EventListenerBreakpoint(instrumentationName, '', [], category, instrumentationName));
905
+ new DOMEventListenerBreakpoint(instrumentationName, '', [], category, instrumentationName));
937
906
  }
938
907
  }
939
908
 
940
909
  private createEventListenerBreakpoints(category: string, eventNames: string[], eventTargetNames: string[]): void {
941
910
  for (const eventName of eventNames) {
942
911
  this.#eventListenerBreakpointsInternal.push(
943
- new EventListenerBreakpoint('', eventName, eventTargetNames, category, eventName));
912
+ new DOMEventListenerBreakpoint('', eventName, eventTargetNames, category, eventName));
944
913
  }
945
914
  }
946
915
 
947
- private resolveEventListenerBreakpointInternal(eventName: string, eventTargetName?: string): EventListenerBreakpoint
948
- |null {
916
+ private resolveEventListenerBreakpointInternal(eventName: string, eventTargetName?: string):
917
+ DOMEventListenerBreakpoint|null {
949
918
  const instrumentationPrefix = 'instrumentation:';
950
919
  const listenerPrefix = 'listener:';
951
920
  let instrumentationName = '';
@@ -958,7 +927,7 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
958
927
  return null;
959
928
  }
960
929
  eventTargetName = (eventTargetName || '*').toLowerCase();
961
- let result: EventListenerBreakpoint|null = null;
930
+ let result: DOMEventListenerBreakpoint|null = null;
962
931
  for (const breakpoint of this.#eventListenerBreakpointsInternal) {
963
932
  if (instrumentationName && breakpoint.instrumentationName === instrumentationName) {
964
933
  result = breakpoint;
@@ -975,7 +944,7 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
975
944
  return result;
976
945
  }
977
946
 
978
- eventListenerBreakpoints(): EventListenerBreakpoint[] {
947
+ eventListenerBreakpoints(): DOMEventListenerBreakpoint[] {
979
948
  return this.#eventListenerBreakpointsInternal.slice();
980
949
  }
981
950
 
@@ -1008,7 +977,7 @@ export class DOMDebuggerManager implements SDKModelObserver<DOMDebuggerModel> {
1008
977
  resolveEventListenerBreakpoint(auxData: {
1009
978
  eventName: string,
1010
979
  targetName: string,
1011
- }): EventListenerBreakpoint|null {
980
+ }): DOMEventListenerBreakpoint|null {
1012
981
  return this.resolveEventListenerBreakpointInternal(auxData['eventName'], auxData['targetName']);
1013
982
  }
1014
983
 
@@ -76,6 +76,8 @@ export class EmulationModel extends SDKModel<void> {
76
76
  Common.Settings.Settings.instance().moduleSetting<string>('emulatedCSSMediaFeatureColorGamut');
77
77
  const mediaFeaturePrefersColorSchemeSetting =
78
78
  Common.Settings.Settings.instance().moduleSetting<string>('emulatedCSSMediaFeaturePrefersColorScheme');
79
+ const mediaFeatureForcedColorsSetting =
80
+ Common.Settings.Settings.instance().moduleSetting('emulatedCSSMediaFeatureForcedColors');
79
81
  const mediaFeaturePrefersContrastSetting =
80
82
  Common.Settings.Settings.instance().moduleSetting<string>('emulatedCSSMediaFeaturePrefersContrast');
81
83
  const mediaFeaturePrefersReducedDataSetting =
@@ -90,6 +92,7 @@ export class EmulationModel extends SDKModel<void> {
90
92
  ['type', mediaTypeSetting.get()],
91
93
  ['color-gamut', mediaFeatureColorGamutSetting.get()],
92
94
  ['prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get()],
95
+ ['forced-colors', mediaFeatureForcedColorsSetting.get()],
93
96
  ['prefers-contrast', mediaFeaturePrefersContrastSetting.get()],
94
97
  ['prefers-reduced-data', mediaFeaturePrefersReducedDataSetting.get()],
95
98
  ['prefers-reduced-motion', mediaFeaturePrefersReducedMotionSetting.get()],
@@ -106,6 +109,10 @@ export class EmulationModel extends SDKModel<void> {
106
109
  this.#mediaConfiguration.set('prefers-color-scheme', mediaFeaturePrefersColorSchemeSetting.get());
107
110
  this.updateCssMedia();
108
111
  });
112
+ mediaFeatureForcedColorsSetting.addChangeListener(() => {
113
+ this.#mediaConfiguration.set('forced-colors', mediaFeatureForcedColorsSetting.get());
114
+ this.updateCssMedia();
115
+ });
109
116
  mediaFeaturePrefersContrastSetting.addChangeListener(() => {
110
117
  this.#mediaConfiguration.set('prefers-contrast', mediaFeaturePrefersContrastSetting.get());
111
118
  this.updateCssMedia();
@@ -367,6 +374,10 @@ export class EmulationModel extends SDKModel<void> {
367
374
  name: 'prefers-color-scheme',
368
375
  value: this.#mediaConfiguration.get('prefers-color-scheme') ?? '',
369
376
  },
377
+ {
378
+ name: 'forced-colors',
379
+ value: this.#mediaConfiguration.get('forced-colors') ?? '',
380
+ },
370
381
  {
371
382
  name: 'prefers-contrast',
372
383
  value: this.#mediaConfiguration.get('prefers-contrast') ?? '',
@@ -0,0 +1,178 @@
1
+ // Copyright 2021 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import type * as Common from '../common/common.js';
6
+ import * as i18n from '../i18n/i18n.js';
7
+ import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
8
+
9
+ import {CategorizedBreakpoint} from './CategorizedBreakpoint.js';
10
+ import type {Target} from './Target.js';
11
+ import {Capability} from './Target.js';
12
+ import {SDKModel} from './SDKModel.js';
13
+ import type {SDKModelObserver} from './TargetManager.js';
14
+ import {TargetManager} from './TargetManager.js';
15
+
16
+ const UIStrings = {
17
+ /**
18
+ * @description Category of breakpoints
19
+ */
20
+ auctionWorklet: 'Ad Auction Worklet',
21
+
22
+ /**
23
+ * @description Name of a breakpoint type.
24
+ * https://github.com/WICG/turtledove/blob/main/FLEDGE.md#32-on-device-bidding
25
+ */
26
+ beforeBidderWorkletBiddingStart: 'Bidder Bidding Phase Start',
27
+
28
+ /**
29
+ * @description Name of a breakpoint type.
30
+ * https://github.com/WICG/turtledove/blob/main/FLEDGE.md#52-buyer-reporting-on-render-and-ad-events
31
+ */
32
+ beforeBidderWorkletReportingStart: 'Bidder Reporting Phase Start',
33
+
34
+ /**
35
+ * @description Name of a breakpoint type.
36
+ * https://github.com/WICG/turtledove/blob/main/FLEDGE.md#23-scoring-bids
37
+ */
38
+ beforeSellerWorkletScoringStart: 'Seller Scoring Phase Start',
39
+
40
+ /**
41
+ * @description Name of a breakpoint type.
42
+ * https://github.com/WICG/turtledove/blob/main/FLEDGE.md#51-seller-reporting-on-render
43
+ */
44
+ beforeSellerWorkletReportingStart: 'Seller Reporting Phase Start',
45
+ };
46
+
47
+ const str_ = i18n.i18n.registerUIStrings('core/sdk/EventBreakpointsModel.ts', UIStrings);
48
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
49
+
50
+ const enum InstrumentationNames {
51
+ BeforeBidderWorkletBiddingStart = 'beforeBidderWorkletBiddingStart',
52
+ BeforeBidderWorkletReportingStart = 'beforeBidderWorkletReportingStart',
53
+ BeforeSellerWorkletScoringStart = 'beforeSellerWorkletScoringStart',
54
+ BeforeSellerWorkletReportingStart = 'beforeSellerWorkletReportingStart',
55
+ }
56
+
57
+ function getTitleForInstrumentationName(instrumentationName: InstrumentationNames): Common.UIString.LocalizedString {
58
+ switch (instrumentationName) {
59
+ case InstrumentationNames.BeforeBidderWorkletBiddingStart:
60
+ return i18nString(UIStrings.beforeBidderWorkletBiddingStart);
61
+
62
+ case InstrumentationNames.BeforeBidderWorkletReportingStart:
63
+ return i18nString(UIStrings.beforeBidderWorkletReportingStart);
64
+
65
+ case InstrumentationNames.BeforeSellerWorkletScoringStart:
66
+ return i18nString(UIStrings.beforeSellerWorkletScoringStart);
67
+
68
+ case InstrumentationNames.BeforeSellerWorkletReportingStart:
69
+ return i18nString(UIStrings.beforeSellerWorkletReportingStart);
70
+ }
71
+ }
72
+
73
+ export class EventBreakpointsModel extends SDKModel<void> {
74
+ readonly agent: ProtocolProxyApi.EventBreakpointsApi;
75
+
76
+ constructor(target: Target) {
77
+ super(target);
78
+ this.agent = target.eventBreakpointsAgent();
79
+ }
80
+ }
81
+
82
+ // This implementation (as opposed to similar class in DOMDebuggerModel) is for
83
+ // instrumentation breakpoints in targets that run JS but do not have a DOM.
84
+ class EventListenerBreakpoint extends CategorizedBreakpoint {
85
+ readonly instrumentationName: string;
86
+ constructor(instrumentationName: InstrumentationNames, category: string) {
87
+ super(category, getTitleForInstrumentationName(instrumentationName));
88
+ this.instrumentationName = instrumentationName;
89
+ }
90
+
91
+ setEnabled(enabled: boolean): void {
92
+ if (this.enabled() === enabled) {
93
+ return;
94
+ }
95
+ super.setEnabled(enabled);
96
+ for (const model of TargetManager.instance().models(EventBreakpointsModel)) {
97
+ this.updateOnModel(model);
98
+ }
99
+ }
100
+
101
+ updateOnModel(model: EventBreakpointsModel): void {
102
+ if (this.enabled()) {
103
+ model.agent.invoke_setInstrumentationBreakpoint({eventName: this.instrumentationName});
104
+ } else {
105
+ model.agent.invoke_removeInstrumentationBreakpoint({eventName: this.instrumentationName});
106
+ }
107
+ }
108
+
109
+ static readonly instrumentationPrefix = 'instrumentation:';
110
+ }
111
+
112
+ let eventBreakpointManagerInstance: EventBreakpointsManager;
113
+
114
+ export class EventBreakpointsManager implements SDKModelObserver<EventBreakpointsModel> {
115
+ readonly #eventListenerBreakpointsInternal: EventListenerBreakpoint[] = [];
116
+
117
+ constructor() {
118
+ this.createInstrumentationBreakpoints(i18nString(UIStrings.auctionWorklet), [
119
+ InstrumentationNames.BeforeBidderWorkletBiddingStart,
120
+ InstrumentationNames.BeforeBidderWorkletReportingStart,
121
+ InstrumentationNames.BeforeSellerWorkletScoringStart,
122
+ InstrumentationNames.BeforeSellerWorkletReportingStart,
123
+ ]);
124
+
125
+ TargetManager.instance().observeModels(EventBreakpointsModel, this);
126
+ }
127
+
128
+ static instance(opts: {
129
+ forceNew: boolean|null,
130
+ } = {forceNew: null}): EventBreakpointsManager {
131
+ const {forceNew} = opts;
132
+ if (!eventBreakpointManagerInstance || forceNew) {
133
+ eventBreakpointManagerInstance = new EventBreakpointsManager();
134
+ }
135
+
136
+ return eventBreakpointManagerInstance;
137
+ }
138
+
139
+ private createInstrumentationBreakpoints(category: string, instrumentationNames: InstrumentationNames[]): void {
140
+ for (const instrumentationName of instrumentationNames) {
141
+ this.#eventListenerBreakpointsInternal.push(new EventListenerBreakpoint(instrumentationName, category));
142
+ }
143
+ }
144
+
145
+ eventListenerBreakpoints(): EventListenerBreakpoint[] {
146
+ return this.#eventListenerBreakpointsInternal.slice();
147
+ }
148
+
149
+ resolveEventListenerBreakpointTitle(auxData: {
150
+ eventName: string,
151
+ }): string|null {
152
+ const breakpoint = this.resolveEventListenerBreakpoint(auxData);
153
+ return breakpoint ? breakpoint.title() : null;
154
+ }
155
+
156
+ resolveEventListenerBreakpoint(auxData: {eventName: string}): EventListenerBreakpoint|null {
157
+ const eventName = auxData.eventName;
158
+ if (!eventName.startsWith(EventListenerBreakpoint.instrumentationPrefix)) {
159
+ return null;
160
+ }
161
+
162
+ const instrumentationName = eventName.substring(EventListenerBreakpoint.instrumentationPrefix.length);
163
+ return this.#eventListenerBreakpointsInternal.find(b => b.instrumentationName === instrumentationName) || null;
164
+ }
165
+
166
+ modelAdded(eventBreakpointModel: EventBreakpointsModel): void {
167
+ for (const breakpoint of this.#eventListenerBreakpointsInternal) {
168
+ if (breakpoint.enabled()) {
169
+ breakpoint.updateOnModel(eventBreakpointModel);
170
+ }
171
+ }
172
+ }
173
+
174
+ modelRemoved(_eventBreakpointModel: EventBreakpointsModel): void {
175
+ }
176
+ }
177
+
178
+ SDKModel.register(EventBreakpointsModel, {capabilities: Capability.EventBreakpoints, autostart: false});