chrome-devtools-mcp 0.0.1 → 0.0.2

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 (354) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +196 -0
  3. package/build/node_modules/chrome-devtools-frontend/LICENSE +27 -0
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/App.js +4 -0
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/AppProvider.js +17 -0
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Base64.js +43 -0
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/CharacterIdMap.js +27 -0
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +2029 -0
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +330 -0
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorUtils.js +221 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +86 -0
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +14 -0
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/EventTarget.js +14 -0
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +64 -0
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/JavaScriptMetaData.js +4 -0
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Lazy.js +29 -0
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Linkifier.js +34 -0
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +20 -0
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Mutex.js +49 -0
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Object.js +86 -0
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +459 -0
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Progress.js +137 -0
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/QueryParamHandler.js +4 -0
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResolverBase.js +69 -0
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +506 -0
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +13 -0
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +159 -0
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Runnable.js +24 -0
  29. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +79 -0
  30. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SettingRegistration.js +164 -0
  31. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +1281 -0
  32. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SimpleHistoryManager.js +97 -0
  33. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +17 -0
  34. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/TextDictionary.js +40 -0
  35. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +71 -0
  36. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Trie.js +127 -0
  37. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Worker.js +44 -0
  38. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +44 -0
  39. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +415 -0
  40. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +161 -0
  41. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +510 -0
  42. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +66 -0
  43. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +59 -0
  44. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +232 -0
  45. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +953 -0
  46. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +12 -0
  47. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/i18n.js +9 -0
  48. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +199 -0
  49. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Brand.js +4 -0
  50. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Constructor.js +4 -0
  51. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DOMUtilities.js +122 -0
  52. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DateUtilities.js +13 -0
  53. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DevToolsPath.js +27 -0
  54. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/KeyboardUtilities.js +21 -0
  55. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MapUtilities.js +79 -0
  56. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/MimeType.js +143 -0
  57. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/NumberUtilities.js +72 -0
  58. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +536 -0
  59. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/Timing.js +9 -0
  60. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypedArrayUtilities.js +157 -0
  61. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/TypescriptUtilities.js +24 -0
  62. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UIString.js +4 -0
  63. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/UserVisibleError.js +22 -0
  64. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +26 -0
  65. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +800 -0
  66. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/NodeURL.js +31 -0
  67. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +13 -0
  68. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/Runtime.js +1 -0
  69. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +5 -0
  70. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AccessibilityModel.js +281 -0
  71. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +846 -0
  72. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AutofillModel.js +155 -0
  73. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUProfilerModel.js +99 -0
  74. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +220 -0
  75. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSContainerQuery.js +98 -0
  76. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSFontFace.js +31 -0
  77. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSLayer.js +22 -0
  78. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +1279 -0
  79. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMedia.js +100 -0
  80. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +1518 -0
  81. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +902 -0
  82. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +315 -0
  83. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +572 -0
  84. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +1316 -0
  85. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSQuery.js +53 -0
  86. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +361 -0
  87. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSScope.js +22 -0
  88. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +275 -0
  89. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleSheetHeader.js +166 -0
  90. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSSupports.js +24 -0
  91. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CategorizedBreakpoint.js +29 -0
  92. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +232 -0
  93. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CompilerSourceMappingContentProvider.js +47 -0
  94. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +242 -0
  95. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +629 -0
  96. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModelTypes.js +14 -0
  97. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +241 -0
  98. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +198 -0
  99. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CookieParser.js +163 -0
  100. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMDebuggerModel.js +597 -0
  101. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +1610 -0
  102. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +1231 -0
  103. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EmulationModel.js +527 -0
  104. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +346 -0
  105. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +125 -0
  106. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameAssociated.js +4 -0
  107. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/FrameManager.js +199 -0
  108. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +130 -0
  109. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +73 -0
  110. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +83 -0
  111. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IsolateManager.js +208 -0
  112. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IssuesModel.js +41 -0
  113. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LayerTreeBase.js +95 -0
  114. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/LogModel.js +34 -0
  115. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +1915 -0
  116. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +1660 -0
  117. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayColorGenerator.js +48 -0
  118. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +765 -0
  119. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayPersistentHighlighter.js +384 -0
  120. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageLoad.js +25 -0
  121. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +300 -0
  122. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PaintProfiler.js +67 -0
  123. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PerformanceMetricsModel.js +62 -0
  124. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +563 -0
  125. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +292 -0
  126. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingObject.js +4 -0
  127. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +905 -0
  128. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Resource.js +163 -0
  129. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +922 -0
  130. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RuntimeModel.js +535 -0
  131. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SDKModel.js +45 -0
  132. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +174 -0
  133. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +395 -0
  134. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SecurityOriginManager.js +54 -0
  135. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEvents.js +67 -0
  136. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +110 -0
  137. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerTiming.js +216 -0
  138. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerCacheModel.js +271 -0
  139. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServiceWorkerManager.js +511 -0
  140. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +678 -0
  141. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +41 -0
  142. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapFunctionRanges.js +132 -0
  143. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +189 -0
  144. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopeChainEntry.js +156 -0
  145. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +276 -0
  146. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageBucketsModel.js +143 -0
  147. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/StorageKeyManager.js +53 -0
  148. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +262 -0
  149. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +382 -0
  150. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +49 -0
  151. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/WebAuthnModel.js +66 -0
  152. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +1117 -0
  153. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +89 -0
  154. package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1513 -0
  155. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +339 -0
  156. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +1558 -0
  157. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +7473 -0
  158. package/build/node_modules/chrome-devtools-frontend/front_end/generated/protocol.js +4 -0
  159. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +260 -0
  160. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +1096 -0
  161. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/UnitFormatters.js +130 -0
  162. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +514 -0
  163. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +90 -0
  164. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/cpu_profile.js +6 -0
  165. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/LogManager.js +67 -0
  166. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +494 -0
  167. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/RequestResolver.js +49 -0
  168. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs-meta.js +73 -0
  169. package/build/node_modules/chrome-devtools-frontend/front_end/models/logs/logs.js +7 -0
  170. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/Calculator.js +4 -0
  171. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/NetworkTimeCalculator.js +256 -0
  172. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +120 -0
  173. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/network_time_calculator.js +6 -0
  174. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/CodeMirrorUtils.js +32 -0
  175. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentData.js +173 -0
  176. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/ContentProvider.js +30 -0
  177. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StaticContentProvider.js +32 -0
  178. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/StreamingContentData.js +79 -0
  179. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/Text.js +69 -0
  180. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextCursor.js +35 -0
  181. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextRange.js +231 -0
  182. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/TextUtils.js +332 -0
  183. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/WasmDisassembly.js +68 -0
  184. package/build/node_modules/chrome-devtools-frontend/front_end/models/text_utils/text_utils.js +14 -0
  185. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EntityMapper.js +122 -0
  186. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +81 -0
  187. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +370 -0
  188. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +171 -0
  189. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Name.js +114 -0
  190. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +547 -0
  191. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +815 -0
  192. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/FilmStrip.js +44 -0
  193. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/MainThreadActivity.js +76 -0
  194. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ScriptDuplication.js +162 -0
  195. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/StackTraceForEvent.js +191 -0
  196. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/ThirdParties.js +118 -0
  197. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceFilter.js +50 -0
  198. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +592 -0
  199. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +10 -0
  200. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationFramesHandler.js +109 -0
  201. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AnimationHandler.js +26 -0
  202. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AsyncJSCallsHandler.js +187 -0
  203. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/AuctionWorkletsHandler.js +162 -0
  204. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/DOMStatsHandler.js +21 -0
  205. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ExtensionTraceDataHandler.js +263 -0
  206. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FlowsHandler.js +148 -0
  207. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +483 -0
  208. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/GPUHandler.js +35 -0
  209. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ImagePaintingHandler.js +147 -0
  210. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InitiatorsHandler.js +180 -0
  211. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/InvalidationsHandler.js +126 -0
  212. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +85 -0
  213. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestTextPaintHandler.js +27 -0
  214. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayerTreeHandler.js +103 -0
  215. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +446 -0
  216. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MemoryHandler.js +21 -0
  217. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +400 -0
  218. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ModelHandlers.js +33 -0
  219. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +540 -0
  220. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageFramesHandler.js +42 -0
  221. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +349 -0
  222. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/RendererHandler.js +346 -0
  223. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +207 -0
  224. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScreenshotsHandler.js +98 -0
  225. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +251 -0
  226. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SelectorStatsHandler.js +71 -0
  227. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/Threads.js +101 -0
  228. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserInteractionsHandler.js +297 -0
  229. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +184 -0
  230. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WarningsHandler.js +134 -0
  231. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/WorkersHandler.js +33 -0
  232. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/handlers.js +7 -0
  233. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +163 -0
  234. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/types.js +1 -0
  235. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Extensions.js +41 -0
  236. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Network.js +102 -0
  237. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SamplesIntegrator.js +493 -0
  238. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/SyntheticEvents.js +74 -0
  239. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +184 -0
  240. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +744 -0
  241. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/TreeHelpers.js +254 -0
  242. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/helpers.js +10 -0
  243. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +488 -0
  244. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +208 -0
  245. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +340 -0
  246. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +180 -0
  247. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +256 -0
  248. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +89 -0
  249. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +81 -0
  250. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +160 -0
  251. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +117 -0
  252. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +262 -0
  253. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +188 -0
  254. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +182 -0
  255. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +88 -0
  256. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Models.js +21 -0
  257. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +199 -0
  258. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +544 -0
  259. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +191 -0
  260. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +135 -0
  261. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Statistics.js +92 -0
  262. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +97 -0
  263. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +101 -0
  264. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/insights.js +9 -0
  265. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/types.js +18 -0
  266. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/LanternError.js +6 -0
  267. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/NetworkAnalyzer.js +488 -0
  268. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/core/core.js +5 -0
  269. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/BaseNode.js +276 -0
  270. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/CPUNode.js +63 -0
  271. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/NetworkNode.js +82 -0
  272. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/PageDependencyGraph.js +551 -0
  273. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/graph/graph.js +7 -0
  274. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/lantern.js +9 -0
  275. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/FirstContentfulPaint.js +136 -0
  276. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Interactive.js +67 -0
  277. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/LargestContentfulPaint.js +68 -0
  278. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/MaxPotentialFID.js +48 -0
  279. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/Metric.js +68 -0
  280. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/SpeedIndex.js +101 -0
  281. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TBTUtils.js +64 -0
  282. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/TotalBlockingTime.js +78 -0
  283. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/metrics/metrics.js +11 -0
  284. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/ConnectionPool.js +115 -0
  285. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Constants.js +42 -0
  286. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/DNSCache.js +47 -0
  287. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/SimulationTimingMap.js +134 -0
  288. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/Simulator.js +450 -0
  289. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/TCPConnection.js +154 -0
  290. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/simulation/simulation.js +9 -0
  291. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/Lantern.js +24 -0
  292. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/lantern/types/types.js +4 -0
  293. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/trace.js +17 -0
  294. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Configuration.js +18 -0
  295. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Extensions.js +37 -0
  296. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/File.js +57 -0
  297. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Overlays.js +4 -0
  298. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/Timing.js +15 -0
  299. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +565 -0
  300. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/types.js +9 -0
  301. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/codemirror.next/codemirror.next.js +1 -0
  302. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/LICENSE +202 -0
  303. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/legacy-javascript.js +38 -0
  304. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +944 -0
  305. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/LICENSE +26 -0
  306. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/builder.js +196 -0
  307. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/builder/safe_builder.js +226 -0
  308. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/codec.js +4 -0
  309. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +394 -0
  310. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encode.js +24 -0
  311. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +283 -0
  312. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/mod.js +7 -0
  313. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/util.js +9 -0
  314. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/vlq.js +84 -0
  315. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/source-map-scopes-codec.js +4 -0
  316. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/LICENSE +20 -0
  317. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/lib/nostats-subset.js +148 -0
  318. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +2 -0
  319. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/httparchive-subset.js +2 -0
  320. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +118 -0
  321. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +40 -0
  322. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/entities.test.js +26 -0
  323. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.js +4 -0
  324. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/index.test.js +215 -0
  325. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +4 -0
  326. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +4 -0
  327. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +4 -0
  328. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/package/nostats-subset.js +2 -0
  329. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/third-party-web/third-party-web.js +8 -0
  330. package/build/src/McpContext.js +204 -0
  331. package/build/src/McpResponse.js +178 -0
  332. package/build/src/Mutex.js +40 -0
  333. package/build/src/PageCollector.js +68 -0
  334. package/build/src/browser.js +105 -0
  335. package/build/src/formatters/consoleFormatter.js +71 -0
  336. package/build/src/formatters/networkFormatter.js +34 -0
  337. package/build/src/formatters/snapshotFormatter.js +75 -0
  338. package/build/src/index.js +206 -0
  339. package/build/src/logger.js +26 -0
  340. package/build/src/tools/ToolDefinition.js +8 -0
  341. package/build/src/tools/categories.js +14 -0
  342. package/build/src/tools/console.js +19 -0
  343. package/build/src/tools/emulation.js +61 -0
  344. package/build/src/tools/input.js +202 -0
  345. package/build/src/tools/network.js +35 -0
  346. package/build/src/tools/pages.js +181 -0
  347. package/build/src/tools/performance.js +116 -0
  348. package/build/src/tools/screenshot.js +65 -0
  349. package/build/src/tools/script.js +35 -0
  350. package/build/src/tools/snapshot.js +42 -0
  351. package/build/src/trace-processing/parse.js +73 -0
  352. package/build/src/waitForHelpers.js +109 -0
  353. package/package.json +53 -6
  354. package/README +0 -1
@@ -0,0 +1,370 @@
1
+ // Copyright 2024 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 Handlers from './handlers/handlers.js';
5
+ import * as Lantern from './lantern/lantern.js';
6
+ function createProcessedNavigation(data, frameId, navigationId) {
7
+ const scoresByNav = data.PageLoadMetrics.metricScoresByFrameId.get(frameId);
8
+ if (!scoresByNav) {
9
+ throw new Lantern.Core.LanternError('missing metric scores for frame');
10
+ }
11
+ const scores = scoresByNav.get(navigationId);
12
+ if (!scores) {
13
+ throw new Lantern.Core.LanternError('missing metric scores for specified navigation');
14
+ }
15
+ const getTimestampOrUndefined = (metric) => {
16
+ const metricScore = scores.get(metric);
17
+ if (!metricScore?.event) {
18
+ return;
19
+ }
20
+ return metricScore.event.ts;
21
+ };
22
+ const getTimestamp = (metric) => {
23
+ const metricScore = scores.get(metric);
24
+ if (!metricScore?.event) {
25
+ throw new Lantern.Core.LanternError(`missing metric: ${metric}`);
26
+ }
27
+ return metricScore.event.ts;
28
+ };
29
+ return {
30
+ timestamps: {
31
+ firstContentfulPaint: getTimestamp("FCP" /* Handlers.ModelHandlers.PageLoadMetrics.MetricName.FCP */),
32
+ largestContentfulPaint: getTimestampOrUndefined("LCP" /* Handlers.ModelHandlers.PageLoadMetrics.MetricName.LCP */),
33
+ },
34
+ };
35
+ }
36
+ function createParsedUrl(url) {
37
+ if (typeof url === 'string') {
38
+ url = new URL(url);
39
+ }
40
+ return {
41
+ scheme: url.protocol.split(':')[0],
42
+ // Intentional, DevTools uses different terminology
43
+ host: url.hostname,
44
+ securityOrigin: url.origin,
45
+ };
46
+ }
47
+ /**
48
+ * Returns a map of `pid` -> `tid[]`.
49
+ */
50
+ function findWorkerThreads(trace) {
51
+ // TODO: WorkersHandler in Trace Engine needs to be updated to also include `pid` (only had `tid`).
52
+ const workerThreads = new Map();
53
+ const workerCreationEvents = ['ServiceWorker thread', 'DedicatedWorker thread'];
54
+ for (const event of trace.traceEvents) {
55
+ if (event.name !== 'thread_name' || !event.args.name) {
56
+ continue;
57
+ }
58
+ if (!workerCreationEvents.includes(event.args.name)) {
59
+ continue;
60
+ }
61
+ const tids = workerThreads.get(event.pid);
62
+ if (tids) {
63
+ tids.push(event.tid);
64
+ }
65
+ else {
66
+ workerThreads.set(event.pid, [event.tid]);
67
+ }
68
+ }
69
+ return workerThreads;
70
+ }
71
+ function createLanternRequest(parsedTrace, workerThreads, request) {
72
+ if (request.args.data.hasResponse && request.args.data.connectionId === undefined) {
73
+ throw new Lantern.Core.LanternError('Trace is too old');
74
+ }
75
+ let url;
76
+ try {
77
+ url = new URL(request.args.data.url);
78
+ }
79
+ catch {
80
+ return;
81
+ }
82
+ const timing = request.args.data.timing ? {
83
+ // These two timings are not included in the trace.
84
+ workerFetchStart: -1,
85
+ workerRespondWithSettled: -1,
86
+ receiveHeadersStart: -1,
87
+ ...request.args.data.timing,
88
+ } :
89
+ undefined;
90
+ const networkRequestTime = timing ? timing.requestTime * 1000 : request.args.data.syntheticData.downloadStart / 1000;
91
+ let fromWorker = false;
92
+ const tids = workerThreads.get(request.pid);
93
+ if (tids?.includes(request.tid)) {
94
+ fromWorker = true;
95
+ }
96
+ // Trace Engine collects worker thread ids in a different manner than `workerThreads` does.
97
+ // AFAIK these should be equivalent, but in case they are not let's also check this for now.
98
+ if (parsedTrace.Workers.workerIdByThread.has(request.tid)) {
99
+ fromWorker = true;
100
+ }
101
+ // `initiator` in the trace does not contain the stack trace for JS-initiated
102
+ // requests. Instead, that is stored in the `stackTrace` property of the SyntheticNetworkRequest.
103
+ // There are some minor differences in the fields, accounted for here.
104
+ // Most importantly, there seems to be fewer frames in the trace than the equivalent
105
+ // events over the CDP. This results in less accuracy in determining the initiator request,
106
+ // which means less edges in the graph, which mean worse results.
107
+ // TODO: Should fix in Chromium.
108
+ const initiator = request.args.data.initiator ?? { type: "other" /* Protocol.Network.InitiatorType.Other */ };
109
+ if (request.args.data.stackTrace) {
110
+ const callFrames = request.args.data.stackTrace.map(f => {
111
+ return {
112
+ scriptId: String(f.scriptId),
113
+ url: f.url,
114
+ lineNumber: f.lineNumber - 1,
115
+ columnNumber: f.columnNumber - 1,
116
+ functionName: f.functionName,
117
+ };
118
+ });
119
+ initiator.stack = { callFrames };
120
+ // Note: there is no `parent` to set ...
121
+ }
122
+ let resourceType = request.args.data.resourceType;
123
+ if (request.args.data.initiator?.fetchType === 'xmlhttprequest') {
124
+ // @ts-expect-error yes XHR is a valid ResourceType. TypeScript const enums are so unhelpful.
125
+ resourceType = 'XHR';
126
+ }
127
+ else if (request.args.data.initiator?.fetchType === 'fetch') {
128
+ // @ts-expect-error yes Fetch is a valid ResourceType. TypeScript const enums are so unhelpful.
129
+ resourceType = 'Fetch';
130
+ }
131
+ // TODO: set decodedBodyLength for data urls in Trace Engine.
132
+ let resourceSize = request.args.data.decodedBodyLength ?? 0;
133
+ if (url.protocol === 'data:' && resourceSize === 0) {
134
+ const commaIndex = url.pathname.indexOf(',');
135
+ if (url.pathname.substring(0, commaIndex).includes(';base64')) {
136
+ resourceSize = atob(url.pathname.substring(commaIndex + 1)).length;
137
+ }
138
+ else {
139
+ resourceSize = url.pathname.length - commaIndex - 1;
140
+ }
141
+ }
142
+ return {
143
+ rawRequest: request,
144
+ requestId: request.args.data.requestId,
145
+ connectionId: request.args.data.connectionId ?? 0,
146
+ connectionReused: request.args.data.connectionReused ?? false,
147
+ url: request.args.data.url,
148
+ protocol: request.args.data.protocol,
149
+ parsedURL: createParsedUrl(url),
150
+ documentURL: request.args.data.requestingFrameUrl,
151
+ rendererStartTime: request.ts / 1000,
152
+ networkRequestTime,
153
+ responseHeadersEndTime: request.args.data.syntheticData.downloadStart / 1000,
154
+ networkEndTime: request.args.data.syntheticData.finishTime / 1000,
155
+ transferSize: request.args.data.encodedDataLength,
156
+ resourceSize,
157
+ fromDiskCache: request.args.data.syntheticData.isDiskCached,
158
+ fromMemoryCache: request.args.data.syntheticData.isMemoryCached,
159
+ isLinkPreload: request.args.data.isLinkPreload,
160
+ finished: request.args.data.finished,
161
+ failed: request.args.data.failed,
162
+ statusCode: request.args.data.statusCode,
163
+ initiator,
164
+ timing,
165
+ resourceType,
166
+ mimeType: request.args.data.mimeType,
167
+ priority: request.args.data.priority,
168
+ frameId: request.args.data.frame,
169
+ fromWorker,
170
+ // Set later.
171
+ redirects: undefined,
172
+ redirectSource: undefined,
173
+ redirectDestination: undefined,
174
+ initiatorRequest: undefined,
175
+ };
176
+ }
177
+ /**
178
+ * @param request The request to find the initiator of
179
+ */
180
+ function chooseInitiatorRequest(request, requestsByURL) {
181
+ if (request.redirectSource) {
182
+ return request.redirectSource;
183
+ }
184
+ const initiatorURL = Lantern.Graph.PageDependencyGraph.getNetworkInitiators(request)[0];
185
+ let candidates = requestsByURL.get(initiatorURL) || [];
186
+ // The (valid) initiator must come before the initiated request.
187
+ candidates = candidates.filter(c => {
188
+ return c.responseHeadersEndTime <= request.rendererStartTime && c.finished && !c.failed;
189
+ });
190
+ if (candidates.length > 1) {
191
+ // Disambiguate based on prefetch. Prefetch requests have type 'Other' and cannot
192
+ // initiate requests, so we drop them here.
193
+ const nonPrefetchCandidates = candidates.filter(cand => cand.resourceType !== Lantern.Types.NetworkRequestTypes.Other);
194
+ if (nonPrefetchCandidates.length) {
195
+ candidates = nonPrefetchCandidates;
196
+ }
197
+ }
198
+ if (candidates.length > 1) {
199
+ // Disambiguate based on frame. It's likely that the initiator comes from the same frame.
200
+ const sameFrameCandidates = candidates.filter(cand => cand.frameId === request.frameId);
201
+ if (sameFrameCandidates.length) {
202
+ candidates = sameFrameCandidates;
203
+ }
204
+ }
205
+ if (candidates.length > 1 && request.initiator.type === 'parser') {
206
+ // Filter to just Documents when initiator type is parser.
207
+ const documentCandidates = candidates.filter(cand => cand.resourceType === Lantern.Types.NetworkRequestTypes.Document);
208
+ if (documentCandidates.length) {
209
+ candidates = documentCandidates;
210
+ }
211
+ }
212
+ if (candidates.length > 1) {
213
+ // If all real loads came from successful preloads (url preloaded and
214
+ // loads came from the cache), filter to link rel=preload request(s).
215
+ const linkPreloadCandidates = candidates.filter(c => c.isLinkPreload);
216
+ if (linkPreloadCandidates.length) {
217
+ const nonPreloadCandidates = candidates.filter(c => !c.isLinkPreload);
218
+ const allPreloaded = nonPreloadCandidates.every(c => c.fromDiskCache || c.fromMemoryCache);
219
+ if (nonPreloadCandidates.length && allPreloaded) {
220
+ candidates = linkPreloadCandidates;
221
+ }
222
+ }
223
+ }
224
+ // Only return an initiator if the result is unambiguous.
225
+ return candidates.length === 1 ? candidates[0] : null;
226
+ }
227
+ function linkInitiators(lanternRequests) {
228
+ const requestsByURL = new Map();
229
+ for (const request of lanternRequests) {
230
+ const requests = requestsByURL.get(request.url) || [];
231
+ requests.push(request);
232
+ requestsByURL.set(request.url, requests);
233
+ }
234
+ for (const request of lanternRequests) {
235
+ const initiatorRequest = chooseInitiatorRequest(request, requestsByURL);
236
+ if (initiatorRequest) {
237
+ request.initiatorRequest = initiatorRequest;
238
+ }
239
+ }
240
+ }
241
+ function createNetworkRequests(trace, data, startTime = 0, endTime = Number.POSITIVE_INFINITY) {
242
+ const workerThreads = findWorkerThreads(trace);
243
+ const lanternRequestsNoRedirects = [];
244
+ for (const request of data.NetworkRequests.byTime) {
245
+ if (request.ts >= startTime && request.ts < endTime) {
246
+ const lanternRequest = createLanternRequest(data, workerThreads, request);
247
+ if (lanternRequest) {
248
+ lanternRequestsNoRedirects.push(lanternRequest);
249
+ }
250
+ }
251
+ }
252
+ const lanternRequests = [];
253
+ // Trace Engine consolidates all redirects into a single request object, but lantern needs
254
+ // an entry for each redirected request.
255
+ for (const request of [...lanternRequestsNoRedirects]) {
256
+ if (!request.rawRequest) {
257
+ continue;
258
+ }
259
+ const redirects = request.rawRequest.args.data.redirects;
260
+ if (!redirects.length) {
261
+ lanternRequests.push(request);
262
+ continue;
263
+ }
264
+ const requestChain = [];
265
+ for (const redirect of redirects) {
266
+ const redirectedRequest = structuredClone(request);
267
+ redirectedRequest.networkRequestTime = redirect.ts / 1000;
268
+ redirectedRequest.rendererStartTime = redirectedRequest.networkRequestTime;
269
+ redirectedRequest.networkEndTime = (redirect.ts + redirect.dur) / 1000;
270
+ redirectedRequest.responseHeadersEndTime = redirectedRequest.networkEndTime;
271
+ redirectedRequest.timing = {
272
+ requestTime: redirectedRequest.networkRequestTime / 1000,
273
+ receiveHeadersStart: redirectedRequest.responseHeadersEndTime,
274
+ receiveHeadersEnd: redirectedRequest.responseHeadersEndTime,
275
+ proxyStart: -1,
276
+ proxyEnd: -1,
277
+ dnsStart: -1,
278
+ dnsEnd: -1,
279
+ connectStart: -1,
280
+ connectEnd: -1,
281
+ sslStart: -1,
282
+ sslEnd: -1,
283
+ sendStart: -1,
284
+ sendEnd: -1,
285
+ workerStart: -1,
286
+ workerReady: -1,
287
+ workerFetchStart: -1,
288
+ workerRespondWithSettled: -1,
289
+ pushStart: -1,
290
+ pushEnd: -1,
291
+ };
292
+ redirectedRequest.url = redirect.url;
293
+ redirectedRequest.parsedURL = createParsedUrl(redirect.url);
294
+ // TODO: Trace Engine is not retaining the actual status code.
295
+ redirectedRequest.statusCode = 302;
296
+ redirectedRequest.resourceType = undefined;
297
+ // TODO: Trace Engine is not retaining transfer size of redirected request.
298
+ redirectedRequest.transferSize = 400;
299
+ requestChain.push(redirectedRequest);
300
+ lanternRequests.push(redirectedRequest);
301
+ }
302
+ requestChain.push(request);
303
+ lanternRequests.push(request);
304
+ for (let i = 0; i < requestChain.length; i++) {
305
+ const request = requestChain[i];
306
+ if (i > 0) {
307
+ request.redirectSource = requestChain[i - 1];
308
+ request.redirects = requestChain.slice(0, i);
309
+ }
310
+ if (i !== requestChain.length - 1) {
311
+ request.redirectDestination = requestChain[i + 1];
312
+ }
313
+ }
314
+ // Apply the `:redirect` requestId convention: only redirects[0].requestId is the actual
315
+ // requestId, all the rest have n occurrences of `:redirect` as a suffix.
316
+ for (let i = 1; i < requestChain.length; i++) {
317
+ requestChain[i].requestId = `${requestChain[i - 1].requestId}:redirect`;
318
+ }
319
+ }
320
+ linkInitiators(lanternRequests);
321
+ return lanternRequests;
322
+ }
323
+ function collectMainThreadEvents(trace, data) {
324
+ const Meta = data.Meta;
325
+ const mainFramePids = Meta.mainFrameNavigations.length ? new Set(Meta.mainFrameNavigations.map(nav => nav.pid)) :
326
+ Meta.topLevelRendererIds;
327
+ const rendererPidToTid = new Map();
328
+ for (const pid of mainFramePids) {
329
+ const threads = Meta.threadsInProcess.get(pid) ?? [];
330
+ let found = false;
331
+ for (const [tid, thread] of threads) {
332
+ if (thread.args.name === 'CrRendererMain') {
333
+ rendererPidToTid.set(pid, tid);
334
+ found = true;
335
+ break;
336
+ }
337
+ }
338
+ if (found) {
339
+ continue;
340
+ }
341
+ // `CrRendererMain` can be missing if chrome is launched with the `--single-process` flag.
342
+ // In this case, page tasks will be run in the browser thread.
343
+ for (const [tid, thread] of threads) {
344
+ if (thread.args.name === 'CrBrowserMain') {
345
+ rendererPidToTid.set(pid, tid);
346
+ found = true;
347
+ break;
348
+ }
349
+ }
350
+ }
351
+ return trace.traceEvents.filter(e => rendererPidToTid.get(e.pid) === e.tid);
352
+ }
353
+ function createGraph(requests, trace, data, url) {
354
+ const mainThreadEvents = collectMainThreadEvents(trace, data);
355
+ // url defines the initial request that the Lantern graph starts at (the root node) and the
356
+ // main document request. These are equal if there are no redirects.
357
+ if (!url) {
358
+ url = {
359
+ requestedUrl: requests[0].url,
360
+ mainDocumentUrl: '',
361
+ };
362
+ let request = requests[0];
363
+ while (request.redirectDestination) {
364
+ request = request.redirectDestination;
365
+ }
366
+ url.mainDocumentUrl = request.url;
367
+ }
368
+ return Lantern.Graph.PageDependencyGraph.createGraph(mainThreadEvents, requests, url);
369
+ }
370
+ export { createGraph, createNetworkRequests, createProcessedNavigation, };
@@ -0,0 +1,171 @@
1
+ // Copyright 2022 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 Platform from '../../core/platform/platform.js';
5
+ import * as Handlers from './handlers/handlers.js';
6
+ import * as Helpers from './helpers/helpers.js';
7
+ import { TraceParseProgressEvent, TraceProcessor } from './Processor.js';
8
+ import * as Types from './types/types.js';
9
+ /**
10
+ * The Model is responsible for parsing arrays of raw trace events and storing the
11
+ * resulting data. It can store multiple traces at once, and can return the data for
12
+ * any of them.
13
+ *
14
+ * Most uses of this class should be through `createWithAllHandlers`, but
15
+ * `createWithSubsetOfHandlers` can be used to run just some handlers.
16
+ **/
17
+ export class Model extends EventTarget {
18
+ #traces = [];
19
+ #nextNumberByDomain = new Map();
20
+ #recordingsAvailable = [];
21
+ #lastRecordingIndex = 0;
22
+ #processor;
23
+ #config = Types.Configuration.defaults();
24
+ static createWithAllHandlers(config) {
25
+ return new Model(Handlers.ModelHandlers, config);
26
+ }
27
+ /**
28
+ * Runs only the provided handlers.
29
+ *
30
+ * Callers must ensure they are providing all dependant handlers (although Meta is included automatically),
31
+ * and must know that the result of `.parsedTrace` will be limited to the handlers provided, even though
32
+ * the type won't reflect that.
33
+ */
34
+ static createWithSubsetOfHandlers(traceHandlers, config) {
35
+ return new Model(traceHandlers, config);
36
+ }
37
+ constructor(handlers, config) {
38
+ super();
39
+ if (config) {
40
+ this.#config = config;
41
+ }
42
+ this.#processor = new TraceProcessor(handlers, this.#config);
43
+ }
44
+ /**
45
+ * Parses an array of trace events into a structured object containing all the
46
+ * information parsed by the trace handlers.
47
+ * You can `await` this function to pause execution until parsing is complete,
48
+ * or instead rely on the `ModuleUpdateEvent` that is dispatched when the
49
+ * parsing is finished.
50
+ *
51
+ * Once parsed, you then have to call the `parsedTrace` method, providing an
52
+ * index of the trace you want to have the data for. This is because any model
53
+ * can store a number of traces. Each trace is given an index, which starts at 0
54
+ * and increments by one as a new trace is parsed.
55
+ *
56
+ * @example
57
+ * // Awaiting the parse method() to block until parsing complete
58
+ * await this.traceModel.parse(events);
59
+ * const data = this.traceModel.parsedTrace(0)
60
+ * @example
61
+ * // Using an event listener to be notified when tracing is complete.
62
+ * this.traceModel.addEventListener(Trace.ModelUpdateEvent.eventName, (event) => {
63
+ * if(event.data.data === 'done') {
64
+ * // trace complete
65
+ * const data = this.traceModel.parsedTrace(0);
66
+ * }
67
+ * });
68
+ * void this.traceModel.parse(events);
69
+ **/
70
+ async parse(traceEvents, config) {
71
+ const metadata = config?.metadata || {};
72
+ const isFreshRecording = config?.isFreshRecording || false;
73
+ const isCPUProfile = metadata?.dataOrigin === "CPUProfile" /* Types.File.DataOrigin.CPU_PROFILE */;
74
+ // During parsing, periodically update any listeners on each processors'
75
+ // progress (if they have any updates).
76
+ const onTraceUpdate = (event) => {
77
+ const { data } = event;
78
+ this.dispatchEvent(new ModelUpdateEvent({ type: "PROGRESS_UPDATE" /* ModelUpdateType.PROGRESS_UPDATE */, data }));
79
+ };
80
+ this.#processor.addEventListener(TraceParseProgressEvent.eventName, onTraceUpdate);
81
+ // TODO(cjamcl): this.#processor.parse needs this to work. So it should either take it as input, or create it itself.
82
+ const syntheticEventsManager = Helpers.SyntheticEvents.SyntheticEventsManager.createAndActivate(traceEvents);
83
+ try {
84
+ // Wait for all outstanding promises before finishing the async execution,
85
+ // but perform all tasks in parallel.
86
+ const parseConfig = {
87
+ isFreshRecording,
88
+ isCPUProfile,
89
+ metadata,
90
+ resolveSourceMap: config?.resolveSourceMap,
91
+ };
92
+ await this.#processor.parse(traceEvents, parseConfig);
93
+ if (!this.#processor.data) {
94
+ throw new Error('processor did not parse trace');
95
+ }
96
+ const file = this.#storeAndCreateParsedTraceFile(syntheticEventsManager, traceEvents, metadata, this.#processor.data, this.#processor.insights);
97
+ // We only push the file onto this.#traces here once we know it's valid
98
+ // and there's been no errors in the parsing.
99
+ this.#traces.push(file);
100
+ }
101
+ catch (e) {
102
+ throw e;
103
+ }
104
+ finally {
105
+ // All processors have finished parsing, no more updates are expected.
106
+ this.#processor.removeEventListener(TraceParseProgressEvent.eventName, onTraceUpdate);
107
+ // Finally, update any listeners that all processors are 'done'.
108
+ this.dispatchEvent(new ModelUpdateEvent({ type: "COMPLETE" /* ModelUpdateType.COMPLETE */, data: 'done' }));
109
+ }
110
+ }
111
+ #storeAndCreateParsedTraceFile(syntheticEventsManager, traceEvents, metadata, data, traceInsights) {
112
+ this.#lastRecordingIndex++;
113
+ let recordingName = `Trace ${this.#lastRecordingIndex}`;
114
+ const origin = Helpers.Trace.extractOriginFromTrace(data.Meta.mainFrameURL);
115
+ if (origin) {
116
+ const nextSequenceForDomain = Platform.MapUtilities.getWithDefault(this.#nextNumberByDomain, origin, () => 1);
117
+ recordingName = `${origin} (${nextSequenceForDomain})`;
118
+ this.#nextNumberByDomain.set(origin, nextSequenceForDomain + 1);
119
+ }
120
+ this.#recordingsAvailable.push(recordingName);
121
+ return {
122
+ traceEvents,
123
+ metadata,
124
+ data,
125
+ insights: traceInsights,
126
+ syntheticEventsManager,
127
+ };
128
+ }
129
+ lastTraceIndex() {
130
+ return this.size() - 1;
131
+ }
132
+ /**
133
+ * Returns the parsed trace data indexed by the order in which it was stored.
134
+ * If no index is given, the last stored parsed data is returned.
135
+ */
136
+ parsedTrace(index = this.#traces.length - 1) {
137
+ return this.#traces.at(index) ?? null;
138
+ }
139
+ overrideModifications(index, newModifications) {
140
+ if (this.#traces[index]) {
141
+ this.#traces[index].metadata.modifications = newModifications;
142
+ }
143
+ }
144
+ syntheticTraceEventsManager(index = this.#traces.length - 1) {
145
+ return this.#traces.at(index)?.syntheticEventsManager ?? null;
146
+ }
147
+ size() {
148
+ return this.#traces.length;
149
+ }
150
+ deleteTraceByIndex(recordingIndex) {
151
+ this.#traces.splice(recordingIndex, 1);
152
+ this.#recordingsAvailable.splice(recordingIndex, 1);
153
+ }
154
+ getRecordingsAvailable() {
155
+ return this.#recordingsAvailable;
156
+ }
157
+ resetProcessor() {
158
+ this.#processor.reset();
159
+ }
160
+ }
161
+ export class ModelUpdateEvent extends Event {
162
+ data;
163
+ static eventName = 'modelupdate';
164
+ constructor(data) {
165
+ super(ModelUpdateEvent.eventName);
166
+ this.data = data;
167
+ }
168
+ }
169
+ export function isModelUpdateDataComplete(eventData) {
170
+ return eventData.type === "COMPLETE" /* ModelUpdateType.COMPLETE */;
171
+ }
@@ -0,0 +1,114 @@
1
+ // Copyright 2024 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
+ import * as i18n from '../../core/i18n/i18n.js';
6
+ import * as Handlers from './handlers/handlers.js';
7
+ import { getEventStyle } from './Styles.js';
8
+ import * as Types from './types/types.js';
9
+ const UIStrings = {
10
+ /**
11
+ * @description Text shown for an entry in the flame chart that has no explicit name.
12
+ */
13
+ anonymous: '(anonymous)',
14
+ /**
15
+ * @description Text used to show an EventDispatch event which has a type associated with it
16
+ * @example {click} PH1
17
+ */
18
+ eventDispatchS: 'Event: {PH1}',
19
+ /**
20
+ * @description Text shown for an entry in the flame chart that represents a frame.
21
+ */
22
+ frame: 'Frame',
23
+ /**
24
+ * @description Text in Timeline Flame Chart Data Provider of the Performance panel
25
+ */
26
+ wsConnectionOpened: 'WebSocket opened',
27
+ /**
28
+ * @description Text in Timeline Flame Chart Data Provider of the Performance panel
29
+ * @example {ws://example.com} PH1
30
+ */
31
+ wsConnectionOpenedWithUrl: 'WebSocket opened: {PH1}',
32
+ /**
33
+ * @description Text in Timeline Flame Chart Data Provider of the Performance panel
34
+ */
35
+ wsConnectionClosed: 'WebSocket closed',
36
+ /**
37
+ * @description Text in Timeline Flame Chart Data Provider of the Performance panel
38
+ */
39
+ layoutShift: 'Layout shift',
40
+ };
41
+ const str_ = i18n.i18n.registerUIStrings('models/trace/Name.ts', UIStrings);
42
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
43
+ /**
44
+ * Calculates the display name for a given entry.
45
+ * @param parsedTrace If the trace data is provided
46
+ * as the second argument it can be used to find source map resolved names for
47
+ * profile calls.
48
+ * Use this function to customize the user visible name for an entry. If no
49
+ * custom name is found, we will fallback to the `name` property in the trace
50
+ * entry.
51
+ */
52
+ export function forEntry(entry, parsedTrace) {
53
+ if (Types.Events.isProfileCall(entry)) {
54
+ if (parsedTrace) {
55
+ const potentialCallName = Handlers.ModelHandlers.Samples.getProfileCallFunctionName(parsedTrace.data.Samples, entry);
56
+ // We need this extra check because the call name could be the empty
57
+ // string. If it is, we want to fallback.
58
+ if (potentialCallName) {
59
+ return potentialCallName;
60
+ }
61
+ }
62
+ return entry.callFrame.functionName || i18nString(UIStrings.anonymous);
63
+ }
64
+ if (Types.Events.isLegacyTimelineFrame(entry)) {
65
+ return i18n.i18n.lockedString(UIStrings.frame);
66
+ }
67
+ if (Types.Events.isDispatch(entry)) {
68
+ // EventDispatch represent user actions such as clicks, so in this case
69
+ // rather than show the event title (which is always just "Event"), we
70
+ // add the type ("click") to help the user understand the event.
71
+ return i18nString(UIStrings.eventDispatchS, { PH1: entry.args.data.type });
72
+ }
73
+ if (Types.Events.isSyntheticNetworkRequest(entry)) {
74
+ const parsedURL = new Common.ParsedURL.ParsedURL(entry.args.data.url);
75
+ const text = parsedURL.isValid ? `${parsedURL.displayName} (${parsedURL.host})` : entry.args.data.url || 'Network request';
76
+ return text;
77
+ }
78
+ if (Types.Events.isWebSocketCreate(entry)) {
79
+ if (entry.args.data.url) {
80
+ return i18nString(UIStrings.wsConnectionOpenedWithUrl, { PH1: entry.args.data.url });
81
+ }
82
+ return i18nString(UIStrings.wsConnectionOpened);
83
+ }
84
+ if (Types.Events.isWebSocketDestroy(entry)) {
85
+ return i18nString(UIStrings.wsConnectionClosed);
86
+ }
87
+ if (Types.Events.isSyntheticInteraction(entry)) {
88
+ return nameForInteractionEvent(entry);
89
+ }
90
+ if (Types.Events.isSyntheticLayoutShift(entry)) {
91
+ return i18nString(UIStrings.layoutShift);
92
+ }
93
+ if (Types.Events.isSyntheticAnimation(entry) && entry.args.data.beginEvent.args.data.displayName) {
94
+ return entry.args.data.beginEvent.args.data.displayName;
95
+ }
96
+ const eventStyleCustomName = getEventStyle(entry.name)?.title;
97
+ return eventStyleCustomName || entry.name;
98
+ }
99
+ function nameForInteractionEvent(event) {
100
+ const category = Handlers.ModelHandlers.UserInteractions.categoryOfInteraction(event);
101
+ // Because we hide nested interactions, we do not want to show the
102
+ // specific type of the interaction that was not hidden, so instead we
103
+ // show just the category of that interaction.
104
+ if (category === 'OTHER') {
105
+ return 'Other';
106
+ }
107
+ if (category === 'KEYBOARD') {
108
+ return 'Keyboard';
109
+ }
110
+ if (category === 'POINTER') {
111
+ return 'Pointer';
112
+ }
113
+ return event.type;
114
+ }