devtools-tracing 1.0.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 (397) hide show
  1. package/generate.ts +643 -0
  2. package/index.ts +16 -0
  3. package/lib/front_end/core/common/App.ts +7 -0
  4. package/lib/front_end/core/common/AppProvider.ts +32 -0
  5. package/lib/front_end/core/common/Base64.ts +47 -0
  6. package/lib/front_end/core/common/CharacterIdMap.ts +30 -0
  7. package/lib/front_end/core/common/Color.ts +2506 -0
  8. package/lib/front_end/core/common/ColorConverter.ts +402 -0
  9. package/lib/front_end/core/common/ColorUtils.ts +252 -0
  10. package/lib/front_end/core/common/Console.ts +114 -0
  11. package/lib/front_end/core/common/Debouncer.ts +15 -0
  12. package/lib/front_end/core/common/EventTarget.ts +52 -0
  13. package/lib/front_end/core/common/Gzip.ts +74 -0
  14. package/lib/front_end/core/common/JavaScriptMetaData.ts +29 -0
  15. package/lib/front_end/core/common/Lazy.ts +31 -0
  16. package/lib/front_end/core/common/Linkifier.ts +55 -0
  17. package/lib/front_end/core/common/MapWithDefault.ts +26 -0
  18. package/lib/front_end/core/common/Mutex.ts +55 -0
  19. package/lib/front_end/core/common/Object.ts +145 -0
  20. package/lib/front_end/core/common/ParsedURL.ts +554 -0
  21. package/lib/front_end/core/common/Progress.ts +180 -0
  22. package/lib/front_end/core/common/QueryParamHandler.ts +7 -0
  23. package/lib/front_end/core/common/ResolverBase.ts +85 -0
  24. package/lib/front_end/core/common/ResourceType.ts +588 -0
  25. package/lib/front_end/core/common/ReturnToPanel.ts +17 -0
  26. package/lib/front_end/core/common/Revealer.ts +192 -0
  27. package/lib/front_end/core/common/Runnable.ts +41 -0
  28. package/lib/front_end/core/common/SegmentedRange.ts +87 -0
  29. package/lib/front_end/core/common/SettingRegistration.ts +339 -0
  30. package/lib/front_end/core/common/Settings.ts +1497 -0
  31. package/lib/front_end/core/common/SimpleHistoryManager.ts +124 -0
  32. package/lib/front_end/core/common/StringOutputStream.ts +26 -0
  33. package/lib/front_end/core/common/TextDictionary.ts +48 -0
  34. package/lib/front_end/core/common/Throttler.ts +99 -0
  35. package/lib/front_end/core/common/Trie.ts +152 -0
  36. package/lib/front_end/core/common/Worker.ts +60 -0
  37. package/lib/front_end/core/common/common.ts +81 -0
  38. package/lib/front_end/core/host/AidaClient.ts +733 -0
  39. package/lib/front_end/core/host/GdpClient.ts +316 -0
  40. package/lib/front_end/core/host/InspectorFrontendHost.ts +648 -0
  41. package/lib/front_end/core/host/InspectorFrontendHostAPI.ts +551 -0
  42. package/lib/front_end/core/host/Platform.ts +76 -0
  43. package/lib/front_end/core/host/ResourceLoader.ts +282 -0
  44. package/lib/front_end/core/host/UserMetrics.ts +1230 -0
  45. package/lib/front_end/core/host/host.ts +23 -0
  46. package/lib/front_end/core/i18n/ByteUtilities.ts +82 -0
  47. package/lib/front_end/core/i18n/DevToolsLocale.ts +87 -0
  48. package/lib/front_end/core/i18n/NumberFormatter.ts +82 -0
  49. package/lib/front_end/core/i18n/i18n.ts +17 -0
  50. package/lib/front_end/core/i18n/i18nImpl.ts +204 -0
  51. package/lib/front_end/core/i18n/i18nTypes.ts +10 -0
  52. package/lib/front_end/core/i18n/locales.js +14 -0
  53. package/lib/front_end/core/i18n/time-utilities.ts +174 -0
  54. package/lib/front_end/core/platform/ArrayUtilities.ts +271 -0
  55. package/lib/front_end/core/platform/Brand.ts +23 -0
  56. package/lib/front_end/core/platform/Constructor.ts +10 -0
  57. package/lib/front_end/core/platform/DOMUtilities.ts +138 -0
  58. package/lib/front_end/core/platform/DateUtilities.ts +15 -0
  59. package/lib/front_end/core/platform/DevToolsPath.ts +53 -0
  60. package/lib/front_end/core/platform/KeyboardUtilities.ts +38 -0
  61. package/lib/front_end/core/platform/MapUtilities.ts +95 -0
  62. package/lib/front_end/core/platform/MimeType.ts +175 -0
  63. package/lib/front_end/core/platform/NumberUtilities.ts +80 -0
  64. package/lib/front_end/core/platform/StringUtilities.ts +588 -0
  65. package/lib/front_end/core/platform/Timing.ts +17 -0
  66. package/lib/front_end/core/platform/TypedArrayUtilities.ts +189 -0
  67. package/lib/front_end/core/platform/TypescriptUtilities.ts +86 -0
  68. package/lib/front_end/core/platform/UIString.ts +39 -0
  69. package/lib/front_end/core/platform/UserVisibleError.ts +28 -0
  70. package/lib/front_end/core/platform/platform.ts +45 -0
  71. package/lib/front_end/core/protocol_client/ConnectionTransport.ts +26 -0
  72. package/lib/front_end/core/protocol_client/InspectorBackend.ts +1050 -0
  73. package/lib/front_end/core/protocol_client/NodeURL.ts +42 -0
  74. package/lib/front_end/core/protocol_client/protocol_client.ts +13 -0
  75. package/lib/front_end/core/root/Runtime.ts +609 -0
  76. package/lib/front_end/core/root/root.ts +6 -0
  77. package/lib/front_end/core/sdk/AccessibilityModel.ts +353 -0
  78. package/lib/front_end/core/sdk/AnimationModel.ts +1041 -0
  79. package/lib/front_end/core/sdk/AutofillModel.ts +184 -0
  80. package/lib/front_end/core/sdk/CPUProfilerModel.ts +148 -0
  81. package/lib/front_end/core/sdk/CPUThrottlingManager.ts +282 -0
  82. package/lib/front_end/core/sdk/CSSContainerQuery.ts +139 -0
  83. package/lib/front_end/core/sdk/CSSFontFace.ts +40 -0
  84. package/lib/front_end/core/sdk/CSSLayer.ts +30 -0
  85. package/lib/front_end/core/sdk/CSSMatchedStyles.ts +1646 -0
  86. package/lib/front_end/core/sdk/CSSMedia.ts +121 -0
  87. package/lib/front_end/core/sdk/CSSMetadata.ts +1647 -0
  88. package/lib/front_end/core/sdk/CSSModel.ts +1128 -0
  89. package/lib/front_end/core/sdk/CSSProperty.ts +384 -0
  90. package/lib/front_end/core/sdk/CSSPropertyParser.ts +681 -0
  91. package/lib/front_end/core/sdk/CSSPropertyParserMatchers.ts +1395 -0
  92. package/lib/front_end/core/sdk/CSSQuery.ts +72 -0
  93. package/lib/front_end/core/sdk/CSSRule.ts +465 -0
  94. package/lib/front_end/core/sdk/CSSScope.ts +30 -0
  95. package/lib/front_end/core/sdk/CSSStartingStyle.ts +29 -0
  96. package/lib/front_end/core/sdk/CSSStyleDeclaration.ts +313 -0
  97. package/lib/front_end/core/sdk/CSSStyleSheetHeader.ts +196 -0
  98. package/lib/front_end/core/sdk/CSSSupports.ts +33 -0
  99. package/lib/front_end/core/sdk/CategorizedBreakpoint.ts +64 -0
  100. package/lib/front_end/core/sdk/ChildTargetManager.ts +314 -0
  101. package/lib/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +62 -0
  102. package/lib/front_end/core/sdk/Connections.ts +293 -0
  103. package/lib/front_end/core/sdk/ConsoleModel.ts +808 -0
  104. package/lib/front_end/core/sdk/ConsoleModelTypes.ts +15 -0
  105. package/lib/front_end/core/sdk/Cookie.ts +319 -0
  106. package/lib/front_end/core/sdk/CookieModel.ts +239 -0
  107. package/lib/front_end/core/sdk/CookieParser.ts +185 -0
  108. package/lib/front_end/core/sdk/DOMDebuggerModel.ts +787 -0
  109. package/lib/front_end/core/sdk/DOMModel.ts +1961 -0
  110. package/lib/front_end/core/sdk/DebuggerModel.ts +1605 -0
  111. package/lib/front_end/core/sdk/EmulationModel.ts +648 -0
  112. package/lib/front_end/core/sdk/EnhancedTracesParser.ts +515 -0
  113. package/lib/front_end/core/sdk/EventBreakpointsModel.ts +183 -0
  114. package/lib/front_end/core/sdk/FrameAssociated.ts +11 -0
  115. package/lib/front_end/core/sdk/FrameManager.ts +259 -0
  116. package/lib/front_end/core/sdk/HeapProfilerModel.ts +225 -0
  117. package/lib/front_end/core/sdk/HttpReasonPhraseStrings.ts +77 -0
  118. package/lib/front_end/core/sdk/IOModel.ts +91 -0
  119. package/lib/front_end/core/sdk/IsolateManager.ts +257 -0
  120. package/lib/front_end/core/sdk/IssuesModel.ts +70 -0
  121. package/lib/front_end/core/sdk/LayerTreeBase.ts +169 -0
  122. package/lib/front_end/core/sdk/LogModel.ts +56 -0
  123. package/lib/front_end/core/sdk/NetworkManager.ts +2823 -0
  124. package/lib/front_end/core/sdk/NetworkRequest.ts +2253 -0
  125. package/lib/front_end/core/sdk/OverlayColorGenerator.ts +52 -0
  126. package/lib/front_end/core/sdk/OverlayModel.ts +1011 -0
  127. package/lib/front_end/core/sdk/OverlayPersistentHighlighter.ts +522 -0
  128. package/lib/front_end/core/sdk/PageLoad.ts +35 -0
  129. package/lib/front_end/core/sdk/PageResourceLoader.ts +435 -0
  130. package/lib/front_end/core/sdk/PaintProfiler.ts +110 -0
  131. package/lib/front_end/core/sdk/PerformanceMetricsModel.ts +84 -0
  132. package/lib/front_end/core/sdk/PreloadingModel.ts +863 -0
  133. package/lib/front_end/core/sdk/RehydratingConnection.ts +386 -0
  134. package/lib/front_end/core/sdk/RehydratingObject.ts +66 -0
  135. package/lib/front_end/core/sdk/RemoteObject.ts +1160 -0
  136. package/lib/front_end/core/sdk/Resource.ts +232 -0
  137. package/lib/front_end/core/sdk/ResourceTreeModel.ts +1160 -0
  138. package/lib/front_end/core/sdk/RuntimeModel.ts +732 -0
  139. package/lib/front_end/core/sdk/SDKModel.ts +65 -0
  140. package/lib/front_end/core/sdk/ScopeTreeCache.ts +45 -0
  141. package/lib/front_end/core/sdk/ScreenCaptureModel.ts +255 -0
  142. package/lib/front_end/core/sdk/Script.ts +534 -0
  143. package/lib/front_end/core/sdk/SecurityOriginManager.ts +76 -0
  144. package/lib/front_end/core/sdk/ServerSentEvents.ts +80 -0
  145. package/lib/front_end/core/sdk/ServerSentEventsProtocol.ts +122 -0
  146. package/lib/front_end/core/sdk/ServerTiming.ts +260 -0
  147. package/lib/front_end/core/sdk/ServiceWorkerCacheModel.ts +377 -0
  148. package/lib/front_end/core/sdk/ServiceWorkerManager.ts +605 -0
  149. package/lib/front_end/core/sdk/SourceMap.ts +867 -0
  150. package/lib/front_end/core/sdk/SourceMapCache.ts +54 -0
  151. package/lib/front_end/core/sdk/SourceMapFunctionRanges.ts +156 -0
  152. package/lib/front_end/core/sdk/SourceMapManager.ts +239 -0
  153. package/lib/front_end/core/sdk/SourceMapScopeChainEntry.ts +189 -0
  154. package/lib/front_end/core/sdk/SourceMapScopesInfo.ts +508 -0
  155. package/lib/front_end/core/sdk/StorageBucketsModel.ts +204 -0
  156. package/lib/front_end/core/sdk/StorageKeyManager.ts +98 -0
  157. package/lib/front_end/core/sdk/Target.ts +332 -0
  158. package/lib/front_end/core/sdk/TargetManager.ts +453 -0
  159. package/lib/front_end/core/sdk/TraceObject.ts +61 -0
  160. package/lib/front_end/core/sdk/WebAuthnModel.ts +104 -0
  161. package/lib/front_end/core/sdk/sdk.ts +174 -0
  162. package/lib/front_end/entrypoints/formatter_worker/FormatterActions.ts +59 -0
  163. package/lib/front_end/generated/InspectorBackendCommands.js +1617 -0
  164. package/lib/front_end/generated/SupportedCSSProperties.js +7512 -0
  165. package/lib/front_end/generated/protocol-proxy-api.d.ts +5022 -0
  166. package/lib/front_end/generated/protocol.ts +22014 -0
  167. package/lib/front_end/models/cpu_profile/CPUProfileDataModel.ts +571 -0
  168. package/lib/front_end/models/cpu_profile/ProfileTreeModel.ts +103 -0
  169. package/lib/front_end/models/cpu_profile/cpu_profile.ts +11 -0
  170. package/lib/front_end/models/formatter/FormatterWorkerPool.ts +219 -0
  171. package/lib/front_end/models/formatter/ScriptFormatter.ts +112 -0
  172. package/lib/front_end/models/formatter/formatter.ts +8 -0
  173. package/lib/front_end/models/text_utils/CodeMirrorUtils.ts +37 -0
  174. package/lib/front_end/models/text_utils/ContentData.ts +199 -0
  175. package/lib/front_end/models/text_utils/ContentProvider.ts +68 -0
  176. package/lib/front_end/models/text_utils/StaticContentProvider.ts +49 -0
  177. package/lib/front_end/models/text_utils/StreamingContentData.ts +108 -0
  178. package/lib/front_end/models/text_utils/Text.ts +90 -0
  179. package/lib/front_end/models/text_utils/TextCursor.ts +44 -0
  180. package/lib/front_end/models/text_utils/TextRange.ts +266 -0
  181. package/lib/front_end/models/text_utils/TextUtils.ts +401 -0
  182. package/lib/front_end/models/text_utils/WasmDisassembly.ts +87 -0
  183. package/lib/front_end/models/text_utils/text_utils.ts +27 -0
  184. package/lib/front_end/models/trace/EntityMapper.ts +141 -0
  185. package/lib/front_end/models/trace/EventsSerializer.ts +101 -0
  186. package/lib/front_end/models/trace/LanternComputationData.ts +438 -0
  187. package/lib/front_end/models/trace/ModelImpl.ts +236 -0
  188. package/lib/front_end/models/trace/Name.ts +136 -0
  189. package/lib/front_end/models/trace/Processor.ts +652 -0
  190. package/lib/front_end/models/trace/Styles.ts +1138 -0
  191. package/lib/front_end/models/trace/extras/FilmStrip.ts +78 -0
  192. package/lib/front_end/models/trace/extras/MainThreadActivity.ts +86 -0
  193. package/lib/front_end/models/trace/extras/ScriptDuplication.ts +236 -0
  194. package/lib/front_end/models/trace/extras/StackTraceForEvent.ts +203 -0
  195. package/lib/front_end/models/trace/extras/ThirdParties.ts +164 -0
  196. package/lib/front_end/models/trace/extras/TraceFilter.ts +62 -0
  197. package/lib/front_end/models/trace/extras/TraceTree.ts +701 -0
  198. package/lib/front_end/models/trace/extras/extras.ts +11 -0
  199. package/lib/front_end/models/trace/handlers/AnimationFramesHandler.ts +128 -0
  200. package/lib/front_end/models/trace/handlers/AnimationHandler.ts +36 -0
  201. package/lib/front_end/models/trace/handlers/AsyncJSCallsHandler.ts +239 -0
  202. package/lib/front_end/models/trace/handlers/AuctionWorkletsHandler.ts +183 -0
  203. package/lib/front_end/models/trace/handlers/DOMStatsHandler.ts +31 -0
  204. package/lib/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +306 -0
  205. package/lib/front_end/models/trace/handlers/FlowsHandler.ts +175 -0
  206. package/lib/front_end/models/trace/handlers/FramesHandler.ts +571 -0
  207. package/lib/front_end/models/trace/handlers/GPUHandler.ts +50 -0
  208. package/lib/front_end/models/trace/handlers/ImagePaintingHandler.ts +183 -0
  209. package/lib/front_end/models/trace/handlers/InitiatorsHandler.ts +193 -0
  210. package/lib/front_end/models/trace/handlers/InvalidationsHandler.ts +168 -0
  211. package/lib/front_end/models/trace/handlers/LargestImagePaintHandler.ts +109 -0
  212. package/lib/front_end/models/trace/handlers/LargestTextPaintHandler.ts +35 -0
  213. package/lib/front_end/models/trace/handlers/LayerTreeHandler.ts +123 -0
  214. package/lib/front_end/models/trace/handlers/LayoutShiftsHandler.ts +573 -0
  215. package/lib/front_end/models/trace/handlers/MemoryHandler.ts +31 -0
  216. package/lib/front_end/models/trace/handlers/MetaHandler.ts +525 -0
  217. package/lib/front_end/models/trace/handlers/ModelHandlers.ts +34 -0
  218. package/lib/front_end/models/trace/handlers/NetworkRequestsHandler.ts +672 -0
  219. package/lib/front_end/models/trace/handlers/PageFramesHandler.ts +52 -0
  220. package/lib/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +460 -0
  221. package/lib/front_end/models/trace/handlers/RendererHandler.ts +428 -0
  222. package/lib/front_end/models/trace/handlers/SamplesHandler.ts +271 -0
  223. package/lib/front_end/models/trace/handlers/ScreenshotsHandler.ts +122 -0
  224. package/lib/front_end/models/trace/handlers/ScriptsHandler.ts +336 -0
  225. package/lib/front_end/models/trace/handlers/SelectorStatsHandler.ts +110 -0
  226. package/lib/front_end/models/trace/handlers/Threads.ts +139 -0
  227. package/lib/front_end/models/trace/handlers/UserInteractionsHandler.ts +400 -0
  228. package/lib/front_end/models/trace/handlers/UserTimingsHandler.ts +233 -0
  229. package/lib/front_end/models/trace/handlers/WarningsHandler.ts +162 -0
  230. package/lib/front_end/models/trace/handlers/WorkersHandler.ts +45 -0
  231. package/lib/front_end/models/trace/handlers/handlers.ts +8 -0
  232. package/lib/front_end/models/trace/handlers/helpers.ts +196 -0
  233. package/lib/front_end/models/trace/handlers/types.ts +75 -0
  234. package/lib/front_end/models/trace/helpers/Extensions.ts +54 -0
  235. package/lib/front_end/models/trace/helpers/Network.ts +129 -0
  236. package/lib/front_end/models/trace/helpers/SamplesIntegrator.ts +544 -0
  237. package/lib/front_end/models/trace/helpers/SyntheticEvents.ts +87 -0
  238. package/lib/front_end/models/trace/helpers/Timing.ts +248 -0
  239. package/lib/front_end/models/trace/helpers/Trace.ts +928 -0
  240. package/lib/front_end/models/trace/helpers/TreeHelpers.ts +320 -0
  241. package/lib/front_end/models/trace/helpers/helpers.ts +11 -0
  242. package/lib/front_end/models/trace/insights/CLSCulprits.ts +668 -0
  243. package/lib/front_end/models/trace/insights/Cache.ts +269 -0
  244. package/lib/front_end/models/trace/insights/Common.ts +453 -0
  245. package/lib/front_end/models/trace/insights/DOMSize.ts +223 -0
  246. package/lib/front_end/models/trace/insights/DocumentLatency.ts +319 -0
  247. package/lib/front_end/models/trace/insights/DuplicatedJavaScript.ts +126 -0
  248. package/lib/front_end/models/trace/insights/FontDisplay.ts +119 -0
  249. package/lib/front_end/models/trace/insights/ForcedReflow.ts +220 -0
  250. package/lib/front_end/models/trace/insights/INPBreakdown.ts +171 -0
  251. package/lib/front_end/models/trace/insights/ImageDelivery.ts +348 -0
  252. package/lib/front_end/models/trace/insights/LCPBreakdown.ts +268 -0
  253. package/lib/front_end/models/trace/insights/LCPDiscovery.ts +237 -0
  254. package/lib/front_end/models/trace/insights/LegacyJavaScript.ts +138 -0
  255. package/lib/front_end/models/trace/insights/Models.ts +22 -0
  256. package/lib/front_end/models/trace/insights/ModernHTTP.ts +257 -0
  257. package/lib/front_end/models/trace/insights/NetworkDependencyTree.ts +726 -0
  258. package/lib/front_end/models/trace/insights/RenderBlocking.ts +257 -0
  259. package/lib/front_end/models/trace/insights/SlowCSSSelector.ts +175 -0
  260. package/lib/front_end/models/trace/insights/Statistics.ts +101 -0
  261. package/lib/front_end/models/trace/insights/ThirdParties.ts +130 -0
  262. package/lib/front_end/models/trace/insights/Viewport.ts +138 -0
  263. package/lib/front_end/models/trace/insights/insights.ts +10 -0
  264. package/lib/front_end/models/trace/insights/types.ts +157 -0
  265. package/lib/front_end/models/trace/lantern/core/LanternError.ts +7 -0
  266. package/lib/front_end/models/trace/lantern/core/NetworkAnalyzer.ts +619 -0
  267. package/lib/front_end/models/trace/lantern/core/core.ts +6 -0
  268. package/lib/front_end/models/trace/lantern/graph/BaseNode.ts +345 -0
  269. package/lib/front_end/models/trace/lantern/graph/CPUNode.ts +80 -0
  270. package/lib/front_end/models/trace/lantern/graph/NetworkNode.ts +101 -0
  271. package/lib/front_end/models/trace/lantern/graph/PageDependencyGraph.ts +636 -0
  272. package/lib/front_end/models/trace/lantern/graph/graph.ts +8 -0
  273. package/lib/front_end/models/trace/lantern/lantern.ts +17 -0
  274. package/lib/front_end/models/trace/lantern/metrics/FirstContentfulPaint.ts +187 -0
  275. package/lib/front_end/models/trace/lantern/metrics/Interactive.ts +88 -0
  276. package/lib/front_end/models/trace/lantern/metrics/LargestContentfulPaint.ts +92 -0
  277. package/lib/front_end/models/trace/lantern/metrics/MaxPotentialFID.ts +72 -0
  278. package/lib/front_end/models/trace/lantern/metrics/Metric.ts +126 -0
  279. package/lib/front_end/models/trace/lantern/metrics/SpeedIndex.ts +126 -0
  280. package/lib/front_end/models/trace/lantern/metrics/TBTUtils.ts +82 -0
  281. package/lib/front_end/models/trace/lantern/metrics/TotalBlockingTime.ts +112 -0
  282. package/lib/front_end/models/trace/lantern/metrics/metrics.ts +12 -0
  283. package/lib/front_end/models/trace/lantern/simulation/ConnectionPool.ts +150 -0
  284. package/lib/front_end/models/trace/lantern/simulation/Constants.ts +46 -0
  285. package/lib/front_end/models/trace/lantern/simulation/DNSCache.ts +61 -0
  286. package/lib/front_end/models/trace/lantern/simulation/SimulationTimingMap.ts +196 -0
  287. package/lib/front_end/models/trace/lantern/simulation/Simulator.ts +556 -0
  288. package/lib/front_end/models/trace/lantern/simulation/TCPConnection.ts +192 -0
  289. package/lib/front_end/models/trace/lantern/simulation/simulation.ts +10 -0
  290. package/lib/front_end/models/trace/lantern/types/Lantern.ts +220 -0
  291. package/lib/front_end/models/trace/lantern/types/types.ts +5 -0
  292. package/lib/front_end/models/trace/trace.ts +33 -0
  293. package/lib/front_end/models/trace/types/Configuration.ts +110 -0
  294. package/lib/front_end/models/trace/types/Extensions.ts +136 -0
  295. package/lib/front_end/models/trace/types/File.ts +281 -0
  296. package/lib/front_end/models/trace/types/Overlays.ts +138 -0
  297. package/lib/front_end/models/trace/types/Timing.ts +30 -0
  298. package/lib/front_end/models/trace/types/TraceEvents.ts +3277 -0
  299. package/lib/front_end/models/trace/types/types.ts +10 -0
  300. package/lib/front_end/third_party/i18n/LICENSE +202 -0
  301. package/lib/front_end/third_party/i18n/README.chromium +15 -0
  302. package/lib/front_end/third_party/i18n/i18n-impl.ts +61 -0
  303. package/lib/front_end/third_party/i18n/i18n.ts +11 -0
  304. package/lib/front_end/third_party/i18n/localized-string-set.ts +129 -0
  305. package/lib/front_end/third_party/intl-messageformat/LICENSE +33 -0
  306. package/lib/front_end/third_party/intl-messageformat/README.chromium +24 -0
  307. package/lib/front_end/third_party/intl-messageformat/intl-messageformat-tsconfig.json +16 -0
  308. package/lib/front_end/third_party/intl-messageformat/intl-messageformat.ts +6 -0
  309. package/lib/front_end/third_party/intl-messageformat/package/LICENSE.md +33 -0
  310. package/lib/front_end/third_party/intl-messageformat/package/README.md +3 -0
  311. package/lib/front_end/third_party/intl-messageformat/package/index.d.ts +6 -0
  312. package/lib/front_end/third_party/intl-messageformat/package/index.d.ts.map +1 -0
  313. package/lib/front_end/third_party/intl-messageformat/package/index.js +13 -0
  314. package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.esm.d.ts +5 -0
  315. package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.esm.js +1710 -0
  316. package/lib/front_end/third_party/intl-messageformat/package/intl-messageformat.iife.js +1815 -0
  317. package/lib/front_end/third_party/intl-messageformat/package/lib/index.d.ts +6 -0
  318. package/lib/front_end/third_party/intl-messageformat/package/lib/index.d.ts.map +1 -0
  319. package/lib/front_end/third_party/intl-messageformat/package/lib/index.js +10 -0
  320. package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.d.ts +34 -0
  321. package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.d.ts.map +1 -0
  322. package/lib/front_end/third_party/intl-messageformat/package/lib/src/core.js +229 -0
  323. package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.d.ts +28 -0
  324. package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.d.ts.map +1 -0
  325. package/lib/front_end/third_party/intl-messageformat/package/lib/src/error.js +48 -0
  326. package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.d.ts +34 -0
  327. package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.d.ts.map +1 -0
  328. package/lib/front_end/third_party/intl-messageformat/package/lib/src/formatters.js +179 -0
  329. package/lib/front_end/third_party/intl-messageformat/package/package.json +42 -0
  330. package/lib/front_end/third_party/intl-messageformat/package/src/core.d.ts +34 -0
  331. package/lib/front_end/third_party/intl-messageformat/package/src/core.d.ts.map +1 -0
  332. package/lib/front_end/third_party/intl-messageformat/package/src/core.js +230 -0
  333. package/lib/front_end/third_party/intl-messageformat/package/src/error.d.ts +28 -0
  334. package/lib/front_end/third_party/intl-messageformat/package/src/error.d.ts.map +1 -0
  335. package/lib/front_end/third_party/intl-messageformat/package/src/error.js +51 -0
  336. package/lib/front_end/third_party/intl-messageformat/package/src/formatters.d.ts +34 -0
  337. package/lib/front_end/third_party/intl-messageformat/package/src/formatters.d.ts.map +1 -0
  338. package/lib/front_end/third_party/intl-messageformat/package/src/formatters.js +182 -0
  339. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/error.d.ts +79 -0
  340. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/index.d.ts +15 -0
  341. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/parser.d.ts +153 -0
  342. package/lib/front_end/third_party/intl-messageformat/package/src/icu-messageformat-parser/types.d.ts +139 -0
  343. package/lib/front_end/third_party/legacy-javascript/LICENSE +202 -0
  344. package/lib/front_end/third_party/legacy-javascript/README.chromium +13 -0
  345. package/lib/front_end/third_party/legacy-javascript/legacy-javascript-tsconfig.json +8 -0
  346. package/lib/front_end/third_party/legacy-javascript/legacy-javascript.ts +3 -0
  347. package/lib/front_end/third_party/legacy-javascript/lib/legacy-javascript.d.ts +18 -0
  348. package/lib/front_end/third_party/legacy-javascript/lib/legacy-javascript.js +943 -0
  349. package/lib/front_end/third_party/legacy-javascript/package.json +8 -0
  350. package/lib/front_end/third_party/legacy-javascript/rebuild.sh +9 -0
  351. package/lib/front_end/third_party/third-party-web/LICENSE +20 -0
  352. package/lib/front_end/third_party/third-party-web/README.chromium +13 -0
  353. package/lib/front_end/third_party/third-party-web/lib/nostats-subset.d.ts +2 -0
  354. package/lib/front_end/third_party/third-party-web/lib/nostats-subset.js +149 -0
  355. package/lib/front_end/third_party/third-party-web/package/LICENSE +20 -0
  356. package/lib/front_end/third_party/third-party-web/package/README.md +929 -0
  357. package/lib/front_end/third_party/third-party-web/package/dist/entities-httparchive-nostats.json +1 -0
  358. package/lib/front_end/third_party/third-party-web/package/dist/entities-httparchive.json +1 -0
  359. package/lib/front_end/third_party/third-party-web/package/dist/entities-nostats.json +1 -0
  360. package/lib/front_end/third_party/third-party-web/package/dist/entities.json +1 -0
  361. package/lib/front_end/third_party/third-party-web/package/facades.md +46 -0
  362. package/lib/front_end/third_party/third-party-web/package/httparchive-nostats-subset.d.ts +1 -0
  363. package/lib/front_end/third_party/third-party-web/package/httparchive-nostats-subset.js +1 -0
  364. package/lib/front_end/third_party/third-party-web/package/httparchive-subset.d.ts +1 -0
  365. package/lib/front_end/third_party/third-party-web/package/httparchive-subset.js +1 -0
  366. package/lib/front_end/third_party/third-party-web/package/lib/__snapshots__/index.test.js.snap +1006 -0
  367. package/lib/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.js +139 -0
  368. package/lib/front_end/third_party/third-party-web/package/lib/create-entity-finder-api.test.js +44 -0
  369. package/lib/front_end/third_party/third-party-web/package/lib/entities.test.js +27 -0
  370. package/lib/front_end/third_party/third-party-web/package/lib/index.d.ts +34 -0
  371. package/lib/front_end/third_party/third-party-web/package/lib/index.js +3 -0
  372. package/lib/front_end/third_party/third-party-web/package/lib/index.test.js +246 -0
  373. package/lib/front_end/third_party/third-party-web/package/lib/markdown/faqs.partial.md +36 -0
  374. package/lib/front_end/third_party/third-party-web/package/lib/markdown/goals.partial.md +9 -0
  375. package/lib/front_end/third_party/third-party-web/package/lib/markdown/methodology.partial.md +5 -0
  376. package/lib/front_end/third_party/third-party-web/package/lib/markdown/template.md +151 -0
  377. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-02-01.md +1 -0
  378. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-03-01.md +1 -0
  379. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-05-06.md +1 -0
  380. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2019-05-13.md +14 -0
  381. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2021-01-01.md +1 -0
  382. package/lib/front_end/third_party/third-party-web/package/lib/markdown/updates/2024-07-01.md +3 -0
  383. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.d.ts +1 -0
  384. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive-nostats.js +3 -0
  385. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive.d.ts +1 -0
  386. package/lib/front_end/third_party/third-party-web/package/lib/subsets/httparchive.js +3 -0
  387. package/lib/front_end/third_party/third-party-web/package/lib/subsets/nostats.d.ts +1 -0
  388. package/lib/front_end/third_party/third-party-web/package/lib/subsets/nostats.js +3 -0
  389. package/lib/front_end/third_party/third-party-web/package/nostats-subset.d.ts +1 -0
  390. package/lib/front_end/third_party/third-party-web/package/nostats-subset.js +1 -0
  391. package/lib/front_end/third_party/third-party-web/package/package.json +46 -0
  392. package/lib/front_end/third_party/third-party-web/package.json +8 -0
  393. package/lib/front_end/third_party/third-party-web/rebuild.sh +13 -0
  394. package/lib/front_end/third_party/third-party-web/third-party-web-tsconfig.json +8 -0
  395. package/lib/front_end/third_party/third-party-web/third-party-web.ts +3 -0
  396. package/package.json +24 -0
  397. package/patches/chrome-devtools-frontend+1.0.1533544.patch +187 -0
@@ -0,0 +1,233 @@
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
+
5
+ import * as Helpers from '../helpers/helpers.js';
6
+ import * as Types from '../types/types.js';
7
+
8
+ /**
9
+ * IMPORTANT!
10
+ * See UserTimings.md in this directory for some handy documentation on
11
+ * UserTimings and the trace events we parse currently.
12
+ **/
13
+ let syntheticEvents: Array<Types.Events.SyntheticEventPair<Types.Events.PairableAsync>> = [];
14
+
15
+ // There are two events dispatched for performance.measure calls: one to
16
+ // represent the measured timing in the tracing clock (which we type as
17
+ // PerformanceMeasure) and another one for the call itself (which we
18
+ // type as UserTimingMeasure). The two events corresponding to the same
19
+ // call are linked together by a common trace_id. The reason two events
20
+ // are dispatched is because the first was originally added with the
21
+ // implementation of the performance.measure API and it uses an
22
+ // overridden timestamp and duration. To prevent breaking potential deps
23
+ // created since then, a second event was added instead of changing the
24
+ // params of the first.
25
+ let measureTraceByTraceId = new Map<number, Types.Events.UserTimingMeasure>();
26
+ let performanceMeasureEvents: Types.Events.PerformanceMeasure[] = [];
27
+ let performanceMarkEvents: Types.Events.PerformanceMark[] = [];
28
+
29
+ let consoleTimings: Array<Types.Events.ConsoleTimeBegin|Types.Events.ConsoleTimeEnd> = [];
30
+
31
+ let timestampEvents: Types.Events.ConsoleTimeStamp[] = [];
32
+
33
+ export interface UserTimingsData {
34
+ /**
35
+ * Events triggered with the performance.measure() API.
36
+ * https://developer.mozilla.org/en-US/docs/Web/API/Performance/measure
37
+ */
38
+ performanceMeasures: readonly Types.Events.SyntheticUserTimingPair[];
39
+ /**
40
+ * Events triggered with the performance.mark() API.
41
+ * https://developer.mozilla.org/en-US/docs/Web/API/Performance/mark
42
+ */
43
+ performanceMarks: readonly Types.Events.PerformanceMark[];
44
+ /**
45
+ * Events triggered with the console.time(), console.timeEnd() and
46
+ * console.timeLog() API.
47
+ * https://developer.mozilla.org/en-US/docs/Web/API/console/time
48
+ */
49
+ consoleTimings: readonly Types.Events.SyntheticConsoleTimingPair[];
50
+ /**
51
+ * Events triggered with the console.timeStamp() API
52
+ * https://developer.mozilla.org/en-US/docs/Web/API/console/timeStamp
53
+ */
54
+ timestampEvents: readonly Types.Events.ConsoleTimeStamp[];
55
+ /**
56
+ * Events triggered to trace the call to performance.measure itself,
57
+ * cached by trace_id.
58
+ */
59
+ measureTraceByTraceId: Map<number, Types.Events.UserTimingMeasure>;
60
+ }
61
+
62
+ export function reset(): void {
63
+ syntheticEvents = [];
64
+ performanceMeasureEvents = [];
65
+ performanceMarkEvents = [];
66
+ consoleTimings = [];
67
+ timestampEvents = [];
68
+ measureTraceByTraceId = new Map();
69
+ }
70
+
71
+ const resourceTimingNames = [
72
+ 'workerStart',
73
+ 'redirectStart',
74
+ 'redirectEnd',
75
+ 'fetchStart',
76
+ 'domainLookupStart',
77
+ 'domainLookupEnd',
78
+ 'connectStart',
79
+ 'connectEnd',
80
+ 'secureConnectionStart',
81
+ 'requestStart',
82
+ 'responseStart',
83
+ 'responseEnd',
84
+ ];
85
+ const navTimingNames = [
86
+ 'navigationStart',
87
+ 'unloadEventStart',
88
+ 'unloadEventEnd',
89
+ 'redirectStart',
90
+ 'redirectEnd',
91
+ 'fetchStart',
92
+ 'commitNavigationEnd',
93
+ 'domainLookupStart',
94
+ 'domainLookupEnd',
95
+ 'connectStart',
96
+ 'connectEnd',
97
+ 'secureConnectionStart',
98
+ 'requestStart',
99
+ 'responseStart',
100
+ 'responseEnd',
101
+ 'domLoading',
102
+ 'domInteractive',
103
+ 'domContentLoadedEventStart',
104
+ 'domContentLoadedEventEnd',
105
+ 'domComplete',
106
+ 'loadEventStart',
107
+ 'loadEventEnd',
108
+ ];
109
+ // These are events dispatched under the blink.user_timing category
110
+ // but that the user didn't add. Filter them out so that they do not
111
+ // Appear in the timings track (they still appear in the main thread
112
+ // flame chart).
113
+ const ignoredNames = [...resourceTimingNames, ...navTimingNames];
114
+
115
+ function getEventTimings(event: Types.Events.SyntheticEventPair|Types.Events.ConsoleTimeStamp):
116
+ {start: Types.Timing.Micro, end: Types.Timing.Micro} {
117
+ if ('dur' in event) {
118
+ // It's a SyntheticEventPair.
119
+ return {start: event.ts, end: Types.Timing.Micro(event.ts + (event.dur ?? 0))};
120
+ }
121
+
122
+ if (Types.Events.isConsoleTimeStamp(event)) {
123
+ const {start, end} = event.args.data || {};
124
+ if (typeof start === 'number' && typeof end === 'number') {
125
+ return {start: Types.Timing.Micro(start), end: Types.Timing.Micro(end)};
126
+ }
127
+ }
128
+
129
+ // A ConsoleTimeStamp without start/end is just a point in time, so dur is 0.
130
+ return {start: event.ts, end: event.ts};
131
+ }
132
+
133
+ function getEventTrack(event: Types.Events.SyntheticEventPair|Types.Events.ConsoleTimeStamp): string|undefined {
134
+ if (event.cat === 'blink.user_timing') {
135
+ // This is a SyntheticUserTimingPair
136
+ const detailString =
137
+ ((event as Types.Events.SyntheticUserTimingPair).args.data.beginEvent.args as {detail?: string})?.detail;
138
+ if (detailString) {
139
+ const details = Helpers.Trace.parseDevtoolsDetails(detailString, 'devtools');
140
+ if (details && 'track' in details) {
141
+ return details.track;
142
+ }
143
+ }
144
+ } else if (Types.Events.isConsoleTimeStamp(event)) {
145
+ const track = event.args.data?.track;
146
+ return typeof track === 'string' ? track : undefined;
147
+ }
148
+
149
+ // SyntheticConsoleTimingPair does not have track info.
150
+ return undefined;
151
+ }
152
+
153
+ /**
154
+ * Similar to the default {@link Helpers.Trace.eventTimeComparator}
155
+ * but with a twist:
156
+ * In case of equal start and end times, put the second event (within a
157
+ * track) first.
158
+ *
159
+ * Explanation:
160
+ * User timing entries come as trace events dispatched when
161
+ * performance.measure/mark is called. The trace events buffered in
162
+ * devtools frontend are sorted by the start time. If their start time
163
+ * is the same, then the event for the first call will appear first.
164
+ *
165
+ * When entries are meant to be stacked, the corresponding
166
+ * performance.measure calls usually are done in bottom-up direction:
167
+ * calls for children first and for parent later (because the call
168
+ * is usually done when the measured task is over). This means that
169
+ * when two user timing events have the same start and end time, usually
170
+ * the second event is the parent of the first. Hence the switch.
171
+ *
172
+ */
173
+ export function userTimingComparator<T extends Types.Events.SyntheticEventPair|Types.Events.ConsoleTimeStamp>(
174
+ a: T, b: T, originalArray: readonly T[]): number {
175
+ const {start: aStart, end: aEnd} = getEventTimings(a);
176
+ const {start: bStart, end: bEnd} = getEventTimings(b);
177
+ const timeDifference = Helpers.Trace.compareBeginAndEnd(aStart, bStart, aEnd, bEnd);
178
+ if (timeDifference) {
179
+ return timeDifference;
180
+ }
181
+
182
+ // Never re-order entries across different tracks.
183
+ const aTrack = getEventTrack(a);
184
+ const bTrack = getEventTrack(b);
185
+ if (aTrack !== bTrack) {
186
+ return 0; // Preserve current positions.
187
+ }
188
+
189
+ // Prefer the event located in a further position in the original array.
190
+ const aIndex = originalArray.indexOf(a);
191
+ const bIndex = originalArray.indexOf(b);
192
+ return bIndex - aIndex;
193
+ }
194
+
195
+ export function handleEvent(event: Types.Events.Event): void {
196
+ if (ignoredNames.includes(event.name)) {
197
+ return;
198
+ }
199
+ if (Types.Events.isUserTimingMeasure(event)) {
200
+ measureTraceByTraceId.set(event.args.traceId, event);
201
+ }
202
+ if (Types.Events.isPerformanceMeasure(event)) {
203
+ performanceMeasureEvents.push(event);
204
+ return;
205
+ }
206
+ if (Types.Events.isPerformanceMark(event)) {
207
+ performanceMarkEvents.push(event);
208
+ }
209
+ if (Types.Events.isConsoleTime(event)) {
210
+ consoleTimings.push(event);
211
+ }
212
+ if (Types.Events.isConsoleTimeStamp(event)) {
213
+ timestampEvents.push(event);
214
+ }
215
+ }
216
+
217
+ export async function finalize(): Promise<void> {
218
+ const asyncEvents = [...performanceMeasureEvents, ...consoleTimings];
219
+ syntheticEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(asyncEvents);
220
+ syntheticEvents = syntheticEvents.sort((a, b) => userTimingComparator(a, b, [...syntheticEvents]));
221
+ timestampEvents = timestampEvents.sort((a, b) => userTimingComparator(a, b, [...timestampEvents]));
222
+ }
223
+
224
+ export function data(): UserTimingsData {
225
+ return {
226
+ consoleTimings: syntheticEvents.filter(e => e.cat === 'blink.console') as Types.Events.SyntheticConsoleTimingPair[],
227
+ performanceMeasures: syntheticEvents.filter(e => e.cat === 'blink.user_timing') as
228
+ Types.Events.SyntheticUserTimingPair[],
229
+ performanceMarks: performanceMarkEvents,
230
+ timestampEvents,
231
+ measureTraceByTraceId,
232
+ };
233
+ }
@@ -0,0 +1,162 @@
1
+ // Copyright 2023 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import * as Platform from '../../../core/platform/platform.js';
6
+ import * as Helpers from '../helpers/helpers.js';
7
+ import * as Types from '../types/types.js';
8
+
9
+ import type {HandlerName} from './types.js';
10
+ import {data as userInteractionsHandlerData} from './UserInteractionsHandler.js';
11
+ import {data as workersData} from './WorkersHandler.js';
12
+
13
+ export interface WarningsData {
14
+ // Tracks warnings keyed by the event.
15
+ perEvent: Map<Types.Events.Event, Warning[]>;
16
+ // The same data in reverse: for each type of warning, track the events.
17
+ // Useful if we need to enumerate events by type of issue
18
+ perWarning: Map<Warning, Types.Events.Event[]>;
19
+ }
20
+
21
+ export type Warning = 'LONG_TASK'|'IDLE_CALLBACK_OVER_TIME'|'FORCED_REFLOW'|'LONG_INTERACTION';
22
+
23
+ let warningsPerEvent: WarningsData['perEvent'] = new Map();
24
+ let eventsPerWarning: WarningsData['perWarning'] = new Map();
25
+
26
+ /**
27
+ * Tracks the stack formed by nested trace events up to a given point
28
+ */
29
+ let allEventsStack: Types.Events.Event[] = [];
30
+ /**
31
+ * Tracks the stack formed by JS invocation trace events up to a given point.
32
+ * F.e. FunctionCall, EvaluateScript, V8Execute.
33
+ * Not to be confused with ProfileCalls.
34
+ */
35
+ let jsInvokeStack: Types.Events.Event[] = [];
36
+ /**
37
+ * Tracks reflow events in a task.
38
+ */
39
+ let taskReflowEvents: Types.Events.Event[] = [];
40
+ /**
41
+ * Tracks events containing long running tasks. These are compared later against the worker thread pool to filter out long tasks from worker threads.
42
+ */
43
+ let longTaskEvents: Types.Events.Event[] = [];
44
+
45
+ export const FORCED_REFLOW_THRESHOLD = Helpers.Timing.milliToMicro(Types.Timing.Milli(30));
46
+
47
+ export const LONG_MAIN_THREAD_TASK_THRESHOLD = Helpers.Timing.milliToMicro(Types.Timing.Milli(50));
48
+
49
+ export function reset(): void {
50
+ warningsPerEvent = new Map();
51
+ eventsPerWarning = new Map();
52
+ allEventsStack = [];
53
+ jsInvokeStack = [];
54
+ taskReflowEvents = [];
55
+ longTaskEvents = [];
56
+ }
57
+
58
+ function storeWarning(event: Types.Events.Event, warning: Warning): void {
59
+ const existingWarnings = Platform.MapUtilities.getWithDefault(warningsPerEvent, event, () => []);
60
+ existingWarnings.push(warning);
61
+ warningsPerEvent.set(event, existingWarnings);
62
+
63
+ const existingEvents = Platform.MapUtilities.getWithDefault(eventsPerWarning, warning, () => []);
64
+ existingEvents.push(event);
65
+ eventsPerWarning.set(warning, existingEvents);
66
+ }
67
+
68
+ export function handleEvent(event: Types.Events.Event): void {
69
+ processForcedReflowWarning(event);
70
+ if (event.name === Types.Events.Name.RUN_TASK) {
71
+ const {duration} = Helpers.Timing.eventTimingsMicroSeconds(event);
72
+ if (duration > LONG_MAIN_THREAD_TASK_THRESHOLD) {
73
+ longTaskEvents.push(event);
74
+ }
75
+ return;
76
+ }
77
+
78
+ if (Types.Events.isFireIdleCallback(event)) {
79
+ const {duration} = Helpers.Timing.eventTimingsMilliSeconds(event);
80
+ if (duration > event.args.data.allottedMilliseconds) {
81
+ storeWarning(event, 'IDLE_CALLBACK_OVER_TIME');
82
+ }
83
+ return;
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Reflows* are added a warning to if:
89
+ * 1. They are forced/sync, meaning they are invoked by JS and finish
90
+ * during the Script execution.
91
+ * 2. Their duration exceeds a threshold.
92
+ * - *Reflow: The style recalculation and layout steps in a render task.
93
+ */
94
+ function processForcedReflowWarning(event: Types.Events.Event): void {
95
+ // Update the event and the JS invocation stacks.
96
+ accomodateEventInStack(event, allEventsStack);
97
+ accomodateEventInStack(event, jsInvokeStack, /* pushEventToStack */ Types.Events.isJSInvocationEvent(event));
98
+ if (jsInvokeStack.length) {
99
+ // Current event falls inside a JS call.
100
+ if (event.name === Types.Events.Name.LAYOUT || event.name === Types.Events.Name.RECALC_STYLE) {
101
+ // A forced reflow happened. However we need to check if
102
+ // the threshold is surpassed to add a warning. Accumulate the
103
+ // event to check for this after the current Task is over.
104
+ taskReflowEvents.push(event);
105
+ return;
106
+ }
107
+ }
108
+ if (allEventsStack.length === 1) {
109
+ // We hit a new task. Check if the forced reflows in the previous
110
+ // task exceeded the threshold and add a warning if so.
111
+ const totalTime = taskReflowEvents.reduce((time, event) => time + (event.dur || 0), 0);
112
+ if (totalTime >= FORCED_REFLOW_THRESHOLD) {
113
+ taskReflowEvents.forEach(reflowEvent => storeWarning(reflowEvent, 'FORCED_REFLOW'));
114
+ }
115
+ taskReflowEvents.length = 0;
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Updates a given trace event stack given a new event.
121
+ */
122
+ function accomodateEventInStack(event: Types.Events.Event, stack: Types.Events.Event[], pushEventToStack = true): void {
123
+ let nextItem = stack.at(-1);
124
+ while (nextItem && event.ts > nextItem.ts + (nextItem.dur || 0)) {
125
+ stack.pop();
126
+ nextItem = stack.at(-1);
127
+ }
128
+ if (!pushEventToStack) {
129
+ return;
130
+ }
131
+ stack.push(event);
132
+ }
133
+
134
+ export function deps(): HandlerName[] {
135
+ return ['UserInteractions', 'Workers'];
136
+ }
137
+
138
+ export async function finalize(): Promise<void> {
139
+ // These events do exist on the UserInteractionsHandler, but we also put
140
+ // them into the WarningsHandler so that the warnings handler can be the
141
+ // source of truth and the way to look up all warnings for a given event.
142
+ // Otherwise, we would have to look up warnings across multiple handlers for
143
+ // a given event, which will start to get messy very quickly.
144
+ const longInteractions = userInteractionsHandlerData().interactionsOverThreshold;
145
+ for (const interaction of longInteractions) {
146
+ storeWarning(interaction, 'LONG_INTERACTION');
147
+ }
148
+
149
+ for (const event of longTaskEvents) {
150
+ if (!(event.tid, workersData().workerIdByThread.has(event.tid))) {
151
+ storeWarning(event, 'LONG_TASK');
152
+ }
153
+ }
154
+ longTaskEvents.length = 0;
155
+ }
156
+
157
+ export function data(): WarningsData {
158
+ return {
159
+ perEvent: warningsPerEvent,
160
+ perWarning: eventsPerWarning,
161
+ };
162
+ }
@@ -0,0 +1,45 @@
1
+ // Copyright 2023 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import * as Types from '../types/types.js';
6
+
7
+ export interface WorkersData {
8
+ workerSessionIdEvents: readonly Types.Events.TracingSessionIdForWorker[];
9
+ workerIdByThread: Map<Types.Events.ThreadID, Types.Events.WorkerId>;
10
+ workerURLById: Map<Types.Events.WorkerId, string>;
11
+ }
12
+
13
+ let sessionIdEvents: Types.Events.TracingSessionIdForWorker[] = [];
14
+ let workerIdByThread = new Map<Types.Events.ThreadID, Types.Events.WorkerId>();
15
+ let workerURLById = new Map<Types.Events.WorkerId, string>();
16
+
17
+ export function reset(): void {
18
+ sessionIdEvents = [];
19
+ workerIdByThread = new Map();
20
+ workerURLById = new Map();
21
+ }
22
+
23
+ export function handleEvent(event: Types.Events.Event): void {
24
+ if (Types.Events.isTracingSessionIdForWorker(event)) {
25
+ sessionIdEvents.push(event);
26
+ }
27
+ }
28
+
29
+ export async function finalize(): Promise<void> {
30
+ for (const sessionIdEvent of sessionIdEvents) {
31
+ if (!sessionIdEvent.args.data) {
32
+ continue;
33
+ }
34
+ workerIdByThread.set(sessionIdEvent.args.data.workerThreadId, sessionIdEvent.args.data.workerId);
35
+ workerURLById.set(sessionIdEvent.args.data.workerId, sessionIdEvent.args.data.url);
36
+ }
37
+ }
38
+
39
+ export function data(): WorkersData {
40
+ return {
41
+ workerSessionIdEvents: sessionIdEvents,
42
+ workerIdByThread,
43
+ workerURLById,
44
+ };
45
+ }
@@ -0,0 +1,8 @@
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
+
5
+ export * as Helpers from './helpers.js';
6
+ export * as ModelHandlers from './ModelHandlers.js';
7
+ export * as Threads from './Threads.js';
8
+ export * as Types from './types.js';
@@ -0,0 +1,196 @@
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
+
5
+ import type * as Platform from '../../../core/platform/platform.js';
6
+ import * as Types from '../types/types.js';
7
+
8
+ import type {TraceEventsForNetworkRequest} from './NetworkRequestsHandler.js';
9
+ import type {HandlerData} from './types.js';
10
+
11
+ export type Entity = {
12
+ name?: string,
13
+ isUnrecognized?: boolean,
14
+ };
15
+
16
+ export interface EntityMappings {
17
+ createdEntityCache: Map<string, Entity>;
18
+ entityByEvent: Map<Types.Events.Event, Entity>;
19
+ eventsByEntity: Map<Entity, Types.Events.Event[]>;
20
+ entityByUrlCache: Map<string, Entity>;
21
+ }
22
+
23
+ export function getEntityForEvent(event: Types.Events.Event, entityMappings: EntityMappings): Entity|undefined {
24
+ const url = getNonResolvedURL(event);
25
+ if (!url) {
26
+ return;
27
+ }
28
+ return getEntityForUrl(url, entityMappings);
29
+ }
30
+
31
+ export function getEntityForUrl(url: string, entityMappings: EntityMappings): Entity|undefined {
32
+ const cachedByUrl = entityMappings.entityByUrlCache.get(url);
33
+ if (cachedByUrl) {
34
+ return cachedByUrl;
35
+ }
36
+ const entity = makeUpEntity(entityMappings.createdEntityCache, url);
37
+ if (entity) {
38
+ entityMappings.entityByUrlCache.set(url, entity);
39
+ }
40
+ return entity;
41
+ }
42
+
43
+ export function getNonResolvedURL(
44
+ entry: Types.Events.Event, handlerData?: HandlerData): Platform.DevToolsPath.UrlString|null {
45
+ if (Types.Events.isProfileCall(entry)) {
46
+ return entry.callFrame.url as Platform.DevToolsPath.UrlString;
47
+ }
48
+
49
+ if (Types.Events.isSyntheticNetworkRequest(entry)) {
50
+ return entry.args.data.url as Platform.DevToolsPath.UrlString;
51
+ }
52
+
53
+ if (Types.Events.isParseAuthorStyleSheetEvent(entry) && entry.args) {
54
+ return entry.args.data.stylesheetUrl as Platform.DevToolsPath.UrlString;
55
+ }
56
+
57
+ if (entry.args?.data?.stackTrace && entry.args.data.stackTrace.length > 0) {
58
+ return entry.args.data.stackTrace[0].url as Platform.DevToolsPath.UrlString;
59
+ }
60
+
61
+ // ParseHTML events store the URL under beginData, not data.
62
+ if (Types.Events.isParseHTML(entry)) {
63
+ return entry.args.beginData.url as Platform.DevToolsPath.UrlString;
64
+ }
65
+
66
+ if (handlerData) {
67
+ // DecodeImage events use the URL from the relevant PaintImage event.
68
+ if (Types.Events.isDecodeImage(entry)) {
69
+ const paintEvent = handlerData.ImagePainting.paintImageForEvent.get(entry);
70
+ return paintEvent ? getNonResolvedURL(paintEvent, handlerData) : null;
71
+ }
72
+
73
+ // DrawLazyPixelRef events use the URL from the relevant PaintImage event.
74
+ if (Types.Events.isDrawLazyPixelRef(entry) && entry.args?.LazyPixelRef) {
75
+ const paintEvent = handlerData.ImagePainting.paintImageByDrawLazyPixelRef.get(entry.args.LazyPixelRef);
76
+ return paintEvent ? getNonResolvedURL(paintEvent, handlerData) : null;
77
+ }
78
+ }
79
+
80
+ // For all other events, try to see if the URL is provided, else return null.
81
+ if (entry.args?.data?.url) {
82
+ return entry.args.data.url as Platform.DevToolsPath.UrlString;
83
+ }
84
+
85
+ // Many events don't have a url, but are associated with a request. Use the
86
+ // request's url.
87
+ const requestId = (entry.args?.data as {requestId?: string})?.requestId;
88
+ if (handlerData && requestId) {
89
+ const url = handlerData.NetworkRequests.byId.get(requestId)?.args.data.url;
90
+ if (url) {
91
+ return url as Platform.DevToolsPath.UrlString;
92
+ }
93
+ }
94
+
95
+ return null;
96
+ }
97
+
98
+ export function makeUpEntity(entityCache: Map<string, Entity>, url: string): Entity|undefined {
99
+ if (url.startsWith('chrome-extension:')) {
100
+ return makeUpChromeExtensionEntity(entityCache, url);
101
+ }
102
+
103
+ // Make up an entity only for valid http/https URLs.
104
+ if (!url.startsWith('http')) {
105
+ return;
106
+ }
107
+
108
+ const rootDomain = URL.parse(url)?.hostname || url
109
+
110
+ const unrecognizedEntity = {
111
+ name: rootDomain,
112
+ company: rootDomain,
113
+ category: '',
114
+ categories: [],
115
+ domains: [rootDomain],
116
+ averageExecutionTime: 0,
117
+ totalExecutionTime: 0,
118
+ totalOccurrences: 0,
119
+ isUnrecognized: true,
120
+ };
121
+ entityCache.set(rootDomain, unrecognizedEntity);
122
+ return unrecognizedEntity;
123
+ }
124
+
125
+ function getChromeExtensionOrigin(url: URL): string {
126
+ return url.protocol + '//' + url.host;
127
+ }
128
+
129
+ function makeUpChromeExtensionEntity(entityCache: Map<string, Entity>, url: string, extensionName?: string): Entity {
130
+ const parsedUrl = new URL(url);
131
+ const origin = getChromeExtensionOrigin(parsedUrl);
132
+ const host = new URL(origin).host;
133
+ const name = extensionName || host;
134
+
135
+ const cachedEntity = entityCache.get(origin);
136
+ if (cachedEntity) {
137
+ return cachedEntity;
138
+ }
139
+
140
+ const chromeExtensionEntity = {
141
+ name,
142
+ company: name,
143
+ category: 'Chrome Extension',
144
+ homepage: 'https://chromewebstore.google.com/detail/' + host,
145
+ categories: [],
146
+ domains: [origin],
147
+ averageExecutionTime: 0,
148
+ totalExecutionTime: 0,
149
+ totalOccurrences: 0,
150
+ };
151
+
152
+ entityCache.set(origin, chromeExtensionEntity);
153
+ return chromeExtensionEntity;
154
+ }
155
+
156
+ export function addEventToEntityMapping(event: Types.Events.Event, entityMappings: EntityMappings): void {
157
+ // As we share the entityMappings between Network and Renderer... We can have ResourceSendRequest events passed in here
158
+ // that were already mapped in Network. So, to avoid mapping twice, we always check that we didn't yet.
159
+ if (entityMappings.entityByEvent.has(event)) {
160
+ return;
161
+ }
162
+
163
+ const entity = getEntityForEvent(event, entityMappings);
164
+ if (!entity) {
165
+ return;
166
+ }
167
+
168
+ const mappedEvents = entityMappings.eventsByEntity.get(entity);
169
+ if (mappedEvents) {
170
+ mappedEvents.push(event);
171
+ } else {
172
+ entityMappings.eventsByEntity.set(entity, [event]);
173
+ }
174
+ entityMappings.entityByEvent.set(event, entity);
175
+ }
176
+
177
+ /** A slight upgrade of addEventToEntityMapping to handle the sub-events of a network request. **/
178
+ export function addNetworkRequestToEntityMapping(
179
+ networkRequest: Types.Events.SyntheticNetworkRequest, entityMappings: EntityMappings,
180
+ requestTraceEvents: TraceEventsForNetworkRequest): void {
181
+ const entity = getEntityForEvent(networkRequest, entityMappings);
182
+ if (!entity) {
183
+ return;
184
+ }
185
+ // In addition to mapping the network request, we'll also assign this entity to its "child" instant events like receiveData, willSendRequest, finishLoading, etc,
186
+ const eventsToMap = [networkRequest, ...Object.values(requestTraceEvents).flat()];
187
+ const mappedEvents = entityMappings.eventsByEntity.get(entity);
188
+ if (mappedEvents) {
189
+ mappedEvents.push(...eventsToMap);
190
+ } else {
191
+ entityMappings.eventsByEntity.set(entity, eventsToMap);
192
+ }
193
+ for (const evt of eventsToMap) {
194
+ entityMappings.entityByEvent.set(evt, entity);
195
+ }
196
+ }