chrome-devtools-frontend 1.0.1679704 → 1.0.1681498

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 (125) hide show
  1. package/AUTHORS +1 -0
  2. package/front_end/core/platform/TypescriptUtilities.ts +0 -9
  3. package/front_end/core/platform/platform.ts +1 -1
  4. package/front_end/core/sdk/ConsoleModel.ts +6 -3
  5. package/front_end/core/sdk/DOMModel.ts +110 -0
  6. package/front_end/core/sdk/EmulationModel.ts +4 -2
  7. package/front_end/core/sdk/NetworkManager.ts +15 -9
  8. package/front_end/core/sdk/OverlayModel.ts +3 -2
  9. package/front_end/core/sdk/PageResourceLoader.ts +4 -3
  10. package/front_end/core/sdk/RuntimeModel.ts +5 -3
  11. package/front_end/core/sdk/SDKSettings.ts +66 -0
  12. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +4 -2
  13. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +32 -0
  14. package/front_end/entrypoints/main/MainImpl.ts +1 -1
  15. package/front_end/entrypoints/main/main-meta.ts +82 -0
  16. package/front_end/entrypoints/shell/shell.ts +0 -3
  17. package/front_end/entrypoints/trace_app/trace_app.ts +0 -3
  18. package/front_end/generated/InspectorBackendCommands.ts +3 -1
  19. package/front_end/generated/SupportedCSSProperties.ts +20 -0
  20. package/front_end/generated/protocol-mapping.d.ts +7 -0
  21. package/front_end/generated/protocol-proxy-api.d.ts +5 -0
  22. package/front_end/generated/protocol.ts +15 -3
  23. package/front_end/models/ai_code_completion/debug.ts +6 -3
  24. package/front_end/models/ai_code_generation/debug.ts +6 -3
  25. package/front_end/models/badges/UserBadges.ts +9 -2
  26. package/front_end/models/emulation/DeviceModeModel.ts +16 -27
  27. package/front_end/models/emulation/EmulatedDevices.ts +30 -125
  28. package/front_end/models/extensions/ExtensionAPI.ts +34 -23
  29. package/front_end/models/logs/NetworkLog.ts +3 -3
  30. package/front_end/models/logs/logs-meta.ts +0 -60
  31. package/front_end/models/persistence/NetworkPersistenceManager.ts +7 -1
  32. package/front_end/panels/application/ServiceWorkersView.ts +1 -1
  33. package/front_end/panels/application/StorageView.ts +2 -0
  34. package/front_end/panels/common/BadgeNotification.ts +1 -1
  35. package/front_end/panels/common/ExtensionPanel.ts +12 -7
  36. package/front_end/panels/common/ExtensionServer.ts +76 -16
  37. package/front_end/panels/common/GdpSignUpDialog.ts +1 -1
  38. package/front_end/panels/console/ConsoleView.ts +4 -2
  39. package/front_end/panels/console/ConsoleViewMessage.ts +3 -2
  40. package/front_end/panels/console/console-meta.ts +19 -5
  41. package/front_end/panels/elements/CSSRuleValidator.ts +12 -12
  42. package/front_end/panels/elements/CSSSpecificityBreakdown.ts +1 -1
  43. package/front_end/panels/elements/ClassesPaneWidget.ts +6 -6
  44. package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +1 -1
  45. package/front_end/panels/elements/ComputedStyleWidget.ts +4 -5
  46. package/front_end/panels/elements/DOMTreeContextMenu.ts +538 -0
  47. package/front_end/panels/elements/ElementIssueUtils.ts +20 -20
  48. package/front_end/panels/elements/ElementStatePaneWidget.ts +6 -6
  49. package/front_end/panels/elements/ElementsPanel.ts +10 -10
  50. package/front_end/panels/elements/ElementsTreeElement.ts +47 -514
  51. package/front_end/panels/elements/ElementsTreeOutline.ts +168 -297
  52. package/front_end/panels/elements/EventListenersWidget.ts +8 -8
  53. package/front_end/panels/elements/LayersWidget.ts +4 -4
  54. package/front_end/panels/elements/LayoutPane.ts +11 -11
  55. package/front_end/panels/elements/MarkerDecorator.ts +3 -3
  56. package/front_end/panels/elements/PlatformFontsWidget.ts +8 -8
  57. package/front_end/panels/elements/PropertiesWidget.ts +4 -4
  58. package/front_end/panels/elements/PropertyRenderer.ts +2 -2
  59. package/front_end/panels/elements/ShortcutTreeElement.ts +1 -1
  60. package/front_end/panels/elements/StylePropertiesSection.ts +14 -14
  61. package/front_end/panels/elements/StylePropertyTreeElement.ts +21 -21
  62. package/front_end/panels/elements/StylesSidebarPane.ts +14 -14
  63. package/front_end/panels/elements/components/AccessibilityTreeNode.ts +1 -1
  64. package/front_end/panels/elements/components/CSSHintDetailsView.ts +1 -1
  65. package/front_end/panels/elements/components/CSSVariableValueView.ts +3 -3
  66. package/front_end/panels/elements/components/ElementsBreadcrumbsUtils.ts +2 -2
  67. package/front_end/panels/elements/components/ElementsTreeExpandButton.ts +1 -1
  68. package/front_end/panels/elements/elements-meta.ts +13 -13
  69. package/front_end/panels/elements/elements.ts +3 -0
  70. package/front_end/panels/issues/AffectedCookiesView.ts +2 -0
  71. package/front_end/panels/issues/AffectedElementsView.ts +5 -0
  72. package/front_end/panels/issues/CorsIssueDetailsView.ts +13 -9
  73. package/front_end/panels/issues/IssueView.ts +7 -2
  74. package/front_end/panels/layer_viewer/LayerDetailsView.ts +11 -7
  75. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +2 -0
  76. package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +3 -1
  77. package/front_end/panels/network/NetworkConfigView.ts +2 -1
  78. package/front_end/panels/network/NetworkLogView.ts +5 -2
  79. package/front_end/panels/network/NetworkOverview.ts +11 -5
  80. package/front_end/panels/network/NetworkPanel.ts +3 -2
  81. package/front_end/panels/network/NetworkWaterfallColumn.ts +16 -3
  82. package/front_end/panels/network/RequestHeadersView.ts +4 -4
  83. package/front_end/panels/network/components/ResponseHeaderSection.ts +6 -2
  84. package/front_end/panels/network/network-meta.ts +117 -0
  85. package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +2 -1
  86. package/front_end/panels/profiler/ProfileLauncherView.ts +19 -16
  87. package/front_end/panels/profiler/ProfileSidebarTreeElement.ts +1 -1
  88. package/front_end/panels/security/security.ts +6 -0
  89. package/front_end/panels/settings/components/SyncSection.ts +1 -1
  90. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +0 -3
  91. package/front_end/panels/sources/NavigatorView.ts +6 -2
  92. package/front_end/panels/sources/SourcesNavigator.ts +8 -4
  93. package/front_end/panels/sources/SourcesPanel.ts +4 -2
  94. package/front_end/panels/sources/SourcesSearchScope.ts +3 -1
  95. package/front_end/panels/sources/SourcesView.ts +8 -107
  96. package/front_end/panels/sources/TabbedEditorContainer.ts +110 -7
  97. package/front_end/panels/sources/UISourceCodeFrame.ts +2 -2
  98. package/front_end/panels/sources/sources-meta.ts +16 -0
  99. package/front_end/panels/timeline/TimelineLoader.ts +1 -1
  100. package/front_end/panels/timeline/TimelineUIUtils.ts +6 -0
  101. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +4 -3
  102. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -1
  103. package/front_end/panels/timeline/components/MetricCard.ts +4 -3
  104. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +5 -2
  105. package/front_end/panels/timeline/components/TimelineRangeSummaryView.ts +1 -1
  106. package/front_end/panels/timeline/components/TimelineSummary.ts +8 -5
  107. package/front_end/panels/web_audio/WebAudioView.ts +8 -0
  108. package/front_end/third_party/chromium/README.chromium +1 -1
  109. package/front_end/third_party/web-vitals/rebuild.sh +1 -1
  110. package/front_end/ui/legacy/TabbedPane.ts +34 -2
  111. package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +11 -11
  112. package/front_end/ui/legacy/components/color_picker/FormatPickerContextMenu.ts +1 -1
  113. package/front_end/ui/legacy/components/color_picker/Spectrum.ts +19 -20
  114. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +2 -2
  115. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +164 -325
  116. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +5 -5
  117. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +7 -7
  118. package/front_end/ui/legacy/components/quick_open/QuickOpen.ts +1 -1
  119. package/front_end/ui/legacy/components/quick_open/quick_open-meta.ts +2 -2
  120. package/front_end/ui/visual_logging/KnownContextValues.ts +40 -0
  121. package/mcp/mcp.ts +0 -3
  122. package/package.json +1 -1
  123. package/front_end/core/sdk/sdk-meta.ts +0 -178
  124. package/front_end/models/badges/badges-meta.ts +0 -27
  125. package/front_end/models/persistence/persistence-meta.ts +0 -69
package/AUTHORS CHANGED
@@ -24,6 +24,7 @@ Anna Agoha <annaagoha@gmail.com>
24
24
  Anthony Xie <anthonyxie64@gmail.com>
25
25
  Axel Chong <haxatron1@gmail.com>
26
26
  Anton Bershanskyi <bershanskyi@gmail.com>
27
+ Ashish Shrees <flowoker1@gmail.com>
27
28
  Aviv Keller <me@aviv.sh>
28
29
  Biboswan Roy <biboswan98@gmail.com>
29
30
  Boris Verkhovskiy <boris.verk@gmail.com>
@@ -17,15 +17,6 @@ export function assertNever(_type: never, message: string): never {
17
17
  throw new Error(message);
18
18
  }
19
19
 
20
- /**
21
- * This is useful to check on the type-level that the unhandled cases of
22
- * a switch are exactly `T` (where T is usually a union type of enum values).
23
- * @param caseVariable
24
- */
25
- export function assertUnhandled<T>(_caseVariable: T): T {
26
- return _caseVariable;
27
- }
28
-
29
20
  export type FieldsThatExtend<Type, Selector> = {
30
21
  [Key in keyof Type]: Type[Key] extends Selector ? Key : never;
31
22
  }[keyof Type];
@@ -24,7 +24,7 @@ import * as UserVisibleError from './UserVisibleError.js';
24
24
  * `Platform.TypeScriptUtilities.assertNotNullOrUndefined` causes a compile
25
25
  * error).
26
26
  */
27
- export {assertNever, assertNotNullOrUndefined, assertUnhandled} from './TypescriptUtilities.js';
27
+ export {assertNever, assertNotNullOrUndefined} from './TypescriptUtilities.js';
28
28
  export {
29
29
  ArrayUtilities,
30
30
  Brand,
@@ -34,7 +34,7 @@ import {
34
34
  RuntimeModel,
35
35
  } from './RuntimeModel.js';
36
36
  import {SDKModel} from './SDKModel.js';
37
- import {preserveConsoleLogSettingDescriptor} from './SDKSettings.js';
37
+ import {consoleUserActivationEvalSettingDescriptor, preserveConsoleLogSettingDescriptor} from './SDKSettings.js';
38
38
  import {Capability, type Target, Type} from './Target.js';
39
39
  import type {TargetManager} from './TargetManager.js';
40
40
 
@@ -156,13 +156,16 @@ export class ConsoleModel extends SDKModel<EventTypes> {
156
156
  replMode: true,
157
157
  allowUnsafeEvalBlockedByCSP: false,
158
158
  },
159
- this.target().targetManager().settings.moduleSetting('console-user-activation-eval').get(),
159
+ this.target().targetManager().settings.resolve(consoleUserActivationEvalSettingDescriptor).get(),
160
160
  /* awaitPromise */ false);
161
161
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.ConsoleEvaluated);
162
162
  if ('error' in result) {
163
163
  return;
164
164
  }
165
- await this.#console.showPromise();
165
+ try {
166
+ await this.#console.showPromise();
167
+ } catch {
168
+ }
166
169
  this.dispatchEventToListeners(
167
170
  Events.CommandEvaluated,
168
171
  {result: result.object, commandMessage: originatingMessage, exceptionDetails: result.exceptionDetails});
@@ -40,6 +40,7 @@ import * as Common from '../common/common.js';
40
40
  import * as Platform from '../platform/platform.js';
41
41
  import * as Root from '../root/root.js';
42
42
 
43
+ import {ConsoleModel} from './ConsoleModel.js';
43
44
  import {CSSModel} from './CSSModel.js';
44
45
  import type {FrameManager} from './FrameManager.js';
45
46
  import {OverlayModel} from './OverlayModel.js';
@@ -1066,6 +1067,102 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
1066
1067
  });
1067
1068
  }
1068
1069
 
1070
+ duplicate(): void {
1071
+ if (this.isInShadowTree()) {
1072
+ return;
1073
+ }
1074
+
1075
+ const parentNode = this.parentNode ? this.parentNode : this;
1076
+ if (parentNode.nodeName() === '#document') {
1077
+ return;
1078
+ }
1079
+
1080
+ this.copyTo(parentNode, this.nextSibling);
1081
+ }
1082
+
1083
+ /**
1084
+ * Runs a script on the node's remote object that toggles a class name on
1085
+ * the node and injects a stylesheet into the head of the node's document
1086
+ * containing a rule to set "visibility: hidden" on the class and all it's
1087
+ * ancestors.
1088
+ */
1089
+ async toggleHideElement(): Promise<void> {
1090
+ let pseudoElementName = this.pseudoType() ? this.nodeName() : null;
1091
+ if (pseudoElementName && this.pseudoIdentifier()) {
1092
+ pseudoElementName += `(${this.pseudoIdentifier()})`;
1093
+ }
1094
+
1095
+ let effectiveNode: DOMNode|null = this;
1096
+ while (effectiveNode?.pseudoType()) {
1097
+ if (effectiveNode !== this && effectiveNode.pseudoType() === 'column') {
1098
+ // Ideally we would select the specific column pseudo element, but
1099
+ // we don't have a way to do that at the moment.
1100
+ pseudoElementName = '::column' + pseudoElementName;
1101
+ }
1102
+ effectiveNode = effectiveNode.parentNode;
1103
+ }
1104
+ if (!effectiveNode) {
1105
+ return;
1106
+ }
1107
+
1108
+ const hidden = this.marker('hidden-marker');
1109
+ const object = await effectiveNode.resolveToObject('');
1110
+
1111
+ if (!object) {
1112
+ return;
1113
+ }
1114
+
1115
+ await object.callFunction((toggleClassAndInjectStyleRule as (this: Object, ...arg1: unknown[]) => void),
1116
+ [{value: pseudoElementName}, {value: !hidden}]);
1117
+ object.release();
1118
+ this.setMarker('hidden-marker', hidden ? null : true);
1119
+
1120
+ function toggleClassAndInjectStyleRule(this: Element, pseudoElementName: string|null, hidden: boolean): void {
1121
+ const classNamePrefix = '__web-inspector-hide';
1122
+ const classNameSuffix = '-shortcut__';
1123
+ const styleTagId = '__web-inspector-hide-shortcut-style__';
1124
+ const pseudoElementNameEscaped = pseudoElementName ? pseudoElementName.replace(/[\(\)\:]/g, '_') : '';
1125
+ const className = classNamePrefix + pseudoElementNameEscaped + classNameSuffix;
1126
+ this.classList.toggle(className, hidden);
1127
+
1128
+ let localRoot: Element|HTMLHeadElement = this;
1129
+ while (localRoot.parentNode) {
1130
+ localRoot = (localRoot.parentNode as Element);
1131
+ }
1132
+ if (localRoot.nodeType === Node.DOCUMENT_NODE) {
1133
+ localRoot = document.head;
1134
+ }
1135
+
1136
+ let style = localRoot.querySelector('style#' + styleTagId);
1137
+ if (!style) {
1138
+ const selectors = [];
1139
+ selectors.push('.__web-inspector-hide-shortcut__');
1140
+ selectors.push('.__web-inspector-hide-shortcut__ *');
1141
+ const selector = selectors.join(', ');
1142
+ const ruleBody = ' visibility: hidden !important;';
1143
+ const rule = '\n' + selector + '\n{\n' + ruleBody + '\n}\n';
1144
+
1145
+ style = document.createElement('style');
1146
+ style.id = styleTagId;
1147
+ style.textContent = rule;
1148
+
1149
+ localRoot.appendChild(style);
1150
+ }
1151
+
1152
+ // In addition to putting them on the element we want to hide, we will
1153
+ // also add pseudo element classes to the style element to keep track of
1154
+ // which pseudo elements we have style rules for.
1155
+ if (pseudoElementName && !style.classList.contains(className)) {
1156
+ style.classList.add(className);
1157
+ style.textContent = `.${className}${pseudoElementName}, ${style.textContent}`;
1158
+ }
1159
+ }
1160
+ }
1161
+
1162
+ isToggledToHidden(): boolean {
1163
+ return Boolean(this.marker('hidden-marker'));
1164
+ }
1165
+
1069
1166
  isXMLNode(): boolean {
1070
1167
  return Boolean(this.#xmlVersion);
1071
1168
  }
@@ -1238,6 +1335,13 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
1238
1335
  };
1239
1336
  }
1240
1337
 
1338
+ async saveNodeToTempVariable(): Promise<void> {
1339
+ const remoteObjectForConsole = await this.resolveToObject();
1340
+ const consoleModel = this.#domModel.target().model(ConsoleModel);
1341
+ await consoleModel?.saveToTempVariable(remoteObjectForConsole?.runtimeModel().defaultExecutionContext() ?? null,
1342
+ remoteObjectForConsole);
1343
+ }
1344
+
1241
1345
  async scrollIntoView(): Promise<void> {
1242
1346
  const node = this.enclosingElementOrSelf();
1243
1347
  if (!node) {
@@ -2425,6 +2529,9 @@ export class DOMNodeSnapshot extends DOMNode {
2425
2529
  _callback?: ((arg0: string|null, arg1: DOMNode|null) => void)|undefined): void {
2426
2530
  }
2427
2531
 
2532
+ override duplicate(): void {
2533
+ }
2534
+
2428
2535
  override canInspectNode(): boolean {
2429
2536
  return false;
2430
2537
  }
@@ -2474,6 +2581,9 @@ export class DOMDocumentSnapshot extends DOMDocument {
2474
2581
  _callback?: ((arg0: string|null, arg1: DOMNode|null) => void)|undefined): void {
2475
2582
  }
2476
2583
 
2584
+ override duplicate(): void {
2585
+ }
2586
+
2477
2587
  override canInspectNode(): boolean {
2478
2588
  return false;
2479
2589
  }
@@ -12,6 +12,7 @@ import {SDKModel} from './SDKModel.js';
12
12
  import {
13
13
  avifFormatDisabledSettingDescriptor,
14
14
  cpuPressureSettingDescriptor,
15
+ emulateAutoDarkModeSettingDescriptor,
15
16
  emulatedCSSMediaFeatureColorGamutSettingDescriptor,
16
17
  emulatedCSSMediaFeatureForcedColorsSettingDescriptor,
17
18
  emulatedCSSMediaFeaturePrefersColorSchemeSettingDescriptor,
@@ -27,6 +28,7 @@ import {
27
28
  jpegXlFormatDisabledSettingDescriptor,
28
29
  localFontsDisabledSettingDescriptor,
29
30
  touchSettingDescriptor,
31
+ webpFormatDisabledSettingDescriptor,
30
32
  } from './SDKSettings.js';
31
33
  import {Capability, type Target} from './Target.js';
32
34
 
@@ -180,7 +182,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
180
182
  });
181
183
  void this.updateCssMedia();
182
184
 
183
- const autoDarkModeSetting = settings.moduleSetting('emulate-auto-dark-mode');
185
+ const autoDarkModeSetting = settings.resolve(emulateAutoDarkModeSettingDescriptor);
184
186
  autoDarkModeSetting.addChangeListener(() => {
185
187
  const enabled = autoDarkModeSetting.get();
186
188
  mediaFeaturePrefersColorSchemeSetting.set(enabled ? 'dark' : '');
@@ -213,7 +215,7 @@ export class EmulationModel extends SDKModel<EmulationModelEventTypes> implement
213
215
 
214
216
  const avifFormatDisabledSetting = settings.resolve(avifFormatDisabledSettingDescriptor);
215
217
  const jpegXlFormatDisabledSetting = settings.resolve(jpegXlFormatDisabledSettingDescriptor);
216
- const webpFormatDisabledSetting = settings.moduleSetting('webp-format-disabled');
218
+ const webpFormatDisabledSetting = settings.resolve(webpFormatDisabledSettingDescriptor);
217
219
 
218
220
  const updateDisabledImageFormats = (): void => {
219
221
  const types = [];
@@ -26,6 +26,12 @@ import {
26
26
  } from './NetworkRequest.js';
27
27
  import {type ExecutionContext, RuntimeModel} from './RuntimeModel.js';
28
28
  import {SDKModel} from './SDKModel.js';
29
+ import {
30
+ cacheDisabledSettingDescriptor,
31
+ monitoringXHREnabledSettingDescriptor,
32
+ preserveNetworkLogSettingDescriptor,
33
+ requestBlockingEnabledSettingDescriptor,
34
+ } from './SDKSettings.js';
29
35
  import {Capability, type Target} from './Target.js';
30
36
  import {type SDKModelObserver, TargetManager} from './TargetManager.js';
31
37
 
@@ -187,7 +193,7 @@ export class NetworkManager extends SDKModel<EventTypes> {
187
193
  const settings = this.target().targetManager().settings;
188
194
  this.activeNetworkThrottlingKey = activeNetworkThrottlingKeySetting(settings);
189
195
 
190
- if (settings.moduleSetting('cache-disabled').get()) {
196
+ if (settings.resolve(cacheDisabledSettingDescriptor).get()) {
191
197
  void this.#networkAgent.invoke_setCacheDisabled({cacheDisabled: true});
192
198
  }
193
199
 
@@ -198,7 +204,7 @@ export class NetworkManager extends SDKModel<EventTypes> {
198
204
  });
199
205
 
200
206
  if (Root.Runtime.hostConfig.devToolsEnableDurableMessages?.enabled) {
201
- const preserveLogSetting = settings.moduleSetting('network-log.preserve-log');
207
+ const preserveLogSetting = settings.resolve(preserveNetworkLogSettingDescriptor);
202
208
  this.#updateDurableMessages(preserveLogSetting.get());
203
209
  preserveLogSetting.addChangeListener(this.preserveLogChanged, this);
204
210
  }
@@ -211,7 +217,7 @@ export class NetworkManager extends SDKModel<EventTypes> {
211
217
  }
212
218
  this.#bypassServiceWorkerSetting.addChangeListener(this.bypassServiceWorkerChanged, this);
213
219
 
214
- settings.moduleSetting('cache-disabled').addChangeListener(this.cacheDisabledSettingChanged, this);
220
+ settings.resolve(cacheDisabledSettingDescriptor).addChangeListener(this.cacheDisabledSettingChanged, this);
215
221
  }
216
222
 
217
223
  static forRequest(request: NetworkRequest): NetworkManager|null {
@@ -555,8 +561,8 @@ export class NetworkManager extends SDKModel<EventTypes> {
555
561
 
556
562
  override dispose(): void {
557
563
  const settings = this.target().targetManager().settings;
558
- settings.moduleSetting('cache-disabled').removeChangeListener(this.cacheDisabledSettingChanged, this);
559
- settings.moduleSetting('network-log.preserve-log').removeChangeListener(this.preserveLogChanged, this);
564
+ settings.resolve(cacheDisabledSettingDescriptor).removeChangeListener(this.cacheDisabledSettingChanged, this);
565
+ settings.resolve(preserveNetworkLogSettingDescriptor).removeChangeListener(this.preserveLogChanged, this);
560
566
  }
561
567
 
562
568
  private bypassServiceWorkerChanged(): void {
@@ -1404,7 +1410,7 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
1404
1410
  this.#multitargetNetworkManager.inflightMainResourceRequests.delete(networkRequest.requestId());
1405
1411
 
1406
1412
  const settings = this.#manager.target().targetManager().settings;
1407
- if (settings.moduleSetting('monitoring-xhr-enabled').get() &&
1413
+ if (settings.resolve(monitoringXHREnabledSettingDescriptor).get() &&
1408
1414
  networkRequest.resourceType().category() === Common.ResourceType.resourceCategories.XHR) {
1409
1415
  let message;
1410
1416
  const failedToLoad = networkRequest.failed || networkRequest.hasErrorStatusCode();
@@ -1992,7 +1998,7 @@ export class RequestConditions extends Common.ObjectWrapper.ObjectWrapper<Reques
1992
1998
  constructor(settings: Common.Settings.Settings) {
1993
1999
  super();
1994
2000
  this.#setting = settings.createSetting<RequestConditionsSetting[]>('network-blocked-patterns', []);
1995
- this.#conditionsEnabledSetting = settings.moduleSetting<boolean>('request-blocking-enabled');
2001
+ this.#conditionsEnabledSetting = settings.resolve(requestBlockingEnabledSettingDescriptor);
1996
2002
  for (const condition of this.#setting.get()) {
1997
2003
  try {
1998
2004
  this.#conditions.push(RequestCondition.createFromSetting(condition, settings));
@@ -2433,8 +2439,8 @@ export class MultitargetNetworkManager extends Common.ObjectWrapper.ObjectWrappe
2433
2439
 
2434
2440
  private async updateInterceptionPatterns(): Promise<void> {
2435
2441
  const settings = this.#targetManager.settings;
2436
- if (!settings.moduleSetting('cache-disabled').get()) {
2437
- settings.moduleSetting('cache-disabled').set(true);
2442
+ if (!settings.resolve(cacheDisabledSettingDescriptor).get()) {
2443
+ settings.resolve(cacheDisabledSettingDescriptor).set(true);
2438
2444
  }
2439
2445
  this.#updatingInterceptionPatternsPromise = null;
2440
2446
  const promises = ([] as Array<Promise<unknown>>);
@@ -16,6 +16,7 @@ import type {RemoteObject} from './RemoteObject.js';
16
16
  import {SDKModel} from './SDKModel.js';
17
17
  import {
18
18
  apcaSettingDescriptor,
19
+ disablePausedStateOverlaySettingDescriptor,
19
20
  showAdHighlightsSettingDescriptor,
20
21
  showDebugBordersSettingDescriptor,
21
22
  showFPSCounterSettingDescriptor,
@@ -122,7 +123,7 @@ export class OverlayModel extends SDKModel<EventTypes> implements ProtocolProxyA
122
123
  const settings = this.target().targetManager().settings;
123
124
  this.#debuggerModel = target.model(DebuggerModel);
124
125
  if (this.#debuggerModel) {
125
- settings.moduleSetting('disable-paused-state-overlay')
126
+ settings.resolve(disablePausedStateOverlaySettingDescriptor)
126
127
  .addChangeListener(this.updatePausedInDebuggerMessage, this);
127
128
  this.#debuggerModel.addEventListener(
128
129
  DebuggerModelEvents.DebuggerPaused, this.updatePausedInDebuggerMessage, this);
@@ -313,7 +314,7 @@ export class OverlayModel extends SDKModel<EventTypes> implements ProtocolProxyA
313
314
  }
314
315
  const settings = this.target().targetManager().settings;
315
316
  const message = this.#debuggerModel && this.#debuggerModel.isPaused() &&
316
- !settings.moduleSetting('disable-paused-state-overlay').get() ?
317
+ !settings.resolve(disablePausedStateOverlaySettingDescriptor).get() ?
317
318
  i18nString(UIStrings.pausedInDebugger) :
318
319
  undefined;
319
320
  void this.overlayAgent.invoke_setPausedInDebuggerMessage({message});
@@ -17,6 +17,7 @@ import {
17
17
  type ResourceTreeFrame,
18
18
  ResourceTreeModel,
19
19
  } from './ResourceTreeModel.js';
20
+ import {cacheDisabledSettingDescriptor, enableRemoteFileLoadingSettingDescriptor} from './SDKSettings.js';
20
21
  import type {Target} from './Target.js';
21
22
  import {TargetManager} from './TargetManager.js';
22
23
 
@@ -433,7 +434,7 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<Event
433
434
  }> {
434
435
  const networkManager = (target.model(NetworkManager) as NetworkManager);
435
436
  const ioModel = (target.model(IOModel) as IOModel);
436
- const disableCache = this.#settings.moduleSetting('cache-disabled').get();
437
+ const disableCache = this.#settings.resolve(cacheDisabledSettingDescriptor).get();
437
438
  const resource = await networkManager.loadNetworkResource(frameId, url, {disableCache, includeCredentials: true});
438
439
  try {
439
440
  const content = resource.stream ?
@@ -470,11 +471,11 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<Event
470
471
  headers['User-Agent'] = currentUserAgent;
471
472
  }
472
473
 
473
- if (this.#settings.moduleSetting('cache-disabled').get()) {
474
+ if (this.#settings.resolve(cacheDisabledSettingDescriptor).get()) {
474
475
  headers['Cache-Control'] = 'no-cache';
475
476
  }
476
477
 
477
- const allowRemoteFilePaths = this.#settings.moduleSetting('network.enable-remote-file-loading').get();
478
+ const allowRemoteFilePaths = this.#settings.resolve(enableRemoteFileLoadingSettingDescriptor).get();
478
479
 
479
480
  return await new Promise(
480
481
  resolve => Host.ResourceLoader.load(url, headers, (success, _responseHeaders, content, errorDescription) => {
@@ -19,6 +19,7 @@ import {
19
19
  ScopeRemoteObject,
20
20
  } from './RemoteObject.js';
21
21
  import {SDKModel} from './SDKModel.js';
22
+ import {customFormattersSettingDescriptor} from './SDKSettings.js';
22
23
  import {Capability, type Target, Type} from './Target.js';
23
24
 
24
25
  export class RuntimeModel extends SDKModel<EventTypes> {
@@ -32,12 +33,13 @@ export class RuntimeModel extends SDKModel<EventTypes> {
32
33
  this.target().registerRuntimeDispatcher(new RuntimeDispatcher(this));
33
34
  void this.agent.invoke_enable();
34
35
 
35
- const settings = this.target().targetManager().context.get(Common.Settings.Settings);
36
- if (settings.moduleSetting('custom-formatters').get()) {
36
+ const customFormattersSetting =
37
+ this.target().targetManager().context.get(Common.Settings.Settings).resolve(customFormattersSettingDescriptor);
38
+ if (customFormattersSetting.get()) {
37
39
  void this.agent.invoke_setCustomObjectFormatterEnabled({enabled: true});
38
40
  }
39
41
 
40
- settings.moduleSetting('custom-formatters').addChangeListener(this.customFormattersStateChanged.bind(this));
42
+ customFormattersSetting.addChangeListener(this.customFormattersStateChanged.bind(this));
41
43
  }
42
44
 
43
45
  static isSideEffectFailure(response: Protocol.Runtime.EvaluateResponse|EvaluationResult): boolean {
@@ -265,3 +265,69 @@ export const jpegXlFormatDisabledSettingDescriptor: Common.Settings.SettingDescr
265
265
  defaultValue: false,
266
266
  storageType: Common.Settings.SettingStorageType.SESSION,
267
267
  };
268
+
269
+ export const webpFormatDisabledSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
270
+ name: 'webp-format-disabled',
271
+ type: Common.Settings.SettingType.BOOLEAN,
272
+ defaultValue: false,
273
+ storageType: Common.Settings.SettingStorageType.SESSION,
274
+ };
275
+
276
+ export const customFormattersSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
277
+ name: 'custom-formatters',
278
+ type: Common.Settings.SettingType.BOOLEAN,
279
+ defaultValue: false,
280
+ };
281
+
282
+ export const requestBlockingEnabledSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
283
+ name: 'request-blocking-enabled',
284
+ type: Common.Settings.SettingType.BOOLEAN,
285
+ defaultValue: false,
286
+ storageType: Common.Settings.SettingStorageType.LOCAL,
287
+ };
288
+
289
+ export const cacheDisabledSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
290
+ name: 'cache-disabled',
291
+ type: Common.Settings.SettingType.BOOLEAN,
292
+ defaultValue: false,
293
+ };
294
+
295
+ export const emulateAutoDarkModeSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
296
+ name: 'emulate-auto-dark-mode',
297
+ type: Common.Settings.SettingType.BOOLEAN,
298
+ defaultValue: false,
299
+ storageType: Common.Settings.SettingStorageType.SESSION,
300
+ };
301
+
302
+ export const enableRemoteFileLoadingSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
303
+ name: 'network.enable-remote-file-loading',
304
+ type: Common.Settings.SettingType.BOOLEAN,
305
+ defaultValue: false,
306
+ storageType: Common.Settings.SettingStorageType.SYNCED,
307
+ };
308
+
309
+ export const consoleUserActivationEvalSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
310
+ name: 'console-user-activation-eval',
311
+ type: Common.Settings.SettingType.BOOLEAN,
312
+ defaultValue: true,
313
+ storageType: Common.Settings.SettingStorageType.SYNCED,
314
+ };
315
+ export const monitoringXHREnabledSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
316
+ name: 'monitoring-xhr-enabled',
317
+ type: Common.Settings.SettingType.BOOLEAN,
318
+ defaultValue: false,
319
+ storageType: Common.Settings.SettingStorageType.SYNCED,
320
+ };
321
+
322
+ export const disablePausedStateOverlaySettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
323
+ name: 'disable-paused-state-overlay',
324
+ type: Common.Settings.SettingType.BOOLEAN,
325
+ defaultValue: false,
326
+ storageType: Common.Settings.SettingStorageType.SYNCED,
327
+ };
328
+
329
+ export const preserveNetworkLogSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
330
+ name: 'network-log.preserve-log',
331
+ type: Common.Settings.SettingType.BOOLEAN,
332
+ defaultValue: false,
333
+ };
@@ -230,7 +230,8 @@ export class RenderingOptionsView extends UI.Widget.VBox {
230
230
  this.#appendCheckbox(i18nString(UIStrings.emulateAFocusedPage), i18nString(UIStrings.emulatesAFocusedPage),
231
231
  Common.Settings.Settings.instance().resolve(SDK.SDKSettings.emulatePageFocusSettingDescriptor),
232
232
  {toggle: Host.UserMetrics.Action.ToggleEmulateFocusedPageFromRenderingTab});
233
- const autoDarkModeSetting = Common.Settings.Settings.instance().moduleSetting('emulate-auto-dark-mode');
233
+ const autoDarkModeSetting =
234
+ Common.Settings.Settings.instance().resolve(SDK.SDKSettings.emulateAutoDarkModeSettingDescriptor);
234
235
  this.#appendCheckbox(i18nString(UIStrings.emulateAutoDarkMode), i18nString(UIStrings.emulatesAutoDarkMode),
235
236
  autoDarkModeSetting);
236
237
 
@@ -284,7 +285,8 @@ export class RenderingOptionsView extends UI.Widget.VBox {
284
285
  Common.Settings.Settings.instance().resolve(SDK.SDKSettings.avifFormatDisabledSettingDescriptor);
285
286
  const jpegXlFormatDisabledSetting =
286
287
  Common.Settings.Settings.instance().resolve(SDK.SDKSettings.jpegXlFormatDisabledSettingDescriptor);
287
- const webpFormatDisabledSetting = Common.Settings.Settings.instance().moduleSetting('webp-format-disabled');
288
+ const webpFormatDisabledSetting =
289
+ Common.Settings.Settings.instance().resolve(SDK.SDKSettings.webpFormatDisabledSettingDescriptor);
288
290
 
289
291
  this.#appendCheckbox(
290
292
  i18nString(UIStrings.disableAvifImageFormat), i18nString(UIStrings.requiresAPageReloadToApplyAnd),
@@ -11,6 +11,11 @@ import * as SettingsUI from '../../ui/settings/settings.js';
11
11
  import type * as InspectorMain from './inspector_main.js';
12
12
 
13
13
  const UIStrings = {
14
+ /**
15
+ * @description The name of a checkbox setting in the Rendering tool. This setting
16
+ * emulates that the webpage is in auto dark mode.
17
+ */
18
+ emulateAutoDarkMode: 'Emulate auto dark mode',
14
19
  /**
15
20
  * @description Title of an option under the Rendering category that can be invoked through the Command Menu.
16
21
  */
@@ -296,6 +301,14 @@ const UIStrings = {
296
301
  * @description Title of a setting that enables JPEG XL format.
297
302
  */
298
303
  enableJpegXlFormat: 'Enable `JPEG XL` format',
304
+ /**
305
+ * @description Title of a setting that disables WebP format.
306
+ */
307
+ disableWebpFormat: 'Disable `WebP` format',
308
+ /**
309
+ * @description Title of a setting that enables WebP format.
310
+ */
311
+ enableWebpFormat: 'Enable `WebP` format',
299
312
  /**
300
313
  * @description Title of an action that reloads the inspected page.
301
314
  */
@@ -938,3 +951,22 @@ SettingsUI.SettingUIRegistration.register(SDK.SDKSettings.jpegXlFormatDisabledSe
938
951
  },
939
952
  ],
940
953
  });
954
+
955
+ SettingsUI.SettingUIRegistration.register(SDK.SDKSettings.webpFormatDisabledSettingDescriptor, {
956
+ category: Common.Settings.SettingCategory.RENDERING,
957
+ options: [
958
+ {
959
+ value: true,
960
+ title: i18nLazyString(UIStrings.disableWebpFormat),
961
+ },
962
+ {
963
+ value: false,
964
+ title: i18nLazyString(UIStrings.enableWebpFormat),
965
+ },
966
+ ],
967
+ });
968
+
969
+ SettingsUI.SettingUIRegistration.register(SDK.SDKSettings.emulateAutoDarkModeSettingDescriptor, {
970
+ category: Common.Settings.SettingCategory.RENDERING,
971
+ title: i18nLazyString(UIStrings.emulateAutoDarkMode),
972
+ });
@@ -216,7 +216,7 @@ export class MainImpl {
216
216
 
217
217
  // Mark 'cache-disabled' as requiring user interaction when multiple CDP clients are attached.
218
218
  if (Root.Runtime.Runtime.queryParam('hasOtherClients')) {
219
- this.#universe.settings.moduleSetting('cache-disabled').setRequiresUserAction(true);
219
+ this.#universe.settings.resolve(SDK.SDKSettings.cacheDisabledSettingDescriptor).setRequiresUserAction(true);
220
220
  }
221
221
 
222
222
  Root.Runtime.experiments.removeAllExperimentsFromLocalStorage();
@@ -8,14 +8,62 @@ import * as i18n from '../../core/i18n/i18n.js';
8
8
  import type * as Platform from '../../core/platform/platform.js';
9
9
  import * as Root from '../../core/root/root.js';
10
10
  import * as SDK from '../../core/sdk/sdk.js';
11
+ import * as Badges from '../../models/badges/badges.js';
12
+ import * as Persistence from '../../models/persistence/persistence.js';
11
13
  import * as Workspace from '../../models/workspace/workspace.js';
12
14
  import * as Components from '../../ui/legacy/components/utils/utils.js';
13
15
  import * as UI from '../../ui/legacy/legacy.js';
16
+ import * as SettingsUI from '../../ui/settings/settings.js';
14
17
  import type * as InspectorMain from '../inspector_main/inspector_main.js';
15
18
 
16
19
  import type * as Main from './main.js';
17
20
 
18
21
  const UIStrings = {
22
+ /**
23
+ * @description Title of a setting under the Persistence category in Settings.
24
+ */
25
+ localOverrides: 'Local overrides',
26
+ /**
27
+ * @description A tag of enable local overrides setting that can be searched in the command menu.
28
+ */
29
+ interception: 'interception',
30
+ /**
31
+ * @description A tag of enable local overrides setting that can be searched in the command menu.
32
+ */
33
+ override: 'override',
34
+ /**
35
+ * @description A tag of group network by frame setting that can be searched in the command menu.
36
+ */
37
+ network: 'network',
38
+ /**
39
+ * @description A tag of enable local overrides setting that can be searched in the command menu.
40
+ */
41
+ rewrite: 'rewrite',
42
+ /**
43
+ * @description A tag of enable local overrides setting that can be searched in the command menu.
44
+ * Noun for network request.
45
+ */
46
+ request: 'request',
47
+ /**
48
+ * @description Title of an option under the Persistence category that can be invoked through the command menu.
49
+ */
50
+ enableOverrideNetworkRequests: 'Enable override network requests',
51
+ /**
52
+ * @description Title of an option under the Persistence category that can be invoked through the command menu.
53
+ */
54
+ disableOverrideNetworkRequests: 'Disable override network requests',
55
+ /**
56
+ * @description Label for a checkbox in the settings UI. Allows developers to opt-in/opt-out
57
+ * of receiving Google Developer Program (GDP) badges based on their activity in Chrome DevTools.
58
+ */
59
+ earnBadges: 'Earn badges',
60
+ /**
61
+ * @description Title of a setting under the Appearance category in Settings. When the webpage is
62
+ * paused by devtools, an overlay is shown on top of the page to indicate that it is paused. The
63
+ * overlay is a pause/unpause button and some text, which appears on top of the paused page. This
64
+ * setting turns off this overlay.
65
+ */
66
+ disablePaused: 'Disable paused state overlay',
19
67
  /**
20
68
  * @description Action title to focus the page being debugged.
21
69
  */
@@ -719,6 +767,11 @@ Common.Settings.registerSettingExtension({
719
767
  defaultValue: false,
720
768
  });
721
769
 
770
+ SettingsUI.SettingUIRegistration.register(SDK.SDKSettings.disablePausedStateOverlaySettingDescriptor, {
771
+ category: Common.Settings.SettingCategory.APPEARANCE,
772
+ title: i18nLazyString(UIStrings.disablePaused),
773
+ });
774
+
722
775
  Common.Settings.registerSettingExtension({
723
776
  category: Common.Settings.SettingCategory.GLOBAL,
724
777
  settingName: 'currentDockState',
@@ -790,6 +843,35 @@ Common.Settings.registerSettingExtension({
790
843
  reloadRequired: true,
791
844
  });
792
845
 
846
+ SettingsUI.SettingUIRegistration.register(Badges.receiveGdpBadgesSettingDescriptor, {
847
+ category: Common.Settings.SettingCategory.ACCOUNT,
848
+ title: i18nLazyString(UIStrings.earnBadges),
849
+ reloadRequired: true,
850
+ });
851
+
852
+ SettingsUI.SettingUIRegistration.register(
853
+ Persistence.NetworkPersistenceManager.persistenceNetworkOverridesEnabledSettingDescriptor, {
854
+ category: Common.Settings.SettingCategory.PERSISTENCE,
855
+ title: i18nLazyString(UIStrings.localOverrides),
856
+ tags: [
857
+ i18nLazyString(UIStrings.interception),
858
+ i18nLazyString(UIStrings.override),
859
+ i18nLazyString(UIStrings.network),
860
+ i18nLazyString(UIStrings.rewrite),
861
+ i18nLazyString(UIStrings.request),
862
+ ],
863
+ options: [
864
+ {
865
+ value: true,
866
+ title: i18nLazyString(UIStrings.enableOverrideNetworkRequests),
867
+ },
868
+ {
869
+ value: false,
870
+ title: i18nLazyString(UIStrings.disableOverrideNetworkRequests),
871
+ },
872
+ ],
873
+ });
874
+
793
875
  Common.Settings.registerSettingExtension({
794
876
  storageType: Common.Settings.SettingStorageType.SYNCED,
795
877
  settingName: 'user-shortcuts',