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,701 @@
1
+ // Copyright 2016 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 Protocol from '../../../generated/protocol.js';
6
+ import * as Helpers from '../helpers/helpers.js';
7
+ import {SamplesIntegrator} from '../helpers/SamplesIntegrator.js';
8
+ import * as Types from '../types/types.js';
9
+
10
+ import type {TraceFilter} from './TraceFilter.js';
11
+
12
+ export class Node {
13
+ /** ms */
14
+ totalTime: number;
15
+ /** ms */
16
+ selfTime: number;
17
+ transferSize: number;
18
+ id: string|symbol;
19
+ /** The first trace event encountered that necessitated the creation of this tree node. */
20
+ event: Types.Events.Event;
21
+ /**
22
+ * All of the trace events associated with this aggregate node.
23
+ * Minor: In the case of Event Log (EventsTimelineTreeView), the node is not aggregate and this will only hold 1 event, the same that's in this.event
24
+ */
25
+ events: Types.Events.Event[];
26
+ parent!: Node|null;
27
+ groupId: string;
28
+ isGroupNodeInternal: boolean;
29
+ depth: number;
30
+
31
+ constructor(id: string|symbol, event: Types.Events.Event) {
32
+ this.totalTime = 0;
33
+ this.selfTime = 0;
34
+ this.transferSize = 0;
35
+ this.id = id;
36
+ this.event = event;
37
+ this.events = [event];
38
+
39
+ this.groupId = '';
40
+ this.isGroupNodeInternal = false;
41
+ this.depth = 0;
42
+ }
43
+
44
+ isGroupNode(): boolean {
45
+ return this.isGroupNodeInternal;
46
+ }
47
+
48
+ hasChildren(): boolean {
49
+ throw new Error('Not implemented');
50
+ }
51
+
52
+ setHasChildren(_value: boolean): void {
53
+ throw new Error('Not implemented');
54
+ }
55
+ /**
56
+ * Returns the direct descendants of this node.
57
+ * @returns a map with ordered <nodeId, Node> tuples.
58
+ */
59
+ children(): ChildrenCache {
60
+ throw new Error('Not implemented');
61
+ }
62
+
63
+ searchTree(matchFunction: (arg0: Types.Events.Event) => boolean, results?: Node[]): Node[] {
64
+ results = results || [];
65
+ if (this.event && matchFunction(this.event)) {
66
+ results.push(this);
67
+ }
68
+ for (const child of this.children().values()) {
69
+ child.searchTree(matchFunction, results);
70
+ }
71
+ return results;
72
+ }
73
+ }
74
+
75
+ export class TopDownNode extends Node {
76
+ root: TopDownRootNode|null;
77
+ private hasChildrenInternal: boolean;
78
+ childrenInternal: ChildrenCache|null;
79
+ override parent: TopDownNode|null;
80
+
81
+ constructor(id: string|symbol, event: Types.Events.Event, parent: TopDownNode|null) {
82
+ super(id, event);
83
+ this.root = parent?.root ?? null;
84
+ this.hasChildrenInternal = false;
85
+ this.childrenInternal = null;
86
+ this.parent = parent;
87
+ }
88
+
89
+ override hasChildren(): boolean {
90
+ return this.hasChildrenInternal;
91
+ }
92
+
93
+ override setHasChildren(value: boolean): void {
94
+ this.hasChildrenInternal = value;
95
+ }
96
+
97
+ override children(): ChildrenCache {
98
+ return this.childrenInternal || this.buildChildren();
99
+ }
100
+
101
+ private buildChildren(): ChildrenCache {
102
+ // Tracks the ancestor path of this node, includes the current node.
103
+ const path: TopDownNode[] = [];
104
+ for (let node: TopDownNode = this; node.parent && !node.isGroupNode(); node = node.parent) {
105
+ path.push((node));
106
+ }
107
+ path.reverse();
108
+ const children: ChildrenCache = new Map();
109
+ const self = this;
110
+ const root = this.root;
111
+ if (!root) {
112
+ this.childrenInternal = children;
113
+ return this.childrenInternal;
114
+ }
115
+ const startTime = root.startTime;
116
+ const endTime = root.endTime;
117
+ const instantEventCallback = (root.doNotAggregate || root.includeInstantEvents) ? onInstantEvent : undefined;
118
+ const eventIdCallback = root.doNotAggregate ? undefined : generateEventID;
119
+ const eventGroupIdCallback = root.getEventGroupIdCallback();
120
+ let depth = 0;
121
+ // The amount of ancestors found to match this node's ancestors
122
+ // during the event tree walk.
123
+ let matchedDepth = 0;
124
+ let currentDirectChild: Node|null = null;
125
+
126
+ // Walk on the full event tree to find this node's children.
127
+ Helpers.Trace.forEachEvent(
128
+ root.events,
129
+ {
130
+ onStartEvent,
131
+ onEndEvent,
132
+ onInstantEvent: instantEventCallback,
133
+ startTime: Helpers.Timing.milliToMicro(startTime),
134
+ endTime: Helpers.Timing.milliToMicro(endTime),
135
+ eventFilter: root.filter,
136
+ ignoreAsyncEvents: false,
137
+ },
138
+ );
139
+
140
+ function onStartEvent(e: Types.Events.Event): void {
141
+ const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);
142
+
143
+ ++depth;
144
+ if (depth > path.length + 2) {
145
+ return;
146
+ }
147
+ if (!matchPath(e)) {
148
+ return;
149
+ }
150
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
151
+ const duration = actualEndTime - Math.max(startTime, currentStartTime);
152
+ if (duration < 0) {
153
+ console.error('Negative event duration');
154
+ }
155
+ processEvent(e, duration);
156
+ }
157
+
158
+ function onInstantEvent(e: Types.Events.Event): void {
159
+ ++depth;
160
+ if (matchedDepth === path.length && depth <= path.length + 2) {
161
+ processEvent(e, 0);
162
+ }
163
+ --depth;
164
+ }
165
+
166
+ /**
167
+ * Creates a child node.
168
+ */
169
+ function processEvent(e: Types.Events.Event, duration: number): void {
170
+ if (depth === path.length + 2) {
171
+ if (!currentDirectChild) {
172
+ return;
173
+ }
174
+ currentDirectChild.setHasChildren(true);
175
+ currentDirectChild.selfTime -= duration;
176
+ return;
177
+ }
178
+ let id;
179
+ let groupId = '';
180
+ if (!eventIdCallback) {
181
+ id = Symbol('uniqueId');
182
+ } else {
183
+ id = eventIdCallback(e);
184
+ groupId = eventGroupIdCallback ? eventGroupIdCallback(e) : '';
185
+ if (groupId) {
186
+ id += '/' + groupId;
187
+ }
188
+ }
189
+ let node = children.get(id);
190
+ if (!node) {
191
+ node = new TopDownNode(id, e, self);
192
+ node.groupId = groupId;
193
+ children.set(id, node);
194
+ } else {
195
+ node.events.push(e);
196
+ }
197
+ node.selfTime += duration;
198
+ node.totalTime += duration;
199
+ if (Types.Events.isReceivedDataEvent(e)) {
200
+ node.transferSize += e.args.data.encodedDataLength;
201
+ }
202
+ currentDirectChild = node;
203
+ }
204
+
205
+ /**
206
+ * Checks if the path of ancestors of an event matches the path of
207
+ * ancestors of the current node. In other words, checks if an event
208
+ * is a child of this node. As the check is done, the partial result
209
+ * is cached on `matchedDepth`, for future checks.
210
+ */
211
+ function matchPath(e: Types.Events.Event): boolean {
212
+ const {endTime} = Helpers.Timing.eventTimingsMilliSeconds(e);
213
+ if (matchedDepth === path.length) {
214
+ return true;
215
+ }
216
+ if (matchedDepth !== depth - 1) {
217
+ return false;
218
+ }
219
+ if (!endTime) {
220
+ return false;
221
+ }
222
+ if (!eventIdCallback) {
223
+ if (e === path[matchedDepth].event) {
224
+ ++matchedDepth;
225
+ }
226
+ return false;
227
+ }
228
+ let id = eventIdCallback(e);
229
+ const groupId = eventGroupIdCallback ? eventGroupIdCallback(e) : '';
230
+ if (groupId) {
231
+ id += '/' + groupId;
232
+ }
233
+ if (id === path[matchedDepth].id) {
234
+ ++matchedDepth;
235
+ }
236
+ return false;
237
+ }
238
+
239
+ function onEndEvent(): void {
240
+ --depth;
241
+ if (matchedDepth > depth) {
242
+ matchedDepth = depth;
243
+ }
244
+ }
245
+
246
+ this.childrenInternal = children;
247
+ return children;
248
+ }
249
+ }
250
+
251
+ export class TopDownRootNode extends TopDownNode {
252
+ readonly filter: (e: Types.Events.Event) => boolean;
253
+ readonly startTime: Types.Timing.Milli;
254
+ readonly endTime: Types.Timing.Milli;
255
+ eventGroupIdCallback: ((arg0: Types.Events.Event) => string)|null|undefined;
256
+ /** Default behavior is to aggregate similar trace events into one Node based on generateEventID(), eventGroupIdCallback(), etc. Set true to keep nodes 1:1 with events. */
257
+ readonly doNotAggregate: boolean|undefined;
258
+ readonly includeInstantEvents?: boolean;
259
+ override totalTime: number;
260
+ override selfTime: number;
261
+
262
+ constructor(
263
+ events: Types.Events.Event[],
264
+ {filters, startTime, endTime, doNotAggregate, eventGroupIdCallback, includeInstantEvents}: {
265
+ filters: TraceFilter[],
266
+ startTime: Types.Timing.Milli,
267
+ endTime: Types.Timing.Milli,
268
+ doNotAggregate?: boolean,
269
+ eventGroupIdCallback?: ((arg0: Types.Events.Event) => string)|null,
270
+ includeInstantEvents?: boolean,
271
+ }) {
272
+ super('', events[0], null);
273
+ this.event = events[0];
274
+ this.root = this;
275
+ this.events = events;
276
+ this.filter = (e: Types.Events.Event): boolean => filters.every(f => f.accept(e));
277
+ this.startTime = startTime;
278
+ this.endTime = endTime;
279
+ this.eventGroupIdCallback = eventGroupIdCallback;
280
+ this.doNotAggregate = doNotAggregate;
281
+ this.includeInstantEvents = includeInstantEvents;
282
+
283
+ this.totalTime = endTime - startTime;
284
+ this.selfTime = this.totalTime;
285
+ }
286
+ override children(): ChildrenCache {
287
+ // FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003
288
+ return this.childrenInternal || this.grouppedTopNodes();
289
+ }
290
+
291
+ private grouppedTopNodes(): ChildrenCache {
292
+ const flatNodes = super.children();
293
+ for (const node of flatNodes.values()) {
294
+ this.selfTime -= node.totalTime;
295
+ }
296
+ if (!this.eventGroupIdCallback) {
297
+ return flatNodes;
298
+ }
299
+ const groupNodes = new Map<string, GroupNode>();
300
+ for (const node of flatNodes.values()) {
301
+ const groupId = this.eventGroupIdCallback(node.event);
302
+ let groupNode = groupNodes.get(groupId);
303
+ if (!groupNode) {
304
+ groupNode = new GroupNode(groupId, this, node.events);
305
+ groupNodes.set(groupId, groupNode);
306
+ } else {
307
+ groupNode.events.push(...node.events);
308
+ }
309
+ groupNode.addChild(node as BottomUpNode, node.selfTime, node.totalTime, node.transferSize);
310
+ }
311
+ this.childrenInternal = groupNodes;
312
+ return groupNodes;
313
+ }
314
+
315
+ getEventGroupIdCallback(): ((arg0: Types.Events.Event) => string)|null|undefined {
316
+ return this.eventGroupIdCallback;
317
+ }
318
+ }
319
+
320
+ export class BottomUpRootNode extends Node {
321
+ private childrenInternal: ChildrenCache|null;
322
+ private textFilter: TraceFilter;
323
+ readonly filter: (e: Types.Events.Event) => boolean;
324
+ readonly startTime: Types.Timing.Milli;
325
+ readonly endTime: Types.Timing.Milli;
326
+ override totalTime: number;
327
+ eventGroupIdCallback: ((arg0: Types.Events.Event) => string)|null|undefined;
328
+ private calculateTransferSize?: boolean;
329
+ private forceGroupIdCallback?: boolean;
330
+
331
+ constructor(events: Types.Events.Event[], {
332
+ textFilter,
333
+ filters,
334
+ startTime,
335
+ endTime,
336
+ eventGroupIdCallback,
337
+ calculateTransferSize,
338
+ forceGroupIdCallback,
339
+ }: {
340
+ textFilter: TraceFilter,
341
+ filters: readonly TraceFilter[],
342
+ startTime: Types.Timing.Milli,
343
+ endTime: Types.Timing.Milli,
344
+ eventGroupIdCallback?: ((arg0: Types.Events.Event) => string)|null,
345
+ calculateTransferSize?: boolean,
346
+ /**
347
+ * This forces using `eventGroupIdCallback` in combination with generateEventID
348
+ * to generate the ID of the node.
349
+ *
350
+ * This is used in the ThirdPartyTreeView and BottomUpTreeView, where we want to group all events
351
+ * related to a specific 3P entity together, regardless of the specific event name/type.
352
+ * There are cases where events under the same event name belong to different entities. But, because
353
+ * they get grouped first by event name/type, it throws off the 3P groupBy - grouping events of different
354
+ * 3P entities together.
355
+ */
356
+ forceGroupIdCallback?: boolean,
357
+ }) {
358
+ super('', events[0]);
359
+ this.childrenInternal = null;
360
+ this.events = events;
361
+ this.textFilter = textFilter;
362
+ this.filter = (e: Types.Events.Event): boolean => filters.every(f => f.accept(e));
363
+ this.startTime = startTime;
364
+ this.endTime = endTime;
365
+ this.eventGroupIdCallback = eventGroupIdCallback;
366
+ this.totalTime = endTime - startTime;
367
+ this.calculateTransferSize = calculateTransferSize;
368
+ this.forceGroupIdCallback = forceGroupIdCallback;
369
+ }
370
+
371
+ override hasChildren(): boolean {
372
+ return true;
373
+ }
374
+
375
+ filterChildren(children: ChildrenCache): ChildrenCache {
376
+ for (const [id, child] of children) {
377
+ // to provide better context to user only filter first (top) level.
378
+ if (child.event && child.depth <= 1 && !this.textFilter.accept(child.event)) {
379
+ children.delete((id));
380
+ }
381
+ }
382
+ return children;
383
+ }
384
+
385
+ override children(): ChildrenCache {
386
+ // FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003
387
+ if (!this.childrenInternal) {
388
+ this.childrenInternal = this.filterChildren(this.grouppedTopNodes());
389
+ }
390
+ return this.childrenInternal;
391
+ }
392
+
393
+ // If no grouping is applied, the nodes returned here are what's initially shown in the bottom-up view.
394
+ // "No grouping" == no grouping in UI dropdown == no groupingFunction…
395
+ // … HOWEVER, nodes are still aggregated via `generateEventID`, which is ~= the event name.
396
+ private ungroupedTopNodes(): ChildrenCache {
397
+ const root = this;
398
+ const startTime = this.startTime;
399
+ const endTime = this.endTime;
400
+ const idStack: string[] = [];
401
+ const nodeById = new Map<string, Node>();
402
+ const selfTimeStack: number[] = [endTime - startTime];
403
+ const firstNodeStack: boolean[] = [];
404
+ const totalTimeById = new Map<string, number>();
405
+ // TODO(paulirish): rename to getGroupNodeId
406
+ const eventGroupIdCallback = this.eventGroupIdCallback;
407
+ const forceGroupIdCallback = this.forceGroupIdCallback;
408
+
409
+ // encodedDataLength is provided solely on instant events.
410
+ const sumTransferSizeOfInstantEvent = (e: Types.Events.Event): void => {
411
+ if (Types.Events.isReceivedDataEvent(e)) {
412
+ let id = generateEventID(e);
413
+ if (this.forceGroupIdCallback && this.eventGroupIdCallback) {
414
+ id = `${id}-${this.eventGroupIdCallback(e)}`;
415
+ }
416
+ let node = nodeById.get(id);
417
+ if (!node) {
418
+ node = new BottomUpNode(root, id, e, false, root);
419
+ nodeById.set(id, node);
420
+ } else {
421
+ node.events.push(e);
422
+ }
423
+
424
+ // ResourceReceivedData events tally up the transfer size over time, but the
425
+ // ResourceReceiveResponse / ResourceFinish events hold the final result.
426
+ if (e.name === 'ResourceReceivedData') {
427
+ node.transferSize += e.args.data.encodedDataLength;
428
+ } else if (e.args.data.encodedDataLength > 0) {
429
+ // For some reason, ResourceFinish can be zero even if data was sent.
430
+ // Ignore that case.
431
+ // Note: this will count the entire resource size if just the last bit of a
432
+ // request is in view. If it isn't in view, the transfer size is counted
433
+ // gradually, in proportion with the ResourceReceivedData events in the
434
+ // current view.
435
+ node.transferSize = e.args.data.encodedDataLength;
436
+ }
437
+ }
438
+ };
439
+
440
+ Helpers.Trace.forEachEvent(
441
+ this.events,
442
+ {
443
+ onStartEvent,
444
+ onEndEvent,
445
+ onInstantEvent: this.calculateTransferSize ? sumTransferSizeOfInstantEvent : undefined,
446
+ startTime: Helpers.Timing.milliToMicro(this.startTime),
447
+ endTime: Helpers.Timing.milliToMicro(this.endTime),
448
+ eventFilter: this.filter,
449
+ ignoreAsyncEvents: false,
450
+ },
451
+ );
452
+
453
+ function onStartEvent(e: Types.Events.Event): void {
454
+ const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);
455
+
456
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
457
+ const duration = actualEndTime - Math.max(currentStartTime, startTime);
458
+ selfTimeStack[selfTimeStack.length - 1] -= duration;
459
+ selfTimeStack.push(duration);
460
+ let id = generateEventID(e);
461
+ if (forceGroupIdCallback && eventGroupIdCallback) {
462
+ id = `${id}-${eventGroupIdCallback(e)}`;
463
+ }
464
+
465
+ idStack.push(id);
466
+
467
+ // For an event 'X' that contains another event 'X' (resolving to the same node
468
+ // id), we need to measure `totalTime` from the start of the outermost 'X' to
469
+ // its corresponding end. This logic ensures we don't double-count the duration
470
+ // of the inner event.
471
+ const noNodeOnStack = !totalTimeById.has(id);
472
+ if (noNodeOnStack) {
473
+ totalTimeById.set(id, duration);
474
+ }
475
+ firstNodeStack.push(noNodeOnStack);
476
+ }
477
+
478
+ function onEndEvent(event: Types.Events.Event): void {
479
+ const id = idStack.pop();
480
+ if (!id) {
481
+ return;
482
+ }
483
+
484
+ let node = nodeById.get(id);
485
+ if (!node) {
486
+ node = new BottomUpNode(root, id, event, false, root);
487
+ nodeById.set(id, node);
488
+ } else {
489
+ node.events.push(event);
490
+ }
491
+ node.selfTime += selfTimeStack.pop() || 0;
492
+ if (firstNodeStack.pop()) {
493
+ node.totalTime += totalTimeById.get(id) || 0;
494
+ totalTimeById.delete(id);
495
+ }
496
+ // TODO: this may be wrong. See the skipped test in TraceTree.test.ts.
497
+ if (firstNodeStack.length) {
498
+ node.setHasChildren(true);
499
+ }
500
+ }
501
+
502
+ this.selfTime = selfTimeStack.pop() || 0;
503
+ // Delete any nodes that have no selfTime (or transferSize, if it's being calculated)
504
+ for (const pair of nodeById) {
505
+ if (pair[1].selfTime <= 0 && (!this.calculateTransferSize || pair[1].transferSize <= 0)) {
506
+ nodeById.delete((pair[0]));
507
+ }
508
+ }
509
+ return nodeById;
510
+ }
511
+
512
+ private grouppedTopNodes(): ChildrenCache {
513
+ const flatNodes = this.ungroupedTopNodes();
514
+ if (!this.eventGroupIdCallback) {
515
+ return flatNodes;
516
+ }
517
+ const groupNodes = new Map<string, GroupNode>();
518
+ for (const node of flatNodes.values()) {
519
+ const groupId = this.eventGroupIdCallback(node.event);
520
+ let groupNode = groupNodes.get(groupId);
521
+ if (!groupNode) {
522
+ groupNode = new GroupNode(groupId, this, node.events);
523
+ groupNodes.set(groupId, groupNode);
524
+ } else {
525
+ for (const e of node.events) {
526
+ groupNode.events.push(e);
527
+ }
528
+ }
529
+ groupNode.addChild(node as BottomUpNode, node.selfTime, node.selfTime, node.transferSize);
530
+ }
531
+ return groupNodes;
532
+ }
533
+ }
534
+
535
+ export class GroupNode extends Node {
536
+ private readonly childrenInternal: ChildrenCache;
537
+ override isGroupNodeInternal: boolean;
538
+ override events: Types.Events.Event[];
539
+
540
+ constructor(id: string, parent: BottomUpRootNode|TopDownRootNode, events: Types.Events.Event[]) {
541
+ super(id, events[0]);
542
+ this.events = events;
543
+ this.childrenInternal = new Map();
544
+ this.parent = parent;
545
+ this.isGroupNodeInternal = true;
546
+ }
547
+
548
+ addChild(child: BottomUpNode, selfTime: number, totalTime: number, transferSize: number): void {
549
+ this.childrenInternal.set(child.id, child);
550
+ this.selfTime += selfTime;
551
+ this.totalTime += totalTime;
552
+ this.transferSize += transferSize;
553
+ child.parent = this;
554
+ }
555
+
556
+ override hasChildren(): boolean {
557
+ return true;
558
+ }
559
+
560
+ override children(): ChildrenCache {
561
+ return this.childrenInternal;
562
+ }
563
+ }
564
+
565
+ export class BottomUpNode extends Node {
566
+ override parent: Node;
567
+ private root: BottomUpRootNode;
568
+ override depth: number;
569
+ private cachedChildren: ChildrenCache|null;
570
+ private hasChildrenInternal: boolean;
571
+
572
+ constructor(root: BottomUpRootNode, id: string, event: Types.Events.Event, hasChildren: boolean, parent: Node) {
573
+ super(id, event);
574
+ this.parent = parent;
575
+ this.root = root;
576
+ this.depth = (parent.depth || 0) + 1;
577
+ this.cachedChildren = null;
578
+ this.hasChildrenInternal = hasChildren;
579
+ }
580
+
581
+ override hasChildren(): boolean {
582
+ return this.hasChildrenInternal;
583
+ }
584
+
585
+ override setHasChildren(value: boolean): void {
586
+ this.hasChildrenInternal = value;
587
+ }
588
+
589
+ override children(): ChildrenCache {
590
+ if (this.cachedChildren) {
591
+ return this.cachedChildren;
592
+ }
593
+ const selfTimeStack: number[] = [0];
594
+ const eventIdStack: string[] = [];
595
+ const eventStack: Types.Events.Event[] = [];
596
+ const nodeById = new Map<string, BottomUpNode>();
597
+ const startTime = this.root.startTime;
598
+ const endTime = this.root.endTime;
599
+ let lastTimeMarker: number = startTime;
600
+ const self = this;
601
+ Helpers.Trace.forEachEvent(
602
+ this.root.events,
603
+ {
604
+ onStartEvent,
605
+ onEndEvent,
606
+ startTime: Helpers.Timing.milliToMicro(startTime),
607
+ endTime: Helpers.Timing.milliToMicro(endTime),
608
+ eventFilter: this.root.filter,
609
+ ignoreAsyncEvents: false,
610
+ },
611
+ );
612
+ function onStartEvent(e: Types.Events.Event): void {
613
+ const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);
614
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
615
+ const duration = actualEndTime - Math.max(currentStartTime, startTime);
616
+ if (duration < 0) {
617
+ console.assert(false, 'Negative duration of an event');
618
+ }
619
+ selfTimeStack[selfTimeStack.length - 1] -= duration;
620
+ selfTimeStack.push(duration);
621
+ const id = generateEventID(e);
622
+ eventIdStack.push(id);
623
+ eventStack.push(e);
624
+ }
625
+
626
+ function onEndEvent(e: Types.Events.Event): void {
627
+ const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);
628
+ const selfTime = selfTimeStack.pop();
629
+ const id = eventIdStack.pop();
630
+ eventStack.pop();
631
+ let node;
632
+ for (node = self; node.depth > 1; node = node.parent) {
633
+ if (node.id !== eventIdStack[eventIdStack.length + 1 - node.depth]) {
634
+ return;
635
+ }
636
+ }
637
+ if (node.id !== id || eventIdStack.length < self.depth) {
638
+ return;
639
+ }
640
+ const childId = eventIdStack[eventIdStack.length - self.depth];
641
+ node = nodeById.get(childId);
642
+ if (!node) {
643
+ const event = eventStack[eventStack.length - self.depth];
644
+ const hasChildren = eventStack.length > self.depth;
645
+ node = new BottomUpNode(self.root, childId, event, hasChildren, self);
646
+ nodeById.set(childId, node);
647
+ } else {
648
+ node.events.push(e);
649
+ }
650
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
651
+ const totalTime = actualEndTime - Math.max(currentStartTime, lastTimeMarker);
652
+ node.selfTime += selfTime || 0;
653
+ node.totalTime += totalTime;
654
+ lastTimeMarker = actualEndTime;
655
+ }
656
+
657
+ this.cachedChildren = this.root.filterChildren(nodeById);
658
+ return this.cachedChildren;
659
+ }
660
+
661
+ override searchTree(matchFunction: (arg0: Types.Events.Event) => boolean, results?: Node[]): Node[] {
662
+ results = results || [];
663
+ if (this.event && matchFunction(this.event)) {
664
+ results.push(this);
665
+ }
666
+ return results;
667
+ }
668
+ }
669
+
670
+ export function eventStackFrame(event: Types.Events.Event): Protocol.Runtime.CallFrame|null {
671
+ if (Types.Events.isProfileCall(event)) {
672
+ return event.callFrame;
673
+ }
674
+ const topFrame = event.args?.data?.stackTrace?.[0];
675
+ if (!topFrame) {
676
+ return null;
677
+ }
678
+ return {...topFrame, scriptId: String(topFrame.scriptId) as Protocol.Runtime.ScriptId};
679
+ }
680
+
681
+ /** TODO(paulirish): rename to generateNodeId **/
682
+ export function generateEventID(event: Types.Events.Event): string {
683
+ if (Types.Events.isProfileCall(event)) {
684
+ const name = SamplesIntegrator.isNativeRuntimeFrame(event.callFrame) ?
685
+ SamplesIntegrator.nativeGroup(event.callFrame.functionName) :
686
+ event.callFrame.functionName;
687
+ const location = event.callFrame.scriptId || event.callFrame.url || '';
688
+ return `f:${name}@${location}`;
689
+ }
690
+
691
+ if (Types.Events.isConsoleTimeStamp(event) && event.args.data) {
692
+ return `${event.name}:${event.args.data.name}`;
693
+ }
694
+ if (Types.Events.isSyntheticNetworkRequest(event) || Types.Events.isReceivedDataEvent(event)) {
695
+ return `req:${event.args.data.requestId}`;
696
+ }
697
+
698
+ return event.name;
699
+ }
700
+
701
+ export type ChildrenCache = Map<string|symbol, Node>;
@@ -0,0 +1,11 @@
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
+ export * as FilmStrip from './FilmStrip.js';
6
+ export * as MainThreadActivity from './MainThreadActivity.js';
7
+ export * as ScriptDuplication from './ScriptDuplication.js';
8
+ export * as StackTraceForEvent from './StackTraceForEvent.js';
9
+ export * as ThirdParties from './ThirdParties.js';
10
+ export * as TraceFilter from './TraceFilter.js';
11
+ export * as TraceTree from './TraceTree.js';