chrome-devtools-mcp-for-extension 0.19.2 → 0.20.0

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 (153) hide show
  1. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +13 -9
  2. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +9 -7
  3. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +1 -8
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +2 -2
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +9 -7
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +5 -3
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +10 -20
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +0 -11
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +6 -4
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +5 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +1 -2
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +110 -99
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +1 -4
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +2 -2
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +1 -4
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +21 -2
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/DispatchHttpRequestClient.js +66 -0
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +102 -86
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +32 -450
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +32 -29
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +430 -0
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +5 -3
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +10 -22
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +26 -15
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +2 -1
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +2 -2
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/HostRuntime.js +19 -0
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +34 -32
  29. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/HostRuntime.js +4 -0
  30. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/api.js +5 -0
  31. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/HostRuntime.js +63 -0
  32. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/browser.js +5 -0
  33. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/HostRuntime.js +72 -0
  34. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/node.js +5 -0
  35. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +2 -2
  36. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +17 -0
  37. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/ConnectionTransport.js +12 -0
  38. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/DevToolsCDPConnection.js +138 -0
  39. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +49 -312
  40. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +4 -9
  41. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/DevToolsContext.js +54 -0
  42. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +2 -1
  43. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +2 -3
  44. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +0 -3
  45. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +51 -17
  46. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +21 -7
  47. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +11 -5
  48. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +4 -7
  49. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +11 -9
  50. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +34 -24
  51. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +52 -10
  52. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStartingStyle.js +21 -0
  53. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +4 -4
  54. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +39 -35
  55. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +10 -47
  56. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +1 -1
  57. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +1 -1
  58. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +29 -4
  59. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +5 -20
  60. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +17 -3
  61. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +4 -2
  62. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +4 -2
  63. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +1 -4
  64. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +428 -121
  65. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +8 -22
  66. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +44 -34
  67. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +64 -19
  68. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +139 -12
  69. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +5 -2
  70. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +3 -2
  71. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScopeTreeCache.js +36 -0
  72. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +20 -18
  73. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +26 -1
  74. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +3 -0
  75. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +54 -14
  76. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +16 -0
  77. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +19 -7
  78. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +240 -8
  79. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +12 -17
  80. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +38 -29
  81. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +11 -8
  82. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +80 -31
  83. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +4 -2
  84. package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1301 -174
  85. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +67 -22
  86. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +62 -91
  87. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +188 -100
  88. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +30 -3
  89. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +50 -34
  90. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +152 -101
  91. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +11 -6
  92. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIContext.js +25 -26
  93. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIQueries.js +46 -2
  94. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +10 -8
  95. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +82 -3
  96. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +33 -15
  97. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +105 -14
  98. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +38 -0
  99. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +5 -4
  100. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +9 -7
  101. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +6 -7
  102. package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +6 -4
  103. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +16 -2
  104. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +6 -4
  105. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/FunctionCodeResolver.js +192 -0
  106. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +12 -16
  107. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +2 -2
  108. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +1 -1
  109. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/Trie.js +8 -0
  110. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +1 -0
  111. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +6 -3
  112. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +4 -4
  113. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +1 -1
  114. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +11 -4
  115. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +7 -5
  116. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +8 -4
  117. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +4 -1
  118. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +29 -3
  119. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +59 -6
  120. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +26 -1
  121. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +1 -1
  122. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +1 -1
  123. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +4 -2
  124. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +18 -4
  125. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +2 -1
  126. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +2 -1
  127. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +2 -1
  128. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +12 -11
  129. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +2 -1
  130. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +2 -1
  131. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +3 -2
  132. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +14 -2
  133. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +2 -1
  134. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +13 -2
  135. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -1
  136. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +4 -2
  137. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +2 -1
  138. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +4 -3
  139. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +2 -1
  140. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +2 -1
  141. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +2 -1
  142. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +2 -1
  143. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +9 -3
  144. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +25 -2
  145. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +41 -48
  146. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +38 -0
  147. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/WorkspaceImpl.js +5 -8
  148. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/workspace-meta.js +34 -0
  149. package/build/src/McpContext.js +8 -1
  150. package/build/src/tools/bookmarks.js +0 -1
  151. package/build/src/tools/gemini-web.js +17 -25
  152. package/build/src/tools/snapshot.js +9 -2
  153. package/package.json +3 -3
@@ -225,8 +225,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
225
225
  #initialPriority = null;
226
226
  #currentPriority = null;
227
227
  #signedExchangeInfo = null;
228
- #webBundleInfo = null;
229
- #webBundleInnerRequestInfo = null;
230
228
  #resourceType = Common.ResourceType.resourceTypes.Other;
231
229
  #contentData = null;
232
230
  #streamingContentData = null;
@@ -306,8 +304,8 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
306
304
  responseReceivedPromiseResolve;
307
305
  directSocketInfo;
308
306
  #directSocketChunks = [];
309
- #isIpProtectionUsed;
310
307
  #isAdRelated;
308
+ #appliedNetworkConditionsId;
311
309
  constructor(requestId, backendRequestId, url, documentURL, frameId, loaderId, initiator, hasUserGesture) {
312
310
  super();
313
311
  this.#requestId = requestId;
@@ -318,7 +316,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
318
316
  this.#loaderId = loaderId;
319
317
  this.#initiator = initiator;
320
318
  this.#hasUserGesture = hasUserGesture;
321
- this.#isIpProtectionUsed = false;
322
319
  this.#isAdRelated = false;
323
320
  }
324
321
  static create(backendRequestId, url, documentURL, frameId, loaderId, initiator, hasUserGesture) {
@@ -376,6 +373,9 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
376
373
  get loaderId() {
377
374
  return this.#loaderId;
378
375
  }
376
+ get appliedNetworkConditionsId() {
377
+ return this.#appliedNetworkConditionsId;
378
+ }
379
379
  setRemoteAddress(ip, port) {
380
380
  this.#remoteAddress = ip + ':' + port;
381
381
  this.dispatchEventToListeners(Events.REMOTE_ADDRESS_CHANGED, this);
@@ -1168,18 +1168,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
1168
1168
  signedExchangeInfo() {
1169
1169
  return this.#signedExchangeInfo;
1170
1170
  }
1171
- setWebBundleInfo(info) {
1172
- this.#webBundleInfo = info;
1173
- }
1174
- webBundleInfo() {
1175
- return this.#webBundleInfo;
1176
- }
1177
- setWebBundleInnerRequestInfo(info) {
1178
- this.#webBundleInnerRequestInfo = info;
1179
- }
1180
- webBundleInnerRequestInfo() {
1181
- return this.#webBundleInnerRequestInfo;
1182
- }
1183
1171
  async populateImageSource(image) {
1184
1172
  const contentData = await this.requestContentData();
1185
1173
  if (TextUtils.ContentData.ContentData.isError(contentData)) {
@@ -1265,12 +1253,16 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
1265
1253
  this.#hasExtraRequestInfo = true;
1266
1254
  this.setRequestHeadersText(''); // Mark request headers as non-provisional
1267
1255
  this.#clientSecurityState = extraRequestInfo.clientSecurityState;
1256
+ this.#appliedNetworkConditionsId = extraRequestInfo.appliedNetworkConditionsId;
1268
1257
  if (extraRequestInfo.connectTiming) {
1269
1258
  this.setConnectTimingFromExtraInfo(extraRequestInfo.connectTiming);
1270
1259
  }
1271
1260
  this.#siteHasCookieInOtherPartition = extraRequestInfo.siteHasCookieInOtherPartition ?? false;
1272
1261
  this.#hasThirdPartyCookiePhaseoutIssue = this.#blockedRequestCookies.some(item => item.blockedReasons.includes("ThirdPartyPhaseout" /* Protocol.Network.CookieBlockedReason.ThirdPartyPhaseout */));
1273
1262
  }
1263
+ setAppliedNetworkConditions(appliedNetworkConditionsId) {
1264
+ this.#appliedNetworkConditionsId = appliedNetworkConditionsId;
1265
+ }
1274
1266
  hasExtraRequestInfo() {
1275
1267
  return this.#hasExtraRequestInfo;
1276
1268
  }
@@ -1418,12 +1410,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
1418
1410
  isSameSite() {
1419
1411
  return this.#isSameSite;
1420
1412
  }
1421
- setIsIpProtectionUsed(isIpProtectionUsed) {
1422
- this.#isIpProtectionUsed = isIpProtectionUsed;
1423
- }
1424
- isIpProtectionUsed() {
1425
- return this.#isIpProtectionUsed;
1426
- }
1427
1413
  setIsAdRelated(isAdRelated) {
1428
1414
  this.#isAdRelated = isAdRelated;
1429
1415
  }
@@ -4,7 +4,7 @@
4
4
  import * as Common from '../common/common.js';
5
5
  import * as Host from '../host/host.js';
6
6
  import * as i18n from '../i18n/i18n.js';
7
- import { FrameManager } from './FrameManager.js';
7
+ import * as Root from '../root/root.js';
8
8
  import { IOModel } from './IOModel.js';
9
9
  import { MultitargetNetworkManager, NetworkManager } from './NetworkManager.js';
10
10
  import { Events as ResourceTreeModelEvents, ResourceTreeModel, } from './ResourceTreeModel.js';
@@ -20,44 +20,48 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
20
20
  function isExtensionInitiator(initiator) {
21
21
  return 'extensionId' in initiator;
22
22
  }
23
- // Used for revealing a resource.
23
+ /** Used for revealing a resource. **/
24
24
  export class ResourceKey {
25
25
  key;
26
26
  constructor(key) {
27
27
  this.key = key;
28
28
  }
29
29
  }
30
- let pageResourceLoader = null;
31
30
  /**
32
31
  * The page resource loader is a bottleneck for all DevTools-initiated resource loads. For each such load, it keeps a
33
32
  * `PageResource` object around that holds meta information. This can be as the basis for reporting to the user which
34
33
  * resources were loaded, and whether there was a load error.
35
34
  */
36
35
  export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
36
+ #targetManager;
37
+ #settings;
38
+ #userAgentProvider;
37
39
  #currentlyLoading = 0;
38
40
  #currentlyLoadingPerTarget = new Map();
39
41
  #maxConcurrentLoads;
40
42
  #pageResources = new Map();
41
43
  #queuedLoads = [];
42
44
  #loadOverride;
43
- constructor(loadOverride, maxConcurrentLoads) {
45
+ constructor(targetManager, settings, userAgentProvider, loadOverride, maxConcurrentLoads = 500) {
44
46
  super();
47
+ this.#targetManager = targetManager;
48
+ this.#settings = settings;
49
+ this.#userAgentProvider = userAgentProvider;
45
50
  this.#maxConcurrentLoads = maxConcurrentLoads;
46
- TargetManager.instance().addModelListener(ResourceTreeModel, ResourceTreeModelEvents.PrimaryPageChanged, this.onPrimaryPageChanged, this);
51
+ this.#targetManager.addModelListener(ResourceTreeModel, ResourceTreeModelEvents.PrimaryPageChanged, this.onPrimaryPageChanged, this);
47
52
  this.#loadOverride = loadOverride;
48
53
  }
49
- static instance({ forceNew, loadOverride, maxConcurrentLoads } = {
54
+ static instance({ forceNew, targetManager, settings, userAgentProvider, loadOverride, maxConcurrentLoads } = {
50
55
  forceNew: false,
51
56
  loadOverride: null,
52
- maxConcurrentLoads: 500,
53
57
  }) {
54
- if (!pageResourceLoader || forceNew) {
55
- pageResourceLoader = new PageResourceLoader(loadOverride, maxConcurrentLoads);
58
+ if (forceNew) {
59
+ Root.DevToolsContext.globalInstance().set(PageResourceLoader, new PageResourceLoader(targetManager ?? TargetManager.instance(), settings ?? Common.Settings.Settings.instance(), userAgentProvider ?? MultitargetNetworkManager.instance(), loadOverride, maxConcurrentLoads));
56
60
  }
57
- return pageResourceLoader;
61
+ return Root.DevToolsContext.globalInstance().get(PageResourceLoader);
58
62
  }
59
63
  static removeInstance() {
60
- pageResourceLoader = null;
64
+ Root.DevToolsContext.globalInstance().delete(PageResourceLoader);
61
65
  }
62
66
  onPrimaryPageChanged(event) {
63
67
  const { frame: mainFrame, type } = event.data;
@@ -85,7 +89,7 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
85
89
  return this.#pageResources;
86
90
  }
87
91
  getScopedResourcesLoaded() {
88
- return new Map([...this.#pageResources].filter(([_, pageResource]) => TargetManager.instance().isInScope(pageResource.initiator.target) ||
92
+ return new Map([...this.#pageResources].filter(([_, pageResource]) => this.#targetManager.isInScope(pageResource.initiator.target) ||
89
93
  isExtensionInitiator(pageResource.initiator)));
90
94
  }
91
95
  /**
@@ -97,11 +101,10 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
97
101
  return { loading: this.#currentlyLoading, queued: this.#queuedLoads.length, resources: this.#pageResources.size };
98
102
  }
99
103
  getScopedNumberOfResources() {
100
- const targetManager = TargetManager.instance();
101
104
  let loadingCount = 0;
102
105
  for (const [targetId, count] of this.#currentlyLoadingPerTarget) {
103
- const target = targetManager.targetById(targetId);
104
- if (targetManager.isInScope(target)) {
106
+ const target = this.#targetManager.targetById(targetId);
107
+ if (this.#targetManager.isInScope(target)) {
105
108
  loadingCount += count;
106
109
  }
107
110
  }
@@ -197,22 +200,15 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
197
200
  return await this.#loadOverride(url);
198
201
  }
199
202
  const parsedURL = new Common.ParsedURL.ParsedURL(url);
200
- const eligibleForLoadFromTarget = getLoadThroughTargetSetting().get() && parsedURL && parsedURL.scheme !== 'file' &&
201
- parsedURL.scheme !== 'data' && parsedURL.scheme !== 'devtools';
203
+ const eligibleForLoadFromTarget = this.getLoadThroughTargetSetting().get() && parsedURL &&
204
+ parsedURL.scheme !== 'file' && parsedURL.scheme !== 'data' && parsedURL.scheme !== 'devtools' &&
205
+ initiator.target;
202
206
  Host.userMetrics.developerResourceScheme(this.getDeveloperResourceScheme(parsedURL));
203
207
  if (eligibleForLoadFromTarget) {
204
208
  try {
205
- if (initiator.target) {
206
- Host.userMetrics.developerResourceLoaded(0 /* Host.UserMetrics.DeveloperResourceLoaded.LOAD_THROUGH_PAGE_VIA_TARGET */);
207
- const result = await this.loadFromTarget(initiator.target, initiator.frameId, url, isBinary);
208
- return result;
209
- }
210
- const frame = FrameManager.instance().getFrame(initiator.frameId);
211
- if (frame) {
212
- Host.userMetrics.developerResourceLoaded(1 /* Host.UserMetrics.DeveloperResourceLoaded.LOAD_THROUGH_PAGE_VIA_FRAME */);
213
- const result = await this.loadFromTarget(frame.resourceTreeModel().target(), initiator.frameId, url, isBinary);
214
- return result;
215
- }
209
+ Host.userMetrics.developerResourceLoaded(0 /* Host.UserMetrics.DeveloperResourceLoaded.LOAD_THROUGH_PAGE_VIA_TARGET */);
210
+ const result = await this.loadFromTarget(initiator.target, initiator.frameId, url, isBinary);
211
+ return result;
216
212
  }
217
213
  catch (e) {
218
214
  if (e instanceof Error) {
@@ -229,12 +225,12 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
229
225
  Host.userMetrics.developerResourceLoaded(3 /* Host.UserMetrics.DeveloperResourceLoaded.LOAD_THROUGH_PAGE_FALLBACK */);
230
226
  }
231
227
  else {
232
- const code = getLoadThroughTargetSetting().get() ?
228
+ const code = this.getLoadThroughTargetSetting().get() ?
233
229
  6 /* Host.UserMetrics.DeveloperResourceLoaded.FALLBACK_PER_PROTOCOL */ :
234
230
  5 /* Host.UserMetrics.DeveloperResourceLoaded.FALLBACK_PER_OVERRIDE */;
235
231
  Host.userMetrics.developerResourceLoaded(code);
236
232
  }
237
- const result = await MultitargetNetworkManager.instance().loadResource(url);
233
+ const result = await this.loadFromHostBindings(url);
238
234
  if (eligibleForLoadFromTarget && !result.success) {
239
235
  Host.userMetrics.developerResourceLoaded(7 /* Host.UserMetrics.DeveloperResourceLoaded.FALLBACK_FAILURE */);
240
236
  }
@@ -269,7 +265,7 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
269
265
  async loadFromTarget(target, frameId, url, isBinary) {
270
266
  const networkManager = target.model(NetworkManager);
271
267
  const ioModel = target.model(IOModel);
272
- const disableCache = Common.Settings.Settings.instance().moduleSetting('cache-disabled').get();
268
+ const disableCache = this.#settings.moduleSetting('cache-disabled').get();
273
269
  const resource = await networkManager.loadNetworkResource(frameId, url, { disableCache, includeCredentials: true });
274
270
  try {
275
271
  const content = resource.stream ?
@@ -294,7 +290,21 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
294
290
  }
295
291
  }
296
292
  }
297
- }
298
- export function getLoadThroughTargetSetting() {
299
- return Common.Settings.Settings.instance().createSetting('load-through-target', true);
293
+ async loadFromHostBindings(url) {
294
+ const headers = {};
295
+ const currentUserAgent = this.#userAgentProvider.currentUserAgent();
296
+ if (currentUserAgent) {
297
+ headers['User-Agent'] = currentUserAgent;
298
+ }
299
+ if (this.#settings.moduleSetting('cache-disabled').get()) {
300
+ headers['Cache-Control'] = 'no-cache';
301
+ }
302
+ const allowRemoteFilePaths = this.#settings.moduleSetting('network.enable-remote-file-loading').get();
303
+ return await new Promise(resolve => Host.ResourceLoader.load(url, headers, (success, _responseHeaders, content, errorDescription) => {
304
+ resolve({ success, content, errorDescription });
305
+ }, allowRemoteFilePaths));
306
+ }
307
+ getLoadThroughTargetSetting() {
308
+ return this.#settings.createSetting('load-through-target', true);
309
+ }
300
310
  }
@@ -6,11 +6,13 @@ import { assertNotNullOrUndefined } from '../platform/platform.js';
6
6
  import { Events as ResourceTreeModelEvents, ResourceTreeModel, } from './ResourceTreeModel.js';
7
7
  import { SDKModel } from './SDKModel.js';
8
8
  import { TargetManager } from './TargetManager.js';
9
- // Holds preloading related information.
10
- //
11
- // - SpeculationRule rule sets
12
- // - Preloading attempts
13
- // - Relationship between rule sets and preloading attempts
9
+ /**
10
+ * Holds preloading related information.
11
+ *
12
+ * - SpeculationRule rule sets
13
+ * - Preloading attempts
14
+ * - Relationship between rule sets and preloading attempts
15
+ **/
14
16
  export class PreloadingModel extends SDKModel {
15
17
  agent;
16
18
  loaderIds = [];
@@ -23,7 +25,7 @@ export class PreloadingModel extends SDKModel {
23
25
  this.agent = target.preloadAgent();
24
26
  void this.agent.invoke_enable();
25
27
  const targetInfo = target.targetInfo();
26
- if (targetInfo !== undefined && targetInfo.subtype === 'prerender') {
28
+ if (targetInfo?.subtype === 'prerender') {
27
29
  this.lastPrimaryPageModel = TargetManager.instance().primaryPageTarget()?.model(PreloadingModel) || null;
28
30
  }
29
31
  TargetManager.instance().addModelListener(ResourceTreeModel, ResourceTreeModelEvents.PrimaryPageChanged, this.onPrimaryPageChanged, this);
@@ -226,15 +228,33 @@ export class PreloadingModel extends SDKModel {
226
228
  onPrerenderStatusUpdated(event) {
227
229
  const loaderId = event.key.loaderId;
228
230
  this.ensureDocumentPreloadingData(loaderId);
229
- const attempt = {
230
- action: "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */,
231
- key: event.key,
232
- pipelineId: event.pipelineId,
233
- status: convertPreloadingStatus(event.status),
234
- prerenderStatus: event.prerenderStatus || null,
235
- disallowedMojoInterface: event.disallowedMojoInterface || null,
236
- mismatchedHeaders: event.mismatchedHeaders || null,
237
- };
231
+ let attempt;
232
+ switch (event.key.action) {
233
+ case "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */:
234
+ attempt = {
235
+ action: event.key.action,
236
+ key: event.key,
237
+ pipelineId: event.pipelineId,
238
+ status: convertPreloadingStatus(event.status),
239
+ prerenderStatus: event.prerenderStatus || null,
240
+ disallowedMojoInterface: event.disallowedMojoInterface || null,
241
+ mismatchedHeaders: event.mismatchedHeaders || null,
242
+ };
243
+ break;
244
+ case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
245
+ attempt = {
246
+ action: event.key.action,
247
+ key: event.key,
248
+ pipelineId: event.pipelineId,
249
+ status: convertPreloadingStatus(event.status),
250
+ prerenderStatus: event.prerenderStatus || null,
251
+ disallowedMojoInterface: event.disallowedMojoInterface || null,
252
+ mismatchedHeaders: event.mismatchedHeaders || null,
253
+ };
254
+ break;
255
+ default:
256
+ throw new Error(`unreachable: event.key.action: ${event.key.action}`);
257
+ }
238
258
  this.documents.get(loaderId)?.preloadingAttempts.upsert(attempt);
239
259
  this.dispatchEventToListeners("ModelUpdated" /* Events.MODEL_UPDATED */);
240
260
  }
@@ -333,6 +353,9 @@ function makePreloadingAttemptId(key) {
333
353
  case "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */:
334
354
  action = 'Prerender';
335
355
  break;
356
+ case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
357
+ action = 'PrerenderUntilScript';
358
+ break;
336
359
  }
337
360
  let targetHint;
338
361
  switch (key.targetHint) {
@@ -364,7 +387,7 @@ export class PreloadPipeline {
364
387
  return new PreloadPipeline(inner);
365
388
  }
366
389
  getOriginallyTriggered() {
367
- const attempt = this.getPrerender() || this.getPrefetch();
390
+ const attempt = this.getPrerender() || this.getPrerenderUntilScript() || this.getPrefetch();
368
391
  assertNotNullOrUndefined(attempt);
369
392
  return attempt;
370
393
  }
@@ -374,7 +397,10 @@ export class PreloadPipeline {
374
397
  getPrerender() {
375
398
  return this.inner.get("Prerender" /* Protocol.Preload.SpeculationAction.Prerender */) || null;
376
399
  }
377
- // Returns attempts in the order: prefetch < prerender.
400
+ getPrerenderUntilScript() {
401
+ return this.inner.get("PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */) || null;
402
+ }
403
+ // Returns attempts in the order: prefetch < prerender_until_script < prerender.
378
404
  // Currently unused.
379
405
  getAttempts() {
380
406
  const ret = [];
@@ -386,6 +412,10 @@ export class PreloadPipeline {
386
412
  if (prerender !== null) {
387
413
  ret.push(prerender);
388
414
  }
415
+ const prerenderUntilScript = this.getPrerenderUntilScript();
416
+ if (prerenderUntilScript !== null) {
417
+ ret.push(prerenderUntilScript);
418
+ }
389
419
  if (ret.length === 0) {
390
420
  throw new Error('unreachable');
391
421
  }
@@ -412,7 +442,9 @@ class PreloadingAttemptRegistry {
412
442
  //
413
443
  // In some cases, browsers automatically triggers preloads. For example, Chrome triggers prefetch
414
444
  // ahead of prerender to prevent multiple fetches in case that the prerender failed due to, e.g.
415
- // use of forbidden mojo APIs. Such prefetch and prerender sit in the same preload pipeline.
445
+ // use of forbidden mojo APIs. Also, a prerender-until-script attempt triggers prefetch as well,
446
+ // and can upgrade to prerender. Such prefetch, prerender-until-script, and prerender sit in the
447
+ // same preload pipeline.
416
448
  //
417
449
  // We regard them as not representative and only show the representative ones to represent
418
450
  // pipelines.
@@ -421,8 +453,10 @@ class PreloadingAttemptRegistry {
421
453
  switch (action) {
422
454
  case "Prefetch" /* Protocol.Preload.SpeculationAction.Prefetch */:
423
455
  return 0;
424
- case "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */:
456
+ case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
425
457
  return 1;
458
+ case "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */:
459
+ return 2;
426
460
  }
427
461
  }
428
462
  // Attempt with status `NOT_TRIGGERED` is a representative of a pipeline.
@@ -525,6 +559,17 @@ class PreloadingAttemptRegistry {
525
559
  mismatchedHeaders: null,
526
560
  };
527
561
  break;
562
+ case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
563
+ attempt = {
564
+ action: "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */,
565
+ key,
566
+ pipelineId: null,
567
+ status: "NotTriggered" /* PreloadingStatus.NOT_TRIGGERED */,
568
+ prerenderStatus: null,
569
+ disallowedMojoInterface: null,
570
+ mismatchedHeaders: null,
571
+ };
572
+ break;
528
573
  }
529
574
  this.map.set(id, attempt);
530
575
  }
@@ -3,6 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
  import * as Common from '../common/common.js';
5
5
  import * as i18n from '../i18n/i18n.js';
6
+ import * as Root from '../root/root.js';
6
7
  import * as EnhancedTraces from './EnhancedTracesParser.js';
7
8
  import { TraceObject } from './TraceObject.js';
8
9
  const UIStrings = {
@@ -21,28 +22,52 @@ const UIStrings = {
21
22
  };
22
23
  const str_ = i18n.i18n.registerUIStrings('core/sdk/RehydratingConnection.ts', UIStrings);
23
24
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
24
- export class RehydratingConnection {
25
+ export class RehydratingConnectionTransport {
25
26
  rehydratingConnectionState = 1 /* RehydratingConnectionState.UNINITIALIZED */;
26
27
  onDisconnect = null;
27
28
  onMessage = null;
28
29
  trace = null;
29
30
  sessions = new Map();
30
31
  #onConnectionLost;
31
- #rehydratingWindow;
32
+ #rehydratingWindow = window;
32
33
  #onReceiveHostWindowPayloadBound = this.onReceiveHostWindowPayload.bind(this);
33
34
  constructor(onConnectionLost) {
34
- // If we're invoking this class, we're in the rehydrating pop-up window. Rename window for clarity.
35
35
  this.#onConnectionLost = onConnectionLost;
36
- this.#rehydratingWindow = window;
37
- this.#setupMessagePassing();
36
+ if (!this.#maybeHandleLoadingFromUrl()) {
37
+ this.#setupMessagePassing();
38
+ }
39
+ }
40
+ /** Returns true if found a trace URL. */
41
+ #maybeHandleLoadingFromUrl() {
42
+ let traceUrl = Root.Runtime.Runtime.queryParam('traceURL');
43
+ if (!traceUrl) {
44
+ // For compatibility, handle the older loadTimelineFromURL.
45
+ const timelineUrl = Root.Runtime.Runtime.queryParam('loadTimelineFromURL');
46
+ if (timelineUrl) {
47
+ // It was double-URI encoded for some reason.
48
+ traceUrl = decodeURIComponent(timelineUrl);
49
+ }
50
+ }
51
+ if (traceUrl) {
52
+ void fetch(traceUrl).then(r => r.arrayBuffer()).then(b => Common.Gzip.arrayBufferToString(b)).then(traceJson => {
53
+ const trace = new TraceObject(JSON.parse(traceJson));
54
+ void this.startHydration(trace);
55
+ });
56
+ return true;
57
+ }
58
+ return false;
38
59
  }
39
60
  #setupMessagePassing() {
40
61
  this.#rehydratingWindow.addEventListener('message', this.#onReceiveHostWindowPayloadBound);
41
- if (!this.#rehydratingWindow.opener) {
62
+ if (this.#rehydratingWindow.opener) {
63
+ this.#rehydratingWindow.opener.postMessage({ type: 'REHYDRATING_WINDOW_READY' });
64
+ }
65
+ else if (this.#rehydratingWindow !== window.top) {
66
+ this.#rehydratingWindow.parent.postMessage({ type: 'REHYDRATING_IFRAME_READY' }, '*');
67
+ }
68
+ else {
42
69
  this.#onConnectionLost(i18nString(UIStrings.noHostWindow));
43
- return;
44
70
  }
45
- this.#rehydratingWindow.opener.postMessage({ type: 'REHYDRATING_WINDOW_READY' });
46
71
  }
47
72
  /**
48
73
  * This is a callback for rehydrated session to receive payload from host window. Payload includes but not limited to
@@ -83,6 +108,7 @@ export class RehydratingConnection {
83
108
  const target = hydratingDataPerTarget.target;
84
109
  const executionContexts = hydratingDataPerTarget.executionContexts;
85
110
  const scripts = hydratingDataPerTarget.scripts;
111
+ const resources = hydratingDataPerTarget.resources;
86
112
  this.postToFrontend({
87
113
  method: 'Target.targetCreated',
88
114
  params: {
@@ -97,7 +123,7 @@ export class RehydratingConnection {
97
123
  },
98
124
  });
99
125
  sessionId += 1;
100
- const session = new RehydratingSession(sessionId, target, executionContexts, scripts, this);
126
+ const session = new RehydratingSession(sessionId, target, executionContexts, scripts, resources, this);
101
127
  this.sessions.set(sessionId, session);
102
128
  session.declareSessionAttachedToTarget();
103
129
  }
@@ -157,14 +183,18 @@ export class RehydratingConnection {
157
183
  return Promise.reject();
158
184
  }
159
185
  }
160
- // Default rehydrating session with default responses.
186
+ /** Default rehydrating session with default responses. **/
161
187
  class RehydratingSessionBase {
162
188
  connection = null;
163
189
  constructor(connection) {
164
190
  this.connection = connection;
165
191
  }
166
192
  sendMessageToFrontend(payload) {
167
- this.connection?.postToFrontend(payload);
193
+ // The frontend doesn't expect CDP responses within the same synchronous event loop, so it breaks unexpectedly.
194
+ // Any async boundary will do, so we use setTimeout.
195
+ setTimeout(() => {
196
+ this.connection?.postToFrontend(payload);
197
+ });
168
198
  }
169
199
  handleFrontendMessageAsFakeCDPAgent(data) {
170
200
  // Send default response in default session.
@@ -179,12 +209,14 @@ export class RehydratingSession extends RehydratingSessionBase {
179
209
  target;
180
210
  executionContexts = [];
181
211
  scripts = [];
182
- constructor(sessionId, target, executionContexts, scripts, connection) {
212
+ resources = [];
213
+ constructor(sessionId, target, executionContexts, scripts, resources, connection) {
183
214
  super(connection);
184
215
  this.sessionId = sessionId;
185
216
  this.target = target;
186
217
  this.executionContexts = executionContexts;
187
218
  this.scripts = scripts;
219
+ this.resources = resources;
188
220
  }
189
221
  sendMessageToFrontend(payload, attachSessionId = true) {
190
222
  // Attach the session's Id to the message.
@@ -201,12 +233,31 @@ export class RehydratingSession extends RehydratingSessionBase {
201
233
  case 'Debugger.enable':
202
234
  this.handleDebuggerEnable(data.id);
203
235
  break;
236
+ case 'CSS.enable':
237
+ this.sendMessageToFrontend({
238
+ id: data.id,
239
+ result: {},
240
+ });
241
+ break;
204
242
  case 'Debugger.getScriptSource':
205
243
  if (data.params) {
206
244
  const params = data.params;
207
245
  this.handleDebuggerGetScriptSource(data.id, params.scriptId);
208
246
  }
209
247
  break;
248
+ case 'Page.getResourceTree':
249
+ this.handleGetResourceTree(data.id);
250
+ break;
251
+ case 'Page.getResourceContent': {
252
+ const request = data.params;
253
+ this.handleGetResourceContent(request.frameId, request.url, data.id);
254
+ break;
255
+ }
256
+ case 'CSS.getStyleSheetText': {
257
+ const request = data.params;
258
+ this.handleGetStyleSheetText(request.styleSheetId, data.id);
259
+ break;
260
+ }
210
261
  default:
211
262
  this.sendMessageToFrontend({
212
263
  id: data.id,
@@ -269,7 +320,20 @@ export class RehydratingSession extends RehydratingSessionBase {
269
320
  // script parsed event to communicate the current script state and respond with a mock
270
321
  // debugger id.
271
322
  handleDebuggerEnable(id) {
323
+ const htmlResourceUrls = new Set(this.resources.filter(r => r.mimeType === 'text/html').map(r => r.url));
272
324
  for (const script of this.scripts) {
325
+ // Handle inline scripts.
326
+ if (htmlResourceUrls.has(script.url)) {
327
+ script.embedderName = script.url;
328
+ // We don't have the actual embedded offset from this trace event. Non-zero
329
+ // values are important though: that is what `Script.isInlineScript()`
330
+ // checks. Otherwise these scripts would try to show individually within the
331
+ // Sources panel.
332
+ script.startColumn = 1;
333
+ script.startLine = 1;
334
+ script.endColumn = 1;
335
+ script.endLine = 1;
336
+ }
273
337
  this.sendMessageToFrontend({
274
338
  method: 'Debugger.scriptParsed',
275
339
  params: script,
@@ -283,4 +347,67 @@ export class RehydratingSession extends RehydratingSessionBase {
283
347
  },
284
348
  });
285
349
  }
350
+ handleGetResourceTree(id) {
351
+ const resources = this.resources.filter(r => r.mimeType === 'text/html' || r.mimeType === 'text/css');
352
+ if (!resources.length) {
353
+ return;
354
+ }
355
+ const frameTree = {
356
+ frame: {
357
+ id: this.target.targetId,
358
+ url: this.target.url,
359
+ },
360
+ childFrames: [],
361
+ resources: resources.map(r => ({
362
+ url: r.url,
363
+ type: r.mimeType === 'text/html' ? 'Document' : 'Stylesheet',
364
+ mimeType: r.mimeType,
365
+ contentSize: r.content.length,
366
+ })),
367
+ };
368
+ this.sendMessageToFrontend({
369
+ id,
370
+ result: {
371
+ frameTree,
372
+ },
373
+ });
374
+ const stylesheets = this.resources.filter(r => r.mimeType === 'text/css');
375
+ for (const stylesheet of stylesheets) {
376
+ this.sendMessageToFrontend({
377
+ method: 'CSS.styleSheetAdded',
378
+ params: {
379
+ header: {
380
+ styleSheetId: `sheet.${stylesheet.frame}.${stylesheet.url}`,
381
+ frameId: stylesheet.frame,
382
+ sourceURL: stylesheet.url,
383
+ },
384
+ },
385
+ });
386
+ }
387
+ }
388
+ handleGetResourceContent(frame, url, id) {
389
+ const resource = this.resources.find(r => r.frame === frame && r.url === url);
390
+ if (!resource) {
391
+ return;
392
+ }
393
+ this.sendMessageToFrontend({
394
+ id,
395
+ result: {
396
+ content: resource.content,
397
+ base64Encoded: false,
398
+ },
399
+ });
400
+ }
401
+ handleGetStyleSheetText(stylesheetId, id) {
402
+ const resource = this.resources.find(r => `sheet.${r.frame}.${r.url}` === stylesheetId);
403
+ if (!resource) {
404
+ return;
405
+ }
406
+ this.sendMessageToFrontend({
407
+ id,
408
+ result: {
409
+ text: resource.content,
410
+ },
411
+ });
412
+ }
286
413
  }
@@ -1,7 +1,7 @@
1
1
  // Copyright 2009 The Chromium Authors
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
- // This cannot be an interface due to "instanceof RemoteObject" checks in the code.
4
+ /** This cannot be an interface due to "instanceof RemoteObject" checks in the code. **/
5
5
  export class RemoteObject {
6
6
  static fromLocalObject(value) {
7
7
  return new LocalJSONObject(value);
@@ -665,6 +665,9 @@ export class LocalJSONObject extends RemoteObject {
665
665
  if (this.#value instanceof Date) {
666
666
  return 'date';
667
667
  }
668
+ if (this.#value instanceof Error) {
669
+ return 'error';
670
+ }
668
671
  return undefined;
669
672
  }
670
673
  get hasChildren() {
@@ -764,7 +767,7 @@ export class RemoteArray {
764
767
  this.#object = object;
765
768
  }
766
769
  static objectAsArray(object) {
767
- if (!object || object.type !== 'object' || (object.subtype !== 'array' && object.subtype !== 'typedarray')) {
770
+ if (object?.type !== 'object' || (object.subtype !== 'array' && object.subtype !== 'typedarray')) {
768
771
  throw new Error('Object is empty or not an array');
769
772
  }
770
773
  return new RemoteArray(object);