@mcp-b/chrome-devtools-mcp 1.7.0 → 1.7.2

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 (146) hide show
  1. package/README.md +120 -10
  2. package/build/src/McpContext.js +50 -3
  3. package/build/src/browser.js +157 -51
  4. package/build/src/cli.js +6 -1
  5. package/build/src/formatters/IssueFormatter.js +190 -0
  6. package/build/src/main.js +83 -2
  7. package/build/src/telemetry/clearcut-logger.js +102 -0
  8. package/build/src/telemetry/flag-utils.js +45 -0
  9. package/build/src/telemetry/metric-utils.js +14 -0
  10. package/build/src/telemetry/persistence.js +53 -0
  11. package/build/src/telemetry/types.js +33 -0
  12. package/build/src/telemetry/watchdog/clearcut-sender.js +201 -0
  13. package/build/src/telemetry/watchdog/main.js +127 -0
  14. package/build/src/telemetry/watchdog-client.js +60 -0
  15. package/build/src/third_party/devtools-formatter-worker.js +7 -0
  16. package/build/src/tools/browser.js +92 -0
  17. package/build/src/tools/extension.js +31 -0
  18. package/build/src/tools/extensions.js +79 -0
  19. package/build/src/tools/input.js +6 -1
  20. package/build/src/tools/pages.js +0 -1
  21. package/build/src/tools/tools.js +4 -0
  22. package/build/src/transports/WebMCPBridgeScript.js +11 -2
  23. package/build/src/utils/ExtensionRegistry.js +35 -0
  24. package/build/src/utils/string.js +36 -0
  25. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Base64.js +20 -2
  26. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Debouncer.js +8 -1
  27. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Gzip.js +11 -0
  28. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Object.js +6 -1
  29. package/build/vendor/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +3 -0
  30. package/build/vendor/chrome-devtools-frontend/front_end/core/common/ResourceType.js +6 -0
  31. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Revealer.js +0 -5
  32. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Settings.js +18 -8
  33. package/build/vendor/chrome-devtools-frontend/front_end/core/host/AidaClient.js +24 -0
  34. package/build/vendor/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +11 -3
  35. package/build/vendor/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +1 -1
  36. package/build/vendor/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +27 -20
  37. package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/collect-ui-strings.js +7 -8
  38. package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/generate-locales-js.js +4 -5
  39. package/build/vendor/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +10 -0
  40. package/build/vendor/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +63 -12
  41. package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +1 -0
  42. package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +4 -1
  43. package/build/vendor/chrome-devtools-frontend/front_end/core/root/ExperimentNames.js +30 -0
  44. package/build/vendor/chrome-devtools-frontend/front_end/core/root/root.js +2 -1
  45. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +0 -4
  46. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +69 -9
  47. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +6 -6
  48. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +28 -13
  49. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +1 -1
  50. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +6 -0
  51. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +0 -2
  52. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +1 -1
  53. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +170 -13
  54. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +5 -39
  55. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +8 -1
  56. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +20 -5
  57. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +12 -21
  58. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +19 -6
  59. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +5 -1
  60. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +8 -5
  61. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +15 -10
  62. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +1 -1
  63. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +13 -27
  64. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/Target.js +3 -1
  65. package/build/vendor/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1 -7
  66. package/build/vendor/chrome-devtools-frontend/front_end/generated/Deprecation.js +1 -16
  67. package/build/vendor/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +82 -22
  68. package/build/vendor/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +265 -123
  69. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +2 -1
  70. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +10 -16
  71. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +97 -26
  72. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +35 -0
  73. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationRepository.js +163 -0
  74. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationType.js +10 -0
  75. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/annotations.js +5 -0
  76. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +5 -3
  77. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerLanguagePlugins.js +29 -58
  78. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +7 -45
  79. package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +1 -1
  80. package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +14 -0
  81. package/build/vendor/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +8 -5
  82. package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/Prototypes.js +33 -0
  83. package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/greendev.js +4 -0
  84. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/ContrastCheckTrigger.js +2 -2
  85. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CookieIssue.js +0 -21
  86. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CorsIssue.js +1 -38
  87. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssueAggregator.js +8 -0
  88. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssuesManager.js +6 -12
  89. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/PermissionElementIssue.js +243 -0
  90. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +7 -0
  91. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
  92. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
  93. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
  94. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +5 -0
  95. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +5 -0
  96. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +5 -0
  97. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementGeolocationDeprecated.md +5 -0
  98. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
  99. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +5 -0
  100. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +5 -0
  101. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +5 -0
  102. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +5 -0
  103. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementLowContrast.md +5 -0
  104. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +5 -0
  105. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
  106. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +6 -0
  107. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
  108. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRegistrationFailed.md +5 -0
  109. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +5 -0
  110. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +5 -0
  111. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +5 -0
  112. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +7 -0
  113. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/issues_manager.js +2 -1
  114. package/build/vendor/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +0 -8
  115. package/build/vendor/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +4 -8
  116. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTrace.js +30 -1
  117. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +70 -1
  118. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +82 -30
  119. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +10 -2
  120. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +2 -2
  121. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +0 -3
  122. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Processor.js +18 -19
  123. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Styles.js +12 -4
  124. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/Initiators.js +46 -0
  125. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +4 -3
  126. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +1 -0
  127. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +2 -2
  128. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +1 -1
  129. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +6 -0
  130. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +10 -1
  131. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +44 -27
  132. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +9 -2
  133. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +1 -6
  134. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +2 -2
  135. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -4
  136. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +3 -2
  137. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +1 -1
  138. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +33 -11
  139. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +51 -18
  140. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
  141. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +4 -0
  142. package/build/vendor/chrome-devtools-frontend/mcp/HostBindings.js +4 -0
  143. package/build/vendor/chrome-devtools-frontend/mcp/mcp.js +4 -0
  144. package/package.json +17 -10
  145. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteInvalidSameParty.md +0 -8
  146. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteSamePartyCrossPartyContextSet.md +0 -10
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fs from 'node:fs/promises';
7
+ import path from 'node:path';
8
+ export class ExtensionRegistry {
9
+ #extensions = new Map();
10
+ async registerExtension(id, extensionPath) {
11
+ const manifestPath = path.join(extensionPath, 'manifest.json');
12
+ const manifestContent = await fs.readFile(manifestPath, 'utf-8');
13
+ const manifest = JSON.parse(manifestContent);
14
+ const name = manifest.name ?? 'Unknown';
15
+ const version = manifest.version ?? 'Unknown';
16
+ const extension = {
17
+ id,
18
+ name,
19
+ version,
20
+ isEnabled: true,
21
+ path: extensionPath,
22
+ };
23
+ this.#extensions.set(extension.id, extension);
24
+ return extension;
25
+ }
26
+ remove(id) {
27
+ this.#extensions.delete(id);
28
+ }
29
+ list() {
30
+ return Array.from(this.#extensions.values());
31
+ }
32
+ getById(id) {
33
+ return this.#extensions.get(id);
34
+ }
35
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Converts a given string to snake_case.
8
+ * This function handles camelCase, PascalCase, and acronyms, including transitions between letters and numbers.
9
+ * It uses Unicode-aware regular expressions (`\p{L}`, `\p{N}`, `\p{Lu}`, `\p{Ll}` with the `u` flag)
10
+ * to correctly process letters and numbers from various languages.
11
+ *
12
+ * @param text The input string to convert to snake_case.
13
+ * @returns The snake_case version of the input string.
14
+ */
15
+ export function toSnakeCase(text) {
16
+ if (!text) {
17
+ return '';
18
+ }
19
+ // First, handle case-based transformations to insert underscores correctly.
20
+ // 1. Add underscore between a letter and a number.
21
+ // e.g., "version2" -> "version_2"
22
+ // 2. Add underscore between an uppercase letter sequence and a following uppercase+lowercase sequence.
23
+ // e.g., "APIFlags" -> "API_Flags"
24
+ // 3. Add underscore between a lowercase/number and an uppercase letter.
25
+ // e.g., "lastName" -> "last_Name", "version_2Update" -> "version_2_Update"
26
+ // 4. Replace sequences of non-alphanumeric with a single underscore
27
+ // 5. Remove any leading or trailing underscores.
28
+ const result = text
29
+ .replace(/(\p{L})(\p{N})/gu, '$1_$2') // 1
30
+ .replace(/(\p{Lu}+)(\p{Lu}\p{Ll})/gu, '$1_$2') // 2
31
+ .replace(/(\p{Ll}|\p{N})(\p{Lu})/gu, '$1_$2') // 3
32
+ .toLowerCase()
33
+ .replace(/[^\p{L}\p{N}]+/gu, '_') // 4
34
+ .replace(/^_|_$/g, ''); // 5
35
+ return result;
36
+ }
@@ -29,13 +29,31 @@ export function decode(input) {
29
29
  }
30
30
  return bytes;
31
31
  }
32
+ /**
33
+ * Note: if input can be very large (larger than the max string size), callers should
34
+ * expect this to throw an error.
35
+ */
32
36
  export function encode(input) {
33
37
  return new Promise((resolve, reject) => {
34
38
  const reader = new FileReader();
35
- reader.onerror = () => reject(new Error('failed to convert to base64'));
39
+ reader.onerror = () => reject(new Error('failed to convert to base64: internal error'));
36
40
  reader.onload = () => {
41
+ // The input was too large to encode as a string. The caller should anticipate
42
+ // this and use a workaround. See TimelinePanel.ts innerSaveToFile for an example.
43
+ // For more information, see crbug.com/436482118.
44
+ if (reader.result === '') {
45
+ reject(new Error('failed to convert to base64: input too large to encode as base64 string'));
46
+ return;
47
+ }
48
+ // This string can be very large, so take care to not double memory. `split`
49
+ // was used here before, which always results in new strings in V8. By using
50
+ // slice instead, we leverage the sliced string optimization in V8 and avoid
51
+ // doubling the memory requirement (even if temporarily: that is a potential
52
+ // source of OOM crashes given large enough input, such as is common with
53
+ // Performance traces).
37
54
  const blobAsUrl = reader.result;
38
- const [, base64] = blobAsUrl.split(',', 2);
55
+ const index = blobAsUrl.indexOf(',');
56
+ const base64 = blobAsUrl.slice(index + 1);
39
57
  resolve(base64);
40
58
  };
41
59
  reader.readAsDataURL(new Blob([input]));
@@ -8,7 +8,14 @@ export const debounce = function (func, delay) {
8
8
  let timer;
9
9
  const debounced = (...args) => {
10
10
  clearTimeout(timer);
11
- timer = setTimeout(() => func(...args), delay);
11
+ timer = setTimeout(() => func(...args), testDebounceOverride ? 0 : delay);
12
12
  };
13
13
  return debounced;
14
14
  };
15
+ let testDebounceOverride = false;
16
+ export function enableTestOverride() {
17
+ testDebounceOverride = true;
18
+ }
19
+ export function disableTestOverride() {
20
+ testDebounceOverride = false;
21
+ }
@@ -64,3 +64,14 @@ export function compressStream(stream) {
64
64
  const cs = new CompressionStream('gzip');
65
65
  return stream.pipeThrough(cs);
66
66
  }
67
+ export function createMonitoredStream(stream, onProgress) {
68
+ let bytesRead = 0;
69
+ const progressTransformer = new TransformStream({
70
+ transform(chunk, controller) {
71
+ bytesRead += chunk.byteLength;
72
+ onProgress(bytesRead);
73
+ controller.enqueue(chunk);
74
+ }
75
+ });
76
+ return stream.pipeThrough(progressTransformer);
77
+ }
@@ -57,7 +57,12 @@ export class ObjectWrapper {
57
57
  // new listeners.
58
58
  for (const listener of [...listeners]) {
59
59
  if (!listener.disposed) {
60
- listener.listener.call(listener.thisObject, event);
60
+ try {
61
+ listener.listener.call(listener.thisObject, event);
62
+ }
63
+ catch (err) {
64
+ console.error(`Event listener for ${String(eventType)} throw an error:`, err);
65
+ }
61
66
  }
62
67
  }
63
68
  }
@@ -263,6 +263,9 @@ export class ParsedURL {
263
263
  return '';
264
264
  }
265
265
  static extractName(url) {
266
+ if (url.endsWith('/')) {
267
+ url = url.slice(0, -1);
268
+ }
266
269
  let index = url.lastIndexOf('/');
267
270
  const pathAndQuery = index !== -1 ? url.substr(index + 1) : url;
268
271
  index = pathAndQuery.indexOf('?');
@@ -229,6 +229,12 @@ export class ResourceType {
229
229
  const regex = new RegExp('^application(.*json$|\/json\+.*)');
230
230
  return regex.test(contentType) ? 'application/json' : contentType;
231
231
  }
232
+ /**
233
+ * Checks whether the given MIME type represents JavaScript content.
234
+ */
235
+ static isJavaScriptMimeType(mimeType) {
236
+ return mimeType === 'application/javascript' || mimeType === 'text/javascript';
237
+ }
232
238
  /**
233
239
  * Adds suffixes iff the mimeType is 'text/javascript' to denote whether the JS is minified or from
234
240
  * a source map.
@@ -31,10 +31,6 @@ const UIStrings = {
31
31
  * @description The UI destination when right clicking an item that can be revealed
32
32
  */
33
33
  applicationPanel: 'Application panel',
34
- /**
35
- * @description The UI destination when right clicking an item that can be revealed
36
- */
37
- securityPanel: 'Security panel',
38
34
  /**
39
35
  * @description The UI destination when right clicking an item that can be revealed
40
36
  */
@@ -158,7 +154,6 @@ export const RevealerDestination = {
158
154
  TIMELINE_PANEL: i18nLazyString(UIStrings.timelinePanel),
159
155
  APPLICATION_PANEL: i18nLazyString(UIStrings.applicationPanel),
160
156
  SOURCES_PANEL: i18nLazyString(UIStrings.sourcesPanel),
161
- SECURITY_PANEL: i18nLazyString(UIStrings.securityPanel),
162
157
  MEMORY_INSPECTOR_PANEL: i18nLazyString(UIStrings.memoryInspectorPanel),
163
158
  ANIMATIONS_PANEL: i18nLazyString(UIStrings.animationsPanel),
164
159
  };
@@ -162,18 +162,28 @@ export class Settings {
162
162
  return this.#registry;
163
163
  }
164
164
  }
165
- export const NOOP_STORAGE = {
166
- register: () => { },
167
- set: () => { },
168
- get: () => Promise.resolve(''),
169
- remove: () => { },
170
- clear: () => { },
171
- };
165
+ export class InMemoryStorage {
166
+ #store = new Map();
167
+ register(_setting) {
168
+ }
169
+ set(key, value) {
170
+ this.#store.set(key, value);
171
+ }
172
+ get(key) {
173
+ return this.#store.get(key);
174
+ }
175
+ remove(key) {
176
+ this.#store.delete(key);
177
+ }
178
+ clear() {
179
+ this.#store.clear();
180
+ }
181
+ }
172
182
  export class SettingsStorage {
173
183
  object;
174
184
  backingStore;
175
185
  storagePrefix;
176
- constructor(object, backingStore = NOOP_STORAGE, storagePrefix = '') {
186
+ constructor(object, backingStore = new InMemoryStorage(), storagePrefix = '') {
177
187
  this.object = object;
178
188
  this.backingStore = backingStore;
179
189
  this.storagePrefix = storagePrefix;
@@ -194,6 +194,12 @@ export class AidaClient {
194
194
  if (!InspectorFrontendHostInstance.doAidaConversation) {
195
195
  throw new Error('doAidaConversation is not available');
196
196
  }
197
+ // Disable logging for now.
198
+ // For context, see b/454563259#comment35.
199
+ // We should be able to remove this ~end of April.
200
+ if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
201
+ request.metadata.disable_user_content_logging = true;
202
+ }
197
203
  const stream = (() => {
198
204
  let { promise, resolve, reject } = Promise.withResolvers();
199
205
  options?.signal?.addEventListener('abort', () => {
@@ -316,6 +322,12 @@ export class AidaClient {
316
322
  };
317
323
  }
318
324
  registerClientEvent(clientEvent) {
325
+ // Disable logging for now.
326
+ // For context, see b/454563259#comment35.
327
+ // We should be able to remove this ~end of April.
328
+ if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
329
+ clientEvent.disable_user_content_logging = true;
330
+ }
319
331
  const { promise, resolve } = Promise.withResolvers();
320
332
  InspectorFrontendHostInstance.registerAidaClientEvent(JSON.stringify({
321
333
  client: CLIENT_NAME,
@@ -328,6 +340,12 @@ export class AidaClient {
328
340
  if (!InspectorFrontendHostInstance.aidaCodeComplete) {
329
341
  throw new Error('aidaCodeComplete is not available');
330
342
  }
343
+ // Disable logging for now.
344
+ // For context, see b/454563259#comment35.
345
+ // We should be able to remove this ~end of April.
346
+ if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
347
+ request.metadata.disable_user_content_logging = true;
348
+ }
331
349
  const { promise, resolve } = Promise.withResolvers();
332
350
  InspectorFrontendHostInstance.aidaCodeComplete(JSON.stringify(request), resolve);
333
351
  const completeCodeResult = await promise;
@@ -369,6 +387,12 @@ export class AidaClient {
369
387
  return { generatedSamples, metadata };
370
388
  }
371
389
  async generateCode(request, options) {
390
+ // Disable logging for now.
391
+ // For context, see b/454563259#comment35.
392
+ // We should be able to remove this ~end of April.
393
+ if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
394
+ request.metadata.disable_user_content_logging = true;
395
+ }
372
396
  const response = await DispatchHttpRequestClient.makeHttpRequest({
373
397
  service: SERVICE_NAME,
374
398
  path: '/v1/aida:generateCode',
@@ -87,6 +87,9 @@ export class InspectorFrontendHostStub {
87
87
  setInjectedScriptForOrigin(_origin, _script) {
88
88
  }
89
89
  inspectedURLChanged(url) {
90
+ if (!('document' in globalThis)) {
91
+ return;
92
+ }
90
93
  document.title = i18nString(UIStrings.devtoolsS, { PH1: url.replace(/^https?:\/\//, '') });
91
94
  }
92
95
  copyText(text) {
@@ -175,6 +178,12 @@ export class InspectorFrontendHostStub {
175
178
  }
176
179
  this.recordedPerformanceHistograms.push({ histogramName, duration });
177
180
  }
181
+ recordPerformanceHistogramMedium(histogramName, duration) {
182
+ if (this.recordedPerformanceHistograms.length >= MAX_RECORDED_HISTOGRAMS_SIZE) {
183
+ this.recordedPerformanceHistograms.shift();
184
+ }
185
+ this.recordedPerformanceHistograms.push({ histogramName, duration });
186
+ }
178
187
  recordUserMetricsAction(_umaName) {
179
188
  }
180
189
  recordNewBadgeUsage(_featureName) {
@@ -297,9 +306,6 @@ export class InspectorFrontendHostStub {
297
306
  devToolsFlexibleLayout: {
298
307
  verticalDrawerEnabled: true,
299
308
  },
300
- devToolsStartingStyleDebugging: {
301
- enabled: false,
302
- },
303
309
  };
304
310
  if ('hostConfigForTesting' in globalThis) {
305
311
  const { hostConfigForTesting } = globalThis;
@@ -427,4 +433,6 @@ export class InspectorFrontendHostStub {
427
433
  }
428
434
  recordFunctionCall(_event) {
429
435
  }
436
+ setChromeFlag(_flagName, _value) {
437
+ }
430
438
  }
@@ -169,7 +169,7 @@ async function fetchToString(url) {
169
169
  }
170
170
  function canBeRemoteFilePath(url) {
171
171
  try {
172
- const urlObject = new URL(url);
172
+ const urlObject = new URL(new URL(url).toString()); // Normalize first.
173
173
  return urlObject.protocol === 'file:' && urlObject.host !== '';
174
174
  }
175
175
  catch {
@@ -159,33 +159,15 @@ export class UserMetrics {
159
159
  InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.SyncSetting" /* EnumeratedHistogram.SyncSetting */, settingValue, 5 /* SyncSetting.MAX_VALUE */);
160
160
  });
161
161
  }
162
- recordingAssertion(value) {
163
- InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingAssertion" /* EnumeratedHistogram.RecordingAssertion */, value, 4 /* RecordingAssertion.MAX_VALUE */);
164
- }
165
162
  recordingToggled(value) {
166
163
  InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingToggled" /* EnumeratedHistogram.RecordingToggled */, value, 3 /* RecordingToggled.MAX_VALUE */);
167
164
  }
168
165
  recordingReplayFinished(value) {
169
166
  InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingReplayFinished" /* EnumeratedHistogram.RecordingReplayFinished */, value, 5 /* RecordingReplayFinished.MAX_VALUE */);
170
167
  }
171
- recordingReplaySpeed(value) {
172
- InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingReplaySpeed" /* EnumeratedHistogram.RecordingReplaySpeed */, value, 5 /* RecordingReplaySpeed.MAX_VALUE */);
173
- }
174
168
  recordingReplayStarted(value) {
175
169
  InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingReplayStarted" /* EnumeratedHistogram.RecordingReplayStarted */, value, 4 /* RecordingReplayStarted.MAX_VALUE */);
176
170
  }
177
- recordingEdited(value) {
178
- InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingEdited" /* EnumeratedHistogram.RecordingEdited */, value, 11 /* RecordingEdited.MAX_VALUE */);
179
- }
180
- recordingExported(value) {
181
- InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingExported" /* EnumeratedHistogram.RecordingExported */, value, 6 /* RecordingExported.MAX_VALUE */);
182
- }
183
- recordingCodeToggled(value) {
184
- InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingCodeToggled" /* EnumeratedHistogram.RecordingCodeToggled */, value, 3 /* RecordingCodeToggled.MAX_VALUE */);
185
- }
186
- recordingCopiedToClipboard(value) {
187
- InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingCopiedToClipboard" /* EnumeratedHistogram.RecordingCopiedToClipboard */, value, 9 /* RecordingCopiedToClipboard.MAX_VALUE */);
188
- }
189
171
  lighthouseModeRun(type) {
190
172
  InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.LighthouseModeRun" /* EnumeratedHistogram.LighthouseModeRun */, type, 4 /* LighthouseModeRun.MAX_VALUE */);
191
173
  }
@@ -222,9 +204,30 @@ export class UserMetrics {
222
204
  consoleInsightTeaserGenerated(timeInMilliseconds) {
223
205
  InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserGenerationTime', timeInMilliseconds);
224
206
  }
207
+ consoleInsightTeaserGeneratedMedium(timeInMilliseconds) {
208
+ InspectorFrontendHostInstance.recordPerformanceHistogramMedium('DevTools.Insights.TeaserGenerationTimeMedium', timeInMilliseconds);
209
+ }
225
210
  consoleInsightTeaserFirstChunkGenerated(timeInMilliseconds) {
226
211
  InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserFirstChunkGenerationTime', timeInMilliseconds);
227
212
  }
213
+ consoleInsightTeaserFirstChunkGeneratedMedium(timeInMilliseconds) {
214
+ InspectorFrontendHostInstance.recordPerformanceHistogramMedium('DevTools.Insights.TeaserFirstChunkGenerationTimeMedium', timeInMilliseconds);
215
+ }
216
+ consoleInsightTeaserChunkToEndMedium(timeInMilliseconds) {
217
+ InspectorFrontendHostInstance.recordPerformanceHistogramMedium('DevTools.Insights.TeaserChunkToEndMedium', timeInMilliseconds);
218
+ }
219
+ consoleInsightTeaserAbortedAfterFirstCharacter(timeInMilliseconds) {
220
+ InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserAfterFirstCharacterAbortionTime', timeInMilliseconds);
221
+ }
222
+ consoleInsightTeaserAbortedBeforeFirstCharacter(timeInMilliseconds) {
223
+ InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserBeforeFirstCharacterAbortionTime', timeInMilliseconds);
224
+ }
225
+ consoleInsightLongTeaserGenerated(timeInMilliseconds) {
226
+ InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.LongTeaserGenerationTime', timeInMilliseconds);
227
+ }
228
+ consoleInsightShortTeaserGenerated(timeInMilliseconds) {
229
+ InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.ShortTeaserGenerationTime', timeInMilliseconds);
230
+ }
228
231
  }
229
232
  /**
230
233
  * The numeric enum values are not necessarily continuous! It is possible that
@@ -436,7 +439,11 @@ export var Action;
436
439
  Action[Action["InsightTeaserGenerationErrored"] = 194] = "InsightTeaserGenerationErrored";
437
440
  Action[Action["AiCodeGenerationSuggestionDisplayed"] = 195] = "AiCodeGenerationSuggestionDisplayed";
438
441
  Action[Action["AiCodeGenerationSuggestionAccepted"] = 196] = "AiCodeGenerationSuggestionAccepted";
439
- Action[Action["MAX_VALUE"] = 197] = "MAX_VALUE";
442
+ Action[Action["InsightTeaserModelDownloadStarted"] = 197] = "InsightTeaserModelDownloadStarted";
443
+ Action[Action["InsightTeaserModelDownloadCompleted"] = 198] = "InsightTeaserModelDownloadCompleted";
444
+ Action[Action["AiCodeGenerationError"] = 199] = "AiCodeGenerationError";
445
+ Action[Action["AiCodeGenerationRequestTriggered"] = 200] = "AiCodeGenerationRequestTriggered";
446
+ Action[Action["MAX_VALUE"] = 201] = "MAX_VALUE";
440
447
  /* eslint-enable @typescript-eslint/naming-convention */
441
448
  })(Action || (Action = {}));
442
449
  export var PanelCodes;
@@ -698,7 +705,7 @@ export var DevtoolsExperiments;
698
705
  DevtoolsExperiments[DevtoolsExperiments["live-heap-profile"] = 11] = "live-heap-profile";
699
706
  DevtoolsExperiments[DevtoolsExperiments["protocol-monitor"] = 13] = "protocol-monitor";
700
707
  DevtoolsExperiments[DevtoolsExperiments["sampling-heap-profiler-timeline"] = 17] = "sampling-heap-profiler-timeline";
701
- DevtoolsExperiments[DevtoolsExperiments["show-option-tp-expose-internals-in-heap-snapshot"] = 18] = "show-option-tp-expose-internals-in-heap-snapshot";
708
+ DevtoolsExperiments[DevtoolsExperiments["show-option-to-expose-internals-in-heap-snapshot"] = 18] = "show-option-to-expose-internals-in-heap-snapshot";
702
709
  DevtoolsExperiments[DevtoolsExperiments["timeline-invalidation-tracking"] = 26] = "timeline-invalidation-tracking";
703
710
  DevtoolsExperiments[DevtoolsExperiments["timeline-show-all-events"] = 27] = "timeline-show-all-events";
704
711
  DevtoolsExperiments[DevtoolsExperiments["timeline-v8-runtime-call-stats"] = 28] = "timeline-v8-runtime-call-stats";
@@ -1,14 +1,13 @@
1
- "use strict";
2
1
  // Copyright 2022 The Chromium Authors
3
2
  // Use of this source code is governed by a BSD-style license that can be
4
3
  // found in the LICENSE file.
5
- const glob = require('glob');
6
- const path = require('node:path');
7
- const yargs = require('yargs');
8
- const { hideBin } = require('yargs/helpers');
9
- const { writeIfChanged } = require('../../../scripts/build/ninja/write-if-changed.js');
10
- const { bakePlaceholders } = require('../../../third_party/i18n/bake-ctc-to-lhl.js');
11
- const { collectAllStringsInDir, createPsuedoLocaleStrings, IGNORED_PATH_COMPONENTS } = require('../../../third_party/i18n/collect-strings.js');
4
+ import glob from 'glob';
5
+ import * as path from 'node:path';
6
+ import yargs from 'yargs';
7
+ import { hideBin } from 'yargs/helpers';
8
+ import { writeIfChanged } from '../../../scripts/build/ninja/write-if-changed.js';
9
+ import { bakePlaceholders } from '../../../third_party/i18n/bake-ctc-to-lhl.js';
10
+ import { collectAllStringsInDir, createPsuedoLocaleStrings, IGNORED_PATH_COMPONENTS, } from '../../../third_party/i18n/collect-strings.js';
12
11
  /** @typedef {import('../../../third_party/i18n/bake-ctc-to-lhl.js').CtcMessage} CtcMessage */
13
12
  const yargsObject = yargs(hideBin(process.argv))
14
13
  .option('input-directories', {
@@ -1,11 +1,10 @@
1
- "use strict";
2
1
  // Copyright 2022 The Chromium Authors
3
2
  // Use of this source code is governed by a BSD-style license that can be
4
3
  // found in the LICENSE file.
5
- const path = require('node:path');
6
- const yargs = require('yargs');
7
- const { hideBin } = require('yargs/helpers');
8
- const { writeIfChanged } = require('../../../scripts/build/ninja/write-if-changed.js');
4
+ import * as path from 'node:path';
5
+ import yargs from 'yargs';
6
+ import { hideBin } from 'yargs/helpers';
7
+ import { writeIfChanged } from '../../../scripts/build/ninja/write-if-changed.js';
9
8
  const yargsObject = yargs(hideBin(process.argv))
10
9
  .option('target-gen-dir', {
11
10
  type: 'string',
@@ -197,3 +197,13 @@ export function nearestIndexFromEnd(arr, predicate) {
197
197
  export function arrayDoesNotContainNullOrUndefined(arr) {
198
198
  return !arr.includes(null) && !arr.includes(undefined);
199
199
  }
200
+ export function assertArrayIsSorted(arr, compareFn) {
201
+ const comparator = compareFn || DEFAULT_COMPARATOR;
202
+ for (let i = 0; i < arr.length - 1; i++) {
203
+ const current = arr[i];
204
+ const next = arr[i + 1];
205
+ if (comparator(current, next) > 0) {
206
+ throw new Error(`Array is not sorted at index ${i}: ${JSON.stringify(current)} > ${JSON.stringify(next)}`);
207
+ }
208
+ }
209
+ }
@@ -325,26 +325,77 @@ export const compare = (a, b) => {
325
325
  }
326
326
  return 0;
327
327
  };
328
+ /** Returns a string that has no more than maxLength characters. Actual graphemes are used, not bytes. */
328
329
  export const trimMiddle = (str, maxLength) => {
330
+ // Early return for the case where there are fewer bytes than the character limit.
329
331
  if (str.length <= maxLength) {
330
- return String(str);
331
- }
332
- let leftHalf = maxLength >> 1;
333
- let rightHalf = maxLength - leftHalf - 1;
334
- if (str.codePointAt(str.length - rightHalf - 1) >= 0x10000) {
335
- --rightHalf;
336
- ++leftHalf;
332
+ return str;
333
+ }
334
+ const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
335
+ // If the max length is so small it can't fit the ellipsis, just return the ellipsis.
336
+ const ellipsis = '…';
337
+ const ellipsisLength = 1;
338
+ if (maxLength <= ellipsisLength) {
339
+ return ellipsis;
340
+ }
341
+ // Calculate how many graphemes to keep on each side.
342
+ const freeSpace = maxLength - ellipsisLength;
343
+ const leftCount = Math.ceil(freeSpace / 2);
344
+ const rightCount = Math.floor(freeSpace / 2);
345
+ let currentGraphemeCount = 0;
346
+ let leftEndIndex = 0;
347
+ // Sliding Window Buffer
348
+ // We need to know where the "Right Half" starts. Since we can't iterate backwards,
349
+ // we keep track of the start index of the last N graphemes we've seen.
350
+ const rightIndexBuffer = [];
351
+ // This function would be significantly simpler if we created an array of all the
352
+ // segments upfront, but could result in poor performance for large input strings.
353
+ for (const { segment, index } of segmenter.segment(str)) {
354
+ currentGraphemeCount++;
355
+ // Mark the byte index where the "Left Half" ends
356
+ if (currentGraphemeCount === leftCount) {
357
+ leftEndIndex = index + segment.length;
358
+ }
359
+ // Maintain the buffer for the "Right Half"
360
+ if (rightCount > 0) {
361
+ rightIndexBuffer.push(index);
362
+ if (rightIndexBuffer.length > rightCount) {
363
+ rightIndexBuffer.shift(); // Remove the oldest index to keep buffer size constant.
364
+ }
365
+ }
337
366
  }
338
- if (leftHalf > 0 && str.codePointAt(leftHalf - 1) >= 0x10000) {
339
- --leftHalf;
367
+ // If the total grapheme count didn't exceed the limit, return the original string.
368
+ if (currentGraphemeCount <= maxLength) {
369
+ return str;
340
370
  }
341
- return str.substr(0, leftHalf) + '' + str.substr(str.length - rightHalf, rightHalf);
371
+ // The first item in our buffer is exactly 'rightCount' graphemes away from the end.
372
+ const rightStartIndex = rightCount > 0 ? rightIndexBuffer[0] : str.length;
373
+ return str.slice(0, leftEndIndex) + ellipsis + str.slice(rightStartIndex);
342
374
  };
375
+ /** Returns a string that has no more than maxLength characters. Actual graphemes are used, not bytes. */
343
376
  export const trimEndWithMaxLength = (str, maxLength) => {
377
+ // Early return for the case where there are fewer bytes than the character limit.
344
378
  if (str.length <= maxLength) {
345
- return String(str);
379
+ return str;
380
+ }
381
+ const ellipsis = '…';
382
+ const ellipsisLength = 1;
383
+ const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
384
+ const iterator = segmenter.segment(str)[Symbol.iterator]();
385
+ let lastSegmentIndex = 0;
386
+ for (let i = 0; i <= maxLength - ellipsisLength; i++) {
387
+ const result = iterator.next();
388
+ if (result.done) {
389
+ return str;
390
+ }
391
+ lastSegmentIndex = result.value.index;
392
+ }
393
+ for (let i = 0; i < ellipsisLength; i++) {
394
+ if (iterator.next().done) {
395
+ return str;
396
+ }
346
397
  }
347
- return str.substr(0, maxLength - 1) + '…';
398
+ return str.slice(0, lastSegmentIndex) + ellipsis;
348
399
  };
349
400
  export const escapeForRegExp = (str) => {
350
401
  return escapeCharacters(str, SPECIAL_REGEX_CHARACTERS);
@@ -14,4 +14,5 @@ export var CDPErrorStatus;
14
14
  CDPErrorStatus[CDPErrorStatus["SERVER_ERROR"] = -32000] = "SERVER_ERROR";
15
15
  CDPErrorStatus[CDPErrorStatus["SESSION_NOT_FOUND"] = -32001] = "SESSION_NOT_FOUND";
16
16
  CDPErrorStatus[CDPErrorStatus["DEVTOOLS_STUB_ERROR"] = -32015] = "DEVTOOLS_STUB_ERROR";
17
+ CDPErrorStatus[CDPErrorStatus["DEVTOOLS_REHYDRATION_ERROR"] = -32016] = "DEVTOOLS_REHYDRATION_ERROR";
17
18
  })(CDPErrorStatus || (CDPErrorStatus = {}));
@@ -444,6 +444,7 @@ export class TargetBase {
444
444
  }
445
445
  /** These are not logged as console.error */
446
446
  const IGNORED_ERRORS = new Set([
447
+ CDPErrorStatus.DEVTOOLS_REHYDRATION_ERROR,
447
448
  CDPErrorStatus.DEVTOOLS_STUB_ERROR,
448
449
  CDPErrorStatus.SERVER_ERROR,
449
450
  CDPErrorStatus.SESSION_NOT_FOUND,
@@ -491,7 +492,9 @@ class AgentPrototype {
491
492
  if ('result' in response) {
492
493
  return { ...response.result, getError: () => undefined };
493
494
  }
494
- return { getError: () => undefined };
495
+ return {
496
+ getError: () => `Command ${method} returned neither result nor an error, params: ${JSON.stringify(request, undefined, 2)}`,
497
+ };
495
498
  });
496
499
  }
497
500
  }
@@ -0,0 +1,30 @@
1
+ // Copyright 2026 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ export var ExperimentName;
5
+ (function (ExperimentName) {
6
+ ExperimentName["ALL"] = "*";
7
+ ExperimentName["CAPTURE_NODE_CREATION_STACKS"] = "capture-node-creation-stacks";
8
+ ExperimentName["LIVE_HEAP_PROFILE"] = "live-heap-profile";
9
+ ExperimentName["PROTOCOL_MONITOR"] = "protocol-monitor";
10
+ ExperimentName["SAMPLING_HEAP_PROFILER_TIMELINE"] = "sampling-heap-profiler-timeline";
11
+ ExperimentName["SHOW_OPTION_TO_EXPOSE_INTERNALS_IN_HEAP_SNAPSHOT"] = "show-option-to-expose-internals-in-heap-snapshot";
12
+ ExperimentName["TIMELINE_INVALIDATION_TRACKING"] = "timeline-invalidation-tracking";
13
+ ExperimentName["TIMELINE_SHOW_ALL_EVENTS"] = "timeline-show-all-events";
14
+ ExperimentName["TIMELINE_V8_RUNTIME_CALL_STATS"] = "timeline-v8-runtime-call-stats";
15
+ ExperimentName["APCA"] = "apca";
16
+ ExperimentName["FONT_EDITOR"] = "font-editor";
17
+ ExperimentName["FULL_ACCESSIBILITY_TREE"] = "full-accessibility-tree";
18
+ ExperimentName["CONTRAST_ISSUES"] = "contrast-issues";
19
+ ExperimentName["EXPERIMENTAL_COOKIE_FEATURES"] = "experimental-cookie-features";
20
+ ExperimentName["INSTRUMENTATION_BREAKPOINTS"] = "instrumentation-breakpoints";
21
+ ExperimentName["AUTHORED_DEPLOYED_GROUPING"] = "authored-deployed-grouping";
22
+ ExperimentName["JUST_MY_CODE"] = "just-my-code";
23
+ ExperimentName["USE_SOURCE_MAP_SCOPES"] = "use-source-map-scopes";
24
+ ExperimentName["TIMELINE_SHOW_POST_MESSAGE_EVENTS"] = "timeline-show-postmessage-events";
25
+ ExperimentName["TIMELINE_DEBUG_MODE"] = "timeline-debug-mode";
26
+ // Adding or removing an entry from this enum?
27
+ // You will need to update:
28
+ // 1. DevToolsExperiments enum in host/UserMetrics.ts
29
+ // 2. Maybe REGISTERED_EXPERIMENTS in EnvironmentHelpers.ts (to create this experiment in the test env)
30
+ })(ExperimentName || (ExperimentName = {}));
@@ -2,5 +2,6 @@
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
  import * as DevToolsContext from './DevToolsContext.js';
5
+ import * as ExperimentNames from './ExperimentNames.js';
5
6
  import * as Runtime from './Runtime.js';
6
- export { DevToolsContext, Runtime, };
7
+ export { DevToolsContext, ExperimentNames, Runtime, };