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
@@ -7,14 +7,14 @@ import { CSSProperty } from './CSSProperty.js';
7
7
  export class CSSStyleDeclaration {
8
8
  #cssModel;
9
9
  parentRule;
10
- #allProperties;
10
+ #allProperties = [];
11
11
  styleSheetId;
12
- range;
12
+ range = null;
13
13
  cssText;
14
14
  #shorthandValues = new Map();
15
15
  #shorthandIsImportant = new Set();
16
16
  #activePropertyMap = new Map();
17
- #leadingProperties;
17
+ #leadingProperties = null;
18
18
  type;
19
19
  // For CSSStyles coming from animations,
20
20
  // This holds the name of the animation.
@@ -82,7 +82,7 @@ export class CSSStyleDeclaration {
82
82
  this.#generateSyntheticPropertiesIfNeeded();
83
83
  this.#computeInactiveProperties();
84
84
  // TODO(changhaohan): verify if this #activePropertyMap is still necessary, or if it is
85
- // providing different information against the activeness in allPropertiesInternal.
85
+ // providing different information against the activeness in #allProperties.
86
86
  this.#activePropertyMap = new Map();
87
87
  for (const property of this.#allProperties) {
88
88
  if (!property.activeInStyle()) {
@@ -4,11 +4,11 @@
4
4
  import * as i18n from '../../core/i18n/i18n.js';
5
5
  import * as Common from '../common/common.js';
6
6
  import * as Host from '../host/host.js';
7
- import { ParallelConnection } from './Connections.js';
8
7
  import { ResourceTreeModel } from './ResourceTreeModel.js';
9
8
  import { SDKModel } from './SDKModel.js';
9
+ import { SecurityOriginManager } from './SecurityOriginManager.js';
10
+ import { StorageKeyManager } from './StorageKeyManager.js';
10
11
  import { Type } from './Target.js';
11
- import { TargetManager } from './TargetManager.js';
12
12
  const UIStrings = {
13
13
  /**
14
14
  * @description Text that refers to the main target. The main target is the primary webpage that
@@ -27,7 +27,6 @@ export class ChildTargetManager extends SDKModel {
27
27
  #targetInfos = new Map();
28
28
  #childTargetsBySessionId = new Map();
29
29
  #childTargetsById = new Map();
30
- #parallelConnections = new Map();
31
30
  #parentTargetId = null;
32
31
  constructor(parentTarget) {
33
32
  super(parentTarget);
@@ -107,7 +106,7 @@ export class ChildTargetManager extends SDKModel {
107
106
  }
108
107
  }
109
108
  fireAvailableTargetsChanged() {
110
- TargetManager.instance().dispatchEventToListeners("AvailableTargetsChanged" /* TargetManagerEvents.AVAILABLE_TARGETS_CHANGED */, [...this.#targetInfos.values()]);
109
+ this.#targetManager.dispatchEventToListeners("AvailableTargetsChanged" /* TargetManagerEvents.AVAILABLE_TARGETS_CHANGED */, [...this.#targetInfos.values()]);
111
110
  }
112
111
  async getParentTargetId() {
113
112
  if (!this.#parentTargetId) {
@@ -154,6 +153,9 @@ export class ChildTargetManager extends SDKModel {
154
153
  else if (targetInfo.type === 'page') {
155
154
  type = Type.FRAME;
156
155
  }
156
+ else if (targetInfo.type === 'browser_ui') {
157
+ type = Type.FRAME;
158
+ }
157
159
  else if (targetInfo.type === 'worker') {
158
160
  type = Type.Worker;
159
161
  }
@@ -186,44 +188,46 @@ export class ChildTargetManager extends SDKModel {
186
188
  if (waitingForDebugger) {
187
189
  void target.runtimeAgent().invoke_runIfWaitingForDebugger();
188
190
  }
191
+ // For top-level workers (those not attached to a frame), we need to
192
+ // initialize their storage context manually. The `Capability.STORAGE` is
193
+ // only granted in `Target.ts` to workers that are not parented by a frame,
194
+ // which makes this check safe. Frame-associated workers have their storage
195
+ // managed by ResourceTreeModel.
196
+ if (type !== Type.FRAME && target.hasAllCapabilities(8192 /* Capability.STORAGE */)) {
197
+ await this.initializeStorage(target);
198
+ }
199
+ }
200
+ async initializeStorage(target) {
201
+ const storageAgent = target.storageAgent();
202
+ const response = await storageAgent.invoke_getStorageKey({});
203
+ const storageKey = response.storageKey;
204
+ if (response.getError() || !storageKey) {
205
+ console.error(`Failed to get storage key for target ${target.id()}: ${response.getError()}`);
206
+ return;
207
+ }
208
+ const storageKeyManager = target.model(StorageKeyManager);
209
+ if (storageKeyManager) {
210
+ storageKeyManager.setMainStorageKey(storageKey);
211
+ storageKeyManager.updateStorageKeys(new Set([storageKey]));
212
+ }
213
+ const securityOriginManager = target.model(SecurityOriginManager);
214
+ if (securityOriginManager) {
215
+ const origin = new URL(storageKey).origin;
216
+ securityOriginManager.setMainSecurityOrigin(origin, '');
217
+ securityOriginManager.updateSecurityOrigins(new Set([origin]));
218
+ }
189
219
  }
190
220
  detachedFromTarget({ sessionId }) {
191
- if (this.#parallelConnections.has(sessionId)) {
192
- this.#parallelConnections.delete(sessionId);
193
- }
194
- else {
195
- const target = this.#childTargetsBySessionId.get(sessionId);
196
- if (target) {
197
- target.dispose('target terminated');
198
- this.#childTargetsBySessionId.delete(sessionId);
199
- this.#childTargetsById.delete(target.id());
200
- }
221
+ const target = this.#childTargetsBySessionId.get(sessionId);
222
+ if (target) {
223
+ target.dispose('target terminated');
224
+ this.#childTargetsBySessionId.delete(sessionId);
225
+ this.#childTargetsById.delete(target.id());
201
226
  }
202
227
  }
203
228
  receivedMessageFromTarget({}) {
204
229
  // We use flatten protocol.
205
230
  }
206
- async createParallelConnection(onMessage) {
207
- // The main Target id is actually just `main`, instead of the real targetId.
208
- // Get the real id (requires an async operation) so that it can be used synchronously later.
209
- const targetId = await this.getParentTargetId();
210
- const { connection, sessionId } = await this.createParallelConnectionAndSessionForTarget(this.#parentTarget, targetId);
211
- connection.setOnMessage(onMessage);
212
- this.#parallelConnections.set(sessionId, connection);
213
- return { connection, sessionId };
214
- }
215
- async createParallelConnectionAndSessionForTarget(target, targetId) {
216
- const targetAgent = target.targetAgent();
217
- const targetRouter = target.router();
218
- const sessionId = (await targetAgent.invoke_attachToTarget({ targetId, flatten: true })).sessionId;
219
- const connection = new ParallelConnection(targetRouter.connection(), sessionId);
220
- targetRouter.registerSession(target, sessionId, connection);
221
- connection.setOnDisconnect(() => {
222
- targetRouter.unregisterSession(sessionId);
223
- void targetAgent.invoke_detachFromTarget({ sessionId });
224
- });
225
- return { connection, sessionId };
226
- }
227
231
  targetInfos() {
228
232
  return Array.from(this.#targetInfos.values());
229
233
  }
@@ -6,7 +6,7 @@ import * as Common from '../common/common.js';
6
6
  import * as Host from '../host/host.js';
7
7
  import * as ProtocolClient from '../protocol_client/protocol_client.js';
8
8
  import * as Root from '../root/root.js';
9
- import { RehydratingConnection } from './RehydratingConnection.js';
9
+ import { RehydratingConnectionTransport } from './RehydratingConnection.js';
10
10
  const UIStrings = {
11
11
  /**
12
12
  * @description Text on the remote debugging window to indicate the connection is lost
@@ -66,7 +66,7 @@ export class MainConnection {
66
66
  }
67
67
  }
68
68
  }
69
- export class WebSocketConnection {
69
+ export class WebSocketTransport {
70
70
  #socket;
71
71
  onMessage = null;
72
72
  #onDisconnect = null;
@@ -150,7 +150,7 @@ export class WebSocketConnection {
150
150
  });
151
151
  }
152
152
  }
153
- export class StubConnection {
153
+ export class StubTransport {
154
154
  onMessage = null;
155
155
  #onDisconnect = null;
156
156
  setOnMessage(onMessage) {
@@ -166,7 +166,7 @@ export class StubConnection {
166
166
  const messageObject = JSON.parse(message);
167
167
  const error = {
168
168
  message: 'This is a stub connection, can\'t dispatch message.',
169
- code: ProtocolClient.InspectorBackend.DevToolsStubErrorCode,
169
+ code: ProtocolClient.CDPConnection.CDPErrorStatus.DEVTOOLS_STUB_ERROR,
170
170
  data: messageObject,
171
171
  };
172
172
  if (this.onMessage) {
@@ -181,62 +181,25 @@ export class StubConnection {
181
181
  this.onMessage = null;
182
182
  }
183
183
  }
184
- export class ParallelConnection {
185
- #connection;
186
- #sessionId;
187
- onMessage = null;
188
- #onDisconnect = null;
189
- constructor(connection, sessionId) {
190
- this.#connection = connection;
191
- this.#sessionId = sessionId;
192
- }
193
- setOnMessage(onMessage) {
194
- this.onMessage = onMessage;
195
- }
196
- setOnDisconnect(onDisconnect) {
197
- this.#onDisconnect = onDisconnect;
198
- }
199
- getOnDisconnect() {
200
- return this.#onDisconnect;
201
- }
202
- sendRawMessage(message) {
203
- const messageObject = JSON.parse(message);
204
- // If the message isn't for a specific session, it must be for the root session.
205
- if (!messageObject.sessionId) {
206
- messageObject.sessionId = this.#sessionId;
207
- }
208
- this.#connection.sendRawMessage(JSON.stringify(messageObject));
209
- }
210
- getSessionId() {
211
- return this.#sessionId;
212
- }
213
- async disconnect() {
214
- if (this.#onDisconnect) {
215
- this.#onDisconnect.call(null, 'force disconnect');
216
- }
217
- this.#onDisconnect = null;
218
- this.onMessage = null;
219
- }
220
- }
221
184
  export async function initMainConnection(createRootTarget, onConnectionLost) {
222
- ProtocolClient.InspectorBackend.Connection.setFactory(createMainConnection.bind(null, onConnectionLost));
185
+ ProtocolClient.ConnectionTransport.ConnectionTransport.setFactory(createMainTransport.bind(null, onConnectionLost));
223
186
  await createRootTarget();
224
187
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.connectionReady();
225
188
  }
226
- function createMainConnection(onConnectionLost) {
227
- if (Root.Runtime.getPathName().includes('rehydrated_devtools_app')) {
228
- return new RehydratingConnection(onConnectionLost);
189
+ function createMainTransport(onConnectionLost) {
190
+ if (Root.Runtime.Runtime.isTraceApp()) {
191
+ return new RehydratingConnectionTransport(onConnectionLost);
229
192
  }
230
193
  const wsParam = Root.Runtime.Runtime.queryParam('ws');
231
194
  const wssParam = Root.Runtime.Runtime.queryParam('wss');
232
195
  if (wsParam || wssParam) {
233
196
  const ws = (wsParam ? `ws://${wsParam}` : `wss://${wssParam}`);
234
- return new WebSocketConnection(ws, onConnectionLost);
197
+ return new WebSocketTransport(ws, onConnectionLost);
235
198
  }
236
199
  const notEmbeddedOrWs = Host.InspectorFrontendHost.InspectorFrontendHostInstance.isHostedMode();
237
200
  if (notEmbeddedOrWs) {
238
201
  // eg., hosted mode (e.g. `http://localhost:9222/devtools/inspector.html`) without a WebSocket URL,
239
- return new StubConnection();
202
+ return new StubTransport();
240
203
  }
241
204
  return new MainConnection();
242
205
  }
@@ -340,7 +340,7 @@ export class ConsoleModel extends SDKModel {
340
340
  const globalObject = result.object;
341
341
  const callFunctionResult = await globalObject.callFunction(saveVariable, [RemoteObject.toCallArgument(remoteObject)]);
342
342
  globalObject.release();
343
- if (callFunctionResult.wasThrown || !callFunctionResult.object || callFunctionResult.object.type !== 'string') {
343
+ if (callFunctionResult.wasThrown || callFunctionResult.object?.type !== 'string') {
344
344
  failedToSave(callFunctionResult.object || null);
345
345
  }
346
346
  else {
@@ -227,7 +227,7 @@ export class Cookie {
227
227
  // extension cookie tests currently use the funtionality, and if we
228
228
  // ever decide to implement that it should be done by preventing
229
229
  // such cookies from being set.
230
- if (!domain || domain[0] !== '.') {
230
+ if (domain?.[0] !== '.') {
231
231
  return false;
232
232
  }
233
233
  // The host with a "." prefixed.
@@ -12,7 +12,7 @@ import { 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';
15
- // Keep this list in sync with https://w3c.github.io/aria/#state_prop_def
15
+ /** Keep this list in sync with https://w3c.github.io/aria/#state_prop_def **/
16
16
  export const ARIA_ATTRIBUTES = new Set([
17
17
  'role',
18
18
  'aria-activedescendant',
@@ -88,6 +88,7 @@ export class DOMNode {
88
88
  #xmlVersion;
89
89
  #isSVGNode;
90
90
  #isScrollable;
91
+ #affectedByStartingStyles;
91
92
  #creationStackTrace = null;
92
93
  #pseudoElements = new Map();
93
94
  #distributedNodes = [];
@@ -148,6 +149,7 @@ export class DOMNode {
148
149
  this.#xmlVersion = payload.xmlVersion;
149
150
  this.#isSVGNode = Boolean(payload.isSVG);
150
151
  this.#isScrollable = Boolean(payload.isScrollable);
152
+ this.#affectedByStartingStyles = Boolean(payload.affectedByStartingStyles);
151
153
  this.#retainedNodes = retainedNodes;
152
154
  if (this.#retainedNodes?.has(this.backendNodeId())) {
153
155
  this.retained = true;
@@ -237,6 +239,9 @@ export class DOMNode {
237
239
  isScrollable() {
238
240
  return this.#isScrollable;
239
241
  }
242
+ affectedByStartingStyles() {
243
+ return this.#affectedByStartingStyles;
244
+ }
240
245
  isMediaNode() {
241
246
  return this.#nodeName === 'AUDIO' || this.#nodeName === 'VIDEO';
242
247
  }
@@ -279,6 +284,9 @@ export class DOMNode {
279
284
  setIsScrollable(isScrollable) {
280
285
  this.#isScrollable = isScrollable;
281
286
  }
287
+ setAffectedByStartingStyles(affectedByStartingStyles) {
288
+ this.#affectedByStartingStyles = affectedByStartingStyles;
289
+ }
282
290
  hasAttributes() {
283
291
  return this.#attributes.size > 0;
284
292
  }
@@ -373,6 +381,9 @@ export class DOMNode {
373
381
  isInShadowTree() {
374
382
  return this.#isInShadowTree;
375
383
  }
384
+ getTreeRoot() {
385
+ return this.isShadowRoot() ? this : (this.ancestorShadowRoot() ?? this.ownerDocument ?? this);
386
+ }
376
387
  ancestorShadowHost() {
377
388
  const ancestorShadowRoot = this.ancestorShadowRoot();
378
389
  return ancestorShadowRoot ? ancestorShadowRoot.parentNode : null;
@@ -498,6 +509,7 @@ export class DOMNode {
498
509
  });
499
510
  }
500
511
  async getSubtree(depth, pierce) {
512
+ console.assert(depth > 0, 'Do not fetch an infinite subtree to avoid crashing the renderer for large documents');
501
513
  const response = await this.#agent.invoke_requestChildNodes({ nodeId: this.id, depth, pierce });
502
514
  return response.getError() ? null : this.childrenInternal;
503
515
  }
@@ -595,7 +607,7 @@ export class DOMNode {
595
607
  continue;
596
608
  }
597
609
  const oldAttribute = oldAttributesMap.get(name);
598
- if (!oldAttribute || oldAttribute.value !== value) {
610
+ if (oldAttribute?.value !== value) {
599
611
  attributesChanged = true;
600
612
  }
601
613
  }
@@ -1327,6 +1339,14 @@ export class DOMModel extends SDKModel {
1327
1339
  node.setIsScrollable(isScrollable);
1328
1340
  this.dispatchEventToListeners(Events.ScrollableFlagUpdated, { node });
1329
1341
  }
1342
+ affectedByStartingStylesFlagUpdated(nodeId, affectedByStartingStyles) {
1343
+ const node = this.nodeForId(nodeId);
1344
+ if (!node || node.affectedByStartingStyles() === affectedByStartingStyles) {
1345
+ return;
1346
+ }
1347
+ node.setAffectedByStartingStyles(affectedByStartingStyles);
1348
+ this.dispatchEventToListeners(Events.AffectedByStartingStylesFlagUpdated, { node });
1349
+ }
1330
1350
  topLayerElementsUpdated() {
1331
1351
  this.dispatchEventToListeners(Events.TopLayerElementsChanged);
1332
1352
  }
@@ -1396,7 +1416,7 @@ export class DOMModel extends SDKModel {
1396
1416
  return null;
1397
1417
  }
1398
1418
  const { nodeIds } = await this.agent.invoke_getSearchResults({ searchId: this.#searchId, fromIndex: index, toIndex: index + 1 });
1399
- return nodeIds && nodeIds.length === 1 ? this.nodeForId(nodeIds[0]) : null;
1419
+ return nodeIds?.length === 1 ? this.nodeForId(nodeIds[0]) : null;
1400
1420
  }
1401
1421
  cancelSearch() {
1402
1422
  if (!this.#searchId) {
@@ -1478,6 +1498,7 @@ export var Events;
1478
1498
  Events["MarkersChanged"] = "MarkersChanged";
1479
1499
  Events["TopLayerElementsChanged"] = "TopLayerElementsChanged";
1480
1500
  Events["ScrollableFlagUpdated"] = "ScrollableFlagUpdated";
1501
+ Events["AffectedByStartingStylesFlagUpdated"] = "AffectedByStartingStylesFlagUpdated";
1481
1502
  /* eslint-enable @typescript-eslint/naming-convention */
1482
1503
  })(Events || (Events = {}));
1483
1504
  class DOMDispatcher {
@@ -1485,6 +1506,9 @@ class DOMDispatcher {
1485
1506
  constructor(domModel) {
1486
1507
  this.#domModel = domModel;
1487
1508
  }
1509
+ adoptedStyleSheetsModified(_params) {
1510
+ // TODO: implementation
1511
+ }
1488
1512
  documentUpdated() {
1489
1513
  this.#domModel.documentUpdated();
1490
1514
  }
@@ -1533,7 +1557,8 @@ class DOMDispatcher {
1533
1557
  scrollableFlagUpdated({ nodeId, isScrollable }) {
1534
1558
  this.#domModel.scrollableFlagUpdated(nodeId, isScrollable);
1535
1559
  }
1536
- affectedByStartingStylesFlagUpdated(_) {
1560
+ affectedByStartingStylesFlagUpdated({ nodeId, affectedByStartingStyles }) {
1561
+ this.#domModel.affectedByStartingStylesFlagUpdated(nodeId, affectedByStartingStyles);
1537
1562
  }
1538
1563
  }
1539
1564
  let domModelUndoStackInstance = null;
@@ -2,17 +2,15 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
  import * as Common from '../common/common.js';
5
- import * as Host from '../host/host.js';
6
5
  import * as i18n from '../i18n/i18n.js';
7
- import * as Platform from '../platform/platform.js';
8
6
  import * as Root from '../root/root.js';
9
7
  import { RemoteObjectProperty, ScopeRef } from './RemoteObject.js';
10
8
  import { Events as ResourceTreeModelEvents, ResourceTreeModel } from './ResourceTreeModel.js';
11
9
  import { RuntimeModel } from './RuntimeModel.js';
12
10
  import { Script } from './Script.js';
13
11
  import { SDKModel } from './SDKModel.js';
12
+ import { SourceMap } from './SourceMap.js';
14
13
  import { SourceMapManager } from './SourceMapManager.js';
15
- import { Type } from './Target.js';
16
14
  const UIStrings = {
17
15
  /**
18
16
  * @description Title of a section in the debugger showing local JavaScript variables.
@@ -146,7 +144,7 @@ export class DebuggerModel extends SDKModel {
146
144
  target.registerDebuggerDispatcher(new DebuggerDispatcher(this));
147
145
  this.agent = target.debuggerAgent();
148
146
  this.#runtimeModel = target.model(RuntimeModel);
149
- this.#sourceMapManager = new SourceMapManager(target);
147
+ this.#sourceMapManager = new SourceMapManager(target, (compiledURL, sourceMappingURL, payload, script) => new SourceMap(compiledURL, sourceMappingURL, payload, script));
150
148
  Common.Settings.Settings.instance()
151
149
  .moduleSetting('pause-on-exception-enabled')
152
150
  .addChangeListener(this.pauseOnExceptionStateChanged, this);
@@ -385,17 +383,6 @@ export class DebuggerModel extends SDKModel {
385
383
  void this.agent.invoke_pause();
386
384
  }
387
385
  async setBreakpointByURL(url, lineNumber, columnNumber, condition) {
388
- // Convert file url to node-js path.
389
- let urlRegex;
390
- if (this.target().type() === Type.NODE && Common.ParsedURL.schemeIs(url, 'file:')) {
391
- const platformPath = Common.ParsedURL.ParsedURL.urlToRawPathString(url, Host.Platform.isWin());
392
- urlRegex =
393
- `${Platform.StringUtilities.escapeForRegExp(platformPath)}|${Platform.StringUtilities.escapeForRegExp(url)}`;
394
- if (Host.Platform.isWin() && platformPath.match(/^.:\\/)) {
395
- // Match upper or lower case drive letter
396
- urlRegex = `[${platformPath[0].toUpperCase()}${platformPath[0].toLowerCase()}]` + urlRegex.substr(1);
397
- }
398
- }
399
386
  // Adjust column if needed.
400
387
  let minColumnNumber = 0;
401
388
  const scripts = this.#scriptsBySourceURL.get(url) || [];
@@ -408,8 +395,7 @@ export class DebuggerModel extends SDKModel {
408
395
  columnNumber = Math.max(columnNumber || 0, minColumnNumber);
409
396
  const response = await this.agent.invoke_setBreakpointByUrl({
410
397
  lineNumber,
411
- url: urlRegex ? undefined : url,
412
- urlRegex,
398
+ url,
413
399
  columnNumber,
414
400
  condition,
415
401
  });
@@ -733,7 +719,7 @@ export class DebuggerModel extends SDKModel {
733
719
  let functionName = null;
734
720
  if (response.properties) {
735
721
  for (const prop of response.properties) {
736
- if (prop.name === 'name' && prop.value && prop.value.type === 'string') {
722
+ if (prop.name === 'name' && prop.value?.type === 'string') {
737
723
  functionName = prop.value;
738
724
  }
739
725
  }
@@ -1088,14 +1074,13 @@ export class Scope {
1088
1074
  #name;
1089
1075
  #ordinal;
1090
1076
  #locationRange;
1091
- #object;
1077
+ #object = null;
1092
1078
  constructor(callFrame, ordinal) {
1093
1079
  this.#callFrame = callFrame;
1094
1080
  this.#payload = callFrame.getPayload().scopeChain[ordinal];
1095
1081
  this.#type = this.#payload.type;
1096
1082
  this.#name = this.#payload.name;
1097
1083
  this.#ordinal = ordinal;
1098
- this.#object = null;
1099
1084
  const start = this.#payload.startLocation ? Location.fromPayload(callFrame.debuggerModel, this.#payload.startLocation) : null;
1100
1085
  const end = this.#payload.endLocation ? Location.fromPayload(callFrame.debuggerModel, this.#payload.endLocation) : null;
1101
1086
  if (start && end && start.scriptId === end.scriptId) {
@@ -14,6 +14,7 @@ export class EnhancedTracesParser {
14
14
  #targets = [];
15
15
  #executionContexts = [];
16
16
  #scripts = [];
17
+ #resources = [];
17
18
  static enhancedTraceVersion = 1;
18
19
  constructor(trace) {
19
20
  this.#trace = trace;
@@ -34,6 +35,9 @@ export class EnhancedTracesParser {
34
35
  if (frame.url === 'about:blank') {
35
36
  continue;
36
37
  }
38
+ if (!frame.isInPrimaryMainFrame) {
39
+ continue;
40
+ }
37
41
  const frameId = frame.frame;
38
42
  if (!this.#targets.find(target => target.targetId === frameId)) {
39
43
  const frameType = frame.isOutermostMainFrame ? 'page' : 'iframe';
@@ -184,7 +188,8 @@ export class EnhancedTracesParser {
184
188
  // this fake event. Would avoid a lot of wasteful (de)serialization. Maybe add SDK.Script.hydratedSourceMap.
185
189
  this.resolveSourceMap(script);
186
190
  }
187
- return this.groupContextsAndScriptsUnderTarget(this.#targets, this.#executionContexts, this.#scripts);
191
+ this.#resources = this.#trace.metadata.resources ?? [];
192
+ return this.groupContextsAndScriptsUnderTarget(this.#targets, this.#executionContexts, this.#scripts, this.#resources);
188
193
  }
189
194
  resolveSourceMap(script) {
190
195
  if (script.sourceMapURL?.startsWith('data:')) {
@@ -253,7 +258,7 @@ export class EnhancedTracesParser {
253
258
  isFunctionCallEvent(event) {
254
259
  return this.isTraceEvent(event) && event.cat === 'devtools.timeline' && event.name === 'FunctionCall';
255
260
  }
256
- groupContextsAndScriptsUnderTarget(targets, executionContexts, scripts) {
261
+ groupContextsAndScriptsUnderTarget(targets, executionContexts, scripts, resources) {
257
262
  const data = [];
258
263
  const targetIds = new Set();
259
264
  const targetToExecutionContexts = new Map();
@@ -262,11 +267,13 @@ export class EnhancedTracesParser {
262
267
  const executionContextIsolateToTarget = new Map();
263
268
  const targetToScripts = new Map();
264
269
  const orphanScripts = [];
270
+ const targetToResources = new Map();
265
271
  // Initialize all the mapping needed
266
272
  for (const target of targets) {
267
273
  targetIds.add(target.targetId);
268
274
  targetToExecutionContexts.set(target.targetId, []);
269
275
  targetToScripts.set(target.targetId, []);
276
+ targetToResources.set(target.targetId, []);
270
277
  }
271
278
  // Put all of the known execution contexts under respective targets
272
279
  for (const executionContext of executionContexts) {
@@ -318,12 +325,19 @@ export class EnhancedTracesParser {
318
325
  console.error('Script can\'t be linked to any target', orphanScript);
319
326
  }
320
327
  }
328
+ for (const resource of resources) {
329
+ const frameId = resource.frame;
330
+ if (targetIds.has(frameId)) {
331
+ targetToResources.get(frameId)?.push(resource);
332
+ }
333
+ }
321
334
  // Now all the scripts are linked to a target, we want to make sure all the scripts are pointing to a valid
322
335
  // execution context. If not, we will create an artificial execution context for the script
323
336
  for (const target of targets) {
324
337
  const targetId = target.targetId;
325
338
  const executionContexts = targetToExecutionContexts.get(targetId) || [];
326
339
  const scripts = targetToScripts.get(targetId) || [];
340
+ const resources = targetToResources.get(targetId) || [];
327
341
  for (const script of scripts) {
328
342
  if (!executionContexts.find(context => context.id === script.executionContextId)) {
329
343
  const artificialContext = {
@@ -343,7 +357,7 @@ export class EnhancedTracesParser {
343
357
  }
344
358
  }
345
359
  // Finally, we put all the information into the data structure we want to return as.
346
- data.push({ target, executionContexts, scripts });
360
+ data.push({ target, executionContexts, scripts, resources });
347
361
  }
348
362
  return data;
349
363
  }
@@ -11,8 +11,10 @@ export class EventBreakpointsModel extends SDKModel {
11
11
  this.agent = target.eventBreakpointsAgent();
12
12
  }
13
13
  }
14
- // This implementation (as opposed to similar class in DOMDebuggerModel) is for
15
- // instrumentation breakpoints in targets that run JS but do not have a DOM.
14
+ /**
15
+ * This implementation (as opposed to similar class in DOMDebuggerModel) is for
16
+ * instrumentation breakpoints in targets that run JS but do not have a DOM.
17
+ **/
16
18
  class EventListenerBreakpoint extends CategorizedBreakpoint {
17
19
  setEnabled(enabled) {
18
20
  if (this.enabled() === enabled) {
@@ -2,8 +2,10 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
  import * as i18n from '../i18n/i18n.js';
5
- // Reason phrase sources
6
- // See https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes
5
+ /**
6
+ * Reason phrase sources
7
+ * See https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes
8
+ **/
7
9
  export function getStatusText(statusCode) {
8
10
  const statusTextLookup = {
9
11
  100: 'Continue',
@@ -19,10 +19,7 @@ export class IOModel extends SDKModel {
19
19
  return result.data;
20
20
  }
21
21
  async close(handle) {
22
- const result = await this.target().ioAgent().invoke_close({ handle });
23
- if (result.getError()) {
24
- console.error('Could not close stream.');
25
- }
22
+ await this.target().ioAgent().invoke_close({ handle });
26
23
  }
27
24
  async resolveBlob(objectOrObjectId) {
28
25
  const objectId = objectOrObjectId instanceof RemoteObject ? objectOrObjectId.objectId : objectOrObjectId;