@paulirish/trace_engine 0.0.9 → 0.0.10

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 (234) hide show
  1. package/core/platform/DevToolsPath.d.ts +32 -0
  2. package/core/platform/DevToolsPath.js +4 -0
  3. package/core/platform/DevToolsPath.js.map +7 -0
  4. package/core/platform/MimeType.js +104 -0
  5. package/core/platform/MimeType.js.map +7 -0
  6. package/core/platform/Timing.js +10 -0
  7. package/core/platform/Timing.js.map +7 -0
  8. package/core/platform/UIString.d.ts +6 -0
  9. package/core/platform/UIString.js +2 -0
  10. package/core/platform/UIString.js.map +7 -0
  11. package/core/platform/UserVisibleError.d.ts +12 -0
  12. package/core/platform/UserVisibleError.js +14 -0
  13. package/core/platform/UserVisibleError.js.map +7 -0
  14. package/core/platform/array-utilities.d.ts +28 -0
  15. package/core/platform/array-utilities.js +163 -0
  16. package/core/platform/array-utilities.js.map +7 -0
  17. package/core/platform/brand.js +1 -0
  18. package/core/platform/brand.js.map +7 -0
  19. package/core/platform/bundle-tsconfig.json +1 -0
  20. package/core/platform/date-utilities.d.ts +2 -0
  21. package/core/platform/date-utilities.js +10 -0
  22. package/core/platform/date-utilities.js.map +7 -0
  23. package/core/platform/dcheck-tsconfig.json +8 -0
  24. package/core/platform/dcheck.d.ts +4 -0
  25. package/core/platform/dcheck.js +5 -0
  26. package/core/platform/devtools_entrypoint-bundle-tsconfig-tsconfig.json +40 -0
  27. package/core/platform/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  28. package/core/platform/dom-utilities.d.ts +6 -0
  29. package/core/platform/dom-utilities.js +98 -0
  30. package/core/platform/dom-utilities.js.map +7 -0
  31. package/core/platform/keyboard-utilities.d.ts +15 -0
  32. package/core/platform/keyboard-utilities.js +31 -0
  33. package/core/platform/keyboard-utilities.js.map +7 -0
  34. package/core/platform/map-utilities.d.ts +14 -0
  35. package/core/platform/map-utilities.js +70 -0
  36. package/core/platform/map-utilities.js.map +7 -0
  37. package/core/platform/number-utilities.d.ts +15 -0
  38. package/core/platform/number-utilities.js +71 -0
  39. package/core/platform/number-utilities.js.map +7 -0
  40. package/core/platform/platform-tsconfig.json +59 -0
  41. package/core/platform/platform.d.ts +15 -0
  42. package/core/platform/platform.js +37 -0
  43. package/core/platform/platform.js.compressed +0 -0
  44. package/core/platform/platform.js.hash +1 -0
  45. package/core/platform/platform.js.map +7 -0
  46. package/core/platform/platform.prebundle.d.ts +15 -0
  47. package/core/platform/platform.prebundle.js +50 -0
  48. package/core/platform/platform.prebundle.js.map +1 -0
  49. package/core/platform/platform.prebundle.ts +64 -0
  50. package/core/platform/promise-utilities.js +10 -0
  51. package/core/platform/promise-utilities.js.map +7 -0
  52. package/core/platform/set-utilities.d.ts +2 -0
  53. package/core/platform/set-utilities.js +20 -0
  54. package/core/platform/set-utilities.js.map +7 -0
  55. package/core/platform/string-utilities.d.ts +40 -0
  56. package/core/platform/string-utilities.js +439 -0
  57. package/core/platform/string-utilities.js.map +7 -0
  58. package/core/platform/typescript-utilities.d.ts +56 -0
  59. package/core/platform/typescript-utilities.js +13 -0
  60. package/core/platform/typescript-utilities.js.map +7 -0
  61. package/generated/protocol.d.ts +16189 -0
  62. package/generated/protocol.js +2230 -0
  63. package/models/cpu_profile/CPUProfileDataModel.js +375 -0
  64. package/models/cpu_profile/CPUProfileDataModel.js.map +7 -0
  65. package/models/cpu_profile/ProfileTreeModel.js +90 -0
  66. package/models/cpu_profile/ProfileTreeModel.js.map +7 -0
  67. package/models/cpu_profile/bundle-tsconfig.json +1 -0
  68. package/models/cpu_profile/cpu_profile-tsconfig.json +51 -0
  69. package/models/cpu_profile/cpu_profile.js +7 -0
  70. package/models/cpu_profile/cpu_profile.js.map +7 -0
  71. package/models/cpu_profile/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  72. package/models/trace/EntriesFilter.js +182 -0
  73. package/models/trace/EntriesFilter.js.map +7 -0
  74. package/models/trace/LegacyTracingModel.d.ts +1 -0
  75. package/models/trace/LegacyTracingModel.js +1 -0
  76. package/models/trace/LegacyTracingModel.js.map +7 -0
  77. package/models/trace/ModelImpl.js +116 -0
  78. package/models/trace/ModelImpl.js.map +7 -0
  79. package/models/trace/Processor.js +179 -0
  80. package/models/trace/Processor.js.map +7 -0
  81. package/models/trace/SDKServices.js +104 -0
  82. package/models/trace/SDKServices.js.map +7 -0
  83. package/models/trace/TraceProcessor.js +133 -0
  84. package/models/trace/TraceProcessor.js.map +7 -0
  85. package/models/trace/TracingManager.d.ts +1 -0
  86. package/models/trace/TracingManager.js +1 -0
  87. package/models/trace/TracingManager.js.map +7 -0
  88. package/models/trace/TreeManipulator.js +85 -0
  89. package/models/trace/TreeManipulator.js.map +7 -0
  90. package/models/trace/bundle-tsconfig.json +1 -0
  91. package/models/trace/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  92. package/models/trace/devtools_entrypoint-legacy-typescript-tsconfig.json +43 -0
  93. package/models/trace/extras/FetchNodes.js +104 -0
  94. package/models/trace/extras/FetchNodes.js.map +7 -0
  95. package/models/trace/extras/FilmStrip.js +37 -0
  96. package/models/trace/extras/FilmStrip.js.map +7 -0
  97. package/models/trace/extras/MainThreadActivity.js +61 -0
  98. package/models/trace/extras/MainThreadActivity.js.map +7 -0
  99. package/models/trace/extras/Metadata.js +28 -0
  100. package/models/trace/extras/Metadata.js.map +7 -0
  101. package/models/trace/extras/bundle-tsconfig.json +1 -0
  102. package/models/trace/extras/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  103. package/models/trace/extras/extras-tsconfig.json +59 -0
  104. package/models/trace/extras/extras.d.ts +1 -0
  105. package/models/trace/extras/extras.js +1 -0
  106. package/models/trace/extras/extras.js.map +7 -0
  107. package/models/trace/frames/TimelineFrameModel.js +392 -0
  108. package/models/trace/frames/TimelineFrameModel.js.map +7 -0
  109. package/models/trace/frames/bundle-tsconfig.json +1 -0
  110. package/models/trace/frames/devtools_entrypoint-bundle-typescript-tsconfig.json +43 -0
  111. package/models/trace/frames/frames-tsconfig.json +58 -0
  112. package/models/trace/frames/frames.js +5 -0
  113. package/models/trace/frames/frames.js.map +7 -0
  114. package/models/trace/handlers/AnimationHandler.js +30 -0
  115. package/models/trace/handlers/AnimationHandler.js.map +7 -0
  116. package/models/trace/handlers/AuctionWorkletsHandler.js +106 -0
  117. package/models/trace/handlers/AuctionWorkletsHandler.js.map +7 -0
  118. package/models/trace/handlers/FramesHandler.js +388 -0
  119. package/models/trace/handlers/FramesHandler.js.map +7 -0
  120. package/models/trace/handlers/GPUHandler.js +50 -0
  121. package/models/trace/handlers/GPUHandler.js.map +7 -0
  122. package/models/trace/handlers/InitiatorsHandler.js +133 -0
  123. package/models/trace/handlers/InitiatorsHandler.js.map +7 -0
  124. package/models/trace/handlers/InvalidationsHandler.js +98 -0
  125. package/models/trace/handlers/InvalidationsHandler.js.map +7 -0
  126. package/models/trace/handlers/LargestImagePaintHandler.js +18 -0
  127. package/models/trace/handlers/LargestImagePaintHandler.js.map +7 -0
  128. package/models/trace/handlers/LargestTextPaintHandler.js +18 -0
  129. package/models/trace/handlers/LargestTextPaintHandler.js.map +7 -0
  130. package/models/trace/handlers/LayerTreeHandler.js +90 -0
  131. package/models/trace/handlers/LayerTreeHandler.js.map +7 -0
  132. package/models/trace/handlers/LayoutShiftsHandler.js +270 -0
  133. package/models/trace/handlers/LayoutShiftsHandler.js.map +7 -0
  134. package/models/trace/handlers/MemoryHandler.js +17 -0
  135. package/models/trace/handlers/MemoryHandler.js.map +7 -0
  136. package/models/trace/handlers/MetaHandler.js +250 -0
  137. package/models/trace/handlers/MetaHandler.js.map +7 -0
  138. package/models/trace/handlers/Migration.js +27 -0
  139. package/models/trace/handlers/Migration.js.map +7 -0
  140. package/models/trace/handlers/ModelHandlers.js +22 -0
  141. package/models/trace/handlers/ModelHandlers.js.map +7 -0
  142. package/models/trace/handlers/NetworkRequestsHandler.js +237 -0
  143. package/models/trace/handlers/NetworkRequestsHandler.js.map +7 -0
  144. package/models/trace/handlers/PageLoadMetricsHandler.js +334 -0
  145. package/models/trace/handlers/PageLoadMetricsHandler.js.map +7 -0
  146. package/models/trace/handlers/RendererHandler.js +221 -0
  147. package/models/trace/handlers/RendererHandler.js.map +7 -0
  148. package/models/trace/handlers/SamplesHandler.js +178 -0
  149. package/models/trace/handlers/SamplesHandler.js.map +7 -0
  150. package/models/trace/handlers/ScreenshotsHandler.js +57 -0
  151. package/models/trace/handlers/ScreenshotsHandler.js.map +7 -0
  152. package/models/trace/handlers/Threads.js +77 -0
  153. package/models/trace/handlers/Threads.js.map +7 -0
  154. package/models/trace/handlers/UberFramesHandler.js +293 -0
  155. package/models/trace/handlers/UberFramesHandler.js.map +7 -0
  156. package/models/trace/handlers/UserInteractionsHandler.js +168 -0
  157. package/models/trace/handlers/UserInteractionsHandler.js.map +7 -0
  158. package/models/trace/handlers/UserTimingsHandler.js +97 -0
  159. package/models/trace/handlers/UserTimingsHandler.js.map +7 -0
  160. package/models/trace/handlers/WarningsHandler.js +87 -0
  161. package/models/trace/handlers/WarningsHandler.js.map +7 -0
  162. package/models/trace/handlers/WorkersHandler.js +50 -0
  163. package/models/trace/handlers/WorkersHandler.js.map +7 -0
  164. package/models/trace/handlers/bundle-tsconfig.json +1 -0
  165. package/models/trace/handlers/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  166. package/models/trace/handlers/handlers-tsconfig.json +79 -0
  167. package/models/trace/handlers/handlers.js +4 -0
  168. package/models/trace/handlers/handlers.js.map +7 -0
  169. package/models/trace/handlers/types.js +18 -0
  170. package/models/trace/handlers/types.js.map +7 -0
  171. package/models/trace/helpers/SamplesIntegrator.js +220 -0
  172. package/models/trace/helpers/SamplesIntegrator.js.map +7 -0
  173. package/models/trace/helpers/Timing.js +141 -0
  174. package/models/trace/helpers/Timing.js.map +7 -0
  175. package/models/trace/helpers/Trace.js +196 -0
  176. package/models/trace/helpers/Trace.js.map +7 -0
  177. package/models/trace/helpers/TreeHelpers.js +119 -0
  178. package/models/trace/helpers/TreeHelpers.js.map +7 -0
  179. package/models/trace/helpers/bundle-tsconfig.json +1 -0
  180. package/models/trace/helpers/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  181. package/models/trace/helpers/helpers-tsconfig.json +59 -0
  182. package/models/trace/helpers/helpers.js +5 -0
  183. package/models/trace/helpers/helpers.js.map +7 -0
  184. package/models/trace/legacy-tsconfig.json +1 -0
  185. package/models/trace/root-causes/LayoutShift.js +370 -0
  186. package/models/trace/root-causes/LayoutShift.js.map +7 -0
  187. package/models/trace/root-causes/RootCauses.js +8 -0
  188. package/models/trace/root-causes/RootCauses.js.map +7 -0
  189. package/models/trace/root-causes/bundle-tsconfig.json +1 -0
  190. package/models/trace/root-causes/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  191. package/models/trace/root-causes/root-causes-tsconfig.json +57 -0
  192. package/models/trace/root-causes/root-causes.js +2 -0
  193. package/models/trace/root-causes/root-causes.js.map +7 -0
  194. package/models/trace/sdk_services/DOMNodeLookup.js +41 -0
  195. package/models/trace/sdk_services/DOMNodeLookup.js.map +7 -0
  196. package/models/trace/sdk_services/LayoutShifts.js +68 -0
  197. package/models/trace/sdk_services/LayoutShifts.js.map +7 -0
  198. package/models/trace/sdk_services/bundle-tsconfig.json +1 -0
  199. package/models/trace/sdk_services/devtools_entrypoint-bundle-typescript-tsconfig.json +41 -0
  200. package/models/trace/sdk_services/sdk_services-tsconfig.json +57 -0
  201. package/models/trace/sdk_services/sdk_services.js +7 -0
  202. package/models/trace/sdk_services/sdk_services.js.map +7 -0
  203. package/models/trace/trace-legacy.js +16 -0
  204. package/models/trace/trace-legacy.js.map +7 -0
  205. package/models/trace/trace-tsconfig.json +69 -0
  206. package/models/trace/trace.js +23 -0
  207. package/models/trace/trace.js.map +7 -0
  208. package/models/trace/types/Configuration.js +18 -0
  209. package/models/trace/types/Configuration.js.map +7 -0
  210. package/models/trace/types/File.js +6 -0
  211. package/models/trace/types/File.js.map +7 -0
  212. package/models/trace/types/Timing.js +17 -0
  213. package/models/trace/types/Timing.js.map +7 -0
  214. package/models/trace/types/TraceEvents.js +595 -0
  215. package/models/trace/types/TraceEvents.js.map +7 -0
  216. package/models/trace/types/bundle-tsconfig.json +1 -0
  217. package/models/trace/types/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
  218. package/models/trace/types/types-tsconfig.json +47 -0
  219. package/models/trace/types/types.js +5 -0
  220. package/models/trace/types/types.js.map +7 -0
  221. package/models/trace/worker/Processor.js +143 -0
  222. package/models/trace/worker/Processor.js.map +7 -0
  223. package/models/trace/worker/Types.js +1 -0
  224. package/models/trace/worker/Types.js.map +7 -0
  225. package/models/trace/worker/bundle-tsconfig.json +1 -0
  226. package/models/trace/worker/devtools_entrypoint-bundle-typescript-tsconfig.json +41 -0
  227. package/models/trace/worker/devtools_entrypoint-worker_entrypoint-typescript-tsconfig.json +41 -0
  228. package/models/trace/worker/processor-tsconfig.json +45 -0
  229. package/models/trace/worker/worker.js +7 -0
  230. package/models/trace/worker/worker.js.map +7 -0
  231. package/models/trace/worker/worker_entrypoint-tsconfig.json +1 -0
  232. package/models/trace/worker/worker_entrypoint.js +36 -0
  233. package/models/trace/worker/worker_entrypoint.js.map +7 -0
  234. package/package.json +2 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../front_end/models/trace/handlers/UserTimingsHandler.ts"],
4
+ "sourcesContent": ["// Copyright 2022 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport {HandlerState} from './types.js';\n\n/**\n * IMPORTANT!\n * See UserTimings.md in this directory for some handy documentation on\n * UserTimings and the trace events we parse currently.\n **/\nlet syntheticEvents: Types.TraceEvents.SyntheticEventPair<Types.TraceEvents.TraceEventPairableAsync>[] = [];\nconst performanceMeasureEvents: Types.TraceEvents.TraceEventPerformanceMeasure[] = [];\nconst performanceMarkEvents: Types.TraceEvents.TraceEventPerformanceMark[] = [];\n\nconst consoleTimings: (Types.TraceEvents.TraceEventConsoleTimeBegin|Types.TraceEvents.TraceEventConsoleTimeEnd)[] = [];\n\nconst timestampEvents: Types.TraceEvents.TraceEventTimeStamp[] = [];\n\nexport interface UserTimingsData {\n /**\n * Events triggered with the performance.measure() API.\n * https://developer.mozilla.org/en-US/docs/Web/API/Performance/measure\n */\n performanceMeasures: readonly Types.TraceEvents.SyntheticUserTimingPair[];\n /**\n * Events triggered with the performance.mark() API.\n * https://developer.mozilla.org/en-US/docs/Web/API/Performance/mark\n */\n performanceMarks: readonly Types.TraceEvents.TraceEventPerformanceMark[];\n /**\n * Events triggered with the console.time(), console.timeEnd() and\n * console.timeLog() API.\n * https://developer.mozilla.org/en-US/docs/Web/API/console/time\n */\n consoleTimings: readonly Types.TraceEvents.SyntheticConsoleTimingPair[];\n /**\n * Events triggered with the console.timeStamp() API\n * https://developer.mozilla.org/en-US/docs/Web/API/console/timeStamp\n */\n timestampEvents: readonly Types.TraceEvents.TraceEventTimeStamp[];\n}\nlet handlerState = HandlerState.UNINITIALIZED;\n\nexport function reset(): void {\n syntheticEvents.length = 0;\n performanceMeasureEvents.length = 0;\n performanceMarkEvents.length = 0;\n consoleTimings.length = 0;\n timestampEvents.length = 0;\n handlerState = HandlerState.INITIALIZED;\n}\n\nconst resourceTimingNames = [\n 'workerStart',\n 'redirectStart',\n 'redirectEnd',\n 'fetchStart',\n 'domainLookupStart',\n 'domainLookupEnd',\n 'connectStart',\n 'connectEnd',\n 'secureConnectionStart',\n 'requestStart',\n 'responseStart',\n 'responseEnd',\n];\nconst navTimingNames = [\n 'navigationStart',\n 'unloadEventStart',\n 'unloadEventEnd',\n 'redirectStart',\n 'redirectEnd',\n 'fetchStart',\n 'commitNavigationEnd',\n 'domainLookupStart',\n 'domainLookupEnd',\n 'connectStart',\n 'connectEnd',\n 'secureConnectionStart',\n 'requestStart',\n 'responseStart',\n 'responseEnd',\n 'domLoading',\n 'domInteractive',\n 'domContentLoadedEventStart',\n 'domContentLoadedEventEnd',\n 'domComplete',\n 'loadEventStart',\n 'loadEventEnd',\n];\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('UserTimings handler is not initialized');\n }\n\n // These are events dispatched under the blink.user_timing category\n // but that the user didn't add. Filter them out so that they do not\n // Appear in the timings track (they still appear in the main thread\n // flame chart).\n const ignoredNames = [...resourceTimingNames, ...navTimingNames];\n if (ignoredNames.includes(event.name)) {\n return;\n }\n\n if (Types.TraceEvents.isTraceEventPerformanceMeasure(event)) {\n performanceMeasureEvents.push(event);\n return;\n }\n if (Types.TraceEvents.isTraceEventPerformanceMark(event)) {\n performanceMarkEvents.push(event);\n }\n if (Types.TraceEvents.isTraceEventConsoleTime(event)) {\n consoleTimings.push(event);\n }\n if (Types.TraceEvents.isTraceEventTimeStamp(event)) {\n timestampEvents.push(event);\n }\n}\n\nexport async function finalize(): Promise<void> {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('UserTimings handler is not initialized');\n }\n\n const asyncEvents = [...performanceMeasureEvents, ...consoleTimings];\n syntheticEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(asyncEvents);\n handlerState = HandlerState.FINALIZED;\n}\n\nexport function data(): UserTimingsData {\n if (handlerState !== HandlerState.FINALIZED) {\n throw new Error('UserTimings handler is not finalized');\n }\n\n return {\n performanceMeasures: syntheticEvents.filter(e => e.cat === 'blink.user_timing') as\n Types.TraceEvents.SyntheticUserTimingPair[],\n consoleTimings: syntheticEvents.filter(e => e.cat === 'blink.console') as\n Types.TraceEvents.SyntheticConsoleTimingPair[],\n performanceMarks: [...performanceMarkEvents],\n timestampEvents: [...timestampEvents],\n };\n}\n"],
5
+ "mappings": "AAIA;AACA;AAEA;AAOA,IAAI,kBAAqG;AACzG,MAAM,2BAA6E;AACnF,MAAM,wBAAuE;AAE7E,MAAM,iBAA8G;AAEpH,MAAM,kBAA2D;AAyBjE,IAAI,eAAe,aAAa;AAEzB,wBAAuB;AAC5B,kBAAgB,SAAS;AACzB,2BAAyB,SAAS;AAClC,wBAAsB,SAAS;AAC/B,iBAAe,SAAS;AACxB,kBAAgB,SAAS;AACzB,iBAAe,aAAa;AAAA;AAG9B,MAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAEF,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAGK,4BAAqB,OAA+C;AACzE,MAAI,iBAAiB,aAAa,aAAa;AAC7C,UAAM,IAAI,MAAM;AAAA;AAOlB,QAAM,eAAe,CAAC,GAAG,qBAAqB,GAAG;AACjD,MAAI,aAAa,SAAS,MAAM,OAAO;AACrC;AAAA;AAGF,MAAI,MAAM,YAAY,+BAA+B,QAAQ;AAC3D,6BAAyB,KAAK;AAC9B;AAAA;AAEF,MAAI,MAAM,YAAY,4BAA4B,QAAQ;AACxD,0BAAsB,KAAK;AAAA;AAE7B,MAAI,MAAM,YAAY,wBAAwB,QAAQ;AACpD,mBAAe,KAAK;AAAA;AAEtB,MAAI,MAAM,YAAY,sBAAsB,QAAQ;AAClD,oBAAgB,KAAK;AAAA;AAAA;AAIzB,iCAAgD;AAC9C,MAAI,iBAAiB,aAAa,aAAa;AAC7C,UAAM,IAAI,MAAM;AAAA;AAGlB,QAAM,cAAc,CAAC,GAAG,0BAA0B,GAAG;AACrD,oBAAkB,QAAQ,MAAM,mCAAmC;AACnE,iBAAe,aAAa;AAAA;AAGvB,uBAAiC;AACtC,MAAI,iBAAiB,aAAa,WAAW;AAC3C,UAAM,IAAI,MAAM;AAAA;AAGlB,SAAO;AAAA,IACL,qBAAqB,gBAAgB,OAAO,OAAK,EAAE,QAAQ;AAAA,IAE3D,gBAAgB,gBAAgB,OAAO,OAAK,EAAE,QAAQ;AAAA,IAEtD,kBAAkB,CAAC,GAAG;AAAA,IACtB,iBAAiB,CAAC,GAAG;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,87 @@
1
+ import * as Platform from "../../../core/platform/platform.js";
2
+ import * as Helpers from "../helpers/helpers.js";
3
+ import * as Types from "../types/types.js";
4
+ import { data as userInteractionsHandlerData } from "./UserInteractionsHandler.js";
5
+ const warningsPerEvent = /* @__PURE__ */ new Map();
6
+ const eventsPerWarning = /* @__PURE__ */ new Map();
7
+ const allEventsStack = [];
8
+ const jsInvokeStack = [];
9
+ const taskReflowEvents = [];
10
+ export const FORCED_REFLOW_THRESHOLD = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(30));
11
+ export const LONG_MAIN_THREAD_TASK_THRESHOLD = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(50));
12
+ export function reset() {
13
+ warningsPerEvent.clear();
14
+ eventsPerWarning.clear();
15
+ allEventsStack.length = 0;
16
+ jsInvokeStack.length = 0;
17
+ taskReflowEvents.length = 0;
18
+ }
19
+ function storeWarning(event, warning) {
20
+ const existingWarnings = Platform.MapUtilities.getWithDefault(warningsPerEvent, event, () => []);
21
+ existingWarnings.push(warning);
22
+ warningsPerEvent.set(event, existingWarnings);
23
+ const existingEvents = Platform.MapUtilities.getWithDefault(eventsPerWarning, warning, () => []);
24
+ existingEvents.push(event);
25
+ eventsPerWarning.set(warning, existingEvents);
26
+ }
27
+ export function handleEvent(event) {
28
+ processForcedReflowWarning(event);
29
+ if (event.name === Types.TraceEvents.KnownEventName.RunTask) {
30
+ const { duration } = Helpers.Timing.eventTimingsMicroSeconds(event);
31
+ if (duration > LONG_MAIN_THREAD_TASK_THRESHOLD) {
32
+ storeWarning(event, "LONG_TASK");
33
+ }
34
+ return;
35
+ }
36
+ if (Types.TraceEvents.isTraceEventFireIdleCallback(event)) {
37
+ const { duration } = Helpers.Timing.eventTimingsMilliSeconds(event);
38
+ if (duration > event.args.data.allottedMilliseconds) {
39
+ storeWarning(event, "IDLE_CALLBACK_OVER_TIME");
40
+ }
41
+ return;
42
+ }
43
+ }
44
+ function processForcedReflowWarning(event) {
45
+ accomodateEventInStack(event, allEventsStack);
46
+ accomodateEventInStack(event, jsInvokeStack, Types.TraceEvents.isJSInvocationEvent(event));
47
+ if (jsInvokeStack.length) {
48
+ if (event.name === Types.TraceEvents.KnownEventName.Layout || event.name === Types.TraceEvents.KnownEventName.RecalculateStyles || event.name === Types.TraceEvents.KnownEventName.UpdateLayoutTree) {
49
+ taskReflowEvents.push(event);
50
+ return;
51
+ }
52
+ }
53
+ if (allEventsStack.length === 1) {
54
+ const totalTime = taskReflowEvents.reduce((time, event2) => time + (event2.dur || 0), 0);
55
+ if (totalTime >= FORCED_REFLOW_THRESHOLD) {
56
+ taskReflowEvents.forEach((reflowEvent) => storeWarning(reflowEvent, "FORCED_REFLOW"));
57
+ }
58
+ taskReflowEvents.length = 0;
59
+ }
60
+ }
61
+ function accomodateEventInStack(event, stack, pushEventToStack = true) {
62
+ let nextItem = stack.at(-1);
63
+ while (nextItem && event.ts > nextItem.ts + (nextItem.dur || 0)) {
64
+ stack.pop();
65
+ nextItem = stack.at(-1);
66
+ }
67
+ if (!pushEventToStack) {
68
+ return;
69
+ }
70
+ stack.push(event);
71
+ }
72
+ export function deps() {
73
+ return ["UserInteractions"];
74
+ }
75
+ export async function finalize() {
76
+ const longInteractions = userInteractionsHandlerData().interactionsOverThreshold;
77
+ for (const interaction of longInteractions) {
78
+ storeWarning(interaction, "LONG_INTERACTION");
79
+ }
80
+ }
81
+ export function data() {
82
+ return {
83
+ perEvent: new Map(warningsPerEvent),
84
+ perWarning: new Map(eventsPerWarning)
85
+ };
86
+ }
87
+ //# sourceMappingURL=WarningsHandler.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../front_end/models/trace/handlers/WarningsHandler.ts"],
4
+ "sourcesContent": ["// Copyright 2023 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport * as Platform from '../../../core/platform/platform.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport {type TraceEventHandlerName} from './types.js';\nimport {data as userInteractionsHandlerData} from './UserInteractionsHandler.js';\n\nexport interface WarningsData {\n // Tracks warnings keyed by the event.\n perEvent: Map<Types.TraceEvents.TraceEventData, Warning[]>;\n // The same data in reverse: for each type of warning, track the events.\n // Useful if we need to enumerate events by type of issue\n perWarning: Map<Warning, Types.TraceEvents.TraceEventData[]>;\n}\n\nexport type Warning = 'LONG_TASK'|'IDLE_CALLBACK_OVER_TIME'|'FORCED_REFLOW'|'LONG_INTERACTION';\n\nconst warningsPerEvent: WarningsData['perEvent'] = new Map();\nconst eventsPerWarning: WarningsData['perWarning'] = new Map();\n\n/**\n * Tracks the stack formed by nested trace events up to a given point\n */\nconst allEventsStack: Types.TraceEvents.TraceEventData[] = [];\n/**\n * Tracks the stack formed by JS invocation trace events up to a given point.\n * F.e. FunctionCall, EvaluateScript, V8Execute.\n * Not to be confused with ProfileCalls.\n */\nconst jsInvokeStack: Types.TraceEvents.TraceEventData[] = [];\n/**\n * Tracks reflow events in a task.\n */\nconst taskReflowEvents: Types.TraceEvents.TraceEventData[] = [];\n\nexport const FORCED_REFLOW_THRESHOLD = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(30));\n\nexport const LONG_MAIN_THREAD_TASK_THRESHOLD = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(50));\n\nexport function reset(): void {\n warningsPerEvent.clear();\n eventsPerWarning.clear();\n allEventsStack.length = 0;\n jsInvokeStack.length = 0;\n taskReflowEvents.length = 0;\n}\n\nfunction storeWarning(event: Types.TraceEvents.TraceEventData, warning: Warning): void {\n const existingWarnings = Platform.MapUtilities.getWithDefault(warningsPerEvent, event, () => []);\n existingWarnings.push(warning);\n warningsPerEvent.set(event, existingWarnings);\n\n const existingEvents = Platform.MapUtilities.getWithDefault(eventsPerWarning, warning, () => []);\n existingEvents.push(event);\n eventsPerWarning.set(warning, existingEvents);\n}\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n processForcedReflowWarning(event);\n if (event.name === Types.TraceEvents.KnownEventName.RunTask) {\n const {duration} = Helpers.Timing.eventTimingsMicroSeconds(event);\n if (duration > LONG_MAIN_THREAD_TASK_THRESHOLD) {\n storeWarning(event, 'LONG_TASK');\n }\n return;\n }\n\n if (Types.TraceEvents.isTraceEventFireIdleCallback(event)) {\n const {duration} = Helpers.Timing.eventTimingsMilliSeconds(event);\n if (duration > event.args.data.allottedMilliseconds) {\n storeWarning(event, 'IDLE_CALLBACK_OVER_TIME');\n }\n return;\n }\n}\n\n/**\n * Reflows* are added a warning to if:\n * 1. They are forced/sync, meaning they are invoked by JS and finish\n * during the Script execution.\n * 2. Their duration exceeds a threshold.\n * - *Reflow: The style recalculation and layout steps in a render task.\n */\nfunction processForcedReflowWarning(event: Types.TraceEvents.TraceEventData): void {\n // Update the event and the JS invocation stacks.\n accomodateEventInStack(event, allEventsStack);\n accomodateEventInStack(event, jsInvokeStack, /* pushEventToStack */ Types.TraceEvents.isJSInvocationEvent(event));\n if (jsInvokeStack.length) {\n // Current event falls inside a JS call.\n if (event.name === Types.TraceEvents.KnownEventName.Layout ||\n event.name === Types.TraceEvents.KnownEventName.RecalculateStyles ||\n event.name === Types.TraceEvents.KnownEventName.UpdateLayoutTree) {\n // A forced reflow happened. However we need to check if\n // the threshold is surpassed to add a warning. Accumulate the\n // event to check for this after the current Task is over.\n taskReflowEvents.push(event);\n return;\n }\n }\n if (allEventsStack.length === 1) {\n // We hit a new task. Check if the forced reflows in the previous\n // task exceeded the threshold and add a warning if so.\n const totalTime = taskReflowEvents.reduce((time, event) => time + (event.dur || 0), 0);\n if (totalTime >= FORCED_REFLOW_THRESHOLD) {\n taskReflowEvents.forEach(reflowEvent => storeWarning(reflowEvent, 'FORCED_REFLOW'));\n }\n taskReflowEvents.length = 0;\n }\n}\n\n/**\n * Updates a given trace event stack given a new event.\n */\nfunction accomodateEventInStack(\n event: Types.TraceEvents.TraceEventData, stack: Types.TraceEvents.TraceEventData[], pushEventToStack = true): void {\n let nextItem = stack.at(-1);\n while (nextItem && event.ts > nextItem.ts + (nextItem.dur || 0)) {\n stack.pop();\n nextItem = stack.at(-1);\n }\n if (!pushEventToStack) {\n return;\n }\n stack.push(event);\n}\n\nexport function deps(): TraceEventHandlerName[] {\n return ['UserInteractions'];\n}\n\nexport async function finalize(): Promise<void> {\n // These events do exist on the UserInteractionsHandler, but we also put\n // them into the WarningsHandler so that the warnings handler can be the\n // source of truth and the way to look up all warnings for a given event.\n // Otherwise, we would have to look up warnings across multiple handlers for\n // a given event, which will start to get messy very quickly.\n const longInteractions = userInteractionsHandlerData().interactionsOverThreshold;\n for (const interaction of longInteractions) {\n storeWarning(interaction, 'LONG_INTERACTION');\n }\n}\n\nexport function data(): WarningsData {\n return {\n perEvent: new Map(warningsPerEvent),\n perWarning: new Map(eventsPerWarning),\n };\n}\n"],
5
+ "mappings": "AAIA;AACA;AACA;AAGA;AAYA,MAAM,mBAA6C,oBAAI;AACvD,MAAM,mBAA+C,oBAAI;AAKzD,MAAM,iBAAqD;AAM3D,MAAM,gBAAoD;AAI1D,MAAM,mBAAuD;AAEtD,aAAM,0BAA0B,QAAQ,OAAO,2BAA2B,MAAM,OAAO,aAAa;AAEpG,aAAM,kCAAkC,QAAQ,OAAO,2BAA2B,MAAM,OAAO,aAAa;AAE5G,wBAAuB;AAC5B,mBAAiB;AACjB,mBAAiB;AACjB,iBAAe,SAAS;AACxB,gBAAc,SAAS;AACvB,mBAAiB,SAAS;AAAA;AAG5B,sBAAsB,OAAyC,SAAwB;AACrF,QAAM,mBAAmB,SAAS,aAAa,eAAe,kBAAkB,OAAO,MAAM;AAC7F,mBAAiB,KAAK;AACtB,mBAAiB,IAAI,OAAO;AAE5B,QAAM,iBAAiB,SAAS,aAAa,eAAe,kBAAkB,SAAS,MAAM;AAC7F,iBAAe,KAAK;AACpB,mBAAiB,IAAI,SAAS;AAAA;AAGzB,4BAAqB,OAA+C;AACzE,6BAA2B;AAC3B,MAAI,MAAM,SAAS,MAAM,YAAY,eAAe,SAAS;AAC3D,UAAM,EAAC,aAAY,QAAQ,OAAO,yBAAyB;AAC3D,QAAI,WAAW,iCAAiC;AAC9C,mBAAa,OAAO;AAAA;AAEtB;AAAA;AAGF,MAAI,MAAM,YAAY,6BAA6B,QAAQ;AACzD,UAAM,EAAC,aAAY,QAAQ,OAAO,yBAAyB;AAC3D,QAAI,WAAW,MAAM,KAAK,KAAK,sBAAsB;AACnD,mBAAa,OAAO;AAAA;AAEtB;AAAA;AAAA;AAWJ,oCAAoC,OAA+C;AAEjF,yBAAuB,OAAO;AAC9B,yBAAuB,OAAO,eAAsC,MAAM,YAAY,oBAAoB;AAC1G,MAAI,cAAc,QAAQ;AAExB,QAAI,MAAM,SAAS,MAAM,YAAY,eAAe,UAChD,MAAM,SAAS,MAAM,YAAY,eAAe,qBAChD,MAAM,SAAS,MAAM,YAAY,eAAe,kBAAkB;AAIpE,uBAAiB,KAAK;AACtB;AAAA;AAAA;AAGJ,MAAI,eAAe,WAAW,GAAG;AAG/B,UAAM,YAAY,iBAAiB,OAAO,CAAC,MAAM,WAAU,OAAQ,QAAM,OAAO,IAAI;AACpF,QAAI,aAAa,yBAAyB;AACxC,uBAAiB,QAAQ,iBAAe,aAAa,aAAa;AAAA;AAEpE,qBAAiB,SAAS;AAAA;AAAA;AAO9B,gCACI,OAAyC,OAA2C,mBAAmB,MAAY;AACrH,MAAI,WAAW,MAAM,GAAG;AACxB,SAAO,YAAY,MAAM,KAAK,SAAS,KAAM,UAAS,OAAO,IAAI;AAC/D,UAAM;AACN,eAAW,MAAM,GAAG;AAAA;AAEtB,MAAI,CAAC,kBAAkB;AACrB;AAAA;AAEF,QAAM,KAAK;AAAA;AAGN,uBAAyC;AAC9C,SAAO,CAAC;AAAA;AAGV,iCAAgD;AAM9C,QAAM,mBAAmB,8BAA8B;AACvD,aAAW,eAAe,kBAAkB;AAC1C,iBAAa,aAAa;AAAA;AAAA;AAIvB,uBAA8B;AACnC,SAAO;AAAA,IACL,UAAU,IAAI,IAAI;AAAA,IAClB,YAAY,IAAI,IAAI;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,50 @@
1
+ import * as Types from "../types/types.js";
2
+ import { HandlerState } from "./types.js";
3
+ let handlerState = HandlerState.UNINITIALIZED;
4
+ const sessionIdEvents = [];
5
+ const workerIdByThread = /* @__PURE__ */ new Map();
6
+ const workerURLById = /* @__PURE__ */ new Map();
7
+ export function initialize() {
8
+ if (handlerState !== HandlerState.UNINITIALIZED) {
9
+ throw new Error("Workers Handler was not reset");
10
+ }
11
+ handlerState = HandlerState.INITIALIZED;
12
+ }
13
+ export function reset() {
14
+ sessionIdEvents.length = 0;
15
+ workerIdByThread.clear();
16
+ workerURLById.clear();
17
+ handlerState = HandlerState.UNINITIALIZED;
18
+ }
19
+ export function handleEvent(event) {
20
+ if (handlerState !== HandlerState.INITIALIZED) {
21
+ throw new Error("Workers Handler is not initialized");
22
+ }
23
+ if (Types.TraceEvents.isTraceEventTracingSessionIdForWorker(event)) {
24
+ sessionIdEvents.push(event);
25
+ }
26
+ }
27
+ export async function finalize() {
28
+ if (handlerState !== HandlerState.INITIALIZED) {
29
+ throw new Error("Handler is not initialized");
30
+ }
31
+ for (const sessionIdEvent of sessionIdEvents) {
32
+ if (!sessionIdEvent.args.data) {
33
+ continue;
34
+ }
35
+ workerIdByThread.set(sessionIdEvent.args.data.workerThreadId, sessionIdEvent.args.data.workerId);
36
+ workerURLById.set(sessionIdEvent.args.data.workerId, sessionIdEvent.args.data.url);
37
+ }
38
+ handlerState = HandlerState.FINALIZED;
39
+ }
40
+ export function data() {
41
+ if (handlerState !== HandlerState.FINALIZED) {
42
+ throw new Error("Workers Handler is not finalized");
43
+ }
44
+ return {
45
+ workerSessionIdEvents: [...sessionIdEvents],
46
+ workerIdByThread: new Map(workerIdByThread),
47
+ workerURLById: new Map(workerURLById)
48
+ };
49
+ }
50
+ //# sourceMappingURL=WorkersHandler.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../front_end/models/trace/handlers/WorkersHandler.ts"],
4
+ "sourcesContent": ["// Copyright 2023 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport * as Types from '../types/types.js';\n\nimport {HandlerState} from './types.js';\n\nexport interface WorkersData {\n workerSessionIdEvents: readonly Types.TraceEvents.TraceEventTracingSessionIdForWorker[];\n workerIdByThread: Map<Types.TraceEvents.ThreadID, Types.TraceEvents.WorkerId>;\n workerURLById: Map<Types.TraceEvents.WorkerId, string>;\n}\nlet handlerState = HandlerState.UNINITIALIZED;\n\nconst sessionIdEvents: Types.TraceEvents.TraceEventTracingSessionIdForWorker[] = [];\nconst workerIdByThread: Map<Types.TraceEvents.ThreadID, Types.TraceEvents.WorkerId> = new Map();\nconst workerURLById: Map<Types.TraceEvents.WorkerId, string> = new Map();\n\nexport function initialize(): void {\n if (handlerState !== HandlerState.UNINITIALIZED) {\n throw new Error('Workers Handler was not reset');\n }\n\n handlerState = HandlerState.INITIALIZED;\n}\n\nexport function reset(): void {\n sessionIdEvents.length = 0;\n workerIdByThread.clear();\n workerURLById.clear();\n handlerState = HandlerState.UNINITIALIZED;\n}\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('Workers Handler is not initialized');\n }\n if (Types.TraceEvents.isTraceEventTracingSessionIdForWorker(event)) {\n sessionIdEvents.push(event);\n }\n}\n\nexport async function finalize(): Promise<void> {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('Handler is not initialized');\n }\n for (const sessionIdEvent of sessionIdEvents) {\n if (!sessionIdEvent.args.data) {\n continue;\n }\n workerIdByThread.set(sessionIdEvent.args.data.workerThreadId, sessionIdEvent.args.data.workerId);\n workerURLById.set(sessionIdEvent.args.data.workerId, sessionIdEvent.args.data.url);\n }\n handlerState = HandlerState.FINALIZED;\n}\n\nexport function data(): WorkersData {\n if (handlerState !== HandlerState.FINALIZED) {\n throw new Error('Workers Handler is not finalized');\n }\n\n return {\n workerSessionIdEvents: [...sessionIdEvents],\n workerIdByThread: new Map(workerIdByThread),\n workerURLById: new Map(workerURLById),\n };\n}\n"],
5
+ "mappings": "AAIA;AAEA;AAOA,IAAI,eAAe,aAAa;AAEhC,MAAM,kBAA2E;AACjF,MAAM,mBAAgF,oBAAI;AAC1F,MAAM,gBAAyD,oBAAI;AAE5D,6BAA4B;AACjC,MAAI,iBAAiB,aAAa,eAAe;AAC/C,UAAM,IAAI,MAAM;AAAA;AAGlB,iBAAe,aAAa;AAAA;AAGvB,wBAAuB;AAC5B,kBAAgB,SAAS;AACzB,mBAAiB;AACjB,gBAAc;AACd,iBAAe,aAAa;AAAA;AAGvB,4BAAqB,OAA+C;AACzE,MAAI,iBAAiB,aAAa,aAAa;AAC7C,UAAM,IAAI,MAAM;AAAA;AAElB,MAAI,MAAM,YAAY,sCAAsC,QAAQ;AAClE,oBAAgB,KAAK;AAAA;AAAA;AAIzB,iCAAgD;AAC9C,MAAI,iBAAiB,aAAa,aAAa;AAC7C,UAAM,IAAI,MAAM;AAAA;AAElB,aAAW,kBAAkB,iBAAiB;AAC5C,QAAI,CAAC,eAAe,KAAK,MAAM;AAC7B;AAAA;AAEF,qBAAiB,IAAI,eAAe,KAAK,KAAK,gBAAgB,eAAe,KAAK,KAAK;AACvF,kBAAc,IAAI,eAAe,KAAK,KAAK,UAAU,eAAe,KAAK,KAAK;AAAA;AAEhF,iBAAe,aAAa;AAAA;AAGvB,uBAA6B;AAClC,MAAI,iBAAiB,aAAa,WAAW;AAC3C,UAAM,IAAI,MAAM;AAAA;AAGlB,SAAO;AAAA,IACL,uBAAuB,CAAC,GAAG;AAAA,IAC3B,kBAAkB,IAAI,IAAI;AAAA,IAC1B,eAAe,IAAI,IAAI;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ {"compilerOptions":{"composite":true,"outDir":".","baseUrl":".","rootDir":"../../../../../../../front_end/models/trace/handlers"},"files":["../../../../../../../front_end/models/trace/handlers/handlers.ts"],"references":[{"path":"./handlers-tsconfig.json"}]}
@@ -0,0 +1,44 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "checkJs": true,
5
+ "composite": true,
6
+ "declaration": true,
7
+ "experimentalDecorators": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "inlineSources": true,
10
+ "lib": [
11
+ "esnext",
12
+ "dom",
13
+ "dom.iterable"
14
+ ],
15
+ "module": "esnext",
16
+ "noEmitOnError": true,
17
+ "noFallthroughCasesInSwitch": true,
18
+ "noImplicitOverride": true,
19
+ "noImplicitReturns": true,
20
+ "noUnusedLocals": false,
21
+ "outDir": ".",
22
+ "rootDir": "../../../../../../../front_end/models/trace/handlers",
23
+ "skipLibCheck": true,
24
+ "sourceMap": true,
25
+ "strict": true,
26
+ "target": "esnext",
27
+ "tsBuildInfoFile": "devtools_entrypoint-bundle-typescript-tsconfig.json.tsbuildinfo",
28
+ "typeRoots": [],
29
+ "useUnknownInCatchVariables": false
30
+ },
31
+ "files": [
32
+ "../../../../../../../front_end/models/trace/handlers/handlers.ts",
33
+ "../../../../../../../front_end/legacy/legacy-defs.d.ts",
34
+ "../../../../../../../front_end/global_typings/global_defs.d.ts",
35
+ "../../../../../../../front_end/global_typings/request_idle_callback.d.ts",
36
+ "../../../../../../../node_modules/@types/filesystem/index.d.ts",
37
+ "../../../../../../../node_modules/@webgpu/types/dist/index.d.ts"
38
+ ],
39
+ "references": [
40
+ {
41
+ "path": "./handlers-tsconfig.json"
42
+ }
43
+ ]
44
+ }
@@ -0,0 +1,79 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "checkJs": true,
5
+ "composite": true,
6
+ "declaration": true,
7
+ "experimentalDecorators": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "inlineSources": true,
10
+ "lib": [
11
+ "esnext",
12
+ "dom",
13
+ "dom.iterable"
14
+ ],
15
+ "module": "esnext",
16
+ "noEmitOnError": true,
17
+ "noFallthroughCasesInSwitch": true,
18
+ "noImplicitOverride": true,
19
+ "noImplicitReturns": true,
20
+ "noUnusedLocals": false,
21
+ "outDir": ".",
22
+ "rootDir": "../../../../../../../front_end/models/trace/handlers",
23
+ "skipLibCheck": true,
24
+ "sourceMap": true,
25
+ "strict": true,
26
+ "target": "esnext",
27
+ "tsBuildInfoFile": "handlers-tsconfig.json.tsbuildinfo",
28
+ "typeRoots": [],
29
+ "useUnknownInCatchVariables": false
30
+ },
31
+ "files": [
32
+ "../../../../../../../front_end/models/trace/handlers/AnimationHandler.ts",
33
+ "../../../../../../../front_end/models/trace/handlers/AuctionWorkletsHandler.ts",
34
+ "../../../../../../../front_end/models/trace/handlers/FramesHandler.ts",
35
+ "../../../../../../../front_end/models/trace/handlers/GPUHandler.ts",
36
+ "../../../../../../../front_end/models/trace/handlers/InitiatorsHandler.ts",
37
+ "../../../../../../../front_end/models/trace/handlers/InvalidationsHandler.ts",
38
+ "../../../../../../../front_end/models/trace/handlers/LargestImagePaintHandler.ts",
39
+ "../../../../../../../front_end/models/trace/handlers/LargestTextPaintHandler.ts",
40
+ "../../../../../../../front_end/models/trace/handlers/LayerTreeHandler.ts",
41
+ "../../../../../../../front_end/models/trace/handlers/LayoutShiftsHandler.ts",
42
+ "../../../../../../../front_end/models/trace/handlers/MemoryHandler.ts",
43
+ "../../../../../../../front_end/models/trace/handlers/MetaHandler.ts",
44
+ "../../../../../../../front_end/models/trace/handlers/ModelHandlers.ts",
45
+ "../../../../../../../front_end/models/trace/handlers/NetworkRequestsHandler.ts",
46
+ "../../../../../../../front_end/models/trace/handlers/PageLoadMetricsHandler.ts",
47
+ "../../../../../../../front_end/models/trace/handlers/RendererHandler.ts",
48
+ "../../../../../../../front_end/models/trace/handlers/SamplesHandler.ts",
49
+ "../../../../../../../front_end/models/trace/handlers/ScreenshotsHandler.ts",
50
+ "../../../../../../../front_end/models/trace/handlers/Threads.ts",
51
+ "../../../../../../../front_end/models/trace/handlers/UserInteractionsHandler.ts",
52
+ "../../../../../../../front_end/models/trace/handlers/UserTimingsHandler.ts",
53
+ "../../../../../../../front_end/models/trace/handlers/WarningsHandler.ts",
54
+ "../../../../../../../front_end/models/trace/handlers/WorkersHandler.ts",
55
+ "../../../../../../../front_end/models/trace/handlers/types.ts",
56
+ "../../../../../../../front_end/legacy/legacy-defs.d.ts",
57
+ "../../../../../../../front_end/global_typings/global_defs.d.ts",
58
+ "../../../../../../../front_end/global_typings/request_idle_callback.d.ts",
59
+ "../../../../../../../node_modules/@types/filesystem/index.d.ts",
60
+ "../../../../../../../node_modules/@webgpu/types/dist/index.d.ts"
61
+ ],
62
+ "references": [
63
+ {
64
+ "path": "../../../core/platform/bundle-tsconfig.json"
65
+ },
66
+ {
67
+ "path": "../../../generated/generated-tsconfig.json"
68
+ },
69
+ {
70
+ "path": "../../cpu_profile/bundle-tsconfig.json"
71
+ },
72
+ {
73
+ "path": "../helpers/bundle-tsconfig.json"
74
+ },
75
+ {
76
+ "path": "../types/bundle-tsconfig.json"
77
+ }
78
+ ]
79
+ }
@@ -0,0 +1,4 @@
1
+ export * as ModelHandlers from "./ModelHandlers.js";
2
+ export * as Threads from "./Threads.js";
3
+ export * as Types from "./types.js";
4
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../front_end/models/trace/handlers/handlers.ts"],
4
+ "sourcesContent": ["// Copyright 2022 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nexport * as ModelHandlers from './ModelHandlers.js';\nexport * as Threads from './Threads.js';\nexport * as Types from './types.js';\n"],
5
+ "mappings": "AAIA;AACA;AACA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,18 @@
1
+ import * as ModelHandlers from "./ModelHandlers.js";
2
+ export function handlerDataHasAllHandlers(data) {
3
+ let isMissingHandler = false;
4
+ for (const handlerName of Object.keys(ModelHandlers)) {
5
+ if (handlerName in data === false) {
6
+ isMissingHandler = true;
7
+ break;
8
+ }
9
+ }
10
+ return !isMissingHandler;
11
+ }
12
+ export var HandlerState = /* @__PURE__ */ ((HandlerState2) => {
13
+ HandlerState2[HandlerState2["UNINITIALIZED"] = 1] = "UNINITIALIZED";
14
+ HandlerState2[HandlerState2["INITIALIZED"] = 2] = "INITIALIZED";
15
+ HandlerState2[HandlerState2["FINALIZED"] = 3] = "FINALIZED";
16
+ return HandlerState2;
17
+ })(HandlerState || {});
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../front_end/models/trace/handlers/types.ts"],
4
+ "sourcesContent": ["\n// Copyright 2022 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\nimport type * as Types from './../types/types.js';\nimport * as ModelHandlers from './ModelHandlers.js';\n\nexport interface TraceEventHandler {\n reset(): void;\n initialize?(freshRecording?: boolean): void;\n handleEvent(data: {}): void;\n finalize?(): Promise<void>;\n data(): unknown;\n deps?(): TraceEventHandlerName[];\n handleUserConfig?(config: Types.Configuration.Configuration): void;\n}\nexport type TraceEventHandlerName = keyof typeof ModelHandlers;\n\n// This type maps TraceEventHandler names to the return type of their data\n// function. So, for example, if we are given an object with a key of 'foo'\n// and a value which is a TraceHandler containing a data() function that\n// returns a string, this type will be { foo: string }.\n//\n// This allows us to model the behavior of the TraceProcessor in the model,\n// which takes an object with TraceEventHandlers as part of its config, and\n// which ultimately returns an object keyed off the names of the\n// TraceEventHandlers, and with values that are derived from each\n// TraceEventHandler's data function.\n//\n// So, concretely, we provide a TraceEventHandler for calculating the #time\n// bounds of a trace called TraceBounds, whose data() function returns a\n// TraceWindow. The HandlerData, therefore, would determine that the\n// TraceProcessor would contain a key called 'TraceBounds' whose value is\n// a TraceWindow.\nexport type EnabledHandlerDataWithMeta<T extends {[key: string]: TraceEventHandler}> = {\n // We allow the user to configure which handlers are created by passing them\n // in when constructing a model instance. However, we then ensure that the\n // Meta handler is added to that, as the Model relies on some of the data\n // from the Meta handler when creating the file. Therefore, this type\n // explicitly defines that the Meta data is present, before then extending it\n // with the index type to represent all the other handlers.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Meta: Readonly<ReturnType<typeof ModelHandlers['Meta']['data']>>,\n}&{\n // For every key in the object, look up the TraceEventHandler's data function\n // and use its return type as the value for the object.\n [K in keyof T]: Readonly<ReturnType<T[K]['data']>>;\n};\n\nexport type HandlersWithMeta<T extends {[key: string]: TraceEventHandler}> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Meta: typeof ModelHandlers.Meta,\n}&{\n [K in keyof T]: T[K];\n};\n\n// Represents the final parsed data from all of the handlers. Note that because\n// we are currently in the middle of the migration of data engines, not all the\n// handlers are enabled. Therefore for now you should use the type defined in\n// models/trace/handlers/Migration.ts, `PartialTraceData`, which\n// represents the final parsed data for only the enabled handlers.\nexport type TraceParseData = Readonly<EnabledHandlerDataWithMeta<typeof ModelHandlers>>;\n\n/**\n * Because you can run the trace engine with a subset of handlers enabled,\n * there can be times when you need to confirm if the trace contains all\n * handlers or not, because some parts of the engine expect to be given all\n * the handlers.\n */\nexport function handlerDataHasAllHandlers(data: Readonly<EnabledHandlerDataWithMeta<{}>>): data is TraceParseData {\n let isMissingHandler = false;\n for (const handlerName of Object.keys(ModelHandlers)) {\n if (handlerName in data === false) {\n isMissingHandler = true;\n break;\n }\n }\n return !isMissingHandler;\n}\n\ntype DeepWriteable<T> = {\n -readonly[P in keyof T]: DeepWriteable<T[P]>\n};\nexport type TraceParseDataMutable = DeepWriteable<TraceParseData>;\n\nexport type Handlers = typeof ModelHandlers;\n\nexport const enum HandlerState {\n UNINITIALIZED = 1,\n INITIALIZED = 2,\n FINALIZED = 3,\n}\n"],
5
+ "mappings": "AAKA;AAgEO,0CAAmC,MAAwE;AAChH,MAAI,mBAAmB;AACvB,aAAW,eAAe,OAAO,KAAK,gBAAgB;AACpD,QAAI,eAAe,SAAS,OAAO;AACjC,yBAAmB;AACnB;AAAA;AAAA;AAGJ,SAAO,CAAC;AAAA;AAUH,WAAW,eAAX,kBAAW,kBAAX;AACL,iDAAgB,KAAhB;AACA,+CAAc,KAAd;AACA,6CAAY,KAAZ;AAHgB;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,220 @@
1
+ import * as Types from "../types/types.js";
2
+ import { millisecondsToMicroseconds } from "./Timing.js";
3
+ import { makeProfileCall, mergeEventsInOrder } from "./Trace.js";
4
+ export class SamplesIntegrator {
5
+ #constructedProfileCalls = [];
6
+ #currentJSStack = [];
7
+ #processId;
8
+ #threadId;
9
+ #lockedJsStackDepth = [];
10
+ #fakeJSInvocation = false;
11
+ #profileModel;
12
+ #nodeForGC = /* @__PURE__ */ new Map();
13
+ #engineConfig;
14
+ constructor(profileModel, pid, tid, configuration) {
15
+ this.#profileModel = profileModel;
16
+ this.#threadId = tid;
17
+ this.#processId = pid;
18
+ this.#engineConfig = configuration || Types.Configuration.DEFAULT;
19
+ }
20
+ buildProfileCalls(traceEvents) {
21
+ const mergedEvents = mergeEventsInOrder(traceEvents, this.callsFromProfileSamples());
22
+ const stack = [];
23
+ for (let i = 0; i < mergedEvents.length; i++) {
24
+ const event = mergedEvents[i];
25
+ if (event.ph === Types.TraceEvents.Phase.INSTANT) {
26
+ continue;
27
+ }
28
+ if (stack.length === 0) {
29
+ if (Types.TraceEvents.isProfileCall(event)) {
30
+ this.#onProfileCall(event);
31
+ continue;
32
+ }
33
+ stack.push(event);
34
+ this.#onTraceEventStart(event);
35
+ continue;
36
+ }
37
+ const parentEvent = stack.at(-1);
38
+ if (parentEvent === void 0) {
39
+ continue;
40
+ }
41
+ const begin = event.ts;
42
+ const parentBegin = parentEvent.ts;
43
+ const parentDuration = parentEvent.dur || 0;
44
+ const parentEnd = parentBegin + parentDuration;
45
+ const startsAfterParent = begin >= parentEnd;
46
+ if (startsAfterParent) {
47
+ this.#onTraceEventEnd(parentEvent);
48
+ stack.pop();
49
+ i--;
50
+ continue;
51
+ }
52
+ if (Types.TraceEvents.isProfileCall(event)) {
53
+ this.#onProfileCall(event, parentEvent);
54
+ continue;
55
+ }
56
+ this.#onTraceEventStart(event);
57
+ stack.push(event);
58
+ }
59
+ while (stack.length) {
60
+ const last = stack.pop();
61
+ if (last) {
62
+ this.#onTraceEventEnd(last);
63
+ }
64
+ }
65
+ return this.#constructedProfileCalls;
66
+ }
67
+ #onTraceEventStart(event) {
68
+ if (event.name === Types.TraceEvents.KnownEventName.RunMicrotasks || event.name === Types.TraceEvents.KnownEventName.RunTask) {
69
+ this.#lockedJsStackDepth = [];
70
+ this.#truncateJSStack(0, event.ts);
71
+ this.#fakeJSInvocation = false;
72
+ }
73
+ if (this.#fakeJSInvocation) {
74
+ this.#truncateJSStack(this.#lockedJsStackDepth.pop() || 0, event.ts);
75
+ this.#fakeJSInvocation = false;
76
+ }
77
+ this.#extractStackTrace(event);
78
+ this.#lockedJsStackDepth.push(this.#currentJSStack.length);
79
+ }
80
+ #onProfileCall(event, parent) {
81
+ if (parent && Types.TraceEvents.isJSInvocationEvent(parent) || this.#fakeJSInvocation) {
82
+ this.#extractStackTrace(event);
83
+ } else if (Types.TraceEvents.isProfileCall(event) && this.#currentJSStack.length === 0) {
84
+ this.#fakeJSInvocation = true;
85
+ const stackDepthBefore = this.#currentJSStack.length;
86
+ this.#extractStackTrace(event);
87
+ this.#lockedJsStackDepth.push(stackDepthBefore);
88
+ }
89
+ }
90
+ #onTraceEventEnd(event) {
91
+ const endTime = Types.Timing.MicroSeconds(event.ts + (event.dur || 0));
92
+ this.#truncateJSStack(this.#lockedJsStackDepth.pop() || 0, endTime);
93
+ }
94
+ callsFromProfileSamples() {
95
+ const samples = this.#profileModel.samples;
96
+ const timestamps = this.#profileModel.timestamps;
97
+ if (!samples) {
98
+ return [];
99
+ }
100
+ const calls = [];
101
+ let prevNode;
102
+ for (let i = 0; i < samples.length; i++) {
103
+ const node = this.#profileModel.nodeByIndex(i);
104
+ const timestamp = millisecondsToMicroseconds(Types.Timing.MilliSeconds(timestamps[i]));
105
+ if (!node) {
106
+ continue;
107
+ }
108
+ const call = makeProfileCall(node, timestamp, this.#processId, this.#threadId);
109
+ calls.push(call);
110
+ if (node.id === this.#profileModel.gcNode?.id && prevNode) {
111
+ this.#nodeForGC.set(call, prevNode);
112
+ continue;
113
+ }
114
+ prevNode = node;
115
+ }
116
+ return calls;
117
+ }
118
+ #getStackTraceFromProfileCall(profileCall) {
119
+ let node = this.#profileModel.nodeById(profileCall.nodeId);
120
+ const isGarbageCollection = node?.id === this.#profileModel.gcNode?.id;
121
+ if (isGarbageCollection) {
122
+ node = this.#nodeForGC.get(profileCall) || null;
123
+ }
124
+ if (!node) {
125
+ return [];
126
+ }
127
+ const callFrames = new Array(node.depth + 1 + Number(isGarbageCollection));
128
+ let i = callFrames.length - 1;
129
+ if (isGarbageCollection) {
130
+ callFrames[i--] = profileCall;
131
+ }
132
+ while (node) {
133
+ callFrames[i--] = makeProfileCall(node, profileCall.ts, this.#processId, this.#threadId);
134
+ node = node.parent;
135
+ }
136
+ return callFrames;
137
+ }
138
+ #extractStackTrace(event) {
139
+ const stackTrace = Types.TraceEvents.isProfileCall(event) ? this.#getStackTraceFromProfileCall(event) : this.#currentJSStack;
140
+ SamplesIntegrator.filterStackFrames(stackTrace, this.#engineConfig);
141
+ const endTime = event.ts + (event.dur || 0);
142
+ const minFrames = Math.min(stackTrace.length, this.#currentJSStack.length);
143
+ let i;
144
+ for (i = this.#lockedJsStackDepth.at(-1) || 0; i < minFrames; ++i) {
145
+ const newFrame = stackTrace[i].callFrame;
146
+ const oldFrame = this.#currentJSStack[i].callFrame;
147
+ if (!SamplesIntegrator.framesAreEqual(newFrame, oldFrame)) {
148
+ break;
149
+ }
150
+ this.#currentJSStack[i].dur = Types.Timing.MicroSeconds(Math.max(this.#currentJSStack[i].dur || 0, endTime - this.#currentJSStack[i].ts));
151
+ }
152
+ this.#truncateJSStack(i, event.ts);
153
+ for (; i < stackTrace.length; ++i) {
154
+ const call = stackTrace[i];
155
+ if (call.nodeId === this.#profileModel.programNode?.id || call.nodeId === this.#profileModel.root?.id || call.nodeId === this.#profileModel.idleNode?.id || call.nodeId === this.#profileModel.gcNode?.id) {
156
+ continue;
157
+ }
158
+ this.#currentJSStack.push(call);
159
+ this.#constructedProfileCalls.push(call);
160
+ }
161
+ }
162
+ #truncateJSStack(depth, time) {
163
+ if (this.#lockedJsStackDepth.length) {
164
+ const lockedDepth = this.#lockedJsStackDepth.at(-1);
165
+ if (lockedDepth && depth < lockedDepth) {
166
+ console.error(`Child stack is shallower (${depth}) than the parent stack (${lockedDepth}) at ${time}`);
167
+ depth = lockedDepth;
168
+ }
169
+ }
170
+ if (this.#currentJSStack.length < depth) {
171
+ console.error(`Trying to truncate higher than the current stack size at ${time}`);
172
+ depth = this.#currentJSStack.length;
173
+ }
174
+ for (let k = 0; k < this.#currentJSStack.length; ++k) {
175
+ this.#currentJSStack[k].dur = Types.Timing.MicroSeconds(Math.max(time - this.#currentJSStack[k].ts, 0));
176
+ }
177
+ this.#currentJSStack.length = depth;
178
+ }
179
+ static framesAreEqual(frame1, frame2) {
180
+ return frame1.scriptId === frame2.scriptId && frame1.functionName === frame2.functionName && frame1.lineNumber === frame2.lineNumber;
181
+ }
182
+ static showNativeName(name, runtimeCallStatsEnabled) {
183
+ return runtimeCallStatsEnabled && Boolean(SamplesIntegrator.nativeGroup(name));
184
+ }
185
+ static nativeGroup(nativeName) {
186
+ if (nativeName.startsWith("Parse")) {
187
+ return "Parse";
188
+ }
189
+ if (nativeName.startsWith("Compile") || nativeName.startsWith("Recompile")) {
190
+ return "Compile";
191
+ }
192
+ return null;
193
+ }
194
+ static isNativeRuntimeFrame(frame) {
195
+ return frame.url === "native V8Runtime";
196
+ }
197
+ static filterStackFrames(stack, engineConfig) {
198
+ const showAllEvents = engineConfig.experiments.timelineShowAllEvents;
199
+ if (showAllEvents) {
200
+ return;
201
+ }
202
+ let previousNativeFrameName = null;
203
+ let j = 0;
204
+ for (let i = 0; i < stack.length; ++i) {
205
+ const frame = stack[i].callFrame;
206
+ const nativeRuntimeFrame = SamplesIntegrator.isNativeRuntimeFrame(frame);
207
+ if (nativeRuntimeFrame && !SamplesIntegrator.showNativeName(frame.functionName, engineConfig.experiments.timelineV8RuntimeCallStats)) {
208
+ continue;
209
+ }
210
+ const nativeFrameName = nativeRuntimeFrame ? SamplesIntegrator.nativeGroup(frame.functionName) : null;
211
+ if (previousNativeFrameName && previousNativeFrameName === nativeFrameName) {
212
+ continue;
213
+ }
214
+ previousNativeFrameName = nativeFrameName;
215
+ stack[j++] = stack[i];
216
+ }
217
+ stack.length = j;
218
+ }
219
+ }
220
+ //# sourceMappingURL=SamplesIntegrator.js.map