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
@@ -15,7 +15,7 @@ export const UIStrings = {
15
15
  /**
16
16
  * @description Description of an insight that provides details about the LCP metric, and the network requests necessary to load it.
17
17
  */
18
- description: 'Optimize LCP by making the LCP image [discoverable](https://web.dev/articles/optimize-lcp#1_eliminate_resource_load_delay) from the HTML immediately, and [avoiding lazy-loading](https://web.dev/articles/lcp-lazy-loading)',
18
+ description: '[Optimize LCP](https://developer.chrome.com/docs/performance/insights/lcp-discovery) by making the LCP image discoverable from the HTML immediately, and avoiding lazy-loading',
19
19
  /**
20
20
  * @description Text to tell the user how long after the earliest discovery time their LCP element loaded.
21
21
  * @example {401ms} PH1
@@ -61,6 +61,7 @@ function finalize(partialModel) {
61
61
  strings: UIStrings,
62
62
  title: i18nString(UIStrings.title),
63
63
  description: i18nString(UIStrings.description),
64
+ docs: 'https://developer.chrome.com/docs/performance/insights/lcp-discovery',
64
65
  category: InsightCategory.LCP,
65
66
  state: partialModel.lcpRequest && partialModel.checklist &&
66
67
  (!partialModel.checklist.eagerlyLoaded.value || !partialModel.checklist.requestDiscoverable.value ||
@@ -15,7 +15,7 @@ export const UIStrings = {
15
15
  /**
16
16
  * @description Description of an insight that identifies polyfills for modern JavaScript features, and recommends their removal.
17
17
  */
18
- description: 'Polyfills and transforms enable older browsers to use new JavaScript features. However, many aren\'t necessary for modern browsers. Consider modifying your JavaScript build process to not transpile [Baseline](https://web.dev/articles/baseline-and-polyfills) features, unless you know you must support older browsers. [Learn why most sites can deploy ES6+ code without transpiling](https://philipwalton.com/articles/the-state-of-es5-on-the-web/)',
18
+ description: 'Polyfills and transforms enable older browsers to use new JavaScript features. However, many aren\'t necessary for modern browsers. Consider modifying your JavaScript build process to not transpile [Baseline](https://web.dev/articles/baseline-and-polyfills) features, unless you know you must support older browsers. [Learn why most sites can deploy ES6+ code without transpiling](https://developer.chrome.com/docs/performance/insights/legacy-javascript)',
19
19
  /** Label for a column in a data table; entries will be the individual JavaScript scripts. */
20
20
  columnScript: 'Script',
21
21
  /** Label for a column in a data table; entries will be the number of wasted bytes (aka the estimated savings in terms of bytes). */
@@ -31,6 +31,7 @@ function finalize(partialModel) {
31
31
  strings: UIStrings,
32
32
  title: i18nString(UIStrings.title),
33
33
  description: i18nString(UIStrings.description),
34
+ docs: 'https://developer.chrome.com/docs/performance/insights/legacy-javascript',
34
35
  category: InsightCategory.ALL,
35
36
  state: requests.length ? 'fail' : 'pass',
36
37
  relatedEvents: [...new Set(requests)],
@@ -48,7 +49,8 @@ export function generateInsight(data, context) {
48
49
  if (script.url?.startsWith('chrome-extension://')) {
49
50
  return false;
50
51
  }
51
- return Helpers.Timing.timestampIsInBounds(context.bounds, script.ts);
52
+ return Helpers.Timing.timestampIsInBounds(context.bounds, script.ts) ||
53
+ (script.request && Helpers.Timing.eventIsInBounds(script.request, context.bounds));
52
54
  });
53
55
  const legacyJavaScriptResults = new Map();
54
56
  const wastedBytesByRequestId = new Map();
@@ -14,7 +14,7 @@ export const UIStrings = {
14
14
  /**
15
15
  * @description Description of an insight that recommends recommends using HTTP/2 over HTTP/1.1 because of the performance benefits. "HTTP" should not be translated.
16
16
  */
17
- description: 'HTTP/2 and HTTP/3 offer many benefits over HTTP/1.1, such as multiplexing. [Learn more about using modern HTTP](https://developer.chrome.com/docs/lighthouse/best-practices/uses-http2/).',
17
+ description: 'HTTP/2 and HTTP/3 offer many benefits over HTTP/1.1, such as multiplexing. [Learn more about using modern HTTP](https://developer.chrome.com/docs/performance/insights/modern-http).',
18
18
  /**
19
19
  * @description Column header for a table where each cell represents a network request.
20
20
  */
@@ -169,6 +169,7 @@ function finalize(partialModel) {
169
169
  strings: UIStrings,
170
170
  title: i18nString(UIStrings.title),
171
171
  description: i18nString(UIStrings.description),
172
+ docs: 'https://developer.chrome.com/docs/performance/insights/modern-http',
172
173
  category: InsightCategory.LCP,
173
174
  state: partialModel.http1Requests.length > 0 ? 'fail' : 'pass',
174
175
  ...partialModel,
@@ -15,7 +15,7 @@ export const UIStrings = {
15
15
  /**
16
16
  * @description Description of an insight that recommends avoiding chaining critical requests.
17
17
  */
18
- description: '[Avoid chaining critical requests](https://developer.chrome.com/docs/lighthouse/performance/critical-request-chains) by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.',
18
+ description: '[Avoid chaining critical requests](https://developer.chrome.com/docs/performance/insights/network-dependency-tree) by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.',
19
19
  /**
20
20
  * @description Description of the warning that recommends avoiding chaining critical requests.
21
21
  */
@@ -105,6 +105,7 @@ function finalize(partialModel) {
105
105
  strings: UIStrings,
106
106
  title: i18nString(UIStrings.title),
107
107
  description: i18nString(UIStrings.description),
108
+ docs: 'https://developer.chrome.com/docs/performance/insights/network-dependency-tree',
108
109
  category: InsightCategory.LCP,
109
110
  state: partialModel.fail ? 'fail' : 'pass',
110
111
  ...partialModel,
@@ -337,7 +338,7 @@ export function handleLinkResponseHeader(linkHeaderValue) {
337
338
  }
338
339
  return preconnectedOrigins;
339
340
  }
340
- // Export the function for test purpose.
341
+ /** Export the function for test purpose. **/
341
342
  export function generatePreconnectedOrigins(data, context, contextRequests, preconnectCandidates) {
342
343
  const preconnectedOrigins = [];
343
344
  for (const event of data.NetworkRequests.linkPreconnectEvents) {
@@ -436,7 +437,7 @@ function candidateRequestsByOrigin(data, mainResource, contextRequests, lcpGraph
436
437
  });
437
438
  return origins;
438
439
  }
439
- // Export the function for test purpose.
440
+ /** Export the function for test purpose. **/
440
441
  export function generatePreconnectCandidates(data, context, contextRequests) {
441
442
  if (!context.lantern) {
442
443
  return [];
@@ -14,7 +14,7 @@ export const UIStrings = {
14
14
  * @description Text to describe that there are requests blocking rendering, which may affect LCP.
15
15
  */
16
16
  description: 'Requests are blocking the page\'s initial render, which may delay LCP. ' +
17
- '[Deferring or inlining](https://web.dev/learn/performance/understanding-the-critical-path#render-blocking_resources) ' +
17
+ '[Deferring or inlining](https://developer.chrome.com/docs/performance/insights/render-blocking) ' +
18
18
  'can move these network requests out of the critical path.',
19
19
  /**
20
20
  * @description Label to describe a network request (that happens to be render-blocking).
@@ -117,6 +117,7 @@ function finalize(partialModel) {
117
117
  strings: UIStrings,
118
118
  title: i18nString(UIStrings.title),
119
119
  description: i18nString(UIStrings.description),
120
+ docs: 'https://developer.chrome.com/docs/performance/insights/render-blocking',
120
121
  category: InsightCategory.LCP,
121
122
  state: partialModel.renderBlockingRequests.length > 0 ? 'fail' : 'pass',
122
123
  ...partialModel,
@@ -14,7 +14,7 @@ export const UIStrings = {
14
14
  /**
15
15
  * @description Text to describe how to improve the performance of CSS selectors.
16
16
  */
17
- description: 'If Recalculate Style costs remain high, selector optimization can reduce them. [Optimize the selectors](https://developer.chrome.com/docs/devtools/performance/selector-stats) with both high elapsed time and high slow-path %. Simpler selectors, fewer selectors, a smaller DOM, and a shallower DOM will all reduce matching costs.',
17
+ description: 'If Recalculate Style costs remain high, selector optimization can reduce them. [Optimize the selectors](https://developer.chrome.com/docs/performance/insights/slow-css-selector) with both high elapsed time and high slow-path %. Simpler selectors, fewer selectors, a smaller DOM, and a shallower DOM will all reduce matching costs.',
18
18
  /**
19
19
  * @description Column name for count of elements that the engine attempted to match against a style rule
20
20
  */
@@ -82,6 +82,7 @@ function finalize(partialModel) {
82
82
  strings: UIStrings,
83
83
  title: i18nString(UIStrings.title),
84
84
  description: i18nString(UIStrings.description),
85
+ docs: 'https://developer.chrome.com/docs/performance/insights/slow-css-selector',
85
86
  category: InsightCategory.ALL,
86
87
  state: partialModel.topSelectorElapsedMs && partialModel.topSelectorMatchAttempts ? 'informative' : 'pass',
87
88
  ...partialModel,
@@ -14,7 +14,7 @@ export const UIStrings = {
14
14
  * This is displayed after a user expands the section to see more. No character length limits.
15
15
  */
16
16
  description: '3rd party code can significantly impact load performance. ' +
17
- '[Reduce and defer loading of 3rd party code](https://web.dev/articles/optimizing-content-efficiency-loading-third-party-javascript/) to prioritize your page\'s content.',
17
+ '[Reduce and defer loading of 3rd party code](https://developer.chrome.com/docs/performance/insights/third-parties) to prioritize your page\'s content.',
18
18
  /** Label for a table column that displays the name of a third-party provider. */
19
19
  columnThirdParty: '3rd party',
20
20
  /** Label for a column in a data table; entries will be the download size of a web resource in kilobytes. */
@@ -43,6 +43,7 @@ function finalize(partialModel) {
43
43
  strings: UIStrings,
44
44
  title: i18nString(UIStrings.title),
45
45
  description: i18nString(UIStrings.description),
46
+ docs: 'https://developer.chrome.com/docs/performance/insights/third-parties',
46
47
  category: InsightCategory.ALL,
47
48
  state: partialModel.entitySummaries.find(summary => summary.entity !== partialModel.firstPartyEntity) ?
48
49
  'informative' :
@@ -13,7 +13,7 @@ export const UIStrings = {
13
13
  /**
14
14
  * @description Text to tell the user how a viewport meta element can improve performance. \xa0 is a non-breaking space
15
15
  */
16
- description: 'Tap interactions may be [delayed by up to 300\xA0ms](https://developer.chrome.com/blog/300ms-tap-delay-gone-away/) if the viewport is not optimized for mobile.',
16
+ description: 'Tap interactions may be [delayed by up to 300\xA0ms](https://developer.chrome.com/docs/performance/insights/viewport) if the viewport is not optimized for mobile.',
17
17
  /**
18
18
  * @description Text for a label describing the portion of an interaction event that was delayed due to a bad mobile viewport.
19
19
  */
@@ -27,6 +27,7 @@ function finalize(partialModel) {
27
27
  strings: UIStrings,
28
28
  title: i18nString(UIStrings.title),
29
29
  description: i18nString(UIStrings.description),
30
+ docs: 'https://developer.chrome.com/docs/performance/insights/viewport',
30
31
  category: InsightCategory.INP,
31
32
  state: partialModel.mobileOptimized === false ? 'fail' : 'pass',
32
33
  ...partialModel,
@@ -19,6 +19,7 @@ export function objectIsCallFrame(object) {
19
19
  ('lineNumber' in object && typeof object.lineNumber === 'number') &&
20
20
  ('url' in object && typeof object.url === 'string');
21
21
  }
22
+ export const VALID_PROFILE_SOURCES = ['Inspector', 'SelfProfiling', 'Internal'];
22
23
  export function isRunTask(event) {
23
24
  return event.name === "RunTask" /* Name.RUN_TASK */ && event.ph === "X" /* Phase.COMPLETE */;
24
25
  }
@@ -349,7 +350,7 @@ export function isResourceWillSendRequest(event) {
349
350
  export function isResourceReceivedData(event) {
350
351
  return event.name === 'ResourceReceivedData';
351
352
  }
352
- // Any event where we receive data (and get an encodedDataLength)
353
+ /** Any event where we receive data (and get an encodedDataLength) **/
353
354
  export function isReceivedDataEvent(event) {
354
355
  return event.name === 'ResourceReceivedData' || event.name === 'ResourceFinish' ||
355
356
  event.name === 'ResourceReceiveResponse';
@@ -547,8 +548,10 @@ export function isFlowPhaseEvent(event) {
547
548
  export function isParseAuthorStyleSheetEvent(event) {
548
549
  return event.name === "ParseAuthorStyleSheet" /* Name.PARSE_AUTHOR_STYLE_SHEET */ && event.ph === "X" /* Phase.COMPLETE */;
549
550
  }
550
- // NOT AN EXHAUSTIVE LIST: just some categories we use and refer
551
- // to in multiple places.
551
+ /**
552
+ * NOT AN EXHAUSTIVE LIST: just some categories we use and refer
553
+ * to in multiple places.
554
+ **/
552
555
  export const Categories = {
553
556
  Console: 'blink.console',
554
557
  UserTiming: 'blink.user_timing',
@@ -572,3 +575,6 @@ export function isRundownScriptSourceLarge(event) {
572
575
  export function isAnyScriptSourceEvent(event) {
573
576
  return event.cat === 'disabled-by-default-devtools.v8-source-rundown-sources';
574
577
  }
578
+ export function isPreloadRenderBlockingStatusChangeEvent(event) {
579
+ return event.name === "PreloadRenderBlockingStatusChange" /* Name.PRELOAD_RENDER_BLOCKING_STATUS_CHANGE */;
580
+ }
@@ -13,7 +13,7 @@ export class SourceMappingsUpdated extends Event {
13
13
  super(SourceMappingsUpdated.eventName, { composed: true, bubbles: true });
14
14
  }
15
15
  }
16
- // The code location key is created as a concatenation of its fields.
16
+ /** The code location key is created as a concatenation of its fields. **/
17
17
  export const resolvedCodeLocationDataNames = new Map();
18
18
  export class SourceMapsResolver extends EventTarget {
19
19
  executionContextNamesByOrigin = new Map();
@@ -81,6 +81,29 @@ export class SourceMapsResolver extends EventTarget {
81
81
  }
82
82
  return null;
83
83
  }
84
+ static codeLocationForEntry(parsedTrace, entry) {
85
+ const uiLocation = _a.resolvedCodeLocationForEntry(entry)?.devtoolsLocation;
86
+ if (uiLocation) {
87
+ return { url: uiLocation.uiSourceCode.url(), line: uiLocation.lineNumber, column: uiLocation.columnNumber };
88
+ }
89
+ // If no source mapping was found for an entry's URL, then default
90
+ // to the frame contained in the event itself, if any.
91
+ const rawCallFrame = Trace.Helpers.Trace.rawCallFrameForEntry(entry);
92
+ if (rawCallFrame) {
93
+ const line = rawCallFrame.lineNumber >= 0 ? rawCallFrame.lineNumber : undefined;
94
+ const column = rawCallFrame.columnNumber >= 0 ? rawCallFrame.columnNumber : undefined;
95
+ return { url: rawCallFrame.url, line, column };
96
+ }
97
+ // Lastly, look for just a url.
98
+ let url = Trace.Handlers.Helpers.getNonResolvedURL(entry, parsedTrace.data);
99
+ if (url) {
100
+ url = Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(url)?.url() ?? url;
101
+ }
102
+ if (url) {
103
+ return { url };
104
+ }
105
+ return null;
106
+ }
84
107
  static storeResolvedCodeDataForCallFrame(callFrame, resolvedCodeLocationData) {
85
108
  const keyForCallFrame = this.keyForCodeLocation(callFrame);
86
109
  resolvedCodeLocationDataNames.set(keyForCallFrame, resolvedCodeLocationData);
@@ -142,7 +165,7 @@ export class SourceMapsResolver extends EventTarget {
142
165
  for (const node of nodes) {
143
166
  const resolvedFunctionName = await SourceMapScopes.NamesResolver.resolveProfileFrameFunctionName(node.callFrame, target);
144
167
  updatedMappings ||= Boolean(resolvedFunctionName);
145
- node.setFunctionName(resolvedFunctionName);
168
+ node.setOriginalFunctionName(resolvedFunctionName);
146
169
  const debuggerModel = target.model(SDK.DebuggerModel.DebuggerModel);
147
170
  const script = debuggerModel?.scriptForId(node.scriptId) || null;
148
171
  const location = debuggerModel &&
@@ -4,6 +4,7 @@
4
4
  import * as Common from '../../core/common/common.js';
5
5
  import * as i18n from '../../core/i18n/i18n.js';
6
6
  import * as Platform from '../../core/platform/platform.js';
7
+ import * as Root from '../../core/root/root.js';
7
8
  import * as SDK from '../../core/sdk/sdk.js';
8
9
  import { projectTypes } from './WorkspaceImpl.js';
9
10
  const UIStrings = {
@@ -34,45 +35,38 @@ const UIStrings = {
34
35
  };
35
36
  const str_ = i18n.i18n.registerUIStrings('models/workspace/IgnoreListManager.ts', UIStrings);
36
37
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
37
- let ignoreListManagerInstance;
38
38
  export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper {
39
- #listeners;
40
- #isIgnoreListedURLCache;
41
- #contentScriptExecutionContexts;
42
- constructor() {
39
+ #settings;
40
+ #targetManager;
41
+ #listeners = new Set();
42
+ #isIgnoreListedURLCache = new Map();
43
+ #contentScriptExecutionContexts = new Set();
44
+ constructor(settings, targetManager) {
43
45
  super();
44
- SDK.TargetManager.TargetManager.instance().addModelListener(SDK.DebuggerModel.DebuggerModel, SDK.DebuggerModel.Events.GlobalObjectCleared, this.clearCacheIfNeeded.bind(this), this);
45
- SDK.TargetManager.TargetManager.instance().addModelListener(SDK.RuntimeModel.RuntimeModel, SDK.RuntimeModel.Events.ExecutionContextCreated, this.onExecutionContextCreated, this, { scoped: true });
46
- SDK.TargetManager.TargetManager.instance().addModelListener(SDK.RuntimeModel.RuntimeModel, SDK.RuntimeModel.Events.ExecutionContextDestroyed, this.onExecutionContextDestroyed, this, { scoped: true });
47
- Common.Settings.Settings.instance()
48
- .moduleSetting('skip-stack-frames-pattern')
46
+ this.#settings = settings;
47
+ this.#targetManager = targetManager;
48
+ this.#targetManager.addModelListener(SDK.DebuggerModel.DebuggerModel, SDK.DebuggerModel.Events.GlobalObjectCleared, this.clearCacheIfNeeded.bind(this), this);
49
+ this.#targetManager.addModelListener(SDK.RuntimeModel.RuntimeModel, SDK.RuntimeModel.Events.ExecutionContextCreated, this.onExecutionContextCreated, this, { scoped: true });
50
+ this.#targetManager.addModelListener(SDK.RuntimeModel.RuntimeModel, SDK.RuntimeModel.Events.ExecutionContextDestroyed, this.onExecutionContextDestroyed, this, { scoped: true });
51
+ this.#settings.moduleSetting('skip-stack-frames-pattern').addChangeListener(this.patternChanged.bind(this));
52
+ this.#settings.moduleSetting('skip-content-scripts').addChangeListener(this.patternChanged.bind(this));
53
+ this.#settings.moduleSetting('automatically-ignore-list-known-third-party-scripts')
49
54
  .addChangeListener(this.patternChanged.bind(this));
50
- Common.Settings.Settings.instance()
51
- .moduleSetting('skip-content-scripts')
52
- .addChangeListener(this.patternChanged.bind(this));
53
- Common.Settings.Settings.instance()
54
- .moduleSetting('automatically-ignore-list-known-third-party-scripts')
55
- .addChangeListener(this.patternChanged.bind(this));
56
- Common.Settings.Settings.instance()
57
- .moduleSetting('enable-ignore-listing')
58
- .addChangeListener(this.patternChanged.bind(this));
59
- Common.Settings.Settings.instance()
60
- .moduleSetting('skip-anonymous-scripts')
61
- .addChangeListener(this.patternChanged.bind(this));
62
- this.#listeners = new Set();
63
- this.#isIgnoreListedURLCache = new Map();
64
- this.#contentScriptExecutionContexts = new Set();
65
- SDK.TargetManager.TargetManager.instance().observeModels(SDK.DebuggerModel.DebuggerModel, this);
55
+ this.#settings.moduleSetting('enable-ignore-listing').addChangeListener(this.patternChanged.bind(this));
56
+ this.#settings.moduleSetting('skip-anonymous-scripts').addChangeListener(this.patternChanged.bind(this));
57
+ this.#targetManager.observeModels(SDK.DebuggerModel.DebuggerModel, this);
66
58
  }
67
- static instance(opts = { forceNew: null }) {
59
+ static instance(opts = {
60
+ forceNew: null,
61
+ }) {
68
62
  const { forceNew } = opts;
69
- if (!ignoreListManagerInstance || forceNew) {
70
- ignoreListManagerInstance = new IgnoreListManager();
63
+ if (forceNew) {
64
+ Root.DevToolsContext.globalInstance().set(IgnoreListManager, new IgnoreListManager(opts.settings ?? Common.Settings.Settings.instance(), opts.targetManager ?? SDK.TargetManager.TargetManager.instance()));
71
65
  }
72
- return ignoreListManagerInstance;
66
+ return Root.DevToolsContext.globalInstance().get(IgnoreListManager);
73
67
  }
74
68
  static removeInstance() {
75
- ignoreListManagerInstance = undefined;
69
+ Root.DevToolsContext.globalInstance().delete(IgnoreListManager);
76
70
  }
77
71
  addChangeListener(listener) {
78
72
  this.#listeners.add(listener);
@@ -99,7 +93,7 @@ export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper {
99
93
  if (this.isContentScript(event.data)) {
100
94
  this.#contentScriptExecutionContexts.add(event.data.uniqueId);
101
95
  if (this.skipContentScripts) {
102
- for (const debuggerModel of SDK.TargetManager.TargetManager.instance().models(SDK.DebuggerModel.DebuggerModel)) {
96
+ for (const debuggerModel of this.#targetManager.models(SDK.DebuggerModel.DebuggerModel)) {
103
97
  void this.updateIgnoredExecutionContexts(debuggerModel);
104
98
  }
105
99
  }
@@ -109,7 +103,7 @@ export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper {
109
103
  if (this.isContentScript(event.data)) {
110
104
  this.#contentScriptExecutionContexts.delete(event.data.uniqueId);
111
105
  if (this.skipContentScripts) {
112
- for (const debuggerModel of SDK.TargetManager.TargetManager.instance().models(SDK.DebuggerModel.DebuggerModel)) {
106
+ for (const debuggerModel of this.#targetManager.models(SDK.DebuggerModel.DebuggerModel)) {
113
107
  void this.updateIgnoredExecutionContexts(debuggerModel);
114
108
  }
115
109
  }
@@ -121,7 +115,7 @@ export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper {
121
115
  }
122
116
  }
123
117
  getSkipStackFramesPatternSetting() {
124
- return Common.Settings.Settings.instance().moduleSetting('skip-stack-frames-pattern');
118
+ return this.#settings.moduleSetting('skip-stack-frames-pattern');
125
119
  }
126
120
  setIgnoreListPatterns(debuggerModel) {
127
121
  const regexPatterns = this.enableIgnoreListing ? this.getSkipStackFramesPatternSetting().getAsArray() : [];
@@ -201,7 +195,7 @@ export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper {
201
195
  }
202
196
  async updateScriptRanges(script, sourceMap) {
203
197
  let hasIgnoreListedMappings = false;
204
- if (!IgnoreListManager.instance().isUserIgnoreListedURL(script.sourceURL, { isContentScript: script.isContentScript() })) {
198
+ if (!this.isUserIgnoreListedURL(script.sourceURL, { isContentScript: script.isContentScript() })) {
205
199
  hasIgnoreListedMappings =
206
200
  sourceMap?.sourceURLs().some(url => this.isUserIgnoreListedURL(url, { isKnownThirdParty: sourceMap.hasIgnoreListHint(url) })) ??
207
201
  false;
@@ -253,48 +247,47 @@ export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper {
253
247
  this.unIgnoreListURL(this.uiSourceCodeURL(uiSourceCode), this.getGeneralRulesForUISourceCode(uiSourceCode));
254
248
  }
255
249
  get enableIgnoreListing() {
256
- return Common.Settings.Settings.instance().moduleSetting('enable-ignore-listing').get();
250
+ return this.#settings.moduleSetting('enable-ignore-listing').get();
257
251
  }
258
252
  set enableIgnoreListing(value) {
259
- Common.Settings.Settings.instance().moduleSetting('enable-ignore-listing').set(value);
253
+ this.#settings.moduleSetting('enable-ignore-listing').set(value);
260
254
  }
261
255
  get skipContentScripts() {
262
- return this.enableIgnoreListing && Common.Settings.Settings.instance().moduleSetting('skip-content-scripts').get();
256
+ return this.enableIgnoreListing && this.#settings.moduleSetting('skip-content-scripts').get();
263
257
  }
264
258
  get skipAnonymousScripts() {
265
- return this.enableIgnoreListing &&
266
- Common.Settings.Settings.instance().moduleSetting('skip-anonymous-scripts').get();
259
+ return this.enableIgnoreListing && this.#settings.moduleSetting('skip-anonymous-scripts').get();
267
260
  }
268
261
  get automaticallyIgnoreListKnownThirdPartyScripts() {
269
262
  return this.enableIgnoreListing &&
270
- Common.Settings.Settings.instance().moduleSetting('automatically-ignore-list-known-third-party-scripts').get();
263
+ this.#settings.moduleSetting('automatically-ignore-list-known-third-party-scripts').get();
271
264
  }
272
265
  ignoreListContentScripts() {
273
266
  if (!this.enableIgnoreListing) {
274
267
  this.enableIgnoreListing = true;
275
268
  }
276
- Common.Settings.Settings.instance().moduleSetting('skip-content-scripts').set(true);
269
+ this.#settings.moduleSetting('skip-content-scripts').set(true);
277
270
  }
278
271
  unIgnoreListContentScripts() {
279
- Common.Settings.Settings.instance().moduleSetting('skip-content-scripts').set(false);
272
+ this.#settings.moduleSetting('skip-content-scripts').set(false);
280
273
  }
281
274
  ignoreListAnonymousScripts() {
282
275
  if (!this.enableIgnoreListing) {
283
276
  this.enableIgnoreListing = true;
284
277
  }
285
- Common.Settings.Settings.instance().moduleSetting('skip-anonymous-scripts').set(true);
278
+ this.#settings.moduleSetting('skip-anonymous-scripts').set(true);
286
279
  }
287
280
  unIgnoreListAnonymousScripts() {
288
- Common.Settings.Settings.instance().moduleSetting('skip-anonymous-scripts').set(false);
281
+ this.#settings.moduleSetting('skip-anonymous-scripts').set(false);
289
282
  }
290
283
  ignoreListThirdParty() {
291
284
  if (!this.enableIgnoreListing) {
292
285
  this.enableIgnoreListing = true;
293
286
  }
294
- Common.Settings.Settings.instance().moduleSetting('automatically-ignore-list-known-third-party-scripts').set(true);
287
+ this.#settings.moduleSetting('automatically-ignore-list-known-third-party-scripts').set(true);
295
288
  }
296
289
  unIgnoreListThirdParty() {
297
- Common.Settings.Settings.instance().moduleSetting('automatically-ignore-list-known-third-party-scripts').set(false);
290
+ this.#settings.moduleSetting('automatically-ignore-list-known-third-party-scripts').set(false);
298
291
  }
299
292
  ignoreListURL(url) {
300
293
  const regexValue = this.urlToRegExpString(url);
@@ -372,7 +365,7 @@ export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper {
372
365
  async patternChanged() {
373
366
  this.#isIgnoreListedURLCache.clear();
374
367
  const promises = [];
375
- for (const debuggerModel of SDK.TargetManager.TargetManager.instance().models(SDK.DebuggerModel.DebuggerModel)) {
368
+ for (const debuggerModel of this.#targetManager.models(SDK.DebuggerModel.DebuggerModel)) {
376
369
  promises.push(this.setIgnoreListPatterns(debuggerModel));
377
370
  const sourceMapManager = debuggerModel.sourceMapManager();
378
371
  for (const script of debuggerModel.scripts()) {
@@ -515,6 +515,19 @@ export class UILocationRange {
515
515
  this.range = range;
516
516
  }
517
517
  }
518
+ /**
519
+ * A text range inside a specific {@link UISourceCode}, representing a function.
520
+ */
521
+ export class UIFunctionBounds {
522
+ uiSourceCode;
523
+ range;
524
+ name;
525
+ constructor(uiSourceCode, range, name) {
526
+ this.uiSourceCode = uiSourceCode;
527
+ this.range = range;
528
+ this.name = name;
529
+ }
530
+ }
518
531
  /**
519
532
  * A message associated with a range in a `UISourceCode`. The range will be
520
533
  * underlined starting at the range's start and ending at the line end (the
@@ -561,3 +574,28 @@ export class UISourceCodeMetadata {
561
574
  this.contentSize = contentSize;
562
575
  }
563
576
  }
577
+ /**
578
+ * Converts an existing LineColumnProfileMap to a new one using the provided mapping.
579
+ *
580
+ * The input and output line/column of originalToMappedLocation is 0-indexed.
581
+ */
582
+ export function createMappedProfileData(profileData, originalToMappedLocation) {
583
+ const mappedProfileData = new Map();
584
+ for (const [lineNumber, columnData] of profileData) {
585
+ for (const [columnNumber, data] of columnData) {
586
+ const mappedLocation = originalToMappedLocation(lineNumber - 1, columnNumber - 1);
587
+ if (!mappedLocation) {
588
+ continue;
589
+ }
590
+ const oneBasedFormattedLineNumber = mappedLocation[0] + 1;
591
+ const oneBasedFormattedColumnNumber = mappedLocation[1] + 1;
592
+ let mappedColumnData = mappedProfileData.get(oneBasedFormattedLineNumber);
593
+ if (!mappedColumnData) {
594
+ mappedColumnData = new Map();
595
+ mappedProfileData.set(oneBasedFormattedLineNumber, mappedColumnData);
596
+ }
597
+ mappedColumnData.set(oneBasedFormattedColumnNumber, (mappedColumnData.get(oneBasedFormattedColumnNumber) || 0) + data);
598
+ }
599
+ }
600
+ return mappedProfileData;
601
+ }
@@ -2,6 +2,7 @@
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 '../../core/common/common.js';
5
+ import * as Root from '../../core/root/root.js';
5
6
  import { UISourceCode } from './UISourceCode.js';
6
7
  /* eslint-disable @typescript-eslint/naming-convention -- Used by web_tests. */
7
8
  export var projectTypes;
@@ -92,22 +93,18 @@ export class ProjectStore {
92
93
  indexContent(_progress) {
93
94
  }
94
95
  }
95
- let workspaceInstance;
96
96
  export class WorkspaceImpl extends Common.ObjectWrapper.ObjectWrapper {
97
97
  #projects = new Map();
98
98
  #hasResourceContentTrackingExtensions = false;
99
- constructor() {
100
- super();
101
- }
102
99
  static instance(opts = { forceNew: null }) {
103
100
  const { forceNew } = opts;
104
- if (!workspaceInstance || forceNew) {
105
- workspaceInstance = new WorkspaceImpl();
101
+ if (!Root.DevToolsContext.globalInstance().has(WorkspaceImpl) || forceNew) {
102
+ Root.DevToolsContext.globalInstance().set(WorkspaceImpl, new WorkspaceImpl());
106
103
  }
107
- return workspaceInstance;
104
+ return Root.DevToolsContext.globalInstance().get(WorkspaceImpl);
108
105
  }
109
106
  static removeInstance() {
110
- workspaceInstance = undefined;
107
+ Root.DevToolsContext.globalInstance().delete(WorkspaceImpl);
111
108
  }
112
109
  uiSourceCode(projectId, url) {
113
110
  const project = this.#projects.get(projectId);
@@ -0,0 +1,34 @@
1
+ // Copyright 2025 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 Common from '../../core/common/common.js';
5
+ Common.Settings.registerSettingExtension({
6
+ storageType: "Synced" /* Common.Settings.SettingStorageType.SYNCED */,
7
+ settingName: 'skip-stack-frames-pattern',
8
+ settingType: "regex" /* Common.Settings.SettingType.REGEX */,
9
+ defaultValue: '/node_modules/|^node:',
10
+ });
11
+ Common.Settings.registerSettingExtension({
12
+ storageType: "Synced" /* Common.Settings.SettingStorageType.SYNCED */,
13
+ settingName: 'skip-content-scripts',
14
+ settingType: "boolean" /* Common.Settings.SettingType.BOOLEAN */,
15
+ defaultValue: true,
16
+ });
17
+ Common.Settings.registerSettingExtension({
18
+ storageType: "Synced" /* Common.Settings.SettingStorageType.SYNCED */,
19
+ settingName: 'automatically-ignore-list-known-third-party-scripts',
20
+ settingType: "boolean" /* Common.Settings.SettingType.BOOLEAN */,
21
+ defaultValue: true,
22
+ });
23
+ Common.Settings.registerSettingExtension({
24
+ storageType: "Synced" /* Common.Settings.SettingStorageType.SYNCED */,
25
+ settingName: 'skip-anonymous-scripts',
26
+ settingType: "boolean" /* Common.Settings.SettingType.BOOLEAN */,
27
+ defaultValue: false,
28
+ });
29
+ Common.Settings.registerSettingExtension({
30
+ storageType: "Synced" /* Common.Settings.SettingStorageType.SYNCED */,
31
+ settingName: 'enable-ignore-listing',
32
+ settingType: "boolean" /* Common.Settings.SettingType.BOOLEAN */,
33
+ defaultValue: true,
34
+ });
@@ -65,7 +65,14 @@ export class McpContext {
65
65
  collect(event);
66
66
  });
67
67
  page.on('pageerror', event => {
68
- collect(event);
68
+ if (event instanceof Error) {
69
+ collect(event);
70
+ }
71
+ else {
72
+ const error = new Error(`${event}`);
73
+ error.stack = undefined;
74
+ collect(error);
75
+ }
69
76
  });
70
77
  });
71
78
  }
@@ -24,7 +24,6 @@ function getDefaultBookmarks() {
24
24
  'docs': 'https://developer.chrome.com/docs/extensions/',
25
25
  'localhost': 'http://localhost:3000',
26
26
  'localhost8080': 'http://localhost:8080',
27
- 'suno': 'https://suno.com/create',
28
27
  'chatgpt': CHATGPT_CONFIG.DEFAULT_URL
29
28
  };
30
29
  }