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
@@ -86,7 +86,8 @@ export class ResourceTreeModel extends SDKModel {
86
86
  if (!this.framesInternal.has(frameId)) {
87
87
  return null;
88
88
  }
89
- const response = await this.storageAgent.invoke_getStorageKeyForFrame({ frameId });
89
+ // TODO(crbug.com/445966299): Refactor to use `storageAgent().invoke_getStorageKey()` instead.
90
+ const response = await this.storageAgent.invoke_getStorageKey({ frameId });
90
91
  if (response.getError() === 'Frame tree node for given frame not found') {
91
92
  return null;
92
93
  }
@@ -721,7 +722,7 @@ export class ResourceTreeFrame {
721
722
  }
722
723
  addRequest(request) {
723
724
  let resource = this.resourcesMap.get(request.url());
724
- if (resource && resource.request === request) {
725
+ if (resource?.request === request) {
725
726
  // Already in the tree, we just got an extra update.
726
727
  return;
727
728
  }
@@ -0,0 +1,36 @@
1
+ // Copyright 2023 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ import * as Formatter from '../../models/formatter/formatter.js';
5
+ import * as TextUtils from '../../models/text_utils/text_utils.js';
6
+ /** If a script failed to parse, we stash null in order to prevent unnecessary re-parsing */
7
+ const scopeTrees = new WeakMap();
8
+ /**
9
+ * Computes and caches the scope tree for `script`.
10
+ *
11
+ * We use {@link Script} as a key to uniquely identify scripts.
12
+ * {@link Script} boils down to "target" + "script ID". This
13
+ * duplicates work in case of identical script running on multiple targets
14
+ * (e.g. workers).
15
+ *
16
+ * We also return a {@link TextUtils.Text.Text} instance. The scope tree uses offsets
17
+ * and the text allows conversion from/to line/column numbers.
18
+ */
19
+ export function scopeTreeForScript(script) {
20
+ let promise = scopeTrees.get(script);
21
+ if (promise === undefined) {
22
+ promise = script.requestContentData().then(content => {
23
+ if (TextUtils.ContentData.ContentData.isError(content)) {
24
+ return null;
25
+ }
26
+ const sourceType = script.isModule ? 'module' : 'script';
27
+ return Formatter.FormatterWorkerPool.formatterWorkerPool()
28
+ .javaScriptScopeTree(content.text, sourceType)
29
+ .then(scopeTree => scopeTree ? ({ scopeTree, text: content.textObj }) : null)
30
+ .catch(() => null);
31
+ });
32
+ scopeTrees.set(script, promise);
33
+ }
34
+ // We intentionally return `null` here if the script already failed to parse once.
35
+ return promise;
36
+ }
@@ -3,24 +3,26 @@
3
3
  // found in the LICENSE file.
4
4
  import { OverlayModel } from './OverlayModel.js';
5
5
  import { SDKModel } from './SDKModel.js';
6
- // Manages concurrent screencast requests by queuing and prioritizing.
7
- //
8
- // When startScreencast is invoked:
9
- // - If a screencast is currently active, the existing screencast's parameters and callbacks are
10
- // saved in the #screencastOperations array.
11
- // - The active screencast is then stopped.
12
- // - A new screencast is initiated using the parameters and callbacks from the current startScreencast call.
13
- //
14
- // When stopScreencast is invoked:
15
- // - The currently active screencast is stopped.
16
- // - The #screencastOperations is checked for interrupted screencast operations.
17
- // - If any operations are found, the latest one is started
18
- // using its saved parameters and callbacks.
19
- //
20
- // This ensures that:
21
- // - Only one screencast is active at a time.
22
- // - Interrupted screencasts are resumed after the current screencast is stopped.
23
- // This ensures animation previews, which use screencasting, don't disrupt ongoing remote debugging sessions. Without this mechanism, stopping a preview screencast would terminate the debugging screencast, freezing the ScreencastView.
6
+ /**
7
+ * Manages concurrent screencast requests by queuing and prioritizing.
8
+ *
9
+ * When startScreencast is invoked:
10
+ * - If a screencast is currently active, the existing screencast's parameters and callbacks are
11
+ * saved in the #screencastOperations array.
12
+ * - The active screencast is then stopped.
13
+ * - A new screencast is initiated using the parameters and callbacks from the current startScreencast call.
14
+ *
15
+ * When stopScreencast is invoked:
16
+ * - The currently active screencast is stopped.
17
+ * - The #screencastOperations is checked for interrupted screencast operations.
18
+ * - If any operations are found, the latest one is started
19
+ * using its saved parameters and callbacks.
20
+ *
21
+ * This ensures that:
22
+ * - Only one screencast is active at a time.
23
+ * - Interrupted screencasts are resumed after the current screencast is stopped.
24
+ * This ensures animation previews, which use screencasting, don't disrupt ongoing remote debugging sessions. Without this mechanism, stopping a preview screencast would terminate the debugging screencast, freezing the ScreencastView.
25
+ **/
24
26
  export class ScreenCaptureModel extends SDKModel {
25
27
  #agent;
26
28
  #nextScreencastOperationId = 1;
@@ -1,6 +1,31 @@
1
1
  // Copyright 2021 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
+ /*
5
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions
9
+ * are met:
10
+ * 1. Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * 2. Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in the
14
+ * documentation and/or other materials provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
17
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
20
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+ */
28
+ import * as Platform from '../../core/platform/platform.js';
4
29
  import * as TextUtils from '../../models/text_utils/text_utils.js';
5
30
  import * as Common from '../common/common.js';
6
31
  import * as i18n from '../i18n/i18n.js';
@@ -366,7 +391,7 @@ function frameIdForScript(script) {
366
391
  }
367
392
  export const sourceURLRegex = /^[\x20\t]*\/\/[@#] sourceURL=\s*(\S*?)\s*$/;
368
393
  export async function disassembleWasm(content) {
369
- const worker = Common.Worker.WorkerWrapper.fromURL(new URL('../../entrypoints/wasmparser_worker/wasmparser_worker-entrypoint.js', import.meta.url));
394
+ const worker = Platform.HostRuntime.HOST_RUNTIME.createWorker(new URL('../../entrypoints/wasmparser_worker/wasmparser_worker-entrypoint.js', import.meta.url).toString());
370
395
  const promise = new Promise((resolve, reject) => {
371
396
  worker.onmessage = ({ data }) => {
372
397
  if ('method' in data) {
@@ -28,6 +28,9 @@ export class ServerSentEventsParser {
28
28
  async addBase64Chunk(raw) {
29
29
  await this.#decoder.addBase64Chunk(raw);
30
30
  }
31
+ addTextChunk(chunk) {
32
+ this.#onTextChunk(chunk);
33
+ }
31
34
  #onTextChunk(chunk) {
32
35
  // A line consists of "this.#line" plus a slice of "chunk[start:<next new cr/lf>]".
33
36
  let start = 0;
@@ -7,6 +7,7 @@ import * as ScopesCodec from '../../third_party/source-map-scopes-codec/source-m
7
7
  import * as Common from '../common/common.js';
8
8
  import * as Platform from '../platform/platform.js';
9
9
  import * as Root from '../root/root.js';
10
+ import { scopeTreeForScript } from './ScopeTreeCache.js';
10
11
  import { buildOriginalScopes, decodePastaRanges } from './SourceMapFunctionRanges.js';
11
12
  import { SourceMapScopesInfo } from './SourceMapScopesInfo.js';
12
13
  /**
@@ -56,22 +57,24 @@ export class SourceMap {
56
57
  #compiledURL;
57
58
  #sourceMappingURL;
58
59
  #baseURL;
59
- #mappings;
60
+ #mappings = null;
60
61
  #sourceInfos = [];
61
62
  #sourceInfoByURL = new Map();
63
+ #script;
62
64
  #scopesInfo = null;
63
65
  #debugId;
66
+ scopesFallbackPromiseForTest;
64
67
  /**
65
68
  * Implements Source Map V3 model. See https://github.com/google/closure-compiler/wiki/Source-Maps
66
69
  * for format description.
67
70
  */
68
- constructor(compiledURL, sourceMappingURL, payload) {
71
+ constructor(compiledURL, sourceMappingURL, payload, script) {
69
72
  this.#json = payload;
73
+ this.#script = script;
70
74
  this.#compiledURL = compiledURL;
71
75
  this.#sourceMappingURL = sourceMappingURL;
72
76
  this.#baseURL = (Common.ParsedURL.schemeIs(sourceMappingURL, 'data:')) ? compiledURL : sourceMappingURL;
73
77
  this.#debugId = 'debugId' in payload ? payload.debugId : undefined;
74
- this.#mappings = null;
75
78
  if ('sections' in this.#json) {
76
79
  if (this.#json.sections.find(section => 'url' in section)) {
77
80
  Common.Console.Console.instance().warn(`SourceMap "${sourceMappingURL}" contains unsupported "URL" field in one of its sections.`);
@@ -83,7 +86,7 @@ export class SourceMap {
83
86
  return this.#json;
84
87
  }
85
88
  augmentWithScopes(scriptUrl, ranges) {
86
- this.#ensureMappingsProcessed();
89
+ this.#ensureSourceMapProcessed();
87
90
  if (this.#json && this.#json.version > 3) {
88
91
  throw new Error('Only support augmenting source maps up to version 3.');
89
92
  }
@@ -115,6 +118,9 @@ export class SourceMap {
115
118
  debugId() {
116
119
  return this.#debugId ?? null;
117
120
  }
121
+ sourceURLForSourceIndex(index) {
122
+ return this.#sourceInfos[index]?.sourceURL;
123
+ }
118
124
  sourceURLs() {
119
125
  return [...this.#sourceInfoByURL.keys()];
120
126
  }
@@ -126,11 +132,11 @@ export class SourceMap {
126
132
  return entry.content;
127
133
  }
128
134
  hasScopeInfo() {
129
- this.#ensureMappingsProcessed();
130
- return this.#scopesInfo !== null;
135
+ this.#ensureSourceMapProcessed();
136
+ return this.#scopesInfo !== null && !this.#scopesInfo.isEmpty();
131
137
  }
132
138
  findEntry(lineNumber, columnNumber, inlineFrameIndex) {
133
- this.#ensureMappingsProcessed();
139
+ this.#ensureSourceMapProcessed();
134
140
  if (inlineFrameIndex && this.#scopesInfo !== null) {
135
141
  // For inlineFrameIndex != 0 we use the callsite info for the corresponding inlining site.
136
142
  // Note that the callsite for "inlineFrameIndex" is actually in the previous frame.
@@ -253,18 +259,36 @@ export class SourceMap {
253
259
  return ranges;
254
260
  }
255
261
  mappings() {
256
- this.#ensureMappingsProcessed();
262
+ this.#ensureSourceMapProcessed();
257
263
  return this.#mappings ?? [];
258
264
  }
265
+ /**
266
+ * If the source map does not contain scope information by itself (e.g. "scopes proposal"
267
+ * or "pasta" scopes), then we'll use this getter to calculate basic function name information from
268
+ * the AST and mappings.
269
+ */
270
+ async #buildScopesFallback() {
271
+ const scopeTreeAndText = this.#script ? await scopeTreeForScript(this.#script) : null;
272
+ if (!scopeTreeAndText) {
273
+ return null;
274
+ }
275
+ const { scopeTree, text } = scopeTreeAndText;
276
+ return SourceMapScopesInfo.createFromAst(this, scopeTree, text);
277
+ }
259
278
  reversedMappings(sourceURL) {
260
- this.#ensureMappingsProcessed();
279
+ this.#ensureSourceMapProcessed();
261
280
  return this.#sourceInfoByURL.get(sourceURL)?.reverseMappings ?? [];
262
281
  }
263
- #ensureMappingsProcessed() {
282
+ #ensureSourceMapProcessed() {
264
283
  if (this.#mappings === null) {
265
284
  this.#mappings = [];
266
285
  try {
267
286
  this.eachSection(this.parseMap.bind(this));
287
+ if (!this.hasScopeInfo()) {
288
+ this.scopesFallbackPromiseForTest = this.#buildScopesFallback().then(info => {
289
+ this.#scopesInfo = info;
290
+ });
291
+ }
268
292
  }
269
293
  catch (e) {
270
294
  console.error('Failed to parse source map', e);
@@ -281,7 +305,7 @@ export class SourceMap {
281
305
  #computeReverseMappings(mappings) {
282
306
  const reverseMappingsPerUrl = new Map();
283
307
  for (let i = 0; i < mappings.length; i++) {
284
- const entryUrl = mappings[i].sourceURL;
308
+ const entryUrl = mappings[i]?.sourceURL;
285
309
  if (!entryUrl) {
286
310
  continue;
287
311
  }
@@ -568,23 +592,39 @@ export class SourceMap {
568
592
  this.hasIgnoreListHint(sourceURL) === other.hasIgnoreListHint(sourceURL);
569
593
  }
570
594
  expandCallFrame(frame) {
571
- this.#ensureMappingsProcessed();
595
+ this.#ensureSourceMapProcessed();
572
596
  if (this.#scopesInfo === null) {
573
597
  return [frame];
574
598
  }
575
599
  return this.#scopesInfo.expandCallFrame(frame);
576
600
  }
577
601
  resolveScopeChain(frame) {
578
- this.#ensureMappingsProcessed();
602
+ this.#ensureSourceMapProcessed();
579
603
  if (this.#scopesInfo === null) {
580
604
  return null;
581
605
  }
582
606
  return this.#scopesInfo.resolveMappedScopeChain(frame);
583
607
  }
584
608
  findOriginalFunctionName(position) {
585
- this.#ensureMappingsProcessed();
609
+ this.#ensureSourceMapProcessed();
586
610
  return this.#scopesInfo?.findOriginalFunctionName(position) ?? null;
587
611
  }
612
+ findOriginalFunctionScope(position) {
613
+ this.#ensureSourceMapProcessed();
614
+ return this.#scopesInfo?.findOriginalFunctionScope(position) ?? null;
615
+ }
616
+ isOutlinedFrame(generatedLine, generatedColumn) {
617
+ this.#ensureSourceMapProcessed();
618
+ return this.#scopesInfo?.isOutlinedFrame(generatedLine, generatedColumn) ?? false;
619
+ }
620
+ hasInlinedFrames(generatedLine, generatedColumn) {
621
+ this.#ensureSourceMapProcessed();
622
+ return this.#scopesInfo?.hasInlinedFrames(generatedLine, generatedColumn) ?? false;
623
+ }
624
+ translateCallSite(generatedLine, generatedColumn) {
625
+ this.#ensureSourceMapProcessed();
626
+ return this.#scopesInfo?.translateCallSite(generatedLine, generatedColumn) ?? [];
627
+ }
588
628
  }
589
629
  _a = SourceMap;
590
630
  const VLQ_BASE_SHIFT = 5;
@@ -5,6 +5,10 @@
5
5
  export class SourceMapCache {
6
6
  static #INSTANCE = new SourceMapCache('devtools-source-map-cache');
7
7
  static instance() {
8
+ if (typeof window === 'undefined') {
9
+ // TODO(crbug.com/451502260): Move this behind a `HostRuntime` interface.
10
+ return IN_MEMORY_INSTANCE; // TS doesn't like that our in-memory class doesn't have the same private fields.
11
+ }
8
12
  return this.#INSTANCE;
9
13
  }
10
14
  static createForTest(name) {
@@ -39,3 +43,15 @@ export class SourceMapCache {
39
43
  await window.caches.delete(this.#name);
40
44
  }
41
45
  }
46
+ const IN_MEMORY_INSTANCE = new (class {
47
+ #cache = new Map();
48
+ async set(debugId, sourceMap) {
49
+ this.#cache.set(debugId, sourceMap);
50
+ }
51
+ async get(debugId) {
52
+ return this.#cache.get(debugId) ?? null;
53
+ }
54
+ async disposeForTest() {
55
+ // Do nothing.
56
+ }
57
+ })();
@@ -9,13 +9,16 @@ import { SourceMapCache } from './SourceMapCache.js';
9
9
  import { Type } from './Target.js';
10
10
  export class SourceMapManager extends Common.ObjectWrapper.ObjectWrapper {
11
11
  #target;
12
+ #factory;
12
13
  #isEnabled = true;
13
14
  #clientData = new Map();
14
15
  #sourceMaps = new Map();
15
16
  #attachingClient = null;
16
- constructor(target) {
17
+ constructor(target, factory) {
17
18
  super();
18
19
  this.#target = target;
20
+ this.#factory =
21
+ factory ?? ((compiledURL, sourceMappingURL, payload) => new SourceMap(compiledURL, sourceMappingURL, payload));
19
22
  }
20
23
  setEnabled(isEnabled) {
21
24
  if (isEnabled === this.#isEnabled) {
@@ -86,10 +89,16 @@ export class SourceMapManager extends Common.ObjectWrapper.ObjectWrapper {
86
89
  if (this.#attachingClient === client) {
87
90
  this.#attachingClient = null;
88
91
  const initiator = client.createPageResourceLoadInitiator();
92
+ // TODO(crbug.com/458180550): Pass PageResourceLoader via constructor.
93
+ // The reason we grab it here lazily from the context is that otherwise every
94
+ // unit test using `createTarget` would need to set up a `PageResourceLoader`, as
95
+ // CSSModel and DebuggerModel are autostarted by default, and they create a
96
+ // SourceMapManager in their respective constructors.
97
+ const resourceLoader = this.#target.targetManager().context.get(PageResourceLoader);
89
98
  clientData.sourceMapPromise =
90
- loadSourceMap(sourceMapURL, client.debugId(), initiator)
99
+ loadSourceMap(resourceLoader, sourceMapURL, client.debugId(), initiator)
91
100
  .then(payload => {
92
- const sourceMap = new SourceMap(sourceURL, sourceMapURL, payload);
101
+ const sourceMap = this.#factory(sourceURL, sourceMapURL, payload, client);
93
102
  if (this.#clientData.get(client) === clientData) {
94
103
  clientData.sourceMap = sourceMap;
95
104
  this.#sourceMaps.set(sourceMap, client);
@@ -148,8 +157,11 @@ export class SourceMapManager extends Common.ObjectWrapper.ObjectWrapper {
148
157
  this.dispatchEventToListeners(Events.SourceMapFailedToAttach, { client });
149
158
  }
150
159
  }
160
+ waitForSourceMapsProcessedForTest() {
161
+ return Promise.all(this.#sourceMaps.keys().map(sourceMap => sourceMap.scopesFallbackPromiseForTest));
162
+ }
151
163
  }
152
- export async function loadSourceMap(url, debugId, initiator) {
164
+ async function loadSourceMap(resourceLoader, url, debugId, initiator) {
153
165
  try {
154
166
  if (debugId) {
155
167
  const cachedSourceMap = await SourceMapCache.instance().get(debugId);
@@ -157,7 +169,7 @@ export async function loadSourceMap(url, debugId, initiator) {
157
169
  return cachedSourceMap;
158
170
  }
159
171
  }
160
- const { content } = await PageResourceLoader.instance().loadResource(url, initiator);
172
+ const { content } = await resourceLoader.loadResource(url, initiator);
161
173
  const sourceMap = parseSourceMap(content);
162
174
  if ('debugId' in sourceMap && sourceMap.debugId) {
163
175
  // In case something goes wrong with updating the cache, we still want to use the source map.
@@ -169,9 +181,9 @@ export async function loadSourceMap(url, debugId, initiator) {
169
181
  throw new Error(`Could not load content for ${url}: ${cause.message}`, { cause });
170
182
  }
171
183
  }
172
- export async function tryLoadSourceMap(url, initiator) {
184
+ export async function tryLoadSourceMap(resourceLoader, url, initiator) {
173
185
  try {
174
- return await loadSourceMap(url, null, initiator);
186
+ return await loadSourceMap(resourceLoader, url, null, initiator);
175
187
  }
176
188
  catch (cause) {
177
189
  console.error(cause);