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
@@ -23,7 +23,11 @@ import {
23
23
  ErrorType,
24
24
  type ResponseData,
25
25
  ResponseType,
26
+ type SerializedAgent,
26
27
  } from './AiAgent.js';
28
+ import {
29
+ AiHistoryStorage,
30
+ } from './AiHistoryStorage.js';
27
31
  import {ChangeManager} from './ChangeManager.js';
28
32
  import {
29
33
  ChatMessageEntity,
@@ -190,6 +194,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
190
194
  #agents = new Set<AiAgent<unknown>>();
191
195
  #currentAgent?: AiAgent<unknown>;
192
196
 
197
+ #previousSameOriginContext?: ConversationContext<unknown>;
193
198
  #selectedFile: FileContext|null = null;
194
199
  #selectedElement: NodeContext|null = null;
195
200
  #selectedCallTree: CallTreeContext|null = null;
@@ -223,7 +228,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
223
228
  onFeedbackSubmit: this.#handleFeedbackSubmit.bind(this),
224
229
  onCancelClick: this.#cancel.bind(this),
225
230
  onContextClick: this.#handleContextClick.bind(this),
226
- onNewConversation: this.#newChat.bind(this),
231
+ onNewConversation: this.#handleNewChatRequest.bind(this),
227
232
  canShowFeedbackForm: this.#serverSideLoggingEnabled,
228
233
  userInfo: {
229
234
  accountImage: syncInfo.accountImage,
@@ -234,6 +239,10 @@ export class FreestylerPanel extends UI.Panel.Panel {
234
239
  stripLinks: false,
235
240
  isReadOnly: false,
236
241
  };
242
+
243
+ for (const historyEntry of AiHistoryStorage.instance().getHistory()) {
244
+ this.#createAgent(historyEntry.type, historyEntry);
245
+ }
237
246
  }
238
247
 
239
248
  #createToolbar(): void {
@@ -241,7 +250,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
241
250
  const leftToolbar = new UI.Toolbar.Toolbar('freestyler-left-toolbar', toolbarContainer);
242
251
  const rightToolbar = new UI.Toolbar.Toolbar('freestyler-right-toolbar', toolbarContainer);
243
252
 
244
- this.#newChatButton.addEventListener(UI.Toolbar.ToolbarButton.Events.CLICK, this.#newChat.bind(this));
253
+ this.#newChatButton.addEventListener(UI.Toolbar.ToolbarButton.Events.CLICK, this.#handleNewChatRequest.bind(this));
245
254
  leftToolbar.appendToolbarItem(this.#newChatButton);
246
255
  leftToolbar.appendSeparator();
247
256
 
@@ -257,8 +266,9 @@ export class FreestylerPanel extends UI.Panel.Panel {
257
266
  AI_ASSISTANCE_SEND_FEEDBACK, i18nString(UIStrings.sendFeedback), undefined, undefined,
258
267
  'freestyler.send-feedback');
259
268
  link.style.setProperty('display', null);
260
- link.style.setProperty('text-decoration', 'none');
261
- link.style.setProperty('padding', '0 var(--sys-size-3)');
269
+ link.style.setProperty('color', 'var(--sys-color-primary)');
270
+ link.style.setProperty('margin', '0 var(--sys-size-3)');
271
+ link.style.setProperty('height', 'calc(100% - 6px)');
262
272
  const linkItem = new UI.Toolbar.ToolbarItem(link);
263
273
  rightToolbar.appendToolbarItem(linkItem);
264
274
 
@@ -292,58 +302,44 @@ export class FreestylerPanel extends UI.Panel.Panel {
292
302
  }
293
303
  }
294
304
 
295
- #createAgent(agentType: AgentType): AiAgent<unknown> {
296
- switch (agentType) {
297
- case AgentType.FREESTYLER:
298
- return this.#createFreestylerAgent();
299
- case AgentType.DRJONES_FILE:
300
- return this.#createDrJonesFileAgent();
301
- case AgentType.DRJONES_NETWORK_REQUEST:
302
- return this.#createDrJonesNetworkAgent();
303
- case AgentType.DRJONES_PERFORMANCE:
304
- return this.#createDrJonesPerformanceAgent();
305
- }
306
- }
307
-
308
- #updateToolbarState(): void {
309
- this.#deleteHistoryEntryButton.setVisible(Boolean(this.#currentAgent && !this.#currentAgent.isEmpty));
310
- }
311
-
312
- #createFreestylerAgent(): FreestylerAgent {
313
- const agent = new FreestylerAgent({
305
+ #createAgent(agentType: AgentType, history?: SerializedAgent): AiAgent<unknown> {
306
+ const options = {
314
307
  aidaClient: this.#aidaClient,
315
- changeManager: this.#changeManager,
316
308
  serverSideLoggingEnabled: this.#serverSideLoggingEnabled,
317
- });
318
- this.#agents.add(agent);
319
- return agent;
320
- }
309
+ };
310
+ let agent: AiAgent<unknown>;
311
+ switch (agentType) {
312
+ case AgentType.FREESTYLER: {
313
+ agent = new FreestylerAgent({
314
+ ...options,
315
+ changeManager: this.#changeManager,
316
+ });
317
+ break;
318
+ }
319
+ case AgentType.DRJONES_NETWORK_REQUEST: {
320
+ agent = new DrJonesNetworkAgent(options);
321
+ break;
322
+ }
323
+ case AgentType.DRJONES_FILE: {
324
+ agent = new DrJonesFileAgent(options);
325
+ break;
326
+ }
327
+ case AgentType.DRJONES_PERFORMANCE: {
328
+ agent = new DrJonesPerformanceAgent(options);
329
+ break;
330
+ }
331
+ }
321
332
 
322
- #createDrJonesFileAgent(): DrJonesFileAgent {
323
- const agent = new DrJonesFileAgent({
324
- aidaClient: this.#aidaClient,
325
- serverSideLoggingEnabled: this.#serverSideLoggingEnabled,
326
- });
327
- this.#agents.add(agent);
328
- return agent;
329
- }
333
+ if (history) {
334
+ agent.populateHistoryFromStorage(history);
335
+ }
330
336
 
331
- #createDrJonesNetworkAgent(): DrJonesNetworkAgent {
332
- const agent = new DrJonesNetworkAgent({
333
- aidaClient: this.#aidaClient,
334
- serverSideLoggingEnabled: this.#serverSideLoggingEnabled,
335
- });
336
337
  this.#agents.add(agent);
337
338
  return agent;
338
339
  }
339
340
 
340
- #createDrJonesPerformanceAgent(): DrJonesPerformanceAgent {
341
- const agent = new DrJonesPerformanceAgent({
342
- aidaClient: this.#aidaClient,
343
- serverSideLoggingEnabled: this.#serverSideLoggingEnabled,
344
- });
345
- this.#agents.add(agent);
346
- return agent;
341
+ #updateToolbarState(): void {
342
+ this.#deleteHistoryEntryButton.setVisible(Boolean(this.#currentAgent && !this.#currentAgent.isEmpty));
347
343
  }
348
344
 
349
345
  static async instance(opts: {
@@ -393,7 +389,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
393
389
  this.#currentAgent = targetAgentType ? this.#createAgent(targetAgentType) : undefined;
394
390
  this.#viewProps.agentType = targetAgentType;
395
391
  this.#onContextSelectionChanged();
396
- this.doUpdate();
392
+ void this.doUpdate();
397
393
  }
398
394
 
399
395
  override wasShown(): void {
@@ -417,7 +413,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
417
413
  inspectElementToggled: this.#toggleSearchElementAction.toggled(),
418
414
  selectedContext: this.#getConversationContext(),
419
415
  };
420
- this.doUpdate();
416
+ void this.doUpdate();
421
417
 
422
418
  this.#freestylerEnabledSetting?.addChangeListener(this.#handleFreestylerEnabledSettingChanged, this);
423
419
  Host.AidaClient.HostConfigTracker.instance().addEventListener(
@@ -476,7 +472,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
476
472
  accountFullName: syncInfo.accountFullName,
477
473
  };
478
474
  this.#viewProps.state = this.#getChatUiState();
479
- this.doUpdate();
475
+ void this.doUpdate();
480
476
  }
481
477
  };
482
478
 
@@ -486,7 +482,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
486
482
  }
487
483
 
488
484
  this.#viewProps.inspectElementToggled = ev.data;
489
- this.doUpdate();
485
+ void this.doUpdate();
490
486
  };
491
487
 
492
488
  #handleDOMNodeFlavorChange = (ev: Common.EventTarget.EventTargetEvent<SDK.DOMModel.DOMNode>): void => {
@@ -538,10 +534,10 @@ export class FreestylerPanel extends UI.Panel.Panel {
538
534
  }
539
535
 
540
536
  this.#viewProps.state = nextChatUiState;
541
- this.doUpdate();
537
+ void this.doUpdate();
542
538
  };
543
539
 
544
- doUpdate(): void {
540
+ override async doUpdate(): Promise<void> {
545
541
  this.#updateToolbarState();
546
542
  this.view(this.#viewProps, this.#viewOutput, this.#contentContainer);
547
543
  }
@@ -633,18 +629,21 @@ export class FreestylerPanel extends UI.Panel.Panel {
633
629
  return;
634
630
  }
635
631
 
632
+ let newAgent = false;
636
633
  if (!this.#currentAgent || this.#currentAgent.type !== targetAgentType || this.#currentAgent.isHistoryEntry ||
637
634
  targetAgentType === AgentType.DRJONES_PERFORMANCE) {
638
635
  this.#currentAgent = this.#createAgent(targetAgentType);
636
+ newAgent = true;
639
637
  }
640
638
  this.#viewProps.agentType = this.#currentAgent.type;
641
639
  this.#viewOutput.freestylerChatUi?.focusTextInput();
642
- Host.userMetrics.actionTaken(Host.UserMetrics.Action.FreestylerOpenedFromElementsPanelFloatingButton);
643
- this.#viewProps.messages = [];
644
640
  this.#onContextSelectionChanged();
645
- this.doUpdate();
646
- this.#viewProps.isReadOnly = false;
647
- void this.#doConversation(this.#currentAgent.runFromHistory());
641
+ void this.doUpdate();
642
+ if (newAgent) {
643
+ this.#viewProps.messages = [];
644
+ this.#viewProps.isReadOnly = false;
645
+ void this.#doConversation(this.#currentAgent.runFromHistory());
646
+ }
648
647
  }
649
648
 
650
649
  #onHistoryClicked(event: Event): void {
@@ -652,6 +651,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
652
651
  const contextMenu = new UI.ContextMenu.ContextMenu(event, {
653
652
  x: boundingRect.left,
654
653
  y: boundingRect.bottom,
654
+ useSoftMenu: true,
655
655
  });
656
656
 
657
657
  for (const agent of [...this.#agents].reverse()) {
@@ -693,20 +693,24 @@ export class FreestylerPanel extends UI.Panel.Panel {
693
693
  this.#currentAgent = undefined;
694
694
  this.#viewProps.messages = [];
695
695
  this.#viewProps.agentType = undefined;
696
- this.doUpdate();
696
+ this.#runAbortController.abort();
697
+ void AiHistoryStorage.instance().deleteAll();
698
+ void this.doUpdate();
697
699
  }
698
700
 
699
701
  #onDeleteClicked(): void {
700
702
  if (this.#currentAgent) {
701
703
  this.#agents.delete(this.#currentAgent);
704
+ void AiHistoryStorage.instance().deleteHistoryEntry(this.#currentAgent.id);
702
705
  this.#currentAgent = undefined;
706
+ this.#cancel();
703
707
  }
704
708
 
705
709
  this.#viewProps.messages = [];
706
710
 
707
711
  this.#selectDefaultAgentIfNeeded();
708
712
  this.#onContextSelectionChanged();
709
- this.doUpdate();
713
+ void this.doUpdate();
710
714
  UI.ARIAUtils.alert(i18nString(UIStrings.chatDeleted));
711
715
  }
712
716
 
@@ -723,44 +727,56 @@ export class FreestylerPanel extends UI.Panel.Panel {
723
727
  await this.#doConversation(agent.runFromHistory());
724
728
  }
725
729
 
726
- #newChat(): void {
730
+ #handleNewChatRequest(): void {
727
731
  this.#viewProps.messages = [];
728
732
  this.#viewProps.isLoading = false;
729
733
  this.#currentAgent = undefined;
730
734
  this.#cancel();
731
735
 
732
736
  this.#selectDefaultAgentIfNeeded();
733
- this.doUpdate();
737
+ void this.doUpdate();
734
738
  UI.ARIAUtils.alert(i18nString(UIStrings.newChatCreated));
735
739
  }
736
740
 
741
+ #handleCrossOriginChatCancellation(): void {
742
+ if (this.#previousSameOriginContext) {
743
+ this.#onContextSelectionChanged(this.#previousSameOriginContext);
744
+ }
745
+ }
746
+
737
747
  #runAbortController = new AbortController();
738
748
  #cancel(): void {
739
749
  this.#runAbortController.abort();
740
750
  this.#viewProps.isLoading = false;
741
- this.doUpdate();
751
+ void this.doUpdate();
742
752
  }
743
753
 
744
- #onContextSelectionChanged(): void {
754
+ #onContextSelectionChanged(contextToRestore?: ConversationContext<unknown>): void {
745
755
  if (!this.#currentAgent) {
746
756
  this.#viewProps.blockedByCrossOrigin = false;
747
- this.doUpdate();
757
+ void this.doUpdate();
748
758
  return;
749
759
  }
750
- const currentContext = this.#getConversationContext();
760
+ const currentContext = contextToRestore ?? this.#getConversationContext();
751
761
  this.#viewProps.selectedContext = currentContext;
752
762
  if (!currentContext) {
753
763
  this.#viewProps.blockedByCrossOrigin = false;
754
764
  this.#viewProps.requiresNewConversation = false;
755
- this.doUpdate();
765
+ void this.doUpdate();
756
766
  return;
757
767
  }
758
768
  this.#viewProps.blockedByCrossOrigin = !currentContext.isOriginAllowed(this.#currentAgent.origin);
769
+ if (!this.#viewProps.blockedByCrossOrigin) {
770
+ this.#previousSameOriginContext = currentContext;
771
+ }
772
+ if (this.#viewProps.blockedByCrossOrigin && this.#previousSameOriginContext) {
773
+ this.#viewProps.onCancelCrossOriginChat = this.#handleCrossOriginChatCancellation.bind(this);
774
+ }
759
775
  this.#viewProps.isReadOnly = this.#currentAgent.isHistoryEntry;
760
776
  this.#viewProps.requiresNewConversation = this.#currentAgent.type === AgentType.DRJONES_PERFORMANCE &&
761
777
  Boolean(this.#currentAgent.context) && this.#currentAgent.context !== currentContext;
762
778
  this.#viewProps.stripLinks = this.#viewProps.agentType === AgentType.DRJONES_PERFORMANCE;
763
- this.doUpdate();
779
+ void this.doUpdate();
764
780
  }
765
781
 
766
782
  #getConversationContext(): ConversationContext<unknown>|null {
@@ -813,6 +829,7 @@ export class FreestylerPanel extends UI.Panel.Panel {
813
829
  steps: [],
814
830
  };
815
831
  let step: Step = {isLoading: true};
832
+ this.#viewProps.isLoading = true;
816
833
  for await (const data of generator) {
817
834
  step.sideEffect = undefined;
818
835
  switch (data.type) {
@@ -821,7 +838,6 @@ export class FreestylerPanel extends UI.Panel.Panel {
821
838
  entity: ChatMessageEntity.USER,
822
839
  text: data.query,
823
840
  });
824
- this.#viewProps.isLoading = true;
825
841
  systemMessage = {
826
842
  entity: ChatMessageEntity.MODEL,
827
843
  steps: [],
@@ -891,13 +907,11 @@ export class FreestylerPanel extends UI.Panel.Panel {
891
907
  systemMessage.steps.pop();
892
908
  }
893
909
  step.isLoading = false;
894
- this.#viewProps.isLoading = false;
895
910
  break;
896
911
  }
897
912
  case ResponseType.ERROR: {
898
913
  systemMessage.error = data.error;
899
914
  systemMessage.rpcId = undefined;
900
- this.#viewProps.isLoading = false;
901
915
  const lastStep = systemMessage.steps.at(-1);
902
916
  if (lastStep) {
903
917
  // Mark the last step as cancelled to make the UI feel better.
@@ -911,9 +925,20 @@ export class FreestylerPanel extends UI.Panel.Panel {
911
925
  }
912
926
  }
913
927
 
914
- this.doUpdate();
915
- this.#viewOutput.freestylerChatUi?.scrollToLastMessage();
928
+ void this.doUpdate();
929
+
930
+ // This handles scrolling to the bottom for live conversations when:
931
+ // * User submits the query & the context step is shown.
932
+ // * There is a side effect dialog shown.
933
+ if (!this.#viewProps.isReadOnly &&
934
+ (data.type === ResponseType.CONTEXT || data.type === ResponseType.SIDE_EFFECT)) {
935
+ this.#viewOutput.freestylerChatUi?.scrollToBottom();
936
+ }
916
937
  }
938
+
939
+ this.#viewProps.isLoading = false;
940
+ this.#viewOutput.freestylerChatUi?.finishTextAnimations();
941
+ void this.doUpdate();
917
942
  }
918
943
  }
919
944
 
@@ -21,7 +21,7 @@ import {AgentType, type ContextDetail, type ConversationContext, ErrorType} from
21
21
  import freestylerChatUiStyles from './freestylerChatUi.css.js';
22
22
  import type {UserActionRowProps} from './UserActionRow.js';
23
23
 
24
- const {html, Directives: {ifDefined}} = LitHtml;
24
+ const {html, Directives: {ifDefined, ref}} = LitHtml;
25
25
 
26
26
  const UIStrings = {
27
27
  /**
@@ -222,6 +222,8 @@ const str_ = i18n.i18n.registerUIStrings('panels/freestyler/components/Freestyle
222
222
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
223
223
  const lockedString = i18n.i18n.lockedString;
224
224
 
225
+ const SCROLL_ROUNDING_OFFSET = 1;
226
+
225
227
  export interface Step {
226
228
  isLoading: boolean;
227
229
  thought?: string;
@@ -269,6 +271,7 @@ export interface Props {
269
271
  onCancelClick: () => void;
270
272
  onContextClick: () => void | Promise<void>;
271
273
  onNewConversation: () => void;
274
+ onCancelCrossOriginChat?: () => void;
272
275
  inspectElementToggled: boolean;
273
276
  state: State;
274
277
  aidaAvailability: Host.AidaClient.AidaAccessPreconditions;
@@ -339,6 +342,20 @@ export class FreestylerChatUi extends HTMLElement {
339
342
  #markdownRenderer = new MarkdownRendererWithCodeBlock();
340
343
  #scrollTop?: number;
341
344
  #props: Props;
345
+ #messagesContainerElement?: Element;
346
+ #mainElementRef?: LitHtml.Directives.Ref<Element> = LitHtml.Directives.createRef();
347
+ #lastAnswerMarkdownView?: MarkdownView.MarkdownView.MarkdownView;
348
+ #messagesContainerResizeObserver = new ResizeObserver(() => this.#handleMessagesContainerResize());
349
+ /**
350
+ * Indicates whether the chat scroll position should be pinned to the bottom.
351
+ *
352
+ * This is true when:
353
+ * - The scroll is at the very bottom, allowing new messages to push the scroll down automatically.
354
+ * - The panel is initially rendered and the user hasn't scrolled yet.
355
+ *
356
+ * It is set to false when the user scrolls up to view previous messages.
357
+ */
358
+ #pinScrollToBottom = true;
342
359
 
343
360
  constructor(props: Props) {
344
361
  super();
@@ -354,6 +371,14 @@ export class FreestylerChatUi extends HTMLElement {
354
371
  connectedCallback(): void {
355
372
  this.#shadow.adoptedStyleSheets = [freestylerChatUiStyles];
356
373
  this.#render();
374
+
375
+ if (this.#messagesContainerElement) {
376
+ this.#messagesContainerResizeObserver.observe(this.#messagesContainerElement);
377
+ }
378
+ }
379
+
380
+ disconnectedCallback(): void {
381
+ this.#messagesContainerResizeObserver.disconnect();
357
382
  }
358
383
 
359
384
  focusTextInput(): void {
@@ -370,20 +395,41 @@ export class FreestylerChatUi extends HTMLElement {
370
395
  return;
371
396
  }
372
397
 
373
- const scrollContainer = this.#shadow.querySelector('.chat-ui main') as HTMLElement;
374
- if (!scrollContainer) {
398
+ if (!this.#mainElementRef?.value) {
399
+ return;
400
+ }
401
+
402
+ this.#mainElementRef.value.scrollTop = this.#scrollTop;
403
+ }
404
+
405
+ finishTextAnimations(): void {
406
+ if (!this.#lastAnswerMarkdownView) {
407
+ return;
408
+ }
409
+
410
+ this.#lastAnswerMarkdownView.finishAnimations();
411
+ }
412
+
413
+ scrollToBottom(): void {
414
+ if (!this.#mainElementRef?.value) {
375
415
  return;
376
416
  }
377
417
 
378
- scrollContainer.scrollTop = this.#scrollTop;
418
+ this.#mainElementRef.value.scrollTop = this.#mainElementRef.value.scrollHeight;
379
419
  }
380
420
 
381
- scrollToLastMessage(): void {
382
- const message = this.#shadow.querySelector('.chat-message:last-child') as HTMLDivElement;
383
- if (!message) {
421
+ #handleMessagesContainerResize(): void {
422
+ if (!this.#pinScrollToBottom) {
384
423
  return;
385
424
  }
386
- message.scrollIntoViewIfNeeded();
425
+
426
+ if (!this.#mainElementRef?.value) {
427
+ return;
428
+ }
429
+
430
+ if (this.#pinScrollToBottom) {
431
+ this.#mainElementRef.value.scrollTop = this.#mainElementRef.value.scrollHeight;
432
+ }
387
433
  }
388
434
 
389
435
  #setInputText(text: string): void {
@@ -428,12 +474,36 @@ export class FreestylerChatUi extends HTMLElement {
428
474
  }
429
475
  };
430
476
 
477
+ #handleMessageContainerRef(el: Element|undefined): void {
478
+ this.#messagesContainerElement = el;
479
+
480
+ if (el) {
481
+ this.#messagesContainerResizeObserver.observe(el);
482
+ } else {
483
+ this.#pinScrollToBottom = true;
484
+ this.#messagesContainerResizeObserver.disconnect();
485
+ }
486
+ }
487
+
488
+ #handleLastAnswerMarkdownViewRef(el: Element|undefined): void {
489
+ if (!el) {
490
+ this.#lastAnswerMarkdownView = undefined;
491
+ return;
492
+ }
493
+
494
+ if (el instanceof MarkdownView.MarkdownView.MarkdownView) {
495
+ this.#lastAnswerMarkdownView = el;
496
+ }
497
+ }
498
+
431
499
  #handleScroll = (ev: Event): void => {
432
500
  if (!ev.target || !(ev.target instanceof HTMLElement)) {
433
501
  return;
434
502
  }
435
503
 
436
504
  this.#scrollTop = ev.target.scrollTop;
505
+ this.#pinScrollToBottom =
506
+ ev.target.scrollTop + ev.target.clientHeight + SCROLL_ROUNDING_OFFSET > ev.target.scrollHeight;
437
507
  };
438
508
 
439
509
  #handleSubmit = (ev: SubmitEvent): void => {
@@ -497,7 +567,10 @@ export class FreestylerChatUi extends HTMLElement {
497
567
  // clang-format on
498
568
  }
499
569
 
500
- #renderTextAsMarkdown(text: string): LitHtml.TemplateResult {
570
+ #renderTextAsMarkdown(text: string, {animate, ref: refFn}: {
571
+ animate?: boolean,
572
+ ref?: (element?: Element) => void,
573
+ } = {}): LitHtml.TemplateResult {
501
574
  let tokens = [];
502
575
  try {
503
576
  tokens = Marked.Marked.lexer(text);
@@ -517,7 +590,8 @@ export class FreestylerChatUi extends HTMLElement {
517
590
 
518
591
  // clang-format off
519
592
  return html`<devtools-markdown-view
520
- .data=${{tokens, renderer: this.#markdownRenderer} as MarkdownView.MarkdownView.MarkdownViewData}>
593
+ .data=${{tokens, renderer: this.#markdownRenderer, animationEnabled: animate} as MarkdownView.MarkdownView.MarkdownViewData}
594
+ ${refFn ? ref(refFn) : LitHtml.nothing}>
521
595
  </devtools-markdown-view>`;
522
596
  // clang-format on
523
597
  }
@@ -766,7 +840,7 @@ export class FreestylerChatUi extends HTMLElement {
766
840
  },
767
841
  )}
768
842
  ${message.answer
769
- ? html`<p>${this.#renderTextAsMarkdown(message.answer)}</p>`
843
+ ? html`<p>${this.#renderTextAsMarkdown(message.answer, { animate: !this.#props.isReadOnly, ref: this.#handleLastAnswerMarkdownViewRef })}</p>`
770
844
  : LitHtml.nothing}
771
845
  ${this.#renderError(message)}
772
846
  <div class="actions">
@@ -836,7 +910,7 @@ export class FreestylerChatUi extends HTMLElement {
836
910
  #renderMessages = (): LitHtml.TemplateResult => {
837
911
  // clang-format off
838
912
  return html`
839
- <div class="messages-container">
913
+ <div class="messages-container" ${ref(this.#handleMessageContainerRef)}>
840
914
  ${this.#props.messages.map((message, _, array) =>
841
915
  this.#renderChatMessage(message, {
842
916
  isLast: array.at(-1) === message,
@@ -885,6 +959,10 @@ export class FreestylerChatUi extends HTMLElement {
885
959
  this.#props.onNewConversation();
886
960
  }
887
961
 
962
+ #onCancelCrossOriginChat(): void {
963
+ this.#props.onCancelCrossOriginChat?.();
964
+ }
965
+
888
966
  #getEmptyStateSuggestions = (): string[] => {
889
967
  if (!this.#props.agentType) {
890
968
  return [];
@@ -965,7 +1043,7 @@ export class FreestylerChatUi extends HTMLElement {
965
1043
  // clang-format on
966
1044
  }
967
1045
 
968
- #renderChatInputButton(): LitHtml.TemplateResult {
1046
+ #renderChatInputButtons(): LitHtml.TemplateResult {
969
1047
  if (this.#props.isLoading) {
970
1048
  // clang-format off
971
1049
  return html`<devtools-button
@@ -986,19 +1064,32 @@ export class FreestylerChatUi extends HTMLElement {
986
1064
  }
987
1065
  if (this.#props.blockedByCrossOrigin || this.#props.requiresNewConversation) {
988
1066
  // clang-format off
989
- return html`<devtools-button
990
- class="chat-input-button"
991
- aria-label=${lockedString(UIStringsNotTranslate.startNewChat)}
992
- @click=${this.#onNewConversation}
993
- .data=${
994
- {
995
- variant: Buttons.Button.Variant.PRIMARY,
996
- size: Buttons.Button.Size.REGULAR,
997
- title: lockedString(UIStringsNotTranslate.startNewChat),
998
- jslogContext: 'start-new-chat',
999
- } as Buttons.Button.ButtonData
1000
- }
1001
- >${lockedString(UIStringsNotTranslate.startNewChat)}</devtools-button>`;
1067
+ return html`
1068
+ ${this.#props.blockedByCrossOrigin && Boolean(this.#props.onCancelCrossOriginChat) ? html`<devtools-button
1069
+ class="chat-cancel-context-button"
1070
+ @click=${this.#onCancelCrossOriginChat}
1071
+ .data=${
1072
+ {
1073
+ variant: Buttons.Button.Variant.TEXT,
1074
+ size: Buttons.Button.Size.REGULAR,
1075
+ jslogContext: 'cancel-cross-origin-context-chat',
1076
+ } as Buttons.Button.ButtonData
1077
+ }
1078
+ >${lockedString(UIStringsNotTranslate.cancelButtonTitle)}</devtools-button>` : LitHtml.nothing}
1079
+ <devtools-button
1080
+ class="chat-input-button"
1081
+ aria-label=${lockedString(UIStringsNotTranslate.startNewChat)}
1082
+ @click=${this.#onNewConversation}
1083
+ .data=${
1084
+ {
1085
+ variant: Buttons.Button.Variant.PRIMARY,
1086
+ size: Buttons.Button.Size.REGULAR,
1087
+ title: lockedString(UIStringsNotTranslate.startNewChat),
1088
+ jslogContext: 'start-new-chat',
1089
+ } as Buttons.Button.ButtonData
1090
+ }
1091
+ >${lockedString(UIStringsNotTranslate.startNewChat)}</devtools-button>
1092
+ `;
1002
1093
  // clang-format on
1003
1094
  }
1004
1095
  // clang-format off
@@ -1024,6 +1115,12 @@ export class FreestylerChatUi extends HTMLElement {
1024
1115
  return LitHtml.nothing;
1025
1116
  }
1026
1117
 
1118
+ const cls = LitHtml.Directives.classMap({
1119
+ 'chat-input': true,
1120
+ 'one-big-button': Boolean(this.#props.requiresNewConversation),
1121
+ 'two-big-buttons': this.#props.blockedByCrossOrigin,
1122
+ });
1123
+
1027
1124
  // clang-format off
1028
1125
  return html`
1029
1126
  <form class="input-form" @submit=${this.#handleSubmit}>
@@ -1035,14 +1132,16 @@ export class FreestylerChatUi extends HTMLElement {
1035
1132
  </div>
1036
1133
  ` : LitHtml.nothing}
1037
1134
  <div class="chat-input-container">
1038
- <textarea class="chat-input"
1135
+ <textarea class=${cls}
1039
1136
  .disabled=${this.#isTextInputDisabled()}
1040
1137
  wrap="hard"
1041
1138
  @keydown=${this.#handleTextAreaKeyDown}
1042
1139
  placeholder=${this.#getInputPlaceholderString()}
1043
1140
  jslog=${VisualLogging.textField('query').track({ keydown: 'Enter' })}
1044
1141
  ></textarea>
1045
- ${this.#renderChatInputButton()}
1142
+ <div class="chat-input-buttons">
1143
+ ${this.#renderChatInputButtons()}
1144
+ </div>
1046
1145
  </div>
1047
1146
  </form>`;
1048
1147
  // clang-format on
@@ -1226,7 +1325,7 @@ export class FreestylerChatUi extends HTMLElement {
1226
1325
  // clang-format off
1227
1326
  LitHtml.render(html`
1228
1327
  <div class="chat-ui">
1229
- <main @scroll=${this.#handleScroll}>
1328
+ <main @scroll=${this.#handleScroll} ${ref(this.#mainElementRef)}>
1230
1329
  ${this.#renderMainContents()}
1231
1330
  ${this.#props.isReadOnly ?
1232
1331
  this.#renderReadOnlySection() :
@@ -166,6 +166,7 @@ export class UserActionRow extends HTMLElement {
166
166
  }
167
167
  this.#props.onFeedbackSubmit(this.#currentRating, input.value);
168
168
  this.#isShowingFeedbackForm = false;
169
+ this.#isSubmitButtonDisabled = true;
169
170
  this.#render();
170
171
  };
171
172