@mcp-b/chrome-devtools-mcp 2.0.2 → 2.0.6

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 (149) hide show
  1. package/README.md +120 -10
  2. package/build/src/McpContext.js +69 -5
  3. package/build/src/browser.js +157 -51
  4. package/build/src/cli.js +11 -5
  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/third_party/index.js +1 -1
  17. package/build/src/tools/browser.js +92 -0
  18. package/build/src/tools/extension.js +31 -0
  19. package/build/src/tools/extensions.js +79 -0
  20. package/build/src/tools/input.js +6 -1
  21. package/build/src/tools/pages.js +7 -1
  22. package/build/src/tools/script.js +31 -4
  23. package/build/src/tools/tools.js +4 -0
  24. package/build/src/transports/CDPClientTransport.js +184 -0
  25. package/build/src/transports/WebMCPBridgeScript.js +11 -2
  26. package/build/src/utils/ExtensionRegistry.js +35 -0
  27. package/build/src/utils/string.js +36 -0
  28. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Base64.js +20 -2
  29. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Debouncer.js +8 -1
  30. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Gzip.js +11 -0
  31. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Object.js +6 -1
  32. package/build/vendor/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +3 -0
  33. package/build/vendor/chrome-devtools-frontend/front_end/core/common/ResourceType.js +6 -0
  34. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Revealer.js +0 -5
  35. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Settings.js +18 -8
  36. package/build/vendor/chrome-devtools-frontend/front_end/core/host/AidaClient.js +24 -0
  37. package/build/vendor/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +11 -3
  38. package/build/vendor/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +1 -1
  39. package/build/vendor/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +27 -20
  40. package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/collect-ui-strings.js +7 -8
  41. package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/generate-locales-js.js +4 -5
  42. package/build/vendor/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +10 -0
  43. package/build/vendor/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +63 -12
  44. package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +1 -0
  45. package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +4 -1
  46. package/build/vendor/chrome-devtools-frontend/front_end/core/root/ExperimentNames.js +30 -0
  47. package/build/vendor/chrome-devtools-frontend/front_end/core/root/root.js +2 -1
  48. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +0 -4
  49. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +69 -9
  50. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +6 -6
  51. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +28 -13
  52. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +1 -1
  53. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +6 -0
  54. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +0 -2
  55. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +1 -1
  56. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +170 -13
  57. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +5 -39
  58. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +8 -1
  59. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +20 -5
  60. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +12 -21
  61. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +19 -6
  62. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +5 -1
  63. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +8 -5
  64. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +15 -10
  65. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +1 -1
  66. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +13 -27
  67. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/Target.js +3 -1
  68. package/build/vendor/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1 -7
  69. package/build/vendor/chrome-devtools-frontend/front_end/generated/Deprecation.js +1 -16
  70. package/build/vendor/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +82 -22
  71. package/build/vendor/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +265 -123
  72. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +2 -1
  73. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +10 -16
  74. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +97 -26
  75. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +35 -0
  76. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationRepository.js +163 -0
  77. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationType.js +10 -0
  78. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/annotations.js +5 -0
  79. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +5 -3
  80. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerLanguagePlugins.js +29 -58
  81. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +7 -45
  82. package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +1 -1
  83. package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +14 -0
  84. package/build/vendor/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +8 -5
  85. package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/Prototypes.js +33 -0
  86. package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/greendev.js +4 -0
  87. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/ContrastCheckTrigger.js +2 -2
  88. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CookieIssue.js +0 -21
  89. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CorsIssue.js +1 -38
  90. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssueAggregator.js +8 -0
  91. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssuesManager.js +6 -12
  92. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/PermissionElementIssue.js +243 -0
  93. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +7 -0
  94. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
  95. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
  96. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
  97. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +5 -0
  98. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +5 -0
  99. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +5 -0
  100. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementGeolocationDeprecated.md +5 -0
  101. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
  102. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +5 -0
  103. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +5 -0
  104. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +5 -0
  105. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +5 -0
  106. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementLowContrast.md +5 -0
  107. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +5 -0
  108. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
  109. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +6 -0
  110. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
  111. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRegistrationFailed.md +5 -0
  112. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +5 -0
  113. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +5 -0
  114. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +5 -0
  115. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +7 -0
  116. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/issues_manager.js +2 -1
  117. package/build/vendor/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +0 -8
  118. package/build/vendor/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +4 -8
  119. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTrace.js +30 -1
  120. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +70 -1
  121. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +82 -30
  122. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +10 -2
  123. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +2 -2
  124. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +0 -3
  125. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Processor.js +18 -19
  126. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Styles.js +12 -4
  127. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/Initiators.js +46 -0
  128. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +4 -3
  129. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +1 -0
  130. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +2 -2
  131. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +1 -1
  132. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +6 -0
  133. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +10 -1
  134. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +44 -27
  135. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +9 -2
  136. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +1 -6
  137. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +2 -2
  138. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -4
  139. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +3 -2
  140. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +1 -1
  141. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +33 -11
  142. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +51 -18
  143. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
  144. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +4 -0
  145. package/build/vendor/chrome-devtools-frontend/mcp/HostBindings.js +4 -0
  146. package/build/vendor/chrome-devtools-frontend/mcp/mcp.js +4 -0
  147. package/package.json +28 -21
  148. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteInvalidSameParty.md +0 -8
  149. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteSamePartyCrossPartyContextSet.md +0 -10
@@ -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, };
@@ -362,10 +362,6 @@ export class AnimationModel extends SDKModel {
362
362
  this.playbackRate = playbackRate;
363
363
  void this.agent.invoke_setPlaybackRate({ playbackRate });
364
364
  }
365
- async releaseAllAnimations() {
366
- const animationIds = [...this.animationGroups.values()].flatMap(animationGroup => animationGroup.animations().map(animation => animation.id()));
367
- await this.agent.invoke_releaseAnimations({ animations: animationIds });
368
- }
369
365
  releaseAnimations(animations) {
370
366
  void this.agent.invoke_releaseAnimations({ animations });
371
367
  }
@@ -474,10 +474,10 @@ export class CSSMatchedStyles {
474
474
  // Now that we've built the arrays of NodeCascades for each pseudo type, convert them into
475
475
  // DOMInheritanceCascades.
476
476
  for (const [pseudoType, nodeCascade] of pseudoCascades.entries()) {
477
- pseudoInheritanceCascades.set(pseudoType, new DOMInheritanceCascade(this, nodeCascade, this.#registeredProperties));
477
+ pseudoInheritanceCascades.set(pseudoType, new DOMInheritanceCascade(this, nodeCascade, this.#registeredProperties, this.#mainDOMCascade));
478
478
  }
479
479
  for (const [highlightName, nodeCascade] of customHighlightPseudoCascades.entries()) {
480
- customHighlightPseudoInheritanceCascades.set(highlightName, new DOMInheritanceCascade(this, nodeCascade, this.#registeredProperties));
480
+ customHighlightPseudoInheritanceCascades.set(highlightName, new DOMInheritanceCascade(this, nodeCascade, this.#registeredProperties, this.#mainDOMCascade));
481
481
  }
482
482
  return [pseudoInheritanceCascades, customHighlightPseudoInheritanceCascades];
483
483
  }
@@ -685,6 +685,10 @@ export class CSSMatchedStyles {
685
685
  const domCascade = this.#styleToDOMCascade.get(property.ownerStyle);
686
686
  return domCascade ? domCascade.propertyState(property) : null;
687
687
  }
688
+ isPropertyOverriddenByAnimation(property) {
689
+ const domCascade = this.#styleToDOMCascade.get(property.ownerStyle);
690
+ return domCascade?.isPropertyOverriddenByAnimation(property) ?? false;
691
+ }
688
692
  resetActiveProperties() {
689
693
  Platform.assertNotNullOrUndefined(this.#mainDOMCascade);
690
694
  Platform.assertNotNullOrUndefined(this.#pseudoDOMCascades);
@@ -730,22 +734,24 @@ export class CSSMatchedStyles {
730
734
  }
731
735
  }
732
736
  class NodeCascade {
737
+ isHighlightPseudoCascade;
733
738
  #matchedStyles;
734
739
  styles;
735
740
  #isInherited;
736
- #isHighlightPseudoCascade;
737
741
  propertiesState = new Map();
742
+ propertiesOverriddenByAnimation = new Set();
738
743
  activeProperties = new Map();
739
744
  #node;
740
745
  constructor(matchedStyles, styles, node, isInherited, isHighlightPseudoCascade = false) {
746
+ this.isHighlightPseudoCascade = isHighlightPseudoCascade;
741
747
  this.#matchedStyles = matchedStyles;
742
748
  this.styles = styles;
743
749
  this.#isInherited = isInherited;
744
- this.#isHighlightPseudoCascade = isHighlightPseudoCascade;
745
750
  this.#node = node;
746
751
  }
747
752
  computeActiveProperties() {
748
753
  this.propertiesState.clear();
754
+ this.propertiesOverriddenByAnimation.clear();
749
755
  this.activeProperties.clear();
750
756
  for (let i = this.styles.length - 1; i >= 0; i--) {
751
757
  const style = this.styles[i];
@@ -760,9 +766,17 @@ class NodeCascade {
760
766
  for (const property of style.allProperties()) {
761
767
  // Do not pick non-inherited properties from inherited styles.
762
768
  const metadata = cssMetadata();
763
- // All properties are inherited for highlight pseudos.
764
- if (this.#isInherited && !this.#isHighlightPseudoCascade && !metadata.isPropertyInherited(property.name)) {
765
- continue;
769
+ if (this.#isInherited) {
770
+ if (this.isHighlightPseudoCascade) {
771
+ // All properties are inherited for highlight pseudos, but custom
772
+ // variables do not come from the inherited pseudo elements.
773
+ if (property.name.startsWith('--')) {
774
+ continue;
775
+ }
776
+ }
777
+ else if (!metadata.isPropertyInherited(property.name)) {
778
+ continue;
779
+ }
766
780
  }
767
781
  // When a property does not have a range in an otherwise ranged CSSStyleDeclaration,
768
782
  // we consider it as a non-leading property (see computeLeadingProperties()), and most
@@ -833,6 +847,10 @@ class NodeCascade {
833
847
  }
834
848
  if (activeProperty) {
835
849
  this.propertiesState.set(activeProperty, "Overloaded" /* PropertyState.OVERLOADED */);
850
+ if (propertyWithHigherSpecificity.ownerStyle.type === Type.Animation ||
851
+ propertyWithHigherSpecificity.ownerStyle.type === Type.Transition) {
852
+ this.propertiesOverriddenByAnimation.add(activeProperty);
853
+ }
836
854
  }
837
855
  this.propertiesState.set(propertyWithHigherSpecificity, "Active" /* PropertyState.ACTIVE */);
838
856
  this.activeProperties.set(canonicalName, propertyWithHigherSpecificity);
@@ -913,6 +931,7 @@ function* forEach(array, startAfter) {
913
931
  }
914
932
  class DOMInheritanceCascade {
915
933
  #propertiesState = new Map();
934
+ #propertiesOverriddenByAnimation = new Set();
916
935
  #availableCSSVariables = new Map();
917
936
  #computedCSSVariables = new Map();
918
937
  #styleToNodeCascade = new Map();
@@ -920,13 +939,24 @@ class DOMInheritanceCascade {
920
939
  #nodeCascades;
921
940
  #registeredProperties;
922
941
  #matchedStyles;
923
- constructor(matchedStyles, nodeCascades, registeredProperties) {
942
+ #fallbackCascade = null;
943
+ #styles = [];
944
+ constructor(matchedStyles, nodeCascades, registeredProperties, fallbackCascade = null) {
924
945
  this.#nodeCascades = nodeCascades;
925
946
  this.#matchedStyles = matchedStyles;
926
947
  this.#registeredProperties = registeredProperties;
948
+ this.#fallbackCascade = fallbackCascade;
927
949
  for (const nodeCascade of nodeCascades) {
928
950
  for (const style of nodeCascade.styles) {
929
951
  this.#styleToNodeCascade.set(style, nodeCascade);
952
+ this.#styles.push(style);
953
+ }
954
+ }
955
+ if (fallbackCascade) {
956
+ for (const [style, nodeCascade] of fallbackCascade.#styleToNodeCascade) {
957
+ if (!this.#styles.includes(style)) {
958
+ this.#styleToNodeCascade.set(style, nodeCascade);
959
+ }
930
960
  }
931
961
  }
932
962
  }
@@ -981,6 +1011,9 @@ class DOMInheritanceCascade {
981
1011
  }
982
1012
  }
983
1013
  }
1014
+ if (this.#fallbackCascade && (!nodeCascade.isHighlightPseudoCascade || property.name.startsWith('--'))) {
1015
+ return this.#fallbackCascade.resolveProperty(property.name, property.ownerStyle);
1016
+ }
984
1017
  return null;
985
1018
  }
986
1019
  #findPropertyInParentCascadeIfInherited(property) {
@@ -1224,15 +1257,20 @@ class DOMInheritanceCascade {
1224
1257
  }
1225
1258
  }
1226
1259
  styles() {
1227
- return Array.from(this.#styleToNodeCascade.keys());
1260
+ return this.#styles;
1228
1261
  }
1229
1262
  propertyState(property) {
1230
1263
  this.ensureInitialized();
1231
1264
  return this.#propertiesState.get(property) || null;
1232
1265
  }
1266
+ isPropertyOverriddenByAnimation(property) {
1267
+ this.ensureInitialized();
1268
+ return this.#propertiesOverriddenByAnimation.has(property);
1269
+ }
1233
1270
  reset() {
1234
1271
  this.#initialized = false;
1235
1272
  this.#propertiesState.clear();
1273
+ this.#propertiesOverriddenByAnimation.clear();
1236
1274
  this.#availableCSSVariables.clear();
1237
1275
  this.#computedCSSVariables.clear();
1238
1276
  }
@@ -1247,11 +1285,20 @@ class DOMInheritanceCascade {
1247
1285
  for (const [property, state] of nodeCascade.propertiesState) {
1248
1286
  if (state === "Overloaded" /* PropertyState.OVERLOADED */) {
1249
1287
  this.#propertiesState.set(property, "Overloaded" /* PropertyState.OVERLOADED */);
1288
+ if (nodeCascade.propertiesOverriddenByAnimation.has(property)) {
1289
+ this.#propertiesOverriddenByAnimation.add(property);
1290
+ }
1250
1291
  continue;
1251
1292
  }
1252
1293
  const canonicalName = cssMetadata().canonicalPropertyName(property.name);
1253
1294
  if (activeProperties.has(canonicalName)) {
1254
1295
  this.#propertiesState.set(property, "Overloaded" /* PropertyState.OVERLOADED */);
1296
+ const activeProperty = activeProperties.get(canonicalName);
1297
+ if (activeProperty &&
1298
+ (activeProperty.ownerStyle.type === Type.Animation ||
1299
+ activeProperty.ownerStyle.type === Type.Transition)) {
1300
+ this.#propertiesOverriddenByAnimation.add(property);
1301
+ }
1255
1302
  continue;
1256
1303
  }
1257
1304
  activeProperties.set(canonicalName, property);
@@ -1289,6 +1336,19 @@ class DOMInheritanceCascade {
1289
1336
  const initialValue = rule.initialValue();
1290
1337
  accumulatedCSSVariables.set(rule.propertyName(), initialValue !== null ? { value: initialValue, declaration: new CSSValueSource(rule) } : null);
1291
1338
  }
1339
+ if (this.#fallbackCascade) {
1340
+ this.#fallbackCascade.ensureInitialized();
1341
+ for (const [cascade, available] of this.#fallbackCascade.#availableCSSVariables) {
1342
+ this.#availableCSSVariables.set(cascade, available);
1343
+ }
1344
+ for (const [cascade, computed] of this.#fallbackCascade.#computedCSSVariables) {
1345
+ this.#computedCSSVariables.set(cascade, computed);
1346
+ }
1347
+ for (const [key, value] of this.#fallbackCascade.#availableCSSVariables.get(this.#fallbackCascade.#nodeCascades[0]) ??
1348
+ []) {
1349
+ accumulatedCSSVariables.set(key, value);
1350
+ }
1351
+ }
1292
1352
  for (let i = this.#nodeCascades.length - 1; i >= 0; --i) {
1293
1353
  const nodeCascade = this.#nodeCascades[i];
1294
1354
  const variableNames = [];
@@ -526,7 +526,7 @@ const extraPropertyValues = new Map([
526
526
  ['background-repeat', new Set(['repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'space', 'round'])],
527
527
  ['content', new Set(['normal', 'close-quote', 'no-close-quote', 'no-open-quote', 'open-quote'])],
528
528
  ['baseline-shift', new Set(['baseline'])],
529
- ['max-height', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content'])],
529
+ ['max-height', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content', 'stretch'])],
530
530
  ['color', new Set(['black'])],
531
531
  ['background-color', new Set(['white'])],
532
532
  ['box-shadow', new Set(['inset'])],
@@ -600,7 +600,7 @@ const extraPropertyValues = new Map([
600
600
  ]),
601
601
  ],
602
602
  ['zoom', new Set(['normal'])],
603
- ['max-width', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content'])],
603
+ ['max-width', new Set(['min-content', 'max-content', '-webkit-fill-available', 'fit-content', 'stretch'])],
604
604
  ['-webkit-font-smoothing', new Set(['antialiased', 'subpixel-antialiased'])],
605
605
  [
606
606
  'border',
@@ -991,7 +991,7 @@ const extraPropertyValues = new Map([
991
991
  ]),
992
992
  ],
993
993
  ['flex-flow', new Set(['nowrap', 'row', 'row-reverse', 'column', 'column-reverse', 'wrap', 'wrap-reverse'])],
994
- ['height', new Set(['-webkit-fill-available'])],
994
+ ['height', new Set(['-webkit-fill-available', 'stretch'])],
995
995
  ['inline-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
996
996
  [
997
997
  'list-style',
@@ -1058,9 +1058,9 @@ const extraPropertyValues = new Map([
1058
1058
  ['max-block-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1059
1059
  ['max-inline-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1060
1060
  ['min-block-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1061
- ['min-height', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1061
+ ['min-height', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content', 'stretch'])],
1062
1062
  ['min-inline-size', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1063
- ['min-width', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content'])],
1063
+ ['min-width', new Set(['-webkit-fill-available', 'min-content', 'max-content', 'fit-content', 'stretch'])],
1064
1064
  ['object-position', new Set(['top', 'bottom', 'left', 'right', 'center'])],
1065
1065
  ['shape-outside', new Set(['border-box', 'content-box', 'padding-box', 'margin-box'])],
1066
1066
  [
@@ -1222,7 +1222,7 @@ const extraPropertyValues = new Map([
1222
1222
  ['-webkit-text-stroke-width', new Set(['medium', 'thick', 'thin'])],
1223
1223
  ['-webkit-transform-origin-x', new Set(['left', 'right', 'center'])],
1224
1224
  ['-webkit-transform-origin-y', new Set(['top', 'bottom', 'center'])],
1225
- ['width', new Set(['-webkit-fill-available'])],
1225
+ ['width', new Set(['-webkit-fill-available', 'stretch'])],
1226
1226
  ['contain-intrinsic-width', new Set(['auto none', 'auto 100px'])],
1227
1227
  ['contain-intrinsic-height', new Set(['auto none', 'auto 100px'])],
1228
1228
  ['contain-intrinsic-size', new Set(['auto none', 'auto 100px'])],
@@ -296,6 +296,12 @@ export class CSSModel extends SDKModel {
296
296
  }
297
297
  return await this.#styleLoader.computedStylePromise(nodeId);
298
298
  }
299
+ async getComputedStyleExtraFields(nodeId) {
300
+ if (!this.isEnabled()) {
301
+ await this.enable();
302
+ }
303
+ return await this.#styleLoader.extraFieldsPromise(nodeId);
304
+ }
299
305
  async getLayoutPropertiesFromComputedStyle(nodeId) {
300
306
  const styles = await this.getComputedStyle(nodeId);
301
307
  if (!styles) {
@@ -317,7 +323,7 @@ export class CSSModel extends SDKModel {
317
323
  isGrid,
318
324
  isSubgrid,
319
325
  isGridLanes,
320
- isContainer,
326
+ containerType: isContainer ? containerType : undefined,
321
327
  hasScroll,
322
328
  };
323
329
  }
@@ -858,25 +864,34 @@ class ComputedStyleLoader {
858
864
  constructor(cssModel) {
859
865
  this.#cssModel = cssModel;
860
866
  }
861
- computedStylePromise(nodeId) {
867
+ #getResponsePromise(nodeId) {
862
868
  let promise = this.#nodeIdToPromise.get(nodeId);
863
869
  if (promise) {
864
870
  return promise;
865
871
  }
866
- promise = this.#cssModel.getAgent().invoke_getComputedStyleForNode({ nodeId }).then(({ computedStyle }) => {
867
- this.#nodeIdToPromise.delete(nodeId);
868
- if (!computedStyle?.length) {
869
- return null;
870
- }
871
- const result = new Map();
872
- for (const property of computedStyle) {
873
- result.set(property.name, property.value);
874
- }
875
- return result;
876
- });
872
+ promise =
873
+ this.#cssModel.getAgent().invoke_getComputedStyleForNode({ nodeId }).then(({ computedStyle, extraFields }) => {
874
+ this.#nodeIdToPromise.delete(nodeId);
875
+ if (!computedStyle?.length) {
876
+ return { style: null, extraFields };
877
+ }
878
+ const result = new Map();
879
+ for (const property of computedStyle) {
880
+ result.set(property.name, property.value);
881
+ }
882
+ return { style: result, extraFields };
883
+ });
877
884
  this.#nodeIdToPromise.set(nodeId, promise);
878
885
  return promise;
879
886
  }
887
+ async computedStylePromise(nodeId) {
888
+ const computedStyleWithExtraFields = await this.#getResponsePromise(nodeId);
889
+ return computedStyleWithExtraFields.style;
890
+ }
891
+ async extraFieldsPromise(nodeId) {
892
+ const computedStyleWithExtraFields = await this.#getResponsePromise(nodeId);
893
+ return computedStyleWithExtraFields.extraFields;
894
+ }
880
895
  }
881
896
  export class InlineStyleResult {
882
897
  inlineStyle;
@@ -77,7 +77,7 @@ export class CSSProperty extends Common.ObjectWrapper.ObjectWrapper {
77
77
  #matchers(matchedStyles, computedStyles) {
78
78
  const matchers = matchedStyles.propertyMatchers(this.ownerStyle, computedStyles);
79
79
  matchers.push(new CSSWideKeywordMatcher(this, matchedStyles));
80
- if (Root.Runtime.experiments.isEnabled('font-editor')) {
80
+ if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.FONT_EDITOR)) {
81
81
  matchers.push(new FontMatcher());
82
82
  }
83
83
  return matchers;