chrome-devtools-frontend 1.0.1380117 → 1.0.1386602

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 (595) hide show
  1. package/.stylelintrc.json +2 -1
  2. package/config/gni/devtools_grd_files.gni +25 -4
  3. package/config/gni/devtools_image_files.gni +2 -0
  4. package/docs/README.md +4 -0
  5. package/docs/contributing/issues.md +13 -10
  6. package/docs/get_the_code.md +4 -1
  7. package/docs/policy/README.md +6 -0
  8. package/docs/policy/slow-close.md +52 -0
  9. package/docs/styleguide/ux/README.md +1 -0
  10. package/docs/styleguide/ux/numbers.md +106 -0
  11. package/front_end/Images/src/cookie_off.svg +3 -0
  12. package/front_end/Images/src/domain.svg +3 -0
  13. package/front_end/core/common/Color.ts +3 -3
  14. package/front_end/core/common/SettingRegistration.ts +7 -0
  15. package/front_end/core/host/AidaClient.ts +3 -3
  16. package/front_end/core/host/InspectorFrontendHostAPI.ts +0 -1
  17. package/front_end/core/host/UserMetrics.ts +0 -8
  18. package/front_end/core/i18n/locales/af.json +1031 -887
  19. package/front_end/core/i18n/locales/am.json +1036 -892
  20. package/front_end/core/i18n/locales/ar.json +1039 -895
  21. package/front_end/core/i18n/locales/as.json +1032 -888
  22. package/front_end/core/i18n/locales/az.json +1034 -890
  23. package/front_end/core/i18n/locales/be.json +1031 -887
  24. package/front_end/core/i18n/locales/bg.json +1031 -887
  25. package/front_end/core/i18n/locales/bn.json +1033 -889
  26. package/front_end/core/i18n/locales/bs.json +1036 -892
  27. package/front_end/core/i18n/locales/ca.json +1031 -887
  28. package/front_end/core/i18n/locales/cs.json +1030 -886
  29. package/front_end/core/i18n/locales/cy.json +1032 -888
  30. package/front_end/core/i18n/locales/da.json +1031 -887
  31. package/front_end/core/i18n/locales/de.json +1033 -889
  32. package/front_end/core/i18n/locales/el.json +1031 -887
  33. package/front_end/core/i18n/locales/en-GB.json +1033 -889
  34. package/front_end/core/i18n/locales/es-419.json +1029 -885
  35. package/front_end/core/i18n/locales/es.json +1032 -888
  36. package/front_end/core/i18n/locales/et.json +1033 -889
  37. package/front_end/core/i18n/locales/eu.json +1031 -887
  38. package/front_end/core/i18n/locales/fa.json +1035 -891
  39. package/front_end/core/i18n/locales/fi.json +1035 -891
  40. package/front_end/core/i18n/locales/fil.json +1034 -890
  41. package/front_end/core/i18n/locales/fr-CA.json +1031 -887
  42. package/front_end/core/i18n/locales/fr.json +1049 -905
  43. package/front_end/core/i18n/locales/gl.json +1032 -888
  44. package/front_end/core/i18n/locales/gu.json +1035 -891
  45. package/front_end/core/i18n/locales/he.json +1031 -887
  46. package/front_end/core/i18n/locales/hi.json +1034 -890
  47. package/front_end/core/i18n/locales/hr.json +1031 -887
  48. package/front_end/core/i18n/locales/hu.json +1033 -889
  49. package/front_end/core/i18n/locales/hy.json +1046 -902
  50. package/front_end/core/i18n/locales/id.json +1023 -879
  51. package/front_end/core/i18n/locales/is.json +1032 -888
  52. package/front_end/core/i18n/locales/it.json +1031 -887
  53. package/front_end/core/i18n/locales/ja.json +1042 -898
  54. package/front_end/core/i18n/locales/ka.json +1034 -890
  55. package/front_end/core/i18n/locales/kk.json +1035 -891
  56. package/front_end/core/i18n/locales/km.json +1035 -891
  57. package/front_end/core/i18n/locales/kn.json +1036 -892
  58. package/front_end/core/i18n/locales/ko.json +1031 -887
  59. package/front_end/core/i18n/locales/ky.json +1032 -888
  60. package/front_end/core/i18n/locales/lo.json +1030 -886
  61. package/front_end/core/i18n/locales/lt.json +1032 -888
  62. package/front_end/core/i18n/locales/lv.json +1032 -888
  63. package/front_end/core/i18n/locales/mk.json +1032 -888
  64. package/front_end/core/i18n/locales/ml.json +1033 -889
  65. package/front_end/core/i18n/locales/mn.json +1034 -890
  66. package/front_end/core/i18n/locales/mr.json +1035 -891
  67. package/front_end/core/i18n/locales/ms.json +1033 -889
  68. package/front_end/core/i18n/locales/my.json +1033 -889
  69. package/front_end/core/i18n/locales/ne.json +1036 -892
  70. package/front_end/core/i18n/locales/nl.json +1033 -889
  71. package/front_end/core/i18n/locales/no.json +1036 -892
  72. package/front_end/core/i18n/locales/or.json +1043 -899
  73. package/front_end/core/i18n/locales/pa.json +1030 -886
  74. package/front_end/core/i18n/locales/pl.json +1032 -888
  75. package/front_end/core/i18n/locales/pt-PT.json +1033 -889
  76. package/front_end/core/i18n/locales/pt.json +1033 -889
  77. package/front_end/core/i18n/locales/ro.json +1029 -885
  78. package/front_end/core/i18n/locales/ru.json +1026 -882
  79. package/front_end/core/i18n/locales/si.json +1031 -887
  80. package/front_end/core/i18n/locales/sk.json +1033 -889
  81. package/front_end/core/i18n/locales/sl.json +1031 -887
  82. package/front_end/core/i18n/locales/sq.json +1061 -917
  83. package/front_end/core/i18n/locales/sr-Latn.json +1033 -889
  84. package/front_end/core/i18n/locales/sr.json +1033 -889
  85. package/front_end/core/i18n/locales/sv.json +1031 -887
  86. package/front_end/core/i18n/locales/sw.json +1033 -889
  87. package/front_end/core/i18n/locales/ta.json +1058 -914
  88. package/front_end/core/i18n/locales/te.json +1037 -893
  89. package/front_end/core/i18n/locales/th.json +1032 -888
  90. package/front_end/core/i18n/locales/tr.json +1031 -887
  91. package/front_end/core/i18n/locales/uk.json +1030 -886
  92. package/front_end/core/i18n/locales/ur.json +1031 -887
  93. package/front_end/core/i18n/locales/uz.json +1023 -879
  94. package/front_end/core/i18n/locales/vi.json +1032 -888
  95. package/front_end/core/i18n/locales/zh-HK.json +1032 -888
  96. package/front_end/core/i18n/locales/zh-TW.json +1032 -888
  97. package/front_end/core/i18n/locales/zh.json +1033 -889
  98. package/front_end/core/i18n/locales/zu.json +1032 -888
  99. package/front_end/core/root/Runtime.ts +0 -1
  100. package/front_end/core/sdk/NetworkManager.test.ts +50 -0
  101. package/front_end/core/sdk/NetworkManager.ts +6 -4
  102. package/front_end/core/sdk/SourceMap.test.ts +5 -5
  103. package/front_end/core/sdk/SourceMapScopeChainEntry.test.ts +7 -2
  104. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +2 -2
  105. package/front_end/core/sdk/SourceMapScopes.test.ts +112 -45
  106. package/front_end/core/sdk/SourceMapScopes.ts +39 -14
  107. package/front_end/core/sdk/SourceMapScopesInfo.test.ts +51 -50
  108. package/front_end/core/sdk/SourceMapScopesInfo.ts +1 -1
  109. package/front_end/core/sdk/sdk-meta.ts +27 -0
  110. package/front_end/devtools_compatibility.js +0 -1
  111. package/front_end/entrypoints/devtools_app/devtools_app.ts +1 -0
  112. package/front_end/entrypoints/inspector_main/renderingOptions.css +1 -1
  113. package/front_end/entrypoints/main/ExecutionContextSelector.test.ts +13 -3
  114. package/front_end/entrypoints/main/ExecutionContextSelector.ts +23 -1
  115. package/front_end/entrypoints/main/MainImpl.ts +0 -5
  116. package/front_end/generated/Deprecation.ts +0 -15
  117. package/front_end/generated/InspectorBackendCommands.js +1 -1
  118. package/front_end/generated/SupportedCSSProperties.js +0 -40
  119. package/front_end/generated/protocol.ts +1 -0
  120. package/front_end/models/bindings/IgnoreListManager.ts +25 -2
  121. package/front_end/models/crux-manager/CrUXManager.test.ts +25 -6
  122. package/front_end/models/crux-manager/CrUXManager.ts +23 -4
  123. package/front_end/models/extensions/ExtensionServer.test.ts +14 -0
  124. package/front_end/models/extensions/ExtensionServer.ts +28 -15
  125. package/front_end/models/issues_manager/CookieIssue.ts +79 -2
  126. package/front_end/models/issues_manager/IssuesManager.ts +1 -1
  127. package/front_end/models/issues_manager/descriptions/cookieExcludePortMismatch.md +8 -0
  128. package/front_end/models/issues_manager/descriptions/cookieExcludeSchemeMismatch.md +7 -0
  129. package/front_end/models/javascript_metadata/NativeFunctions.js +14 -4
  130. package/front_end/models/persistence/EditFileSystemView.ts +2 -2
  131. package/front_end/models/persistence/editFileSystemView.css +6 -3
  132. package/front_end/models/persistence/workspaceSettingsTab.css +2 -2
  133. package/front_end/models/trace/extras/Metadata.test.ts +35 -2
  134. package/front_end/models/trace/extras/Metadata.ts +24 -5
  135. package/front_end/models/trace/extras/TraceTree.ts +28 -18
  136. package/front_end/models/trace/extras/URLForEntry.ts +6 -5
  137. package/front_end/models/trace/handlers/ImagePaintingHandler.ts +12 -0
  138. package/front_end/models/trace/helpers/Timing.ts +8 -0
  139. package/front_end/models/trace/insights/CLSCulprits.ts +11 -3
  140. package/front_end/models/trace/insights/DocumentLatency.ts +16 -3
  141. package/front_end/models/trace/insights/FontDisplay.ts +10 -3
  142. package/front_end/models/trace/insights/ImageDelivery.test.ts +98 -0
  143. package/front_end/models/trace/insights/ImageDelivery.ts +183 -0
  144. package/front_end/models/trace/insights/InteractionToNextPaint.ts +9 -3
  145. package/front_end/models/trace/insights/LCPDiscovery.ts +24 -3
  146. package/front_end/models/trace/insights/LCPPhases.ts +25 -3
  147. package/front_end/models/trace/insights/Models.ts +1 -0
  148. package/front_end/models/trace/insights/RenderBlocking.ts +10 -2
  149. package/front_end/models/trace/insights/SlowCSSSelector.ts +10 -3
  150. package/front_end/models/trace/insights/ThirdParties.ts +11 -3
  151. package/front_end/models/trace/insights/Viewport.ts +16 -3
  152. package/front_end/models/trace/insights/types.ts +13 -2
  153. package/front_end/models/trace/types/File.ts +7 -0
  154. package/front_end/models/trace/types/TraceEvents.ts +9 -2
  155. package/front_end/panels/animation/AnimationTimeline.ts +2 -4
  156. package/front_end/panels/application/ApplicationPanelSidebar.test.ts +0 -5
  157. package/front_end/panels/application/ApplicationPanelSidebar.ts +15 -21
  158. package/front_end/panels/application/IndexedDBViews.ts +4 -1
  159. package/front_end/panels/application/ServiceWorkerCacheViews.ts +4 -1
  160. package/front_end/panels/application/StorageView.test.ts +1 -1
  161. package/front_end/panels/application/resourcesSidebar.css +1 -1
  162. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +1 -1
  163. package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +1 -1
  164. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +1 -1
  165. package/front_end/panels/browser_debugger/categorizedBreakpointsSidebarPane.css +1 -1
  166. package/front_end/panels/browser_debugger/xhrBreakpointsSidebarPane.css +1 -1
  167. package/front_end/panels/console/ConsoleViewMessage.test.ts +25 -0
  168. package/front_end/panels/console/ConsoleViewMessage.ts +23 -0
  169. package/front_end/panels/coverage/CoverageListView.ts +1 -1
  170. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +1 -1
  171. package/front_end/panels/elements/ClassesPaneWidget.ts +1 -1
  172. package/front_end/panels/elements/ElementStatePaneWidget.test.ts +3 -2
  173. package/front_end/panels/elements/ElementStatePaneWidget.ts +7 -2
  174. package/front_end/panels/elements/ElementsSidebarPane.ts +3 -3
  175. package/front_end/panels/elements/ElementsTreeElement.ts +1 -0
  176. package/front_end/panels/elements/LayersWidget.ts +1 -1
  177. package/front_end/panels/elements/PropertyMatchers.test.ts +7 -0
  178. package/front_end/panels/elements/PropertyMatchers.ts +3 -0
  179. package/front_end/panels/elements/classesPaneWidget.css +1 -1
  180. package/front_end/panels/emulation/DeviceModeView.ts +1 -1
  181. package/front_end/panels/emulation/DeviceModeWrapper.ts +1 -1
  182. package/front_end/panels/emulation/InspectedPagePlaceholder.ts +1 -1
  183. package/front_end/panels/freestyler/AiAgent.test.ts +319 -50
  184. package/front_end/panels/freestyler/AiAgent.ts +193 -141
  185. package/front_end/panels/freestyler/AiHistoryStorage.test.ts +159 -0
  186. package/front_end/panels/freestyler/AiHistoryStorage.ts +73 -0
  187. package/front_end/panels/freestyler/DrJonesFileAgent.test.ts +14 -15
  188. package/front_end/panels/freestyler/DrJonesFileAgent.ts +3 -14
  189. package/front_end/panels/freestyler/DrJonesNetworkAgent.test.ts +14 -13
  190. package/front_end/panels/freestyler/DrJonesNetworkAgent.ts +3 -3
  191. package/front_end/panels/freestyler/DrJonesPerformanceAgent.test.ts +38 -36
  192. package/front_end/panels/freestyler/DrJonesPerformanceAgent.ts +3 -14
  193. package/front_end/panels/freestyler/FreestylerAgent.test.ts +195 -14
  194. package/front_end/panels/freestyler/FreestylerAgent.ts +13 -18
  195. package/front_end/panels/freestyler/FreestylerPanel.test.ts +71 -0
  196. package/front_end/panels/freestyler/FreestylerPanel.ts +99 -74
  197. package/front_end/panels/freestyler/components/FreestylerChatUi.ts +128 -29
  198. package/front_end/panels/freestyler/components/UserActionRow.ts +1 -0
  199. package/front_end/panels/freestyler/components/freestylerChatUi.css +21 -1
  200. package/front_end/panels/freestyler/components/userActionRow.css +2 -1
  201. package/front_end/panels/freestyler/freestyler.ts +1 -0
  202. package/front_end/panels/issues/IssueAggregator.test.ts +50 -0
  203. package/front_end/panels/issues/IssueAggregator.ts +10 -10
  204. package/front_end/panels/issues/issuesTree.css +1 -1
  205. package/front_end/panels/layer_viewer/LayerDetailsView.ts +1 -1
  206. package/front_end/panels/layer_viewer/Layers3DView.ts +1 -1
  207. package/front_end/panels/layer_viewer/PaintProfilerView.ts +1 -1
  208. package/front_end/panels/layers/LayersPanel.ts +1 -1
  209. package/front_end/panels/lighthouse/lighthouseStartView.css +1 -1
  210. package/front_end/panels/media/TickingFlameChart.ts +1 -1
  211. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +1 -1
  212. package/front_end/panels/network/BlockedURLsPane.ts +1 -1
  213. package/front_end/panels/network/NetworkDataGridNode.ts +1 -0
  214. package/front_end/panels/network/NetworkLogView.test.ts +1 -1
  215. package/front_end/panels/network/NetworkPanel.ts +40 -32
  216. package/front_end/panels/network/NetworkWaterfallColumn.ts +1 -1
  217. package/front_end/panels/profiler/HeapProfileView.ts +9 -9
  218. package/front_end/panels/profiler/HeapTimelineOverview.ts +1 -1
  219. package/front_end/panels/profiler/IsolateSelector.ts +1 -1
  220. package/front_end/panels/profiler/LiveHeapProfileView.ts +3 -1
  221. package/front_end/panels/profiler/ProfileFlameChartDataProvider.ts +3 -3
  222. package/front_end/panels/profiler/ProfileView.ts +2 -2
  223. package/front_end/panels/profiler/profileLauncherView.css +1 -1
  224. package/front_end/panels/profiler/profilesSidebarTree.css +1 -1
  225. package/front_end/panels/recorder/recorderController.css +1 -1
  226. package/front_end/panels/security/CookieControlsTreeElement.ts +18 -0
  227. package/front_end/panels/security/CookieControlsView.test.ts +29 -0
  228. package/front_end/panels/security/CookieControlsView.ts +265 -0
  229. package/front_end/panels/security/CookieReportView.test.ts +157 -0
  230. package/front_end/panels/security/CookieReportView.ts +208 -12
  231. package/front_end/panels/security/SecurityPanel.ts +5 -3
  232. package/front_end/panels/security/SecurityPanelSidebar.ts +6 -1
  233. package/front_end/panels/security/cookieControlsView.css +101 -0
  234. package/front_end/panels/security/cookieReportView.css +26 -3
  235. package/front_end/panels/security/security.ts +4 -0
  236. package/front_end/panels/security/sidebar.css +1 -1
  237. package/front_end/panels/settings/KeybindsSettingsTab.ts +3 -2
  238. package/front_end/panels/settings/SettingsScreen.ts +5 -1
  239. package/front_end/panels/settings/frameworkIgnoreListSettingsTab.css +1 -1
  240. package/front_end/panels/settings/keybindsSettingsTab.css +6 -1
  241. package/front_end/panels/settings/settings-meta.ts +3 -1
  242. package/front_end/panels/settings/settingsScreen.css +10 -0
  243. package/front_end/panels/sources/CallStackSidebarPane.ts +2 -2
  244. package/front_end/panels/sources/NavigatorView.ts +1 -0
  245. package/front_end/panels/sources/navigatorTree.css +1 -1
  246. package/front_end/panels/sources/sourcesPanel.css +2 -2
  247. package/front_end/panels/timeline/AnimationsTrackAppender.ts +1 -7
  248. package/front_end/panels/timeline/AppenderUtils.ts +1 -1
  249. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +38 -41
  250. package/front_end/panels/timeline/ExtensionTrackAppender.ts +4 -13
  251. package/front_end/panels/timeline/InteractionsTrackAppender.ts +3 -4
  252. package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +6 -12
  253. package/front_end/panels/timeline/ServerTimingsTrackAppender.ts +1 -10
  254. package/front_end/panels/timeline/ThreadAppender.ts +9 -12
  255. package/front_end/panels/timeline/TimelineController.ts +1 -1
  256. package/front_end/panels/timeline/TimelineDetailsView.test.ts +3 -2
  257. package/front_end/panels/timeline/TimelineDetailsView.ts +18 -17
  258. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +55 -36
  259. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +1 -1
  260. package/front_end/panels/timeline/TimelineFlameChartView.ts +33 -14
  261. package/front_end/panels/timeline/TimelineHistoryManager.test.ts +20 -15
  262. package/front_end/panels/timeline/TimelineHistoryManager.ts +46 -58
  263. package/front_end/panels/timeline/TimelineLayersView.ts +1 -1
  264. package/front_end/panels/timeline/TimelineLoader.ts +16 -0
  265. package/front_end/panels/timeline/TimelineMiniMap.ts +2 -2
  266. package/front_end/panels/timeline/TimelinePaintProfilerView.ts +1 -1
  267. package/front_end/panels/timeline/TimelinePanel.ts +145 -28
  268. package/front_end/panels/timeline/TimelineTreeView.ts +65 -16
  269. package/front_end/panels/timeline/TimelineUIUtils.ts +44 -0
  270. package/front_end/panels/timeline/TimingsTrackAppender.ts +6 -13
  271. package/front_end/panels/timeline/components/FieldSettingsDialog.test.ts +1 -0
  272. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +6 -1
  273. package/front_end/panels/timeline/components/LiveMetricsView.test.ts +12 -0
  274. package/front_end/panels/timeline/components/LiveMetricsView.ts +13 -18
  275. package/front_end/panels/timeline/components/Sidebar.ts +1 -4
  276. package/front_end/panels/timeline/components/SidebarAnnotationsTab.test.ts +1 -1
  277. package/front_end/panels/timeline/components/SidebarInsightsTab.ts +1 -1
  278. package/front_end/panels/timeline/components/SidebarSingleInsightSet.test.ts +21 -35
  279. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +16 -9
  280. package/front_end/panels/timeline/components/TimelineSummary.test.ts +75 -0
  281. package/front_end/panels/timeline/components/TimelineSummary.ts +101 -0
  282. package/front_end/panels/timeline/components/Utils.test.ts +49 -0
  283. package/front_end/panels/timeline/components/Utils.ts +2 -2
  284. package/front_end/panels/timeline/components/components.ts +2 -0
  285. package/front_end/panels/timeline/components/insights/BaseInsightComponent.test.ts +84 -0
  286. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +291 -0
  287. package/front_end/panels/timeline/components/insights/CLSCulprits.ts +17 -41
  288. package/front_end/panels/timeline/components/insights/DocumentLatency.ts +28 -46
  289. package/front_end/panels/timeline/components/insights/EventRef.ts +70 -2
  290. package/front_end/panels/timeline/components/insights/FontDisplay.ts +28 -46
  291. package/front_end/panels/timeline/components/insights/Helpers.ts +5 -208
  292. package/front_end/panels/timeline/components/insights/ImageDelivery.ts +142 -0
  293. package/front_end/panels/timeline/components/insights/InteractionToNextPaint.ts +30 -53
  294. package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +36 -75
  295. package/front_end/panels/timeline/components/insights/LCPPhases.ts +15 -49
  296. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +27 -44
  297. package/front_end/panels/timeline/components/insights/SidebarInsight.ts +3 -197
  298. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +51 -74
  299. package/front_end/panels/timeline/components/insights/Table.ts +6 -5
  300. package/front_end/panels/timeline/components/insights/ThirdParties.ts +41 -61
  301. package/front_end/panels/timeline/components/insights/Viewport.ts +20 -31
  302. package/front_end/panels/timeline/components/insights/{sidebarInsight.css → baseInsightComponent.css} +9 -9
  303. package/front_end/panels/timeline/components/insights/insights.ts +4 -0
  304. package/front_end/panels/timeline/components/insights/types.ts +0 -7
  305. package/front_end/panels/timeline/components/liveMetricsView.css +5 -5
  306. package/front_end/panels/timeline/components/timelineSummary.css +67 -0
  307. package/front_end/panels/timeline/docs/flame_chart_migration.md +1 -1
  308. package/front_end/panels/timeline/fixtures/traces/README.md +4 -0
  309. package/front_end/panels/timeline/fixtures/traces/image-delivery.json.gz +0 -0
  310. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +22 -0
  311. package/front_end/panels/timeline/timeline-meta.ts +1 -1
  312. package/front_end/panels/timeline/timelineFlamechartPopover.css +14 -4
  313. package/front_end/panels/timeline/timelineHistoryManager.css +7 -3
  314. package/front_end/panels/timeline/timelinePanel.css +0 -1
  315. package/front_end/panels/timeline/track_appenders/CompatibilityTracksAppender.test.ts +5 -5
  316. package/front_end/panels/timeline/track_appenders/ExtensionTrackAppender.test.ts +5 -6
  317. package/front_end/panels/timeline/track_appenders/LayoutShiftsTrackAppender.test.ts +11 -2
  318. package/front_end/panels/timeline/track_appenders/ServerTimingsTrackAppender.test.ts +0 -9
  319. package/front_end/panels/timeline/track_appenders/ThreadAppender.test.ts +37 -44
  320. package/front_end/panels/timeline/track_appenders/TimingsTrackAppender.test.ts +44 -30
  321. package/front_end/panels/timeline/utils/EntryName.ts +1 -2
  322. package/front_end/panels/timeline/utils/Helpers.ts +19 -0
  323. package/front_end/panels/timeline/utils/IgnoreList.test.ts +52 -0
  324. package/front_end/panels/timeline/utils/IgnoreList.ts +68 -7
  325. package/front_end/panels/timeline/utils/SourceMapsResolver.ts +2 -0
  326. package/front_end/panels/webauthn/webauthnPane.css +1 -1
  327. package/front_end/panels/whats_new/ReleaseNote.test.ts +90 -0
  328. package/front_end/panels/whats_new/ReleaseNoteText.ts +52 -0
  329. package/front_end/panels/whats_new/ReleaseNoteView.ts +157 -0
  330. package/front_end/panels/whats_new/WhatsNewImpl.ts +102 -0
  331. package/front_end/panels/whats_new/releaseNoteView.css +121 -0
  332. package/front_end/panels/whats_new/resources/WNDT.md +6 -0
  333. package/front_end/panels/whats_new/resources/whatsnew.avif +0 -0
  334. package/front_end/panels/whats_new/whats_new-meta.ts +142 -0
  335. package/front_end/panels/whats_new/whats_new.ts +13 -0
  336. package/front_end/services/puppeteer/PuppeteerConnection.ts +4 -3
  337. package/front_end/testing/EnvironmentHelpers.ts +1 -2
  338. package/front_end/testing/SourceMapEncoder.ts +27 -11
  339. package/front_end/testing/TraceHelpers.ts +2 -1
  340. package/front_end/testing/TraceLoader.ts +6 -2
  341. package/front_end/third_party/lighthouse/README.chromium +2 -2
  342. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +1380 -1369
  343. package/front_end/third_party/lighthouse/locales/ar-XB.json +88 -85
  344. package/front_end/third_party/lighthouse/locales/ar.json +98 -95
  345. package/front_end/third_party/lighthouse/locales/bg.json +88 -85
  346. package/front_end/third_party/lighthouse/locales/ca.json +91 -88
  347. package/front_end/third_party/lighthouse/locales/cs.json +91 -88
  348. package/front_end/third_party/lighthouse/locales/da.json +94 -91
  349. package/front_end/third_party/lighthouse/locales/de.json +92 -89
  350. package/front_end/third_party/lighthouse/locales/el.json +92 -89
  351. package/front_end/third_party/lighthouse/locales/en-GB.json +89 -86
  352. package/front_end/third_party/lighthouse/locales/en-US.json +23 -20
  353. package/front_end/third_party/lighthouse/locales/en-XA.json +88 -85
  354. package/front_end/third_party/lighthouse/locales/en-XL.json +23 -20
  355. package/front_end/third_party/lighthouse/locales/es-419.json +92 -89
  356. package/front_end/third_party/lighthouse/locales/es.json +91 -88
  357. package/front_end/third_party/lighthouse/locales/fi.json +92 -89
  358. package/front_end/third_party/lighthouse/locales/fil.json +93 -90
  359. package/front_end/third_party/lighthouse/locales/fr.json +94 -91
  360. package/front_end/third_party/lighthouse/locales/he.json +97 -94
  361. package/front_end/third_party/lighthouse/locales/hi.json +92 -89
  362. package/front_end/third_party/lighthouse/locales/hr.json +90 -87
  363. package/front_end/third_party/lighthouse/locales/hu.json +90 -87
  364. package/front_end/third_party/lighthouse/locales/id.json +91 -88
  365. package/front_end/third_party/lighthouse/locales/it.json +90 -87
  366. package/front_end/third_party/lighthouse/locales/ja.json +90 -87
  367. package/front_end/third_party/lighthouse/locales/ko.json +90 -87
  368. package/front_end/third_party/lighthouse/locales/lt.json +90 -87
  369. package/front_end/third_party/lighthouse/locales/lv.json +91 -88
  370. package/front_end/third_party/lighthouse/locales/nl.json +90 -87
  371. package/front_end/third_party/lighthouse/locales/no.json +92 -89
  372. package/front_end/third_party/lighthouse/locales/pl.json +90 -87
  373. package/front_end/third_party/lighthouse/locales/pt-PT.json +111 -108
  374. package/front_end/third_party/lighthouse/locales/pt.json +97 -94
  375. package/front_end/third_party/lighthouse/locales/ro.json +94 -91
  376. package/front_end/third_party/lighthouse/locales/ru.json +93 -90
  377. package/front_end/third_party/lighthouse/locales/sk.json +93 -90
  378. package/front_end/third_party/lighthouse/locales/sl.json +91 -88
  379. package/front_end/third_party/lighthouse/locales/sr-Latn.json +91 -88
  380. package/front_end/third_party/lighthouse/locales/sr.json +91 -88
  381. package/front_end/third_party/lighthouse/locales/sv.json +92 -89
  382. package/front_end/third_party/lighthouse/locales/ta.json +101 -98
  383. package/front_end/third_party/lighthouse/locales/te.json +92 -89
  384. package/front_end/third_party/lighthouse/locales/th.json +95 -92
  385. package/front_end/third_party/lighthouse/locales/tr.json +91 -88
  386. package/front_end/third_party/lighthouse/locales/uk.json +93 -90
  387. package/front_end/third_party/lighthouse/locales/vi.json +95 -92
  388. package/front_end/third_party/lighthouse/locales/zh-HK.json +92 -89
  389. package/front_end/third_party/lighthouse/locales/zh-TW.json +98 -95
  390. package/front_end/third_party/lighthouse/locales/zh.json +96 -93
  391. package/front_end/third_party/puppeteer/README.chromium +2 -2
  392. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +8 -0
  393. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  394. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  395. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.d.ts.map +1 -1
  396. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js +3 -1
  397. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js.map +1 -1
  398. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.d.ts +1 -0
  399. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.d.ts.map +1 -1
  400. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.js +1 -0
  401. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.js.map +1 -1
  402. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +4 -0
  403. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  404. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  405. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +1 -0
  406. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  407. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +3 -0
  408. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  409. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +3 -2
  410. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  411. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +10 -4
  412. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  413. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserConnector.d.ts.map +1 -1
  414. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserConnector.js +2 -2
  415. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserConnector.js.map +1 -1
  416. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts +2 -0
  417. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  418. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js +7 -0
  419. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js.map +1 -1
  420. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.d.ts +1 -0
  421. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  422. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js +3 -0
  423. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js.map +1 -1
  424. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.d.ts +1 -2
  425. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
  426. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.js +4 -4
  427. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.js.map +1 -1
  428. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  429. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js +24 -12
  430. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js.map +1 -1
  431. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +1 -0
  432. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  433. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +3 -0
  434. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  435. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts +5 -0
  436. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  437. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.d.ts +30 -0
  438. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.d.ts.map +1 -0
  439. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.js +8 -0
  440. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.js.map +1 -0
  441. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/common.d.ts +1 -0
  442. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/common.d.ts.map +1 -1
  443. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
  444. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
  445. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  446. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  447. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js +2 -2
  448. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js.map +1 -1
  449. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  450. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  451. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  452. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  453. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +49 -0
  454. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +118 -88
  455. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +8 -0
  456. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  457. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  458. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.d.ts.map +1 -1
  459. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js +3 -1
  460. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js.map +1 -1
  461. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.d.ts +1 -0
  462. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.d.ts.map +1 -1
  463. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.js +1 -0
  464. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.js.map +1 -1
  465. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +4 -0
  466. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  467. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  468. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +1 -0
  469. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  470. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +3 -0
  471. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  472. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +3 -2
  473. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  474. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +10 -4
  475. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  476. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserConnector.d.ts.map +1 -1
  477. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserConnector.js +2 -2
  478. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserConnector.js.map +1 -1
  479. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts +2 -0
  480. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  481. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js +7 -0
  482. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js.map +1 -1
  483. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.d.ts +1 -0
  484. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  485. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js +3 -0
  486. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js.map +1 -1
  487. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.d.ts +1 -2
  488. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
  489. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.js +4 -4
  490. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.js.map +1 -1
  491. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  492. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js +24 -12
  493. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js.map +1 -1
  494. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +1 -0
  495. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  496. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +3 -0
  497. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  498. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts +5 -0
  499. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  500. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.d.ts +30 -0
  501. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.d.ts.map +1 -0
  502. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.js +7 -0
  503. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.js.map +1 -0
  504. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/common.d.ts +1 -0
  505. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/common.d.ts.map +1 -1
  506. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
  507. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
  508. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  509. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js +2 -2
  510. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js.map +1 -1
  511. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  512. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  513. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  514. package/front_end/third_party/puppeteer/package/lib/types.d.ts +49 -0
  515. package/front_end/third_party/puppeteer/package/package.json +3 -3
  516. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +8 -0
  517. package/front_end/third_party/puppeteer/package/src/api/Frame.ts +3 -1
  518. package/front_end/third_party/puppeteer/package/src/api/HTTPRequest.ts +1 -0
  519. package/front_end/third_party/puppeteer/package/src/api/Page.ts +5 -0
  520. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +4 -0
  521. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +11 -3
  522. package/front_end/third_party/puppeteer/package/src/cdp/BrowserConnector.ts +2 -0
  523. package/front_end/third_party/puppeteer/package/src/cdp/BrowserContext.ts +11 -0
  524. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +4 -0
  525. package/front_end/third_party/puppeteer/package/src/cdp/HTTPResponse.ts +3 -5
  526. package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +34 -17
  527. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +4 -0
  528. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +5 -0
  529. package/front_end/third_party/puppeteer/package/src/common/DownloadBehavior.ts +31 -0
  530. package/front_end/third_party/puppeteer/package/src/common/common.ts +1 -0
  531. package/front_end/third_party/puppeteer/package/src/generated/version.ts +1 -1
  532. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +2 -0
  533. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  534. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +1 -0
  535. package/front_end/ui/components/data_grid/DataGridControllerIntegrator.ts +4 -1
  536. package/front_end/ui/components/dialogs/ButtonDialog.test.ts +78 -0
  537. package/front_end/ui/components/dialogs/ButtonDialog.ts +131 -0
  538. package/front_end/ui/components/dialogs/Dialog.test.ts +43 -0
  539. package/front_end/ui/components/dialogs/Dialog.ts +64 -2
  540. package/front_end/ui/components/dialogs/ShortcutDialog.test.ts +15 -1
  541. package/front_end/ui/components/dialogs/ShortcutDialog.ts +28 -20
  542. package/front_end/ui/components/dialogs/buttonDialog.css +9 -0
  543. package/front_end/ui/components/dialogs/dialog.css +15 -0
  544. package/front_end/ui/components/dialogs/dialogs.ts +2 -0
  545. package/front_end/ui/components/dialogs/shortcutDialog.css +34 -6
  546. package/front_end/ui/components/docs/dialog/button_dialog.html +28 -0
  547. package/front_end/ui/components/docs/dialog/button_dialog.ts +29 -0
  548. package/front_end/ui/components/docs/performance_panel/basic.ts +1 -1
  549. package/front_end/ui/components/docs/performance_panel/timeline_history_manager.ts +6 -4
  550. package/front_end/ui/components/floating_button/FloatingButton.ts +3 -2
  551. package/front_end/ui/components/icon_button/fileSourceIcon.css +7 -3
  552. package/front_end/ui/components/issue_counter/IssueCounter.ts +15 -2
  553. package/front_end/ui/components/legacy_wrapper/LegacyWrapper.ts +1 -1
  554. package/front_end/ui/components/markdown_view/MarkdownView.ts +15 -0
  555. package/front_end/ui/components/markdown_view/markdownView.css +1 -1
  556. package/front_end/ui/components/render_coordinator/RenderCoordinator.ts +24 -18
  557. package/front_end/ui/components/switch/SwitchImpl.ts +2 -2
  558. package/front_end/ui/legacy/Infobar.ts +6 -0
  559. package/front_end/ui/legacy/InspectorView.ts +40 -0
  560. package/front_end/ui/legacy/ListWidget.ts +4 -2
  561. package/front_end/ui/legacy/ThrottledWidget.ts +2 -2
  562. package/front_end/ui/legacy/Toolbar.ts +3 -3
  563. package/front_end/ui/legacy/UIUtils.ts +8 -6
  564. package/front_end/ui/legacy/Widget.ts +32 -0
  565. package/front_end/ui/legacy/components/data_grid/DataGrid.test.ts +6 -9
  566. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +35 -34
  567. package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +1 -1
  568. package/front_end/ui/legacy/components/perf_ui/ChartViewport.ts +2 -2
  569. package/front_end/ui/legacy/components/perf_ui/FilmStripView.ts +1 -1
  570. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +32 -25
  571. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.ts +18 -4
  572. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +80 -39
  573. package/front_end/ui/legacy/components/perf_ui/perf_ui-meta.ts +4 -4
  574. package/front_end/ui/legacy/components/utils/jsUtils.css +8 -0
  575. package/front_end/ui/legacy/filter.css +1 -1
  576. package/front_end/ui/legacy/inspectorCommon.css +1 -1
  577. package/front_end/ui/legacy/listWidget.css +4 -1
  578. package/front_end/ui/legacy/reportView.css +1 -1
  579. package/front_end/ui/legacy/toolbar.css +3 -6
  580. package/front_end/ui/legacy/treeoutline.css +3 -1
  581. package/front_end/ui/visual_logging/KnownContextValues.ts +12 -1
  582. package/front_end/ui/visual_logging/LoggingDriver.test.ts +27 -1
  583. package/front_end/ui/visual_logging/LoggingDriver.ts +7 -4
  584. package/package.json +2 -3
  585. package/scripts/build/wasm-as.py +1 -1
  586. package/scripts/freestyler/auto_freestyler.js +12 -4
  587. package/scripts/freestyler/to_tsv.mjs +40 -0
  588. package/scripts/tools/update_goldens.py +11 -13
  589. package/front_end/panels/timeline/components/insights/SidebarInsight.test.ts +0 -72
  590. package/front_end/ui/components/docs/two_states_counter/basic.html +0 -27
  591. package/front_end/ui/components/docs/two_states_counter/basic.ts +0 -45
  592. package/front_end/ui/components/two_states_counter/TwoStatesCounter.test.ts +0 -73
  593. package/front_end/ui/components/two_states_counter/TwoStatesCounter.ts +0 -104
  594. package/front_end/ui/components/two_states_counter/twoStatesCounter.css +0 -37
  595. package/front_end/ui/components/two_states_counter/two_states_counter.ts +0 -9
@@ -40,6 +40,7 @@ import * as Platform from '../../core/platform/platform.js';
40
40
  import * as Root from '../../core/root/root.js';
41
41
  import * as SDK from '../../core/sdk/sdk.js';
42
42
  import type * as Protocol from '../../generated/protocol.js';
43
+ import * as EmulationModel from '../../models/emulation/emulation.js';
43
44
  import * as Trace from '../../models/trace/trace.js';
44
45
  import * as Workspace from '../../models/workspace/workspace.js';
45
46
  import * as TraceBounds from '../../services/trace_bounds/trace_bounds.js';
@@ -65,6 +66,7 @@ import {AnnotationModifiedEvent, ModificationsManager} from './ModificationsMana
65
66
  import * as Overlays from './overlays/overlays.js';
66
67
  import {cpuprofileJsonGenerator, traceJsonGenerator} from './SaveFileFormatter.js';
67
68
  import {type Client, TimelineController} from './TimelineController.js';
69
+ import type {TimelineFlameChartDataProvider} from './TimelineFlameChartDataProvider.js';
68
70
  import {TimelineFlameChartView} from './TimelineFlameChartView.js';
69
71
  import {TimelineHistoryManager} from './TimelineHistoryManager.js';
70
72
  import {TimelineLandingPage} from './TimelineLandingPage.js';
@@ -316,6 +318,22 @@ const UIStrings = {
316
318
  * @description Tooltip text for a button that takes the user back to the default view which shows performance metrics that are live.
317
319
  */
318
320
  backToLiveMetrics: 'Go back to the live metrics page',
321
+ /**
322
+ * @description Description of the Timeline in/out zoom action that appears in the Performance panel shortcuts dialog.
323
+ */
324
+ timelineZoomInOut: 'Timeline zoom in/out',
325
+ /**
326
+ * @description Description of the Timeline fast in/out zoom action that appears in the Performance panel shortcuts dialog.
327
+ */
328
+ timelineFastZoomInOut: 'Timeline fast zoom in/out',
329
+ /**
330
+ * @description Description of the Timeline up/down scroll action that appears in the Performance panel shortcuts dialog.
331
+ */
332
+ timelineScrollUpDown: 'Timeline up/down',
333
+ /**
334
+ * @description Description of the Timeline right/left panning action that appears in the Performance panel shortcuts dialog.
335
+ */
336
+ timelinePanLeftRight: 'Timeline right/left',
319
337
  };
320
338
  const str_ = i18n.i18n.registerUIStrings('panels/timeline/TimelinePanel.ts', UIStrings);
321
339
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -445,6 +463,9 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
445
463
  #pendingAriaMessage: string|null = null;
446
464
 
447
465
  #eventToRelatedInsights: TimelineComponents.RelatedInsightChips.EventToRelatedInsightsMap = new Map();
466
+ #shortcutsDialog: ShortcutDialog.ShortcutDialog.ShortcutDialog = new ShortcutDialog.ShortcutDialog.ShortcutDialog();
467
+
468
+ #onMainEntryHovered: (event: Common.EventTarget.EventTargetEvent<number>) => void;
448
469
 
449
470
  constructor() {
450
471
  super('timeline');
@@ -544,6 +565,10 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
544
565
  this.flameChart.getMainFlameChart().addEventListener(
545
566
  PerfUI.FlameChart.Events.CHART_PLAYABLE_STATE_CHANGED, this.#onChartPlayableStateChangeBound, this);
546
567
 
568
+ this.#onMainEntryHovered = this.#onEntryHovered.bind(this, this.flameChart.getMainDataProvider());
569
+ this.flameChart.getMainFlameChart().addEventListener(
570
+ PerfUI.FlameChart.Events.ENTRY_HOVERED, this.#onMainEntryHovered);
571
+
547
572
  this.searchableViewInternal = new UI.SearchableView.SearchableView(this.flameChart, null);
548
573
  this.searchableViewInternal.setMinimumSize(0, 100);
549
574
  this.searchableViewInternal.element.classList.add('searchable-view');
@@ -557,16 +582,23 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
557
582
  this.#splitWidget.enableShowModeSaving();
558
583
  this.#splitWidget.show(this.element);
559
584
 
585
+ this.flameChart.overlays().addEventListener(Overlays.Overlays.TimeRangeMouseOverEvent.eventName, event => {
586
+ const {overlay} = event as Overlays.Overlays.TimeRangeMouseOverEvent;
587
+ const overlayBounds = overlay && Overlays.Overlays.traceWindowContainingOverlays([overlay]);
588
+ this.#minimapComponent.highlightBounds(overlayBounds, /* withBracket */ false);
589
+ });
590
+
591
+ this.flameChart.overlays().addEventListener(Overlays.Overlays.TimeRangeMouseOutEvent.eventName, () => {
592
+ this.#minimapComponent.clearBoundsHighlight();
593
+ });
594
+
560
595
  this.#sideBar.element.addEventListener(TimelineInsights.SidebarInsight.InsightDeactivated.eventName, () => {
561
596
  this.#setActiveInsight(null);
562
597
  });
563
598
 
564
- // TODO(crbug.com/372946179): when clicking on an insight chip, this event never fires if the insight tab
565
- // is not on the DOM. That only happens when the sidebar tabbed pane component is set to Annotations.
566
- // In that case, clicking on the insight chip will do nothing.
567
599
  this.#sideBar.element.addEventListener(TimelineInsights.SidebarInsight.InsightActivated.eventName, event => {
568
- const {name, insightSetKey, overlays, relatedEvents} = event;
569
- this.#setActiveInsight({name, insightSetKey, overlays, relatedEvents});
600
+ const {model, insightSetKey} = event;
601
+ this.#setActiveInsight({model, insightSetKey});
570
602
  });
571
603
 
572
604
  this.#sideBar.element.addEventListener(TimelineInsights.SidebarInsight.InsightProvideOverlays.eventName, event => {
@@ -576,25 +608,12 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
576
608
 
577
609
  const overlaysBounds = overlays && Overlays.Overlays.traceWindowContainingOverlays(overlays);
578
610
  if (overlaysBounds) {
579
- this.#minimapComponent.highlightBounds(overlaysBounds);
611
+ this.#minimapComponent.highlightBounds(overlaysBounds, /* withBracket */ true);
580
612
  } else {
581
613
  this.#minimapComponent.clearBoundsHighlight();
582
614
  }
583
615
  });
584
616
 
585
- this.#sideBar.element.addEventListener(
586
- TimelineInsights.SidebarInsight.InsightProvideRelatedEvents.eventName, event => {
587
- const relatedInsight = {
588
- insightLabel: event.label,
589
- activateInsight: event.activateInsight,
590
- };
591
- for (const traceEvent of event.events) {
592
- const relatedInsights = this.#eventToRelatedInsights.get(traceEvent) ?? [];
593
- relatedInsights.push(relatedInsight);
594
- this.#eventToRelatedInsights.set(traceEvent, relatedInsights);
595
- }
596
- });
597
-
598
617
  this.flameChart.element.addEventListener(TimelineInsights.EventRef.EventReferenceClick.eventName, event => {
599
618
  const fromTraceEvent = selectionFromEvent(event.event);
600
619
  this.flameChart.setSelectionAndReveal(fromTraceEvent);
@@ -615,7 +634,7 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
615
634
 
616
635
  this.#sideBar.element.addEventListener(TimelineInsights.SidebarInsight.InsightSetHovered.eventName, event => {
617
636
  if (event.bounds) {
618
- this.#minimapComponent.highlightBounds(event.bounds);
637
+ this.#minimapComponent.highlightBounds(event.bounds, /* withBracket */ true);
619
638
  } else {
620
639
  this.#minimapComponent.clearBoundsHighlight();
621
640
  }
@@ -913,6 +932,21 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
913
932
  }
914
933
  }
915
934
 
935
+ #onEntryHovered(dataProvider: TimelineFlameChartDataProvider, event: Common.EventTarget.EventTargetEvent<number>):
936
+ void {
937
+ const entryIndex = event.data;
938
+ if (entryIndex === -1) {
939
+ this.#minimapComponent.clearBoundsHighlight();
940
+ return;
941
+ }
942
+ const traceEvent = dataProvider.eventByIndex(entryIndex);
943
+ if (!traceEvent) {
944
+ return;
945
+ }
946
+ const bounds = Trace.Helpers.Timing.traceWindowFromEvent(traceEvent);
947
+ this.#minimapComponent.highlightBounds(bounds, /* withBracket */ false);
948
+ }
949
+
916
950
  private loadFromCpuProfile(profile: Protocol.Profiler.Profile|null): void {
917
951
  if (this.state !== State.IDLE || profile === null) {
918
952
  return;
@@ -1073,14 +1107,57 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
1073
1107
  }
1074
1108
 
1075
1109
  if (Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.TIMELINE_ALTERNATIVE_NAVIGATION)) {
1076
- // TODO: Fill the shortcuts dialog with shortcuts for the cuttently selected navigation option
1077
- const shortcutDialog = new ShortcutDialog.ShortcutDialog.ShortcutDialog();
1078
- shortcutDialog.data = {shortcuts: [{title: 'Shortcut Title', bindings: ['Ctrl+E']}]};
1079
- const dialogToolbarItem = new UI.Toolbar.ToolbarItem(shortcutDialog);
1110
+ this.#shortcutsDialog.prependElement(this.#getNavigationSetting());
1111
+ const dialogToolbarItem = new UI.Toolbar.ToolbarItem(this.#shortcutsDialog);
1080
1112
  this.panelRightToolbar.appendToolbarItem(dialogToolbarItem);
1081
1113
  }
1082
1114
  }
1083
1115
 
1116
+ #getNavigationSetting(): HTMLElement {
1117
+ const currentNavSetting = Common.Settings.moduleSetting('flamechart-selected-navigation').get();
1118
+ this.#shortcutsDialog.data = {shortcuts: this.#getShortcutsInfo(currentNavSetting === 'classic')};
1119
+
1120
+ const navigationRadioButtons = document.createElement('form');
1121
+ navigationRadioButtons.classList.add('nav-radio-buttons');
1122
+ UI.ARIAUtils.markAsRadioGroup(navigationRadioButtons);
1123
+ const modernNavRadioButton = UI.UIUtils.createRadioLabel(
1124
+ 'flamechart-selected-navigation', 'Modern', /* checked */ currentNavSetting === 'modern');
1125
+ // Change EventListener is only triggered when the radio button is selected
1126
+ modernNavRadioButton.radioElement.addEventListener('change', () => {
1127
+ this.#shortcutsDialog.data = {shortcuts: this.#getShortcutsInfo(/* isNavClassic */ false)};
1128
+ Common.Settings.moduleSetting('flamechart-selected-navigation').set('modern');
1129
+ });
1130
+ const classicNavRadioButton = UI.UIUtils.createRadioLabel(
1131
+ 'flamechart-selected-navigation', 'Classic', /* checked */ currentNavSetting === 'classic');
1132
+ classicNavRadioButton.radioElement.addEventListener('change', () => {
1133
+ this.#shortcutsDialog.data = {shortcuts: this.#getShortcutsInfo(/* isNavClassic */ true)};
1134
+ Common.Settings.moduleSetting('flamechart-selected-navigation').set('classic');
1135
+ });
1136
+
1137
+ navigationRadioButtons.appendChild(modernNavRadioButton);
1138
+ navigationRadioButtons.appendChild(classicNavRadioButton);
1139
+
1140
+ return navigationRadioButtons;
1141
+ }
1142
+
1143
+ #getShortcutsInfo(isNavClassic: boolean): ShortcutDialog.ShortcutDialog.Shortcut[] {
1144
+ if (isNavClassic) {
1145
+ return [
1146
+ {title: i18nString(UIStrings.timelineScrollUpDown), bindings: ['Shift Scroll']},
1147
+ {title: i18nString(UIStrings.timelineZoomInOut), bindings: ['Scroll', 'W/S']},
1148
+ {title: i18nString(UIStrings.timelineFastZoomInOut), bindings: ['Shift W/S']},
1149
+ {title: i18nString(UIStrings.timelinePanLeftRight), bindings: ['A/D']},
1150
+ ];
1151
+ }
1152
+
1153
+ return [
1154
+ {title: i18nString(UIStrings.timelineScrollUpDown), bindings: ['Scroll', 'Shift up/down']},
1155
+ {title: i18nString(UIStrings.timelineZoomInOut), bindings: ['Cmd Scroll', 'W/S', '+/-']},
1156
+ {title: i18nString(UIStrings.timelineFastZoomInOut), bindings: ['Shift W/S', 'Shift +/-']},
1157
+ {title: i18nString(UIStrings.timelinePanLeftRight), bindings: ['A/D', 'Shift Scroll', 'Shift left/right']},
1158
+ ];
1159
+ }
1160
+
1084
1161
  private createSettingsPane(): void {
1085
1162
  this.showSettingsPaneSetting =
1086
1163
  Common.Settings.Settings.instance().createSetting('timeline-show-settings-toolbar', false);
@@ -1857,11 +1934,28 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
1857
1934
 
1858
1935
  this.#setActiveInsight(null);
1859
1936
 
1860
- this.#eventToRelatedInsights.clear();
1861
1937
  const traceInsightsSets = this.#traceEngineModel.traceInsights(traceIndex);
1862
1938
  this.flameChart.setInsights(traceInsightsSets, this.#eventToRelatedInsights);
1863
1939
  this.#sideBar.setInsights(traceInsightsSets);
1864
1940
 
1941
+ this.#eventToRelatedInsights.clear();
1942
+ if (traceInsightsSets) {
1943
+ for (const [insightSetKey, insightSet] of traceInsightsSets) {
1944
+ for (const model of Object.values(insightSet.model)) {
1945
+ for (const event of model.relatedEvents ?? []) {
1946
+ const relatedInsights = this.#eventToRelatedInsights.get(event) ?? [];
1947
+ this.#eventToRelatedInsights.set(event, relatedInsights);
1948
+ relatedInsights.push({
1949
+ insightLabel: model.title,
1950
+ activateInsight: () => {
1951
+ this.#setActiveInsight({model, insightSetKey});
1952
+ },
1953
+ });
1954
+ }
1955
+ }
1956
+ }
1957
+ }
1958
+
1865
1959
  this.#showSidebarIfRequired();
1866
1960
  }
1867
1961
 
@@ -2054,6 +2148,20 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
2054
2148
  this.flameChart.getMainFlameChart().update();
2055
2149
  }
2056
2150
 
2151
+ #deviceModeModel(): EmulationModel.DeviceModeModel.DeviceModeModel|null {
2152
+ // This is wrapped in a try/catch because in some DevTools entry points
2153
+ // (such as worker_app.ts) the Emulation panel is not included and as such
2154
+ // the below code fails; it tries to instantiate the model which requires
2155
+ // reading the value of a setting which has not been registered.
2156
+ // In this case, we fallback to 'ALL'. See crbug.com/361515458 for an
2157
+ // example bug that this resolves.
2158
+ try {
2159
+ return EmulationModel.DeviceModeModel.DeviceModeModel.instance();
2160
+ } catch {
2161
+ return null;
2162
+ }
2163
+ }
2164
+
2057
2165
  /**
2058
2166
  * This is called with we are done loading a trace from a file, or after we
2059
2167
  * have recorded a fresh trace.
@@ -2094,8 +2202,17 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
2094
2202
  return;
2095
2203
  }
2096
2204
 
2097
- metadata = metadata ? metadata :
2098
- await Trace.Extras.Metadata.forNewRecording(isCpuProfile, recordingStartTime ?? undefined);
2205
+ if (!metadata) {
2206
+ const deviceModeModel = this.#deviceModeModel();
2207
+ let emulatedDeviceTitle;
2208
+ if (deviceModeModel?.type() === EmulationModel.DeviceModeModel.Type.Device) {
2209
+ emulatedDeviceTitle = deviceModeModel.device()?.title ?? undefined;
2210
+ } else if (deviceModeModel?.type() === EmulationModel.DeviceModeModel.Type.Responsive) {
2211
+ emulatedDeviceTitle = 'Responsive';
2212
+ }
2213
+ metadata = await Trace.Extras.Metadata.forNewRecording(
2214
+ isCpuProfile, recordingStartTime ?? undefined, emulatedDeviceTitle);
2215
+ }
2099
2216
 
2100
2217
  try {
2101
2218
  await this.#executeNewTrace(collectedEvents, recordingIsFresh, metadata);
@@ -2128,7 +2245,7 @@ export class TimelinePanel extends UI.Panel.Panel implements Client, TimelineMod
2128
2245
  },
2129
2246
  filmStripForPreview: Trace.Extras.FilmStrip.fromParsedTrace(parsedTrace),
2130
2247
  parsedTrace,
2131
- startTime: recordingStartTime ?? null,
2248
+ metadata,
2132
2249
  });
2133
2250
  } catch (error) {
2134
2251
  // If we errored during the parsing stage, it
@@ -149,7 +149,9 @@ const UIStrings = {
149
149
  };
150
150
  const str_ = i18n.i18n.registerUIStrings('panels/timeline/TimelineTreeView.ts', UIStrings);
151
151
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
152
- export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableView.Searchable {
152
+ export class TimelineTreeView extends
153
+ Common.ObjectWrapper.eventMixin<TimelineTreeView.EventTypes, typeof UI.Widget.VBox>(UI.Widget.VBox)
154
+ implements UI.SearchableView.Searchable {
153
155
  #selectedEvents: Trace.Types.Events.Event[]|null;
154
156
  private searchResults: Trace.Extras.TraceTree.Node[];
155
157
  linkifier!: Components.Linkifier.Linkifier;
@@ -172,8 +174,9 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
172
174
  private caseSensitiveButton: UI.Toolbar.ToolbarToggle|undefined;
173
175
  private regexButton: UI.Toolbar.ToolbarToggle|undefined;
174
176
  private matchWholeWord: UI.Toolbar.ToolbarToggle|undefined;
175
-
176
177
  #parsedTrace: Trace.Handlers.Types.ParsedTrace|null = null;
178
+ #lastHighlightedEvent: HTMLElement|null = null;
179
+ eventToTreeNode: WeakMap<Trace.Types.Events.Event, Trace.Extras.TraceTree.Node> = new WeakMap();
177
180
 
178
181
  constructor() {
179
182
  super();
@@ -237,6 +240,9 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
237
240
  });
238
241
  this.dataGrid.addEventListener(DataGrid.DataGrid.Events.SORTING_CHANGED, this.sortingChanged, this);
239
242
  this.dataGrid.element.addEventListener('mousemove', this.onMouseMove.bind(this), true);
243
+ this.dataGrid.element.addEventListener(
244
+ 'mouseleave', () => this.dispatchEventToListeners(TimelineTreeView.Events.TREE_ROW_HOVERED, null));
245
+ this.dataGrid.addEventListener(DataGrid.DataGrid.Events.OPENED_NODE, this.onGridNodeOpened, this);
240
246
  this.dataGrid.setResizeMethod(DataGrid.DataGrid.ResizeMethod.LAST);
241
247
  this.dataGrid.setRowContextMenuCallback(this.onContextMenu.bind(this));
242
248
  this.dataGrid.asWidget().show(mainView.element);
@@ -269,6 +275,22 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
269
275
  this.refreshTree();
270
276
  }
271
277
 
278
+ highlightEventInTree(event: Trace.Types.Events.Event|null): void {
279
+ // Potentially clear last highlight
280
+ const dataGridElem = event && this.dataGridElementForEvent(event);
281
+ if (!event || (dataGridElem && dataGridElem !== this.#lastHighlightedEvent)) {
282
+ this.#lastHighlightedEvent?.style.setProperty('background-color', '');
283
+ }
284
+
285
+ if (event) {
286
+ const rowElem = dataGridElem;
287
+ if (rowElem) {
288
+ this.#lastHighlightedEvent = rowElem;
289
+ this.#lastHighlightedEvent.style.backgroundColor = 'var(--sys-color-yellow-container)';
290
+ }
291
+ }
292
+ }
293
+
272
294
  filters(): Trace.Extras.TraceFilter.TraceFilter[] {
273
295
  return [this.taskFilter, this.textFilterInternal, ...(ActiveFilters.instance().activeFilters())];
274
296
  }
@@ -318,9 +340,6 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
318
340
  return this.#selectedEvents || [];
319
341
  }
320
342
 
321
- onHover(_node: Trace.Extras.TraceTree.Node|null): void {
322
- }
323
-
324
343
  appendContextMenuItems(_contextMenu: UI.ContextMenu.ContextMenu, _node: Trace.Extras.TraceTree.Node): void {
325
344
  }
326
345
 
@@ -370,6 +389,9 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
370
389
  for (const child of children.values()) {
371
390
  // Exclude the idle time off the total calculation.
372
391
  const gridNode = new TreeGridNode(child, totalUsedTime, maxSelfTime, maxTotalTime, this);
392
+ for (const e of child.events) {
393
+ this.eventToTreeNode.set(e, child);
394
+ }
373
395
  this.dataGrid.insertChild(gridNode);
374
396
  }
375
397
  this.sortingChanged();
@@ -527,9 +549,7 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
527
549
  const gridNode = event.target && (event.target instanceof Node) ?
528
550
  (this.dataGrid.dataGridNodeFromNode((event.target as Node))) :
529
551
  null;
530
- // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration
531
- // @ts-expect-error
532
- const profileNode = gridNode && gridNode._profileNode;
552
+ const profileNode = (gridNode as TreeGridNode)?.profileNode;
533
553
  if (profileNode === this.lastHoveredProfileNode) {
534
554
  return;
535
555
  }
@@ -537,6 +557,16 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
537
557
  this.onHover(profileNode);
538
558
  }
539
559
 
560
+ onHover(node: Trace.Extras.TraceTree.Node|null): void {
561
+ this.dispatchEventToListeners(TimelineTreeView.Events.TREE_ROW_HOVERED, node);
562
+ }
563
+
564
+ // TODO: do this on selection (before opened)
565
+ onGridNodeOpened(): void {
566
+ const node = this.dataGrid.selectedNode as TreeGridNode;
567
+ this.dispatchEventToListeners(TimelineTreeView.Events.TREE_ROW_HOVERED, node.profileNode);
568
+ }
569
+
540
570
  private onContextMenu(
541
571
  contextMenu: UI.ContextMenu.ContextMenu, eventGridNode: DataGrid.DataGrid.DataGridNode<GridNode>): void {
542
572
  const gridNode = (eventGridNode as GridNode);
@@ -549,8 +579,16 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
549
579
  }
550
580
  }
551
581
 
582
+ dataGridElementForEvent(event: Trace.Types.Events.Event|null): HTMLElement|null {
583
+ if (!event) {
584
+ return null;
585
+ }
586
+ const treeNode = this.eventToTreeNode.get(event);
587
+ return (treeNode && this.dataGridNodeForTreeNode(treeNode)?.element()) ?? null;
588
+ }
589
+
552
590
  dataGridNodeForTreeNode(treeNode: Trace.Extras.TraceTree.Node): GridNode|null {
553
- return profileNodeToTreeGridNode.get(treeNode) || null;
591
+ return treeNodeToGridNode.get(treeNode) || null;
554
592
  }
555
593
 
556
594
  // UI.SearchableView.Searchable implementation
@@ -597,6 +635,16 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
597
635
  }
598
636
  }
599
637
 
638
+ export namespace TimelineTreeView {
639
+ export const enum Events {
640
+ TREE_ROW_HOVERED = 'TreeRowHovered',
641
+ }
642
+
643
+ export type EventTypes = {
644
+ [Events.TREE_ROW_HOVERED]: Trace.Extras.TraceTree.Node|null,
645
+ };
646
+ }
647
+
600
648
  export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode<GridNode> {
601
649
  protected populated: boolean;
602
650
  profileNode: Trace.Extras.TraceTree.Node;
@@ -651,10 +699,8 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode<Gri
651
699
  if (this.linkElement) {
652
700
  container.createChild('div', 'activity-link').appendChild(this.linkElement);
653
701
  }
654
- const eventStyle = TimelineUIUtils.eventStyle(event);
655
- const eventCategory = eventStyle.category;
656
- UI.ARIAUtils.setLabel(icon, eventCategory.title);
657
- icon.style.backgroundColor = eventCategory.getComputedColorValue();
702
+ UI.ARIAUtils.setLabel(icon, TimelineUIUtils.eventStyle(event).category.title);
703
+ icon.style.backgroundColor = TimelineUIUtils.eventColor(event);
658
704
  if (Trace.Types.Extensions.isSyntheticExtensionEntry(event)) {
659
705
  icon.style.backgroundColor = Extensions.ExtensionUI.extensionEntryColor(event);
660
706
  }
@@ -720,7 +766,7 @@ export class TreeGridNode extends GridNode {
720
766
  treeView: TimelineTreeView) {
721
767
  super(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView);
722
768
  this.setHasChildren(this.profileNode.hasChildren());
723
- profileNodeToTreeGridNode.set(profileNode, this);
769
+ treeNodeToGridNode.set(profileNode, this);
724
770
  }
725
771
 
726
772
  override populate(): void {
@@ -733,12 +779,15 @@ export class TreeGridNode extends GridNode {
733
779
  }
734
780
  for (const node of this.profileNode.children().values()) {
735
781
  const gridNode = new TreeGridNode(node, this.grandTotalTime, this.maxSelfTime, this.maxTotalTime, this.treeView);
782
+ for (const e of node.events) {
783
+ this.treeView.eventToTreeNode.set(e, node);
784
+ }
736
785
  this.insertChildOrdered(gridNode);
737
786
  }
738
787
  }
739
788
  }
740
789
 
741
- const profileNodeToTreeGridNode = new WeakMap<Trace.Extras.TraceTree.Node, TreeGridNode>();
790
+ const treeNodeToGridNode = new WeakMap<Trace.Extras.TraceTree.Node, TreeGridNode>();
742
791
 
743
792
  export class AggregatedTimelineTreeView extends TimelineTreeView {
744
793
  protected readonly groupBySetting: Common.Settings.Setting<AggregatedTimelineTreeView.GroupBy>;
@@ -794,7 +843,7 @@ export class AggregatedTimelineTreeView extends TimelineTreeView {
794
843
  icon: (Element|undefined),
795
844
  } {
796
845
  const categories = Utils.EntryStyles.getCategoryStyles();
797
- const color = node.id && node.event ? TimelineUIUtils.eventColor(node.event) : categories['other'].color;
846
+ const color = TimelineUIUtils.eventColor(node.event);
798
847
  const unattributed = i18nString(UIStrings.unattributed);
799
848
 
800
849
  const id = typeof node.id === 'symbol' ? undefined : node.id;
@@ -2275,6 +2275,50 @@ export class TimelineUIUtils {
2275
2275
 
2276
2276
  return element;
2277
2277
  }
2278
+ // Generates a Summary component given a aggregated stats for categories.
2279
+ static generateSummaryDetails(aggregatedStats: Record<string, number>, rangeStart: number, rangeEnd: number):
2280
+ Element {
2281
+ let total = 0;
2282
+ // Calculate total of all categories.
2283
+ for (const categoryName in aggregatedStats) {
2284
+ total += aggregatedStats[categoryName];
2285
+ }
2286
+
2287
+ const element = document.createElement('div');
2288
+ element.classList.add('timeline-details-view-summary');
2289
+
2290
+ const summaryTable = new TimelineComponents.TimelineSummary.TimelineSummary();
2291
+ let categories: TimelineComponents.TimelineSummary.CategoryData[] = [];
2292
+
2293
+ // Get stats values from categories.
2294
+ for (const categoryName in Utils.EntryStyles.getCategoryStyles()) {
2295
+ const category = Utils.EntryStyles.getCategoryStyles()[categoryName as keyof Utils.EntryStyles.CategoryPalette];
2296
+ if (category.name === Utils.EntryStyles.EventCategory.IDLE) {
2297
+ continue;
2298
+ }
2299
+ const value = aggregatedStats[category.name];
2300
+ if (!value) {
2301
+ continue;
2302
+ }
2303
+ const title = category.title;
2304
+ const color = category.getCSSValue();
2305
+ categories.push({value, color, title});
2306
+ }
2307
+
2308
+ // Keeps the most useful categories on top.
2309
+ categories = categories.sort((a, b) => b.value - a.value);
2310
+ const start = Trace.Types.Timing.MilliSeconds(rangeStart);
2311
+ const end = Trace.Types.Timing.MilliSeconds(rangeEnd);
2312
+ summaryTable.data = {
2313
+ rangeStart: start,
2314
+ rangeEnd: end,
2315
+ total,
2316
+ categories,
2317
+ };
2318
+ const summaryTableContainer = element.createChild('div');
2319
+ summaryTableContainer.appendChild(summaryTable);
2320
+ return element;
2321
+ }
2278
2322
 
2279
2323
  static generateDetailsContentForFrame(
2280
2324
  frame: Trace.Types.Events.LegacyTimelineFrame, filmStrip: Trace.Extras.FilmStrip.Data|null,
@@ -8,7 +8,7 @@ import * as Trace from '../../models/trace/trace.js';
8
8
  import {buildGroupStyle, buildTrackHeader, getFormattedTime} from './AppenderUtils.js';
9
9
  import {
10
10
  type CompatibilityTracksAppender,
11
- type HighlightedEntryInfo,
11
+ type PopoverInfo,
12
12
  type TrackAppender,
13
13
  type TrackAppenderName,
14
14
  VisualLoggingTrackName,
@@ -307,18 +307,13 @@ export class TimingsTrackAppender implements TrackAppender {
307
307
  if (Trace.Types.Events.isPerformanceMark(event)) {
308
308
  return `[mark]: ${event.name}`;
309
309
  }
310
+ if (Trace.Types.Extensions.isSyntheticExtensionEntry(event) && event.args.tooltipText) {
311
+ return event.args.tooltipText;
312
+ }
310
313
  return event.name;
311
314
  }
312
315
 
313
- /**
314
- * Returns the info shown when an event added by this appender
315
- * is hovered in the timeline.
316
- */
317
- highlightedEntryInfo(event: Trace.Types.Events.Event): HighlightedEntryInfo {
318
- const title = Trace.Types.Extensions.isSyntheticExtensionEntry(event) && event.args.tooltipText ?
319
- event.args.tooltipText :
320
- this.titleForEvent(event);
321
-
316
+ setPopoverInfo(event: Trace.Types.Events.Event, info: PopoverInfo): void {
322
317
  // If an event is a marker event, rather than show a duration of 0, we can instead show the time that the event happened, which is much more useful. We do this currently for:
323
318
  // Page load events: DCL, FCP and LCP
324
319
  // performance.mark() events
@@ -331,9 +326,7 @@ export class TimingsTrackAppender implements TrackAppender {
331
326
  this.#parsedTrace.Meta.navigationsByNavigationId,
332
327
  this.#parsedTrace.Meta.navigationsByFrameId,
333
328
  );
334
- return {title, formattedTime: getFormattedTime(timeOfEvent)};
329
+ info.formattedTime = getFormattedTime(timeOfEvent);
335
330
  }
336
-
337
- return {title, formattedTime: getFormattedTime(event.dur)};
338
331
  }
339
332
  }
@@ -96,6 +96,7 @@ describeWithMockConnection('FieldSettingsDialog', () => {
96
96
  'url-DESKTOP': null,
97
97
  'url-PHONE': null,
98
98
  'url-TABLET': null,
99
+ warnings: [],
99
100
  };
100
101
 
101
102
  cruxManager.getConfigSetting().set({enabled: false, override: ''});
@@ -188,7 +188,12 @@ export class FieldSettingsDialog extends HTMLElement {
188
188
  async #urlHasFieldData(url: string): Promise<boolean> {
189
189
  const cruxManager = CrUXManager.CrUXManager.instance();
190
190
  const result = await cruxManager.getFieldDataForPage(url);
191
- return Object.values(result).some(v => v);
191
+ return Object.entries(result).some(([key, value]) => {
192
+ if (key === 'warnings') {
193
+ return false;
194
+ }
195
+ return Boolean(value);
196
+ });
192
197
  }
193
198
 
194
199
  async #submit(enabled: boolean): Promise<void> {
@@ -707,6 +707,7 @@ describeWithMockConnection('LiveMetricsView', () => {
707
707
  'url-DESKTOP': null,
708
708
  'url-PHONE': null,
709
709
  'url-TABLET': null,
710
+ warnings: [],
710
711
  };
711
712
 
712
713
  sinon.stub(CrUXManager.CrUXManager.instance(), 'getFieldDataForCurrentPage').callsFake(async () => mockFieldData);
@@ -787,6 +788,17 @@ describeWithMockConnection('LiveMetricsView', () => {
787
788
  assert.strictEqual(title.innerText, 'Local and field metrics');
788
789
  });
789
790
 
791
+ it('should display any warning from crux', async () => {
792
+ mockFieldData.warnings.push('Warning from crux');
793
+
794
+ const view = renderLiveMetrics();
795
+
796
+ await coordinator.done();
797
+
798
+ const fieldMessage = getFieldMessage(view);
799
+ assert.match(fieldMessage!.textContent!, /Warning from crux/);
800
+ });
801
+
790
802
  it('should make initial request on render when crux is enabled', async () => {
791
803
  mockFieldData['url-ALL'] = createMockFieldData();
792
804