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

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
@@ -926,6 +926,9 @@ export class MathFunctionMatch extends BaseFunctionMatch {
926
926
  case "calc" /* ArithmeticFunction.CALC */:
927
927
  case "sibling-count" /* ArithmeticFunction.SIBLING_COUNT */:
928
928
  case "sibling-index" /* ArithmeticFunction.SIBLING_INDEX */:
929
+ case "round" /* ArithmeticFunction.ROUND */:
930
+ case "mod" /* ArithmeticFunction.MOD */:
931
+ case "rem" /* ArithmeticFunction.REM */:
929
932
  return true;
930
933
  }
931
934
  // This assignment catches missed values in the switch above.
@@ -946,6 +949,9 @@ export class MathFunctionMatcher extends matcherBase(MathFunctionMatch) {
946
949
  case "calc" /* ArithmeticFunction.CALC */:
947
950
  case "sibling-count" /* ArithmeticFunction.SIBLING_COUNT */:
948
951
  case "sibling-index" /* ArithmeticFunction.SIBLING_INDEX */:
952
+ case "round" /* ArithmeticFunction.ROUND */:
953
+ case "mod" /* ArithmeticFunction.MOD */:
954
+ case "rem" /* ArithmeticFunction.REM */:
949
955
  return maybeFunc;
950
956
  }
951
957
  // This assignment catches missed values in the switch above.
@@ -433,7 +433,6 @@ export class ConsoleMessage {
433
433
  #exceptionId = undefined;
434
434
  #affectedResources;
435
435
  category;
436
- isCookieReportIssue = false;
437
436
  /**
438
437
  * The parent frame of the `console.log` call of logpoints or conditional breakpoints
439
438
  * if they called `console.*` explicitly. The parent frame is where V8 paused
@@ -460,7 +459,6 @@ export class ConsoleMessage {
460
459
  this.workerId = details?.workerId;
461
460
  this.#affectedResources = details?.affectedResources;
462
461
  this.category = details?.category;
463
- this.isCookieReportIssue = Boolean(details?.isCookieReportIssue);
464
462
  if (!this.#executionContextId && this.#runtimeModel) {
465
463
  if (this.scriptId) {
466
464
  this.#executionContextId = this.#runtimeModel.executionContextIdForScriptId(this.scriptId);
@@ -84,7 +84,7 @@ export class CookieModel extends SDKModel {
84
84
  if (cookie.expires()) {
85
85
  expires = Math.floor(Date.parse(`${cookie.expires()}`) / 1000);
86
86
  }
87
- const enabled = Root.Runtime.experiments.isEnabled('experimental-cookie-features');
87
+ const enabled = Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.EXPERIMENTAL_COOKIE_FEATURES);
88
88
  const preserveUnset = (scheme) => scheme === "Unset" /* Protocol.Network.CookieSourceScheme.Unset */ ? scheme : undefined;
89
89
  const protocolCookie = {
90
90
  name: cookie.name(),
@@ -8,7 +8,7 @@ import { CSSModel } from './CSSModel.js';
8
8
  import { FrameManager } from './FrameManager.js';
9
9
  import { OverlayModel } from './OverlayModel.js';
10
10
  import { RemoteObject } from './RemoteObject.js';
11
- import { ResourceTreeModel } from './ResourceTreeModel.js';
11
+ import { Events as ResourceTreeModelEvents, ResourceTreeModel } from './ResourceTreeModel.js';
12
12
  import { RuntimeModel } from './RuntimeModel.js';
13
13
  import { SDKModel } from './SDKModel.js';
14
14
  import { TargetManager } from './TargetManager.js';
@@ -69,7 +69,16 @@ export const ARIA_ATTRIBUTES = new Set([
69
69
  'aria-valuenow',
70
70
  'aria-valuetext',
71
71
  ]);
72
- export class DOMNode {
72
+ export var DOMNodeEvents;
73
+ (function (DOMNodeEvents) {
74
+ DOMNodeEvents["TOP_LAYER_INDEX_CHANGED"] = "TopLayerIndexChanged";
75
+ DOMNodeEvents["SCROLLABLE_FLAG_UPDATED"] = "ScrollableFlagUpdated";
76
+ DOMNodeEvents["GRID_OVERLAY_STATE_CHANGED"] = "GridOverlayStateChanged";
77
+ DOMNodeEvents["FLEX_CONTAINER_OVERLAY_STATE_CHANGED"] = "FlexContainerOverlayStateChanged";
78
+ DOMNodeEvents["SCROLL_SNAP_OVERLAY_STATE_CHANGED"] = "ScrollSnapOverlayStateChanged";
79
+ DOMNodeEvents["CONTAINER_QUERY_OVERLAY_STATE_CHANGED"] = "ContainerQueryOverlayStateChanged";
80
+ })(DOMNodeEvents || (DOMNodeEvents = {}));
81
+ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper {
73
82
  #domModel;
74
83
  #agent;
75
84
  ownerDocument;
@@ -122,7 +131,14 @@ export class DOMNode {
122
131
  */
123
132
  detached = false;
124
133
  #retainedNodes;
134
+ #adoptedStyleSheets = [];
135
+ /**
136
+ * 1-based index of the node in the top layer. Only set
137
+ * for non-backdrop nodes.
138
+ */
139
+ #topLayerIndex = -1;
125
140
  constructor(domModel) {
141
+ super();
126
142
  this.#domModel = domModel;
127
143
  this.#agent = this.#domModel.getAgent();
128
144
  }
@@ -137,6 +153,7 @@ export class DOMNode {
137
153
  this.#isInShadowTree = isInShadowTree;
138
154
  this.id = payload.nodeId;
139
155
  this.#backendNodeId = payload.backendNodeId;
156
+ this.#frameOwnerFrameId = payload.frameId || null;
140
157
  this.#domModel.registerNode(this);
141
158
  this.#nodeType = payload.nodeType;
142
159
  this.#nodeName = payload.nodeName;
@@ -145,7 +162,6 @@ export class DOMNode {
145
162
  this.#pseudoType = payload.pseudoType;
146
163
  this.#pseudoIdentifier = payload.pseudoIdentifier;
147
164
  this.#shadowRootType = payload.shadowRootType;
148
- this.#frameOwnerFrameId = payload.frameId || null;
149
165
  this.#xmlVersion = payload.xmlVersion;
150
166
  this.#isSVGNode = Boolean(payload.isSVG);
151
167
  this.#isScrollable = Boolean(payload.isScrollable);
@@ -157,6 +173,9 @@ export class DOMNode {
157
173
  if (payload.attributes) {
158
174
  this.setAttributesPayload(payload.attributes);
159
175
  }
176
+ if (payload.adoptedStyleSheets) {
177
+ this.#adoptedStyleSheets = this.toAdoptedStyleSheets(payload.adoptedStyleSheets);
178
+ }
160
179
  this.childNodeCountInternal = payload.childNodeCount || 0;
161
180
  if (payload.shadowRoots) {
162
181
  for (let i = 0; i < payload.shadowRoots.length; ++i) {
@@ -223,6 +242,16 @@ export class DOMNode {
223
242
  const childModel = frame.resourceTreeModel()?.target().model(DOMModel);
224
243
  return await (childModel?.requestDocument() || null);
225
244
  }
245
+ setTopLayerIndex(idx) {
246
+ const oldIndex = this.#topLayerIndex;
247
+ this.#topLayerIndex = idx;
248
+ if (oldIndex !== idx) {
249
+ this.dispatchEventToListeners(DOMNodeEvents.TOP_LAYER_INDEX_CHANGED);
250
+ }
251
+ }
252
+ topLayerIndex() {
253
+ return this.#topLayerIndex;
254
+ }
226
255
  isAdFrameNode() {
227
256
  if (this.isIframe() && this.#frameOwnerFrameId) {
228
257
  const frame = FrameManager.instance().getFrame(this.#frameOwnerFrameId);
@@ -233,6 +262,12 @@ export class DOMNode {
233
262
  }
234
263
  return false;
235
264
  }
265
+ isRootNode() {
266
+ if (this.nodeType() === Node.ELEMENT_NODE && this.nodeName() === 'HTML') {
267
+ return true;
268
+ }
269
+ return false;
270
+ }
236
271
  isSVGNode() {
237
272
  return this.#isSVGNode;
238
273
  }
@@ -283,6 +318,11 @@ export class DOMNode {
283
318
  }
284
319
  setIsScrollable(isScrollable) {
285
320
  this.#isScrollable = isScrollable;
321
+ this.dispatchEventToListeners(DOMNodeEvents.SCROLLABLE_FLAG_UPDATED);
322
+ if (this.nodeName() === '#document') {
323
+ // We show the scroll badge of the document on the <html> element.
324
+ this.ownerDocument?.documentElement?.setIsScrollable(isScrollable);
325
+ }
286
326
  }
287
327
  setAffectedByStartingStyles(affectedByStartingStyles) {
288
328
  this.#affectedByStartingStyles = affectedByStartingStyles;
@@ -684,6 +724,16 @@ export class DOMNode {
684
724
  }
685
725
  }
686
726
  }
727
+ toAdoptedStyleSheets(ids) {
728
+ return ids.map(id => (new AdoptedStyleSheet(id, this)));
729
+ }
730
+ setAdoptedStyleSheets(ids) {
731
+ this.#adoptedStyleSheets = this.toAdoptedStyleSheets(ids);
732
+ this.#domModel.dispatchEventToListeners(Events.AdoptedStyleSheetsModified, this);
733
+ }
734
+ get adoptedStyleSheetsForNode() {
735
+ return this.#adoptedStyleSheets;
736
+ }
687
737
  setDistributedNodePayloads(payloads) {
688
738
  this.#distributedNodes = [];
689
739
  for (const payload of payloads) {
@@ -987,10 +1037,14 @@ export class DOMNodeShortcut {
987
1037
  nodeType;
988
1038
  nodeName;
989
1039
  deferredNode;
990
- constructor(target, backendNodeId, nodeType, nodeName) {
1040
+ // Shortctus to elements that children of the element this shortcut is for.
1041
+ // Currently, use for backdrop elements in the top layer.«
1042
+ childShortcuts = [];
1043
+ constructor(target, backendNodeId, nodeType, nodeName, childShortcuts = []) {
991
1044
  this.nodeType = nodeType;
992
1045
  this.nodeName = nodeName;
993
1046
  this.deferredNode = new DeferredDOMNode(target, backendNodeId);
1047
+ this.childShortcuts = childShortcuts;
994
1048
  }
995
1049
  }
996
1050
  export class DOMDocument extends DOMNode {
@@ -1007,9 +1061,21 @@ export class DOMDocument extends DOMNode {
1007
1061
  this.baseURL = (payload.baseURL || '');
1008
1062
  }
1009
1063
  }
1064
+ export class AdoptedStyleSheet {
1065
+ id;
1066
+ parent;
1067
+ constructor(id, parent) {
1068
+ this.id = id;
1069
+ this.parent = parent;
1070
+ }
1071
+ get cssModel() {
1072
+ return this.parent.domModel().cssModel();
1073
+ }
1074
+ }
1010
1075
  export class DOMModel extends SDKModel {
1011
1076
  agent;
1012
1077
  idToDOMNode = new Map();
1078
+ frameIdToOwnerNode = new Map();
1013
1079
  #document = null;
1014
1080
  #attributeLoadNodeIds = new Set();
1015
1081
  runtimeModelInternal;
@@ -1018,15 +1084,20 @@ export class DOMModel extends SDKModel {
1018
1084
  #frameOwnerNode;
1019
1085
  #loadNodeAttributesTimeout;
1020
1086
  #searchId;
1087
+ #topLayerThrottler = new Common.Throttler.Throttler(100);
1088
+ #topLayerNodes = [];
1089
+ #resourceTreeModel = null;
1021
1090
  constructor(target) {
1022
1091
  super(target);
1023
1092
  this.agent = target.domAgent();
1024
1093
  target.registerDOMDispatcher(new DOMDispatcher(this));
1025
1094
  this.runtimeModelInternal = target.model(RuntimeModel);
1095
+ this.#resourceTreeModel = target.model(ResourceTreeModel);
1096
+ this.#resourceTreeModel?.addEventListener(ResourceTreeModelEvents.DocumentOpened, this.onDocumentOpened, this);
1026
1097
  if (!target.suspended()) {
1027
1098
  void this.agent.invoke_enable({});
1028
1099
  }
1029
- if (Root.Runtime.experiments.isEnabled('capture-node-creation-stacks')) {
1100
+ if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.CAPTURE_NODE_CREATION_STACKS)) {
1030
1101
  void this.agent.invoke_setNodeStackTracesEnabled({ enable: true });
1031
1102
  }
1032
1103
  }
@@ -1057,6 +1128,18 @@ export class DOMModel extends SDKModel {
1057
1128
  this.dispatchEventToListeners(Events.DOMMutated, node);
1058
1129
  }
1059
1130
  }
1131
+ onDocumentOpened(event) {
1132
+ const frame = event.data;
1133
+ const node = this.frameIdToOwnerNode.get(frame.id);
1134
+ if (node) {
1135
+ const contentDocument = node.contentDocument();
1136
+ if (contentDocument && contentDocument.documentURL !== frame.url) {
1137
+ contentDocument.documentURL = frame.url;
1138
+ contentDocument.baseURL = frame.url;
1139
+ this.dispatchEventToListeners(Events.DocumentURLChanged, contentDocument);
1140
+ }
1141
+ }
1142
+ }
1060
1143
  requestDocument() {
1061
1144
  if (this.#document) {
1062
1145
  return Promise.resolve(this.#document);
@@ -1215,6 +1298,7 @@ export class DOMModel extends SDKModel {
1215
1298
  }
1216
1299
  setDocument(payload) {
1217
1300
  this.idToDOMNode = new Map();
1301
+ this.frameIdToOwnerNode = new Map();
1218
1302
  if (payload && 'nodeId' in payload) {
1219
1303
  this.#document = new DOMDocument(this, payload);
1220
1304
  }
@@ -1331,13 +1415,19 @@ export class DOMModel extends SDKModel {
1331
1415
  this.dispatchEventToListeners(Events.NodeInserted, node);
1332
1416
  this.scheduleMutationEvent(node);
1333
1417
  }
1418
+ adoptedStyleSheetsModified(parentId, styleSheets) {
1419
+ const parent = this.idToDOMNode.get(parentId);
1420
+ if (!parent) {
1421
+ return;
1422
+ }
1423
+ parent.setAdoptedStyleSheets(styleSheets);
1424
+ }
1334
1425
  scrollableFlagUpdated(nodeId, isScrollable) {
1335
1426
  const node = this.nodeForId(nodeId);
1336
1427
  if (!node || node.isScrollable() === isScrollable) {
1337
1428
  return;
1338
1429
  }
1339
1430
  node.setIsScrollable(isScrollable);
1340
- this.dispatchEventToListeners(Events.ScrollableFlagUpdated, { node });
1341
1431
  }
1342
1432
  affectedByStartingStylesFlagUpdated(nodeId, affectedByStartingStyles) {
1343
1433
  const node = this.nodeForId(nodeId);
@@ -1347,9 +1437,6 @@ export class DOMModel extends SDKModel {
1347
1437
  node.setAffectedByStartingStyles(affectedByStartingStyles);
1348
1438
  this.dispatchEventToListeners(Events.AffectedByStartingStylesFlagUpdated, { node });
1349
1439
  }
1350
- topLayerElementsUpdated() {
1351
- this.dispatchEventToListeners(Events.TopLayerElementsChanged);
1352
- }
1353
1440
  pseudoElementRemoved(parentId, pseudoElementId) {
1354
1441
  const parent = this.idToDOMNode.get(parentId);
1355
1442
  if (!parent) {
@@ -1375,6 +1462,10 @@ export class DOMModel extends SDKModel {
1375
1462
  }
1376
1463
  unbind(node) {
1377
1464
  this.idToDOMNode.delete(node.id);
1465
+ const frameId = node.frameOwnerFrameId();
1466
+ if (frameId) {
1467
+ this.frameIdToOwnerNode.delete(frameId);
1468
+ }
1378
1469
  const children = node.children();
1379
1470
  for (let i = 0; children && i < children.length; ++i) {
1380
1471
  this.unbind(children[i]);
@@ -1437,6 +1528,66 @@ export class DOMModel extends SDKModel {
1437
1528
  getTopLayerElements() {
1438
1529
  return this.agent.invoke_getTopLayerElements().then(({ nodeIds }) => nodeIds);
1439
1530
  }
1531
+ topLayerElementsUpdated() {
1532
+ void this.#topLayerThrottler.schedule(async () => {
1533
+ // This returns top layer nodes for all local frames.
1534
+ const result = await this.agent.invoke_getTopLayerElements();
1535
+ if (result.getError()) {
1536
+ return;
1537
+ }
1538
+ // Re-set indexes as we re-create top layer nodes list.
1539
+ const previousDocs = new Set();
1540
+ for (const node of this.#topLayerNodes) {
1541
+ node.setTopLayerIndex(-1);
1542
+ if (node.ownerDocument) {
1543
+ previousDocs.add(node.ownerDocument);
1544
+ }
1545
+ }
1546
+ this.#topLayerNodes.splice(0);
1547
+ const nodes = result.nodeIds.map(id => this.idToDOMNode.get(id)).filter((node) => Boolean(node));
1548
+ const nodesByDocument = new Map();
1549
+ for (const node of nodes) {
1550
+ const document = node.ownerDocument;
1551
+ if (!document) {
1552
+ continue;
1553
+ }
1554
+ if (!nodesByDocument.has(document)) {
1555
+ nodesByDocument.set(document, []);
1556
+ }
1557
+ nodesByDocument.get(document)?.push(node);
1558
+ }
1559
+ for (const [document, nodes] of nodesByDocument) {
1560
+ let topLayerIdx = 1;
1561
+ const documentShortcuts = [];
1562
+ for (const [idx, node] of nodes.entries()) {
1563
+ if (node.nodeName() === '::backdrop') {
1564
+ continue;
1565
+ }
1566
+ const childShortcuts = [];
1567
+ const previousNode = result.nodeIds[idx - 1] ? this.idToDOMNode.get(result.nodeIds[idx - 1]) : null;
1568
+ if (previousNode && previousNode.nodeName() === '::backdrop') {
1569
+ childShortcuts.push(new DOMNodeShortcut(this.target(), previousNode.backendNodeId(), 0, previousNode.nodeName()));
1570
+ }
1571
+ const shortcut = new DOMNodeShortcut(this.target(), node.backendNodeId(), 0, node.nodeName(), childShortcuts);
1572
+ node.setTopLayerIndex(topLayerIdx++);
1573
+ this.#topLayerNodes.push(node);
1574
+ documentShortcuts.push(shortcut);
1575
+ previousDocs.delete(document);
1576
+ }
1577
+ this.dispatchEventToListeners(Events.TopLayerElementsChanged, {
1578
+ document,
1579
+ documentShortcuts,
1580
+ });
1581
+ }
1582
+ // Emit empty events for documents that are no longer in the top layer.
1583
+ for (const document of previousDocs) {
1584
+ this.dispatchEventToListeners(Events.TopLayerElementsChanged, {
1585
+ document,
1586
+ documentShortcuts: [],
1587
+ });
1588
+ }
1589
+ });
1590
+ }
1440
1591
  getDetachedDOMNodes() {
1441
1592
  return this.agent.invoke_getDetachedDomNodes().then(({ detachedNodes }) => detachedNodes);
1442
1593
  }
@@ -1470,6 +1621,7 @@ export class DOMModel extends SDKModel {
1470
1621
  await this.agent.invoke_enable({});
1471
1622
  }
1472
1623
  dispose() {
1624
+ this.#resourceTreeModel?.removeEventListener(ResourceTreeModelEvents.DocumentOpened, this.onDocumentOpened, this);
1473
1625
  DOMModelUndoStack.instance().dispose(this);
1474
1626
  }
1475
1627
  parentModel() {
@@ -1481,6 +1633,10 @@ export class DOMModel extends SDKModel {
1481
1633
  }
1482
1634
  registerNode(node) {
1483
1635
  this.idToDOMNode.set(node.id, node);
1636
+ const frameId = node.frameOwnerFrameId();
1637
+ if (frameId) {
1638
+ this.frameIdToOwnerNode.set(frameId, node);
1639
+ }
1484
1640
  }
1485
1641
  }
1486
1642
  export var Events;
@@ -1490,6 +1646,7 @@ export var Events;
1490
1646
  Events["AttrRemoved"] = "AttrRemoved";
1491
1647
  Events["CharacterDataModified"] = "CharacterDataModified";
1492
1648
  Events["DOMMutated"] = "DOMMutated";
1649
+ Events["DocumentURLChanged"] = "DocumentURLChanged";
1493
1650
  Events["NodeInserted"] = "NodeInserted";
1494
1651
  Events["NodeRemoved"] = "NodeRemoved";
1495
1652
  Events["DocumentUpdated"] = "DocumentUpdated";
@@ -1497,8 +1654,8 @@ export var Events;
1497
1654
  Events["DistributedNodesChanged"] = "DistributedNodesChanged";
1498
1655
  Events["MarkersChanged"] = "MarkersChanged";
1499
1656
  Events["TopLayerElementsChanged"] = "TopLayerElementsChanged";
1500
- Events["ScrollableFlagUpdated"] = "ScrollableFlagUpdated";
1501
1657
  Events["AffectedByStartingStylesFlagUpdated"] = "AffectedByStartingStylesFlagUpdated";
1658
+ Events["AdoptedStyleSheetsModified"] = "AdoptedStyleSheetsModified";
1502
1659
  /* eslint-enable @typescript-eslint/naming-convention */
1503
1660
  })(Events || (Events = {}));
1504
1661
  class DOMDispatcher {
@@ -1506,9 +1663,6 @@ class DOMDispatcher {
1506
1663
  constructor(domModel) {
1507
1664
  this.#domModel = domModel;
1508
1665
  }
1509
- adoptedStyleSheetsModified(_params) {
1510
- // TODO: implementation
1511
- }
1512
1666
  documentUpdated() {
1513
1667
  this.#domModel.documentUpdated();
1514
1668
  }
@@ -1518,6 +1672,9 @@ class DOMDispatcher {
1518
1672
  attributeRemoved({ nodeId, name }) {
1519
1673
  this.#domModel.attributeRemoved(nodeId, name);
1520
1674
  }
1675
+ adoptedStyleSheetsModified({ nodeId, adoptedStyleSheets }) {
1676
+ this.#domModel.adoptedStyleSheetsModified(nodeId, adoptedStyleSheets);
1677
+ }
1521
1678
  inlineStyleInvalidated({ nodeIds }) {
1522
1679
  this.#domModel.inlineStyleInvalidated(nodeIds);
1523
1680
  }
@@ -129,7 +129,6 @@ export class DebuggerModel extends SDKModel {
129
129
  #skipAllPausesTimeout = 0;
130
130
  #beforePausedCallback = null;
131
131
  #computeAutoStepRangesCallback = null;
132
- #expandCallFramesCallback = null;
133
132
  evaluateOnCallFrameCallback = null;
134
133
  #synchronizeBreakpointsCallback = null;
135
134
  // We need to be able to register listeners for individual breakpoints. As such, we dispatch
@@ -221,7 +220,7 @@ export class DebuggerModel extends SDKModel {
221
220
  const maxScriptsCacheSize = isRemoteFrontend ? 10e6 : 100e6;
222
221
  const enablePromise = this.agent.invoke_enable({ maxScriptsCacheSize });
223
222
  let instrumentationPromise;
224
- if (Root.Runtime.experiments.isEnabled("instrumentation-breakpoints" /* Root.Runtime.ExperimentName.INSTRUMENTATION_BREAKPOINTS */)) {
223
+ if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.INSTRUMENTATION_BREAKPOINTS)) {
225
224
  instrumentationPromise = this.agent.invoke_setInstrumentationBreakpoint({
226
225
  instrumentation: "beforeScriptExecution" /* Protocol.Debugger.SetInstrumentationBreakpointRequestInstrumentation.BeforeScriptExecution */,
227
226
  });
@@ -506,9 +505,6 @@ export class DebuggerModel extends SDKModel {
506
505
  setBeforePausedCallback(callback) {
507
506
  this.#beforePausedCallback = callback;
508
507
  }
509
- setExpandCallFramesCallback(callback) {
510
- this.#expandCallFramesCallback = callback;
511
- }
512
508
  setEvaluateOnCallFrameCallback(callback) {
513
509
  this.evaluateOnCallFrameCallback = callback;
514
510
  }
@@ -525,7 +521,6 @@ export class DebuggerModel extends SDKModel {
525
521
  return;
526
522
  }
527
523
  const pausedDetails = new DebuggerPausedDetails(this, callFrames, reason, auxData, breakpointIds, asyncStackTrace, asyncStackTraceId);
528
- await this.#expandCallFrames(pausedDetails);
529
524
  if (this.continueToLocationCallback) {
530
525
  const callback = this.continueToLocationCallback;
531
526
  this.continueToLocationCallback = null;
@@ -545,31 +540,6 @@ export class DebuggerModel extends SDKModel {
545
540
  Common.EventTarget.fireEvent('DevTools.DebuggerPaused');
546
541
  }
547
542
  }
548
- /** Delegates to the DebuggerLanguagePlugin and potential attached source maps to expand inlined call frames */
549
- async #expandCallFrames(pausedDetails) {
550
- if (this.#expandCallFramesCallback) {
551
- pausedDetails.callFrames = await this.#expandCallFramesCallback.call(null, pausedDetails.callFrames);
552
- }
553
- if (!Root.Runtime.experiments.isEnabled("use-source-map-scopes" /* Root.Runtime.ExperimentName.USE_SOURCE_MAP_SCOPES */)) {
554
- return;
555
- }
556
- // TODO(crbug.com/40277685): Support attaching/detaching source maps after pausing.
557
- // Expanding call frames via source maps here is only suitable for the experiment prototype because
558
- // we block until all relevant source maps are loaded.
559
- // We should change this so the "Debugger Plugin" and "Source Map" have a bottle neck where they expand
560
- // call frames and that bottleneck should support attaching/detaching source maps while paused.
561
- const finalFrames = [];
562
- for (const frame of pausedDetails.callFrames) {
563
- const sourceMap = await this.sourceMapManager().sourceMapForClientPromise(frame.script);
564
- if (sourceMap?.hasScopeInfo()) {
565
- finalFrames.push(...sourceMap.expandCallFrame(frame));
566
- }
567
- else {
568
- finalFrames.push(frame);
569
- }
570
- }
571
- pausedDetails.callFrames = finalFrames;
572
- }
573
543
  resumedScript() {
574
544
  this.resetDebuggerPausedDetails();
575
545
  this.dispatchEventToListeners(Events.DebuggerResumed, this);
@@ -590,7 +560,8 @@ export class DebuggerModel extends SDKModel {
590
560
  const script = new Script(this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId, hash, isContentScript, isLiveEdit, sourceMapURL, hasSourceURLComment, length, isModule, originStackTrace, codeOffset, scriptLanguage, selectedDebugSymbol, embedderName, buildId);
591
561
  this.registerScript(script);
592
562
  this.dispatchEventToListeners(Events.ParsedScriptSource, script);
593
- if (script.sourceMapURL && !hasSyntaxError) {
563
+ if ((!selectedDebugSymbol || selectedDebugSymbol.type === "SourceMap" /* Protocol.Debugger.DebugSymbolsType.SourceMap */) &&
564
+ script.sourceMapURL && !hasSyntaxError) {
594
565
  this.#sourceMapManager.attachSourceMap(script, script.sourceURL, script.sourceMapURL);
595
566
  }
596
567
  const isDiscardable = hasSyntaxError && script.isAnonymousScript();
@@ -607,10 +578,6 @@ export class DebuggerModel extends SDKModel {
607
578
  this.#sourceMapManager.attachSourceMap(script, script.sourceURL, script.sourceMapURL);
608
579
  }
609
580
  async setDebugInfoURL(script, _externalURL) {
610
- if (this.#expandCallFramesCallback && this.#debuggerPausedDetails) {
611
- this.#debuggerPausedDetails.callFrames =
612
- await this.#expandCallFramesCallback.call(null, this.#debuggerPausedDetails.callFrames);
613
- }
614
581
  this.dispatchEventToListeners(Events.DebugInfoAttached, script);
615
582
  }
616
583
  executionContextDestroyed(executionContext) {
@@ -785,7 +752,8 @@ export class DebuggerModel extends SDKModel {
785
752
  */
786
753
  async *iterateAsyncParents(stackTraceOrPausedDetails) {
787
754
  // We make `DebuggerPausedDetails` look like a stack trace. We are only interested in `parent` and `parentId` in any case.
788
- let stackTrace = stackTraceOrPausedDetails instanceof DebuggerPausedDetails ?
755
+ const isPausedDetails = (details) => !('parent' in details) && !('parentId' in details);
756
+ let stackTrace = isPausedDetails(stackTraceOrPausedDetails) ?
789
757
  {
790
758
  callFrames: [],
791
759
  parent: stackTraceOrPausedDetails.asyncStackTrace,
@@ -950,7 +918,6 @@ export class CallFrame {
950
918
  functionName;
951
919
  #functionLocation;
952
920
  #returnValue;
953
- missingDebugInfoDetails;
954
921
  exception;
955
922
  canBeRestarted;
956
923
  constructor(debuggerModel, script, payload, inlineFrameIndex, functionName, exception = null) {
@@ -962,7 +929,6 @@ export class CallFrame {
962
929
  this.#localScope = null;
963
930
  this.inlineFrameIndex = inlineFrameIndex || 0;
964
931
  this.functionName = functionName ?? payload.functionName;
965
- this.missingDebugInfoDetails = null;
966
932
  this.canBeRestarted = Boolean(payload.canBeRestarted);
967
933
  this.exception = exception;
968
934
  for (let i = 0; i < payload.scopeChain.length; ++i) {
@@ -3,6 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
  import { RuntimeModel } from './RuntimeModel.js';
5
5
  import { SDKModel } from './SDKModel.js';
6
+ import { TargetManager } from './TargetManager.js';
6
7
  export class HeapProfilerModel extends SDKModel {
7
8
  #enabled;
8
9
  #heapProfilerAgent;
@@ -80,7 +81,13 @@ export class HeapProfilerModel extends SDKModel {
80
81
  return Boolean(response.getError());
81
82
  }
82
83
  async takeHeapSnapshot(heapSnapshotOptions) {
83
- await this.#heapProfilerAgent.invoke_takeHeapSnapshot(heapSnapshotOptions);
84
+ await TargetManager.instance().suspendAllTargets('heap-snapshot');
85
+ try {
86
+ await this.#heapProfilerAgent.invoke_takeHeapSnapshot(heapSnapshotOptions);
87
+ }
88
+ finally {
89
+ await TargetManager.instance().resumeAllTargets();
90
+ }
84
91
  }
85
92
  async startTrackingHeapObjects(recordAllocationStacks) {
86
93
  const response = await this.#heapProfilerAgent.invoke_startTrackingHeapObjects({ trackAllocations: recordAllocationStacks });
@@ -330,6 +330,9 @@ export class NetworkManager extends SDKModel {
330
330
  async enableReportingApi(enable = true) {
331
331
  return await this.#networkAgent.invoke_enableReportingApi({ enable });
332
332
  }
333
+ async enableDeviceBoundSessions(enable = true) {
334
+ return await this.#networkAgent.invoke_enableDeviceBoundSessions({ enable });
335
+ }
333
336
  async loadNetworkResource(frameId, url, options) {
334
337
  const result = await this.#networkAgent.invoke_loadNetworkResource({ frameId: frameId ?? undefined, url, options });
335
338
  if (result.getError()) {
@@ -355,6 +358,8 @@ export var Events;
355
358
  Events["ReportingApiReportAdded"] = "ReportingApiReportAdded";
356
359
  Events["ReportingApiReportUpdated"] = "ReportingApiReportUpdated";
357
360
  Events["ReportingApiEndpointsChangedForOrigin"] = "ReportingApiEndpointsChangedForOrigin";
361
+ Events["DeviceBoundSessionsAdded"] = "DeviceBoundSessionsAdded";
362
+ Events["DeviceBoundSessionEventOccurred"] = "DeviceBoundSessionEventOccurred";
358
363
  /* eslint-enable @typescript-eslint/naming-convention */
359
364
  })(Events || (Events = {}));
360
365
  /**
@@ -612,7 +617,7 @@ export class NetworkDispatcher {
612
617
  this.getExtraInfoBuilder(requestId).addHasExtraInfo(info.hasExtraInfo);
613
618
  this.#manager.dispatchEventToListeners(Events.ResponseReceived, { request: networkRequest, response: info.outerResponse });
614
619
  }
615
- requestWillBeSent({ requestId, loaderId, documentURL, request, timestamp, wallTime, initiator, redirectHasExtraInfo, redirectResponse, type, frameId, hasUserGesture, }) {
620
+ requestWillBeSent({ requestId, loaderId, documentURL, request, timestamp, wallTime, initiator, redirectHasExtraInfo, redirectResponse, type, frameId, hasUserGesture, renderBlockingBehavior, }) {
616
621
  let networkRequest = this.#requestsById.get(requestId);
617
622
  if (networkRequest) {
618
623
  // FIXME: move this check to the backend.
@@ -639,6 +644,9 @@ export class NetworkDispatcher {
639
644
  }
640
645
  else {
641
646
  networkRequest = NetworkRequest.create(requestId, request.url, documentURL, frameId ?? null, loaderId, initiator, hasUserGesture);
647
+ if (renderBlockingBehavior) {
648
+ networkRequest.setRenderBlockingBehavior(renderBlockingBehavior);
649
+ }
642
650
  requestToManagerMap.set(networkRequest, this.#manager);
643
651
  }
644
652
  networkRequest.hasNetworkData = true;
@@ -810,7 +818,7 @@ export class NetworkDispatcher {
810
818
  }
811
819
  requestIntercepted({}) {
812
820
  }
813
- requestWillBeSentExtraInfo({ requestId, associatedCookies, headers, clientSecurityState, connectTiming, siteHasCookieInOtherPartition, appliedNetworkConditionsId }) {
821
+ requestWillBeSentExtraInfo({ requestId, associatedCookies, headers, deviceBoundSessionUsages, clientSecurityState, connectTiming, siteHasCookieInOtherPartition, appliedNetworkConditionsId }) {
814
822
  const blockedRequestCookies = [];
815
823
  const includedRequestCookies = [];
816
824
  for (const { blockedReasons, exemptionReason, cookie } of associatedCookies) {
@@ -825,6 +833,7 @@ export class NetworkDispatcher {
825
833
  blockedRequestCookies,
826
834
  includedRequestCookies,
827
835
  requestHeaders: this.headersMapToHeadersArray(headers),
836
+ deviceBoundSessionUsages,
828
837
  clientSecurityState,
829
838
  connectTiming,
830
839
  siteHasCookieInOtherPartition,
@@ -1268,6 +1277,12 @@ export class NetworkDispatcher {
1268
1277
  reportingApiEndpointsChangedForOrigin(data) {
1269
1278
  this.#manager.dispatchEventToListeners(Events.ReportingApiEndpointsChangedForOrigin, data);
1270
1279
  }
1280
+ deviceBoundSessionsAdded(_params) {
1281
+ this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionsAdded, _params.sessions);
1282
+ }
1283
+ deviceBoundSessionEventOccurred(_params) {
1284
+ this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionEventOccurred, _params);
1285
+ }
1271
1286
  policyUpdated() {
1272
1287
  }
1273
1288
  /**
@@ -1536,9 +1551,9 @@ export class RequestConditions extends Common.ObjectWrapper.ObjectWrapper {
1536
1551
  matchedNetworkConditions.push({ ruleIds, urlPattern, conditions });
1537
1552
  }
1538
1553
  }
1539
- if (globalConditions) {
1540
- matchedNetworkConditions.push({ conditions: globalConditions });
1541
- }
1554
+ }
1555
+ if (globalConditions) {
1556
+ matchedNetworkConditions.push({ conditions: globalConditions });
1542
1557
  }
1543
1558
  const promises = [];
1544
1559
  for (const agent of agents) {