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
@@ -233,7 +233,7 @@ export const stripLineBreaks = (inputStr) => {
233
233
  };
234
234
  const EXTENDED_KEBAB_CASE_REGEXP = /^([a-z0-9]+(?:-[a-z0-9]+)*\.)*[a-z0-9]+(?:-[a-z0-9]+)*$/;
235
235
  /**
236
- * Tests if the `inputStr` is following the extended Kebab Case naming convetion,
236
+ * Tests if the `inputStr` is following the extended Kebab Case naming convention,
237
237
  * where words are separated with either a dash (`-`) or a dot (`.`), and all
238
238
  * characters must be lower-case alphanumeric.
239
239
  *
@@ -351,7 +351,7 @@ export const escapeForRegExp = (str) => {
351
351
  };
352
352
  export const naturalOrderComparator = (a, b) => {
353
353
  const chunk = /^\d+|^\D+/;
354
- let chunka, chunkb, anum, bnum;
354
+ let chunkA, chunkB, numA, numB;
355
355
  while (true) {
356
356
  if (a) {
357
357
  if (!b) {
@@ -364,33 +364,33 @@ export const naturalOrderComparator = (a, b) => {
364
364
  }
365
365
  return 0;
366
366
  }
367
- chunka = a.match(chunk)[0];
368
- chunkb = b.match(chunk)[0];
369
- anum = !Number.isNaN(Number(chunka));
370
- bnum = !Number.isNaN(Number(chunkb));
371
- if (anum && !bnum) {
367
+ chunkA = a.match(chunk)[0];
368
+ chunkB = b.match(chunk)[0];
369
+ numA = !Number.isNaN(Number(chunkA));
370
+ numB = !Number.isNaN(Number(chunkB));
371
+ if (numA && !numB) {
372
372
  return -1;
373
373
  }
374
- if (bnum && !anum) {
374
+ if (numB && !numA) {
375
375
  return 1;
376
376
  }
377
- if (anum && bnum) {
378
- const diff = Number(chunka) - Number(chunkb);
377
+ if (numA && numB) {
378
+ const diff = Number(chunkA) - Number(chunkB);
379
379
  if (diff) {
380
380
  return diff;
381
381
  }
382
- if (chunka.length !== chunkb.length) {
383
- if (!Number(chunka) && !Number(chunkb)) { // chunks are strings of all 0s (special case)
384
- return chunka.length - chunkb.length;
382
+ if (chunkA.length !== chunkB.length) {
383
+ if (!Number(chunkA) && !Number(chunkB)) { // chunks are strings of all 0s (special case)
384
+ return chunkA.length - chunkB.length;
385
385
  }
386
- return chunkb.length - chunka.length;
386
+ return chunkB.length - chunkA.length;
387
387
  }
388
388
  }
389
- else if (chunka !== chunkb) {
390
- return (chunka < chunkb) ? -1 : 1;
389
+ else if (chunkA !== chunkB) {
390
+ return (chunkA < chunkB) ? -1 : 1;
391
391
  }
392
- a = a.substring(chunka.length);
393
- b = b.substring(chunkb.length);
392
+ a = a.substring(chunkA.length);
393
+ b = b.substring(chunkB.length);
394
394
  }
395
395
  };
396
396
  export const base64ToSize = function (content) {
@@ -458,19 +458,21 @@ export const createPlainTextSearchRegex = function (query, flags) {
458
458
  export const toLowerCaseString = function (input) {
459
459
  return input.toLowerCase();
460
460
  };
461
+ /**
462
+ * 1: two or more consecutive uppercase letters. This is useful for identifying acronyms
463
+ * 2: lookahead assertion that matches a word boundary
464
+ * 3: numeronym: single letter followed by number and another letter
465
+ * 4: word starting with an optional uppercase letter
466
+ * 5: single digit followed by word to handle '3D' or '2px' (this might be controverial)
467
+ * 6: single uppercase letter or number
468
+ * 7: a dot character. We extract it into a separate word and remove dashes around it later.
469
+ * This is makes more sense conceptually and allows accounting for all possible word variants.
470
+ * Making dot a part of a word prevent us from handling acronyms or numeronyms after the word
471
+ * correctly without making the RegExp prohibitively complicated.
472
+ * https://regex101.com/r/FhMVKc/1
473
+ * <---1---><------------2-----------> <---------3--------> <-----4----> <------5-----> <-----6----> <7>
474
+ */
461
475
  const WORD = /[A-Z]{2,}(?=[A-Z0-9][a-z0-9]+|\b|_)|[A-Za-z][0-9]+[a-z]?|[A-Z]?[a-z]+|[0-9][A-Za-z]+|[A-Z]|[0-9]+|[.]/g;
462
- // <---1---><------------2-----------> <---------3--------> <-----4----> <------5-----> <-----6----> <7>
463
- // 1: two or more consecutive uppercase letters. This is useful for identifying acronyms
464
- // 2: lookahead assertion that matches a word boundary
465
- // 3: numeronym: single letter followed by number and another letter
466
- // 4: word starting with an optional uppercase letter
467
- // 5: single digit followed by word to handle '3D' or '2px' (this might be controverial)
468
- // 6: single uppercase letter or number
469
- // 7: a dot character. We extract it into a separate word and remove dashes around it later.
470
- // This is makes more sense conceptually and allows accounting for all possible word variants.
471
- // Making dot a part of a word prevent us from handling acronyms or numeronyms after the word
472
- // correctly without making the RegExp prohibitively complicated.
473
- // https://regex101.com/r/FhMVKc/1
474
476
  export const toKebabCase = function (input) {
475
477
  return (input.match?.(WORD)?.map(w => w.toLowerCase()).join('-').replaceAll('-.-', '.') || input);
476
478
  };
@@ -507,7 +509,7 @@ export function toSnakeCase(text) {
507
509
  .replace(/^_|_$/g, ''); // 5
508
510
  return result;
509
511
  }
510
- // Replaces the last ocurrence of parameter `search` with parameter `replacement` in `input`
512
+ /** Replaces the last occurrence of parameter `search` with parameter `replacement` in `input` **/
511
513
  export const replaceLast = function (input, search, replacement) {
512
514
  const replacementStartIndex = input.lastIndexOf(search);
513
515
  if (replacementStartIndex === -1) {
@@ -532,5 +534,5 @@ export const concatBase64 = function (lhs, rhs) {
532
534
  }
533
535
  const lhsLeaveAsIs = lhs.substring(0, lhs.length - 4);
534
536
  const lhsToDecode = lhs.substring(lhs.length - 4);
535
- return lhsLeaveAsIs + window.btoa(window.atob(lhsToDecode) + window.atob(rhs));
537
+ return lhsLeaveAsIs + globalThis.btoa(globalThis.atob(lhsToDecode) + globalThis.atob(rhs));
536
538
  };
@@ -0,0 +1,4 @@
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
+ export {};
@@ -0,0 +1,5 @@
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 HostRuntime from './HostRuntime.js';
5
+ export { HostRuntime };
@@ -0,0 +1,63 @@
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
+ class WebWorkerScope {
5
+ postMessage(message) {
6
+ self.postMessage(message);
7
+ }
8
+ set onmessage(listener) {
9
+ self.onmessage = listener;
10
+ }
11
+ }
12
+ class WebWorker {
13
+ #workerPromise;
14
+ #disposed;
15
+ #rejectWorkerPromise;
16
+ constructor(workerLocation) {
17
+ this.#workerPromise = new Promise((fulfill, reject) => {
18
+ this.#rejectWorkerPromise = reject;
19
+ const worker = new Worker(new URL(workerLocation), { type: 'module' });
20
+ worker.onerror = event => {
21
+ console.error(`Failed to load worker for ${workerLocation}:`, event);
22
+ };
23
+ worker.onmessage = (event) => {
24
+ console.assert(event.data === 'workerReady');
25
+ worker.onmessage = null;
26
+ fulfill(worker);
27
+ };
28
+ });
29
+ }
30
+ postMessage(message, transfer) {
31
+ void this.#workerPromise.then(worker => {
32
+ if (!this.#disposed) {
33
+ worker.postMessage(message, transfer ?? []);
34
+ }
35
+ });
36
+ }
37
+ dispose() {
38
+ this.#disposed = true;
39
+ void this.#workerPromise.then(worker => worker.terminate());
40
+ }
41
+ terminate(immediately = false) {
42
+ if (immediately) {
43
+ this.#rejectWorkerPromise?.(new Error('Worker terminated'));
44
+ }
45
+ this.dispose();
46
+ }
47
+ set onmessage(listener) {
48
+ void this.#workerPromise.then(worker => {
49
+ worker.onmessage = listener;
50
+ });
51
+ }
52
+ set onerror(listener) {
53
+ void this.#workerPromise.then(worker => {
54
+ worker.onerror = listener;
55
+ });
56
+ }
57
+ }
58
+ export const HOST_RUNTIME = {
59
+ createWorker(url) {
60
+ return new WebWorker(url);
61
+ },
62
+ workerScope: new WebWorkerScope(),
63
+ };
@@ -0,0 +1,5 @@
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 HostRuntime from './HostRuntime.js';
5
+ export { HostRuntime };
@@ -0,0 +1,72 @@
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 WorkerThreads from 'node:worker_threads';
5
+ class NodeWorkerScope {
6
+ postMessage(message) {
7
+ WorkerThreads.parentPort?.postMessage(message);
8
+ }
9
+ set onmessage(listener) {
10
+ WorkerThreads.parentPort?.on('message', data => {
11
+ listener({ data });
12
+ });
13
+ }
14
+ }
15
+ class NodeWorker {
16
+ #workerPromise;
17
+ #disposed = false;
18
+ #rejectWorkerPromise;
19
+ constructor(url) {
20
+ this.#workerPromise = new Promise((resolve, reject) => {
21
+ this.#rejectWorkerPromise = reject;
22
+ const worker = new WorkerThreads.Worker(new URL(url));
23
+ worker.once('message', (message) => {
24
+ if (message === 'workerReady') {
25
+ resolve(worker);
26
+ }
27
+ });
28
+ worker.on('error', reject);
29
+ });
30
+ }
31
+ postMessage(message) {
32
+ void this.#workerPromise.then(worker => {
33
+ if (!this.#disposed) {
34
+ worker.postMessage(message);
35
+ }
36
+ });
37
+ }
38
+ dispose() {
39
+ this.#disposed = true;
40
+ void this.#workerPromise.then(worker => worker.terminate());
41
+ }
42
+ terminate(immediately) {
43
+ if (immediately) {
44
+ this.#rejectWorkerPromise?.(new Error('Worker terminated'));
45
+ }
46
+ this.dispose();
47
+ }
48
+ set onmessage(listener) {
49
+ void this.#workerPromise.then(worker => {
50
+ worker.on('message', data => {
51
+ if (!this.#disposed) {
52
+ listener({ data });
53
+ }
54
+ });
55
+ });
56
+ }
57
+ set onerror(listener) {
58
+ void this.#workerPromise.then(worker => {
59
+ worker.on('error', (error) => {
60
+ if (!this.#disposed) {
61
+ listener({ type: 'error', ...error });
62
+ }
63
+ });
64
+ });
65
+ }
66
+ }
67
+ export const HOST_RUNTIME = {
68
+ createWorker(url) {
69
+ return new NodeWorker(url);
70
+ },
71
+ workerScope: new NodeWorkerScope(),
72
+ };
@@ -0,0 +1,5 @@
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 HostRuntime from './HostRuntime.js';
5
+ export { HostRuntime };
@@ -6,7 +6,7 @@ import * as Brand from './Brand.js';
6
6
  import * as Constructor from './Constructor.js';
7
7
  import * as DateUtilities from './DateUtilities.js';
8
8
  import * as DevToolsPath from './DevToolsPath.js';
9
- import * as DOMUtilities from './DOMUtilities.js';
9
+ import * as HostRuntime from './HostRuntime.js';
10
10
  import * as KeyboardUtilities from './KeyboardUtilities.js';
11
11
  import * as MapUtilities from './MapUtilities.js';
12
12
  import * as MimeType from './MimeType.js';
@@ -23,4 +23,4 @@ import * as UserVisibleError from './UserVisibleError.js';
23
23
  * error).
24
24
  */
25
25
  export { assertNever, assertNotNullOrUndefined, assertUnhandled } from './TypescriptUtilities.js';
26
- export { ArrayUtilities, Brand, Constructor, DateUtilities, DevToolsPath, DOMUtilities, KeyboardUtilities, MapUtilities, MimeType, NumberUtilities, StringUtilities, Timing, TypedArrayUtilities, TypeScriptUtilities, UIString, UserVisibleError, };
26
+ export { ArrayUtilities, Brand, Constructor, DateUtilities, DevToolsPath, HostRuntime, KeyboardUtilities, MapUtilities, MimeType, NumberUtilities, StringUtilities, Timing, TypedArrayUtilities, TypeScriptUtilities, UIString, UserVisibleError, };
@@ -0,0 +1,17 @@
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
+ /**
5
+ * Keep this in sync with https://source.chromium.org/chromium/chromium/src/+/main:third_party/inspector_protocol/crdtp/dispatch.h.
6
+ */
7
+ export var CDPErrorStatus;
8
+ (function (CDPErrorStatus) {
9
+ CDPErrorStatus[CDPErrorStatus["PARSE_ERROR"] = -32700] = "PARSE_ERROR";
10
+ CDPErrorStatus[CDPErrorStatus["INVALID_REQUEST"] = -32600] = "INVALID_REQUEST";
11
+ CDPErrorStatus[CDPErrorStatus["METHOD_NOT_FOUND"] = -32601] = "METHOD_NOT_FOUND";
12
+ CDPErrorStatus[CDPErrorStatus["INVALID_PARAMS"] = -32602] = "INVALID_PARAMS";
13
+ CDPErrorStatus[CDPErrorStatus["INTERNAL_ERROR"] = -32603] = "INTERNAL_ERROR";
14
+ CDPErrorStatus[CDPErrorStatus["SERVER_ERROR"] = -32000] = "SERVER_ERROR";
15
+ CDPErrorStatus[CDPErrorStatus["SESSION_NOT_FOUND"] = -32001] = "SESSION_NOT_FOUND";
16
+ CDPErrorStatus[CDPErrorStatus["DEVTOOLS_STUB_ERROR"] = -32015] = "DEVTOOLS_STUB_ERROR";
17
+ })(CDPErrorStatus || (CDPErrorStatus = {}));
@@ -0,0 +1,12 @@
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
+ let connectionFactory;
5
+ export class ConnectionTransport {
6
+ static setFactory(factory) {
7
+ connectionFactory = factory;
8
+ }
9
+ static getFactory() {
10
+ return connectionFactory;
11
+ }
12
+ }
@@ -0,0 +1,138 @@
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 { CDPErrorStatus } from './CDPConnection.js';
5
+ import { InspectorBackend, test } from './InspectorBackend.js';
6
+ const LongPollingMethods = new Set(['CSS.takeComputedStyleUpdates']);
7
+ export class DevToolsCDPConnection {
8
+ #transport;
9
+ #lastMessageId = 1;
10
+ #pendingResponsesCount = 0;
11
+ #pendingLongPollingMessageIds = new Set();
12
+ #pendingScripts = [];
13
+ #callbacks = new Map();
14
+ #observers = new Set();
15
+ constructor(transport) {
16
+ this.#transport = transport;
17
+ test.deprecatedRunAfterPendingDispatches = this.deprecatedRunAfterPendingDispatches.bind(this);
18
+ test.sendRawMessage = this.sendRawMessageForTesting.bind(this);
19
+ this.#transport.setOnMessage(this.onMessage.bind(this));
20
+ this.#transport.setOnDisconnect(reason => {
21
+ this.#observers.forEach(observer => observer.onDisconnect(reason));
22
+ });
23
+ }
24
+ observe(observer) {
25
+ this.#observers.add(observer);
26
+ }
27
+ unobserve(observer) {
28
+ this.#observers.delete(observer);
29
+ }
30
+ send(method, params, sessionId) {
31
+ const messageId = ++this.#lastMessageId;
32
+ const messageObject = {
33
+ id: messageId,
34
+ method,
35
+ };
36
+ if (params) {
37
+ messageObject.params = params;
38
+ }
39
+ if (sessionId) {
40
+ messageObject.sessionId = sessionId;
41
+ }
42
+ if (test.dumpProtocol) {
43
+ test.dumpProtocol('frontend: ' + JSON.stringify(messageObject));
44
+ }
45
+ if (test.onMessageSent) {
46
+ const domain = method.split('.')[0];
47
+ const paramsObject = JSON.parse(JSON.stringify(params || {}));
48
+ test.onMessageSent({ domain, method, params: paramsObject, id: messageId, sessionId });
49
+ }
50
+ ++this.#pendingResponsesCount;
51
+ if (LongPollingMethods.has(method)) {
52
+ this.#pendingLongPollingMessageIds.add(messageId);
53
+ }
54
+ return new Promise(resolve => {
55
+ this.#callbacks.set(messageId, { resolve, method, sessionId });
56
+ this.#transport.sendRawMessage(JSON.stringify(messageObject));
57
+ });
58
+ }
59
+ resolvePendingCalls(sessionId) {
60
+ for (const { resolve, method, sessionId: callbackSessionId } of this.#callbacks.values()) {
61
+ if (sessionId !== callbackSessionId) {
62
+ continue;
63
+ }
64
+ resolve({
65
+ error: {
66
+ message: `Session is unregistering, can\'t dispatch pending call to ${method}`,
67
+ code: CDPErrorStatus.SESSION_NOT_FOUND,
68
+ }
69
+ });
70
+ }
71
+ }
72
+ sendRawMessageForTesting(method, params, callback, sessionId = '') {
73
+ void this.send(method, params, sessionId).then(response => {
74
+ if ('error' in response && response.error) {
75
+ callback?.(response.error, null);
76
+ }
77
+ else if ('result' in response) {
78
+ callback?.(null, response.result);
79
+ }
80
+ });
81
+ }
82
+ onMessage(message) {
83
+ if (test.dumpProtocol) {
84
+ test.dumpProtocol('backend: ' + ((typeof message === 'string') ? message : JSON.stringify(message)));
85
+ }
86
+ if (test.onMessageReceived) {
87
+ const messageObjectCopy = JSON.parse((typeof message === 'string') ? message : JSON.stringify(message));
88
+ test.onMessageReceived(messageObjectCopy);
89
+ }
90
+ const messageObject = ((typeof message === 'string') ? JSON.parse(message) : message);
91
+ if ('id' in messageObject && messageObject.id !== undefined) { // just a response for some request
92
+ const callback = this.#callbacks.get(messageObject.id);
93
+ this.#callbacks.delete(messageObject.id);
94
+ if (!callback) {
95
+ // Ignore messages with unknown IDs, we might see puppeteer proxied messages here.
96
+ return;
97
+ }
98
+ callback.resolve(messageObject);
99
+ --this.#pendingResponsesCount;
100
+ this.#pendingLongPollingMessageIds.delete(messageObject.id);
101
+ if (this.#pendingScripts.length && !this.hasOutstandingNonLongPollingRequests()) {
102
+ this.deprecatedRunAfterPendingDispatches();
103
+ }
104
+ }
105
+ else if ('method' in messageObject) {
106
+ this.#observers.forEach(observer => observer.onEvent(messageObject));
107
+ }
108
+ else {
109
+ InspectorBackend.reportProtocolError('Protocol Error: the message without method', messageObject);
110
+ }
111
+ }
112
+ hasOutstandingNonLongPollingRequests() {
113
+ return this.#pendingResponsesCount - this.#pendingLongPollingMessageIds.size > 0;
114
+ }
115
+ deprecatedRunAfterPendingDispatches(script) {
116
+ if (script) {
117
+ this.#pendingScripts.push(script);
118
+ }
119
+ // Execute all promises.
120
+ setTimeout(() => {
121
+ if (!this.hasOutstandingNonLongPollingRequests()) {
122
+ this.executeAfterPendingDispatches();
123
+ }
124
+ else {
125
+ this.deprecatedRunAfterPendingDispatches();
126
+ }
127
+ }, 0);
128
+ }
129
+ executeAfterPendingDispatches() {
130
+ if (!this.hasOutstandingNonLongPollingRequests()) {
131
+ const scripts = this.#pendingScripts;
132
+ this.#pendingScripts = [];
133
+ for (let id = 0; id < scripts.length; ++id) {
134
+ scripts[id]();
135
+ }
136
+ }
137
+ }
138
+ }