chrome-devtools-frontend 1.0.1376716 → 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 (885) hide show
  1. package/.stylelintrc.json +2 -1
  2. package/config/gni/devtools_grd_files.gni +40 -11
  3. package/config/gni/devtools_image_files.gni +4 -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/animation.svg +3 -0
  12. package/front_end/Images/src/brush-2.svg +3 -0
  13. package/front_end/Images/src/cookie_off.svg +3 -0
  14. package/front_end/Images/src/domain.svg +3 -0
  15. package/front_end/core/common/Color.ts +3 -3
  16. package/front_end/core/common/SettingRegistration.ts +8 -1
  17. package/front_end/core/host/AidaClient.ts +4 -3
  18. package/front_end/core/host/InspectorFrontendHost.ts +4 -0
  19. package/front_end/core/host/InspectorFrontendHostAPI.ts +0 -1
  20. package/front_end/core/host/UserMetrics.ts +0 -8
  21. package/front_end/core/i18n/ByteUtilities.test.ts +34 -0
  22. package/front_end/core/i18n/ByteUtilities.ts +65 -0
  23. package/front_end/core/i18n/NumberFormatter.ts +75 -0
  24. package/front_end/core/i18n/i18n.ts +4 -0
  25. package/front_end/core/i18n/locales/af.json +1031 -887
  26. package/front_end/core/i18n/locales/am.json +1036 -892
  27. package/front_end/core/i18n/locales/ar.json +1039 -895
  28. package/front_end/core/i18n/locales/as.json +1032 -888
  29. package/front_end/core/i18n/locales/az.json +1034 -890
  30. package/front_end/core/i18n/locales/be.json +1031 -887
  31. package/front_end/core/i18n/locales/bg.json +1031 -887
  32. package/front_end/core/i18n/locales/bn.json +1033 -889
  33. package/front_end/core/i18n/locales/bs.json +1036 -892
  34. package/front_end/core/i18n/locales/ca.json +1031 -887
  35. package/front_end/core/i18n/locales/cs.json +1030 -886
  36. package/front_end/core/i18n/locales/cy.json +1032 -888
  37. package/front_end/core/i18n/locales/da.json +1031 -887
  38. package/front_end/core/i18n/locales/de.json +1033 -889
  39. package/front_end/core/i18n/locales/el.json +1031 -887
  40. package/front_end/core/i18n/locales/en-GB.json +1033 -889
  41. package/front_end/core/i18n/locales/es-419.json +1029 -885
  42. package/front_end/core/i18n/locales/es.json +1032 -888
  43. package/front_end/core/i18n/locales/et.json +1033 -889
  44. package/front_end/core/i18n/locales/eu.json +1031 -887
  45. package/front_end/core/i18n/locales/fa.json +1035 -891
  46. package/front_end/core/i18n/locales/fi.json +1035 -891
  47. package/front_end/core/i18n/locales/fil.json +1034 -890
  48. package/front_end/core/i18n/locales/fr-CA.json +1031 -887
  49. package/front_end/core/i18n/locales/fr.json +1049 -905
  50. package/front_end/core/i18n/locales/gl.json +1032 -888
  51. package/front_end/core/i18n/locales/gu.json +1035 -891
  52. package/front_end/core/i18n/locales/he.json +1031 -887
  53. package/front_end/core/i18n/locales/hi.json +1034 -890
  54. package/front_end/core/i18n/locales/hr.json +1031 -887
  55. package/front_end/core/i18n/locales/hu.json +1033 -889
  56. package/front_end/core/i18n/locales/hy.json +1046 -902
  57. package/front_end/core/i18n/locales/id.json +1023 -879
  58. package/front_end/core/i18n/locales/is.json +1032 -888
  59. package/front_end/core/i18n/locales/it.json +1031 -887
  60. package/front_end/core/i18n/locales/ja.json +1042 -898
  61. package/front_end/core/i18n/locales/ka.json +1034 -890
  62. package/front_end/core/i18n/locales/kk.json +1035 -891
  63. package/front_end/core/i18n/locales/km.json +1035 -891
  64. package/front_end/core/i18n/locales/kn.json +1036 -892
  65. package/front_end/core/i18n/locales/ko.json +1031 -887
  66. package/front_end/core/i18n/locales/ky.json +1032 -888
  67. package/front_end/core/i18n/locales/lo.json +1030 -886
  68. package/front_end/core/i18n/locales/lt.json +1032 -888
  69. package/front_end/core/i18n/locales/lv.json +1032 -888
  70. package/front_end/core/i18n/locales/mk.json +1032 -888
  71. package/front_end/core/i18n/locales/ml.json +1033 -889
  72. package/front_end/core/i18n/locales/mn.json +1034 -890
  73. package/front_end/core/i18n/locales/mr.json +1035 -891
  74. package/front_end/core/i18n/locales/ms.json +1033 -889
  75. package/front_end/core/i18n/locales/my.json +1033 -889
  76. package/front_end/core/i18n/locales/ne.json +1036 -892
  77. package/front_end/core/i18n/locales/nl.json +1033 -889
  78. package/front_end/core/i18n/locales/no.json +1036 -892
  79. package/front_end/core/i18n/locales/or.json +1043 -899
  80. package/front_end/core/i18n/locales/pa.json +1030 -886
  81. package/front_end/core/i18n/locales/pl.json +1032 -888
  82. package/front_end/core/i18n/locales/pt-PT.json +1033 -889
  83. package/front_end/core/i18n/locales/pt.json +1033 -889
  84. package/front_end/core/i18n/locales/ro.json +1029 -885
  85. package/front_end/core/i18n/locales/ru.json +1026 -882
  86. package/front_end/core/i18n/locales/si.json +1031 -887
  87. package/front_end/core/i18n/locales/sk.json +1033 -889
  88. package/front_end/core/i18n/locales/sl.json +1031 -887
  89. package/front_end/core/i18n/locales/sq.json +1061 -917
  90. package/front_end/core/i18n/locales/sr-Latn.json +1033 -889
  91. package/front_end/core/i18n/locales/sr.json +1033 -889
  92. package/front_end/core/i18n/locales/sv.json +1031 -887
  93. package/front_end/core/i18n/locales/sw.json +1033 -889
  94. package/front_end/core/i18n/locales/ta.json +1058 -914
  95. package/front_end/core/i18n/locales/te.json +1037 -893
  96. package/front_end/core/i18n/locales/th.json +1032 -888
  97. package/front_end/core/i18n/locales/tr.json +1031 -887
  98. package/front_end/core/i18n/locales/uk.json +1030 -886
  99. package/front_end/core/i18n/locales/ur.json +1031 -887
  100. package/front_end/core/i18n/locales/uz.json +1023 -879
  101. package/front_end/core/i18n/locales/vi.json +1032 -888
  102. package/front_end/core/i18n/locales/zh-HK.json +1032 -888
  103. package/front_end/core/i18n/locales/zh-TW.json +1032 -888
  104. package/front_end/core/i18n/locales/zh.json +1033 -889
  105. package/front_end/core/i18n/locales/zu.json +1032 -888
  106. package/front_end/core/i18n/time-utilities.test.ts +20 -2
  107. package/front_end/core/i18n/time-utilities.ts +125 -86
  108. package/front_end/core/platform/NumberUtilities.test.ts +3 -26
  109. package/front_end/core/platform/NumberUtilities.ts +0 -20
  110. package/front_end/core/root/Runtime.ts +6 -4
  111. package/front_end/core/sdk/CPUThrottlingManager.ts +4 -0
  112. package/front_end/core/sdk/CSSContainerQuery.test.ts +10 -16
  113. package/front_end/core/sdk/CSSContainerQuery.ts +3 -15
  114. package/front_end/core/sdk/CSSMatchedStyles.test.ts +4 -0
  115. package/front_end/core/sdk/CSSMatchedStyles.ts +5 -5
  116. package/front_end/core/sdk/CSSModel.ts +18 -0
  117. package/front_end/core/sdk/CSSPropertyParser.test.ts +16 -1
  118. package/front_end/core/sdk/CSSPropertyParser.ts +2 -2
  119. package/front_end/core/sdk/NetworkManager.test.ts +50 -0
  120. package/front_end/core/sdk/NetworkManager.ts +6 -4
  121. package/front_end/core/sdk/SourceMap.test.ts +5 -5
  122. package/front_end/core/sdk/SourceMapScopeChainEntry.test.ts +7 -2
  123. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +2 -2
  124. package/front_end/core/sdk/SourceMapScopes.test.ts +112 -45
  125. package/front_end/core/sdk/SourceMapScopes.ts +39 -14
  126. package/front_end/core/sdk/SourceMapScopesInfo.test.ts +51 -50
  127. package/front_end/core/sdk/SourceMapScopesInfo.ts +1 -1
  128. package/front_end/core/sdk/sdk-meta.ts +35 -0
  129. package/front_end/devtools_compatibility.js +0 -1
  130. package/front_end/entrypoints/devtools_app/devtools_app.ts +1 -0
  131. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +3 -3
  132. package/front_end/entrypoints/inspector_main/renderingOptions.css +1 -1
  133. package/front_end/entrypoints/main/ExecutionContextSelector.test.ts +13 -3
  134. package/front_end/entrypoints/main/ExecutionContextSelector.ts +23 -1
  135. package/front_end/entrypoints/main/MainImpl.ts +0 -5
  136. package/front_end/generated/ARIAProperties.js +4 -0
  137. package/front_end/generated/Deprecation.ts +0 -15
  138. package/front_end/generated/InspectorBackendCommands.js +9 -7
  139. package/front_end/generated/SupportedCSSProperties.js +14 -41
  140. package/front_end/generated/protocol-mapping.d.ts +15 -1
  141. package/front_end/generated/protocol-proxy-api.d.ts +14 -1
  142. package/front_end/generated/protocol.ts +27 -2
  143. package/front_end/models/bindings/IgnoreListManager.ts +25 -2
  144. package/front_end/models/crux-manager/CrUXManager.test.ts +25 -6
  145. package/front_end/models/crux-manager/CrUXManager.ts +23 -4
  146. package/front_end/models/extensions/ExtensionAPI.ts +9 -1
  147. package/front_end/models/extensions/ExtensionServer.test.ts +14 -0
  148. package/front_end/models/extensions/ExtensionServer.ts +28 -15
  149. package/front_end/models/heap_snapshot_model/HeapSnapshotModel.ts +2 -0
  150. package/front_end/models/issues_manager/CookieIssue.ts +79 -2
  151. package/front_end/models/issues_manager/IssuesManager.ts +1 -1
  152. package/front_end/models/issues_manager/descriptions/cookieExcludePortMismatch.md +8 -0
  153. package/front_end/models/issues_manager/descriptions/cookieExcludeSchemeMismatch.md +7 -0
  154. package/front_end/models/javascript_metadata/NativeFunctions.js +22 -25
  155. package/front_end/models/live-metrics/web-vitals-injected/{rollup.config.js → rollup.config.mjs} +1 -1
  156. package/front_end/models/persistence/EditFileSystemView.ts +20 -10
  157. package/front_end/models/persistence/WorkspaceSettingsTab.ts +50 -54
  158. package/front_end/models/persistence/editFileSystemView.css +38 -15
  159. package/front_end/models/persistence/workspaceSettingsTab.css +21 -87
  160. package/front_end/models/timeline_model/timeline_model.ts +0 -6
  161. package/front_end/models/trace/Processor.test.ts +18 -17
  162. package/front_end/models/trace/Processor.ts +10 -14
  163. package/front_end/models/trace/README.md +0 -1
  164. package/front_end/models/trace/extras/Metadata.test.ts +35 -2
  165. package/front_end/models/trace/extras/Metadata.ts +24 -5
  166. package/front_end/models/{timeline_model → trace/extras}/TimelineJSProfile.ts +19 -29
  167. package/front_end/models/{timeline_model/TimelineModelFilter.test.ts → trace/extras/TraceFilter.test.ts} +15 -17
  168. package/front_end/models/trace/extras/TraceFilter.ts +62 -0
  169. package/front_end/models/{timeline_model/TimelineProfileTree.test.ts → trace/extras/TraceTree.test.ts} +44 -43
  170. package/front_end/models/{timeline_model/TimelineProfileTree.ts → trace/extras/TraceTree.ts} +86 -70
  171. package/front_end/models/trace/extras/URLForEntry.ts +6 -5
  172. package/front_end/models/trace/extras/extras.ts +3 -0
  173. package/front_end/models/trace/handlers/AnimationHandler.ts +0 -8
  174. package/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +1 -11
  175. package/front_end/models/trace/handlers/FramesHandler.test.ts +1 -6
  176. package/front_end/models/trace/handlers/FramesHandler.ts +1 -14
  177. package/front_end/models/trace/handlers/GPUHandler.test.ts +0 -2
  178. package/front_end/models/trace/handlers/GPUHandler.ts +1 -25
  179. package/front_end/models/trace/handlers/ImagePaintingHandler.ts +15 -0
  180. package/front_end/models/trace/handlers/InitiatorsHandler.test.ts +0 -1
  181. package/front_end/models/trace/handlers/InitiatorsHandler.ts +0 -20
  182. package/front_end/models/trace/handlers/InvalidationsHandler.test.ts +0 -1
  183. package/front_end/models/trace/handlers/InvalidationsHandler.ts +0 -18
  184. package/front_end/models/trace/handlers/LargestImagePaintHandler.test.ts +2 -2
  185. package/front_end/models/trace/handlers/LargestImagePaintHandler.ts +63 -3
  186. package/front_end/models/trace/handlers/LargestTextPaintHandler.ts +3 -0
  187. package/front_end/models/trace/handlers/LayerTreeHandler.test.ts +0 -2
  188. package/front_end/models/trace/handlers/LayerTreeHandler.ts +1 -18
  189. package/front_end/models/trace/handlers/LayoutShiftsHandler.test.ts +0 -3
  190. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +1 -20
  191. package/front_end/models/trace/handlers/MemoryHandler.test.ts +0 -1
  192. package/front_end/models/trace/handlers/MemoryHandler.ts +3 -0
  193. package/front_end/models/trace/handlers/MetaHandler.test.ts +1 -32
  194. package/front_end/models/trace/handlers/MetaHandler.ts +2 -30
  195. package/front_end/models/trace/handlers/NetworkRequestsHandler.test.ts +0 -26
  196. package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +4 -23
  197. package/front_end/models/trace/handlers/PageFramesHandler.ts +3 -0
  198. package/front_end/models/trace/handlers/RendererHandler.test.ts +0 -4
  199. package/front_end/models/trace/handlers/RendererHandler.ts +1 -24
  200. package/front_end/models/trace/handlers/SamplesHandler.test.ts +0 -5
  201. package/front_end/models/trace/handlers/SamplesHandler.ts +0 -26
  202. package/front_end/models/trace/handlers/ScreenshotsHandler.test.ts +0 -1
  203. package/front_end/models/trace/handlers/SelectorStatsHandler.ts +3 -0
  204. package/front_end/models/trace/handlers/ServerTimingsHandler.ts +1 -16
  205. package/front_end/models/trace/handlers/Threads.test.ts +1 -2
  206. package/front_end/models/trace/handlers/UserInteractionsHandler.test.ts +4 -27
  207. package/front_end/models/trace/handlers/UserInteractionsHandler.ts +16 -25
  208. package/front_end/models/trace/handlers/UserTimingsHandler.ts +0 -17
  209. package/front_end/models/trace/handlers/WorkersHandler.test.ts +0 -1
  210. package/front_end/models/trace/handlers/WorkersHandler.ts +0 -23
  211. package/front_end/models/trace/handlers/types.ts +1 -8
  212. package/front_end/models/trace/helpers/Timing.ts +8 -0
  213. package/front_end/models/trace/insights/{CumulativeLayoutShift.test.ts → CLSCulprits.test.ts} +21 -21
  214. package/front_end/models/trace/insights/{CumulativeLayoutShift.ts → CLSCulprits.ts} +32 -5
  215. package/front_end/models/trace/insights/Common.ts +5 -55
  216. package/front_end/models/trace/insights/DocumentLatency.test.ts +2 -2
  217. package/front_end/models/trace/insights/DocumentLatency.ts +39 -6
  218. package/front_end/models/trace/insights/FontDisplay.ts +31 -5
  219. package/front_end/models/trace/insights/ImageDelivery.test.ts +98 -0
  220. package/front_end/models/trace/insights/ImageDelivery.ts +183 -0
  221. package/front_end/models/trace/insights/InteractionToNextPaint.test.ts +1 -1
  222. package/front_end/models/trace/insights/InteractionToNextPaint.ts +32 -6
  223. package/front_end/models/trace/insights/LCPDiscovery.test.ts +58 -0
  224. package/front_end/models/trace/insights/LCPDiscovery.ts +122 -0
  225. package/front_end/models/trace/insights/{LargestContentfulPaint.test.ts → LCPPhases.test.ts} +6 -28
  226. package/front_end/models/trace/insights/{LargestContentfulPaint.ts → LCPPhases.ts} +59 -38
  227. package/front_end/models/trace/insights/{InsightRunners.ts → Models.ts} +5 -3
  228. package/front_end/models/trace/insights/RenderBlocking.test.ts +1 -1
  229. package/front_end/models/trace/insights/RenderBlocking.ts +41 -28
  230. package/front_end/models/trace/insights/SlowCSSSelector.ts +33 -5
  231. package/front_end/models/trace/insights/{ThirdPartyWeb.test.ts → ThirdParties.test.ts} +3 -3
  232. package/front_end/models/trace/insights/{ThirdPartyWeb.ts → ThirdParties.ts} +32 -5
  233. package/front_end/models/trace/insights/Viewport.test.ts +1 -1
  234. package/front_end/models/trace/insights/Viewport.ts +40 -9
  235. package/front_end/models/trace/insights/insights.ts +1 -1
  236. package/front_end/models/trace/insights/types.ts +22 -9
  237. package/front_end/models/trace/types/File.ts +7 -0
  238. package/front_end/models/trace/types/TraceEvents.ts +60 -24
  239. package/front_end/panels/animation/AnimationTimeline.ts +2 -4
  240. package/front_end/panels/application/ApplicationPanelSidebar.test.ts +0 -5
  241. package/front_end/panels/application/ApplicationPanelSidebar.ts +15 -21
  242. package/front_end/panels/application/IndexedDBViews.ts +4 -1
  243. package/front_end/panels/application/ServiceWorkerCacheViews.ts +4 -1
  244. package/front_end/panels/application/SharedStorageItemsView.test.ts +3 -3
  245. package/front_end/panels/application/SharedStorageItemsView.ts +5 -3
  246. package/front_end/panels/application/StorageView.test.ts +1 -1
  247. package/front_end/panels/application/StorageView.ts +3 -3
  248. package/front_end/panels/application/components/StorageMetadataView.ts +1 -2
  249. package/front_end/panels/application/resourcesSidebar.css +1 -1
  250. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +1 -1
  251. package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +1 -1
  252. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +35 -32
  253. package/front_end/panels/browser_debugger/categorizedBreakpointsSidebarPane.css +1 -1
  254. package/front_end/panels/browser_debugger/xhrBreakpointsSidebarPane.css +1 -1
  255. package/front_end/panels/console/ConsoleViewMessage.test.ts +25 -0
  256. package/front_end/panels/console/ConsoleViewMessage.ts +23 -0
  257. package/front_end/panels/coverage/CoverageListView.ts +1 -1
  258. package/front_end/panels/coverage/CoverageView.ts +3 -3
  259. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +1 -1
  260. package/front_end/panels/elements/ClassesPaneWidget.ts +1 -1
  261. package/front_end/panels/elements/ComputedStyleModel.ts +9 -2
  262. package/front_end/panels/elements/ComputedStyleWidget.test.ts +72 -0
  263. package/front_end/panels/elements/ComputedStyleWidget.ts +12 -0
  264. package/front_end/panels/elements/ElementStatePaneWidget.test.ts +85 -30
  265. package/front_end/panels/elements/ElementStatePaneWidget.ts +49 -26
  266. package/front_end/panels/elements/ElementsSidebarPane.ts +3 -3
  267. package/front_end/panels/elements/ElementsTreeElement.ts +25 -11
  268. package/front_end/panels/elements/LayersWidget.ts +1 -1
  269. package/front_end/panels/elements/MetricsSidebarPane.ts +12 -7
  270. package/front_end/panels/elements/PropertyMatchers.test.ts +7 -0
  271. package/front_end/panels/elements/PropertyMatchers.ts +6 -0
  272. package/front_end/panels/elements/StylePropertiesSection.ts +15 -6
  273. package/front_end/panels/elements/StylePropertyTreeElement.test.ts +3 -1
  274. package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -3
  275. package/front_end/panels/elements/classesPaneWidget.css +1 -1
  276. package/front_end/panels/elements/stylePropertiesTreeOutline.css +2 -2
  277. package/front_end/panels/emulation/DeviceModeView.ts +1 -1
  278. package/front_end/panels/emulation/DeviceModeWrapper.ts +1 -1
  279. package/front_end/panels/emulation/InspectedPagePlaceholder.ts +1 -1
  280. package/front_end/panels/explain/components/ConsoleInsight.ts +8 -18
  281. package/front_end/panels/freestyler/AiAgent.test.ts +376 -50
  282. package/front_end/panels/freestyler/AiAgent.ts +251 -144
  283. package/front_end/panels/freestyler/AiHistoryStorage.test.ts +159 -0
  284. package/front_end/panels/freestyler/AiHistoryStorage.ts +73 -0
  285. package/front_end/panels/freestyler/DrJonesFileAgent.test.ts +113 -38
  286. package/front_end/panels/freestyler/DrJonesFileAgent.ts +56 -34
  287. package/front_end/panels/freestyler/DrJonesNetworkAgent.test.ts +29 -20
  288. package/front_end/panels/freestyler/DrJonesNetworkAgent.ts +39 -18
  289. package/front_end/panels/freestyler/DrJonesPerformanceAgent.test.ts +44 -42
  290. package/front_end/panels/freestyler/DrJonesPerformanceAgent.ts +51 -22
  291. package/front_end/panels/freestyler/FreestylerAgent.test.ts +210 -28
  292. package/front_end/panels/freestyler/FreestylerAgent.ts +65 -26
  293. package/front_end/panels/freestyler/FreestylerPanel.test.ts +610 -39
  294. package/front_end/panels/freestyler/FreestylerPanel.ts +414 -255
  295. package/front_end/panels/freestyler/components/FreestylerChatUi.test.ts +126 -34
  296. package/front_end/panels/freestyler/components/FreestylerChatUi.ts +431 -280
  297. package/front_end/panels/freestyler/components/UserActionRow.ts +157 -47
  298. package/front_end/panels/freestyler/components/freestylerChatUi.css +90 -35
  299. package/front_end/panels/freestyler/components/userActionRow.css +41 -67
  300. package/front_end/panels/freestyler/freestyler-meta.ts +3 -11
  301. package/front_end/panels/freestyler/freestyler.ts +1 -0
  302. package/front_end/panels/issues/IssueAggregator.test.ts +50 -0
  303. package/front_end/panels/issues/IssueAggregator.ts +10 -10
  304. package/front_end/panels/issues/components/HideIssuesMenu.ts +2 -11
  305. package/front_end/panels/issues/issuesTree.css +1 -1
  306. package/front_end/panels/layer_viewer/LayerDetailsView.ts +2 -3
  307. package/front_end/panels/layer_viewer/Layers3DView.ts +1 -1
  308. package/front_end/panels/layer_viewer/PaintProfilerView.ts +6 -6
  309. package/front_end/panels/layers/LayersPanel.ts +1 -1
  310. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +46 -0
  311. package/front_end/panels/lighthouse/lighthouseStartView.css +1 -1
  312. package/front_end/panels/media/TickingFlameChart.ts +1 -1
  313. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +26 -17
  314. package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +25 -19
  315. package/front_end/panels/network/BinaryResourceView.ts +6 -7
  316. package/front_end/panels/network/BlockedURLsPane.ts +1 -1
  317. package/front_end/panels/network/EventSourceMessagesView.ts +1 -1
  318. package/front_end/panels/network/NetworkDataGridNode.ts +4 -3
  319. package/front_end/panels/network/NetworkLogView.test.ts +1 -1
  320. package/front_end/panels/network/NetworkLogView.ts +7 -8
  321. package/front_end/panels/network/NetworkPanel.ts +40 -32
  322. package/front_end/panels/network/NetworkWaterfallColumn.ts +1 -1
  323. package/front_end/panels/network/RequestTimingView.test.ts +35 -1
  324. package/front_end/panels/network/RequestTimingView.ts +96 -0
  325. package/front_end/panels/network/ResourceWebSocketFrameView.ts +2 -2
  326. package/front_end/panels/network/networkTimingTable.css +2 -1
  327. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +1 -1
  328. package/front_end/panels/profiler/HeapProfileView.ts +10 -10
  329. package/front_end/panels/profiler/HeapSnapshotView.ts +2 -2
  330. package/front_end/panels/profiler/HeapTimelineOverview.ts +13 -13
  331. package/front_end/panels/profiler/IsolateSelector.ts +4 -5
  332. package/front_end/panels/profiler/LiveHeapProfileView.ts +3 -1
  333. package/front_end/panels/profiler/ProfileFlameChartDataProvider.ts +4 -4
  334. package/front_end/panels/profiler/ProfileSidebarTreeElement.ts +7 -6
  335. package/front_end/panels/profiler/ProfileView.ts +3 -3
  336. package/front_end/panels/profiler/profileLauncherView.css +1 -1
  337. package/front_end/panels/profiler/profilesSidebarTree.css +1 -1
  338. package/front_end/panels/recorder/components/RecordingView.ts +2 -2
  339. package/front_end/panels/recorder/injected/{rollup.config.js → rollup.config.mjs} +1 -1
  340. package/front_end/panels/recorder/recorderController.css +1 -5
  341. package/front_end/panels/security/CookieControlsTreeElement.ts +18 -0
  342. package/front_end/panels/security/CookieControlsView.test.ts +29 -0
  343. package/front_end/panels/security/CookieControlsView.ts +265 -0
  344. package/front_end/panels/security/CookieReportTreeElement.ts +1 -9
  345. package/front_end/panels/security/CookieReportView.test.ts +157 -0
  346. package/front_end/panels/security/CookieReportView.ts +316 -0
  347. package/front_end/panels/security/SecurityPanel.ts +12 -4
  348. package/front_end/panels/security/SecurityPanelSidebar.ts +6 -1
  349. package/front_end/panels/security/cookieControlsView.css +101 -0
  350. package/front_end/panels/security/cookieReportView.css +69 -0
  351. package/front_end/panels/security/security.ts +4 -0
  352. package/front_end/panels/security/sidebar.css +2 -3
  353. package/front_end/panels/sensors/LocationsSettingsTab.ts +26 -11
  354. package/front_end/panels/sensors/locationsSettingsTab.css +18 -18
  355. package/front_end/panels/settings/AISettingsTab.ts +6 -15
  356. package/front_end/panels/settings/KeybindsSettingsTab.ts +4 -3
  357. package/front_end/panels/settings/SettingsScreen.ts +64 -55
  358. package/front_end/panels/settings/aiSettingsTab.css +3 -14
  359. package/front_end/panels/settings/components/SyncSection.ts +1 -2
  360. package/front_end/panels/settings/components/syncSection.css +0 -10
  361. package/front_end/panels/settings/frameworkIgnoreListSettingsTab.css +4 -2
  362. package/front_end/panels/settings/keybindsSettingsTab.css +12 -10
  363. package/front_end/panels/settings/settings-meta.ts +3 -1
  364. package/front_end/panels/settings/settingsScreen.css +37 -125
  365. package/front_end/panels/sources/CallStackSidebarPane.ts +2 -2
  366. package/front_end/panels/sources/DebuggerPlugin.ts +9 -4
  367. package/front_end/panels/sources/NavigatorView.ts +12 -13
  368. package/front_end/panels/sources/navigatorTree.css +1 -1
  369. package/front_end/panels/sources/sourcesPanel.css +2 -2
  370. package/front_end/panels/timeline/ActiveFilters.ts +3 -4
  371. package/front_end/panels/timeline/AnimationsTrackAppender.ts +2 -9
  372. package/front_end/panels/timeline/AppenderUtils.ts +1 -1
  373. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +38 -41
  374. package/front_end/panels/timeline/CountersGraph.ts +2 -4
  375. package/front_end/panels/timeline/EventsTimelineTreeView.ts +7 -8
  376. package/front_end/panels/timeline/ExtensionTrackAppender.ts +4 -13
  377. package/front_end/panels/timeline/InteractionsTrackAppender.ts +3 -4
  378. package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +6 -12
  379. package/front_end/panels/timeline/README.md +2 -1
  380. package/front_end/panels/timeline/ServerTimingsTrackAppender.ts +1 -10
  381. package/front_end/panels/timeline/ThreadAppender.ts +9 -12
  382. package/front_end/panels/timeline/TimelineController.ts +14 -4
  383. package/front_end/panels/timeline/TimelineDetailsView.test.ts +3 -2
  384. package/front_end/panels/timeline/TimelineDetailsView.ts +18 -17
  385. package/front_end/panels/timeline/TimelineEventOverview.ts +3 -4
  386. package/front_end/panels/timeline/TimelineFilters.ts +3 -4
  387. package/front_end/panels/timeline/TimelineFlameChartDataProvider.test.ts +1 -1
  388. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +58 -46
  389. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +2 -3
  390. package/front_end/panels/timeline/TimelineFlameChartView.ts +54 -26
  391. package/front_end/panels/timeline/TimelineHistoryManager.test.ts +20 -15
  392. package/front_end/panels/timeline/TimelineHistoryManager.ts +46 -58
  393. package/front_end/panels/timeline/TimelineLayersView.ts +1 -1
  394. package/front_end/panels/timeline/TimelineLoader.test.ts +1 -2
  395. package/front_end/panels/timeline/TimelineLoader.ts +19 -4
  396. package/front_end/panels/timeline/TimelineMiniMap.ts +12 -2
  397. package/front_end/panels/timeline/TimelinePaintProfilerView.ts +1 -1
  398. package/front_end/panels/timeline/TimelinePanel.ts +161 -32
  399. package/front_end/panels/timeline/TimelineTreeView.test.ts +12 -13
  400. package/front_end/panels/timeline/TimelineTreeView.ts +98 -54
  401. package/front_end/panels/timeline/TimelineUIUtils.test.ts +2 -2
  402. package/front_end/panels/timeline/TimelineUIUtils.ts +56 -14
  403. package/front_end/panels/timeline/TimingsTrackAppender.ts +6 -13
  404. package/front_end/panels/timeline/components/FieldSettingsDialog.test.ts +1 -0
  405. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +6 -1
  406. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +6 -7
  407. package/front_end/panels/timeline/components/LiveMetricsView.test.ts +15 -3
  408. package/front_end/panels/timeline/components/LiveMetricsView.ts +27 -44
  409. package/front_end/panels/timeline/components/MetricCard.test.ts +1 -1
  410. package/front_end/panels/timeline/components/MetricCard.ts +46 -0
  411. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +3 -4
  412. package/front_end/panels/timeline/components/Sidebar.ts +1 -4
  413. package/front_end/panels/timeline/components/SidebarAnnotationsTab.test.ts +1 -1
  414. package/front_end/panels/timeline/components/SidebarInsightsTab.ts +1 -1
  415. package/front_end/panels/timeline/components/SidebarSingleInsightSet.test.ts +23 -35
  416. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +53 -41
  417. package/front_end/panels/timeline/components/TimelineSummary.test.ts +75 -0
  418. package/front_end/panels/timeline/components/TimelineSummary.ts +101 -0
  419. package/front_end/panels/timeline/components/Utils.test.ts +49 -0
  420. package/front_end/panels/timeline/components/Utils.ts +2 -2
  421. package/front_end/panels/timeline/components/components.ts +2 -0
  422. package/front_end/panels/timeline/components/insights/BaseInsightComponent.test.ts +84 -0
  423. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +291 -0
  424. package/front_end/panels/timeline/components/insights/CLSCulprits.ts +24 -62
  425. package/front_end/panels/timeline/components/insights/DocumentLatency.ts +43 -72
  426. package/front_end/panels/timeline/components/insights/EventRef.ts +70 -2
  427. package/front_end/panels/timeline/components/insights/FontDisplay.ts +37 -61
  428. package/front_end/panels/timeline/components/insights/Helpers.ts +5 -212
  429. package/front_end/panels/timeline/components/insights/ImageDelivery.ts +142 -0
  430. package/front_end/panels/timeline/components/insights/InteractionToNextPaint.ts +34 -69
  431. package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +52 -103
  432. package/front_end/panels/timeline/components/insights/LCPPhases.ts +31 -92
  433. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +38 -64
  434. package/front_end/panels/timeline/components/insights/SidebarInsight.ts +3 -198
  435. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +59 -95
  436. package/front_end/panels/timeline/components/insights/Table.ts +6 -3
  437. package/front_end/panels/timeline/components/insights/ThirdParties.ts +51 -78
  438. package/front_end/panels/timeline/components/insights/Viewport.ts +27 -49
  439. package/front_end/panels/timeline/components/insights/{sidebarInsight.css → baseInsightComponent.css} +9 -9
  440. package/front_end/panels/timeline/components/insights/insights.ts +4 -0
  441. package/front_end/panels/timeline/components/insights/types.ts +0 -7
  442. package/front_end/panels/timeline/components/liveMetricsView.css +10 -18
  443. package/front_end/panels/timeline/components/metricCard.css +11 -0
  444. package/front_end/panels/timeline/components/sidebarInsightsTab.css +1 -1
  445. package/front_end/panels/timeline/components/timelineSummary.css +67 -0
  446. package/front_end/panels/timeline/docs/flame_chart_migration.md +1 -1
  447. package/front_end/panels/timeline/fixtures/traces/README.md +4 -0
  448. package/front_end/panels/timeline/fixtures/traces/image-delivery.json.gz +0 -0
  449. package/front_end/panels/timeline/overlays/OverlaysImpl.test.ts +5 -5
  450. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +35 -12
  451. package/front_end/panels/timeline/timeline-meta.ts +1 -1
  452. package/front_end/panels/timeline/timelineFlameChartView.css +1 -1
  453. package/front_end/panels/timeline/timelineFlamechartPopover.css +14 -4
  454. package/front_end/panels/timeline/timelineHistoryManager.css +7 -3
  455. package/front_end/panels/timeline/timelinePanel.css +0 -1
  456. package/front_end/panels/timeline/track_appenders/CompatibilityTracksAppender.test.ts +5 -5
  457. package/front_end/panels/timeline/track_appenders/ExtensionTrackAppender.test.ts +5 -6
  458. package/front_end/panels/timeline/track_appenders/LayoutShiftsTrackAppender.test.ts +11 -2
  459. package/front_end/panels/timeline/track_appenders/ServerTimingsTrackAppender.test.ts +0 -9
  460. package/front_end/panels/timeline/track_appenders/ThreadAppender.test.ts +37 -44
  461. package/front_end/panels/timeline/track_appenders/TimingsTrackAppender.test.ts +44 -30
  462. package/front_end/panels/timeline/utils/AICallTree.test.ts +105 -0
  463. package/front_end/panels/timeline/utils/AICallTree.ts +25 -24
  464. package/front_end/panels/timeline/utils/EntryName.ts +1 -2
  465. package/front_end/panels/timeline/utils/Helpers.ts +19 -0
  466. package/front_end/panels/timeline/utils/IgnoreList.test.ts +52 -0
  467. package/front_end/panels/timeline/utils/IgnoreList.ts +68 -7
  468. package/front_end/panels/timeline/utils/SourceMapsResolver.ts +2 -0
  469. package/front_end/panels/webauthn/webauthnPane.css +1 -1
  470. package/front_end/panels/whats_new/ReleaseNote.test.ts +90 -0
  471. package/front_end/panels/whats_new/ReleaseNoteText.ts +52 -0
  472. package/front_end/panels/whats_new/ReleaseNoteView.ts +157 -0
  473. package/front_end/panels/whats_new/WhatsNewImpl.ts +102 -0
  474. package/front_end/panels/whats_new/releaseNoteView.css +121 -0
  475. package/front_end/panels/whats_new/resources/WNDT.md +6 -0
  476. package/front_end/panels/whats_new/resources/whatsnew.avif +0 -0
  477. package/front_end/panels/whats_new/whats_new-meta.ts +142 -0
  478. package/front_end/panels/whats_new/whats_new.ts +13 -0
  479. package/front_end/services/puppeteer/PuppeteerConnection.ts +4 -3
  480. package/front_end/testing/EnvironmentHelpers.ts +6 -20
  481. package/front_end/testing/InsightHelpers.ts +4 -4
  482. package/front_end/testing/SourceMapEncoder.ts +27 -11
  483. package/front_end/testing/TraceHelpers.ts +3 -2
  484. package/front_end/testing/TraceLoader.ts +6 -2
  485. package/front_end/third_party/lighthouse/README.chromium +2 -2
  486. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +1380 -1369
  487. package/front_end/third_party/lighthouse/locales/ar-XB.json +88 -85
  488. package/front_end/third_party/lighthouse/locales/ar.json +98 -95
  489. package/front_end/third_party/lighthouse/locales/bg.json +88 -85
  490. package/front_end/third_party/lighthouse/locales/ca.json +91 -88
  491. package/front_end/third_party/lighthouse/locales/cs.json +91 -88
  492. package/front_end/third_party/lighthouse/locales/da.json +94 -91
  493. package/front_end/third_party/lighthouse/locales/de.json +92 -89
  494. package/front_end/third_party/lighthouse/locales/el.json +92 -89
  495. package/front_end/third_party/lighthouse/locales/en-GB.json +89 -86
  496. package/front_end/third_party/lighthouse/locales/en-US.json +23 -20
  497. package/front_end/third_party/lighthouse/locales/en-XA.json +88 -85
  498. package/front_end/third_party/lighthouse/locales/en-XL.json +23 -20
  499. package/front_end/third_party/lighthouse/locales/es-419.json +92 -89
  500. package/front_end/third_party/lighthouse/locales/es.json +91 -88
  501. package/front_end/third_party/lighthouse/locales/fi.json +92 -89
  502. package/front_end/third_party/lighthouse/locales/fil.json +93 -90
  503. package/front_end/third_party/lighthouse/locales/fr.json +94 -91
  504. package/front_end/third_party/lighthouse/locales/he.json +97 -94
  505. package/front_end/third_party/lighthouse/locales/hi.json +92 -89
  506. package/front_end/third_party/lighthouse/locales/hr.json +90 -87
  507. package/front_end/third_party/lighthouse/locales/hu.json +90 -87
  508. package/front_end/third_party/lighthouse/locales/id.json +91 -88
  509. package/front_end/third_party/lighthouse/locales/it.json +90 -87
  510. package/front_end/third_party/lighthouse/locales/ja.json +90 -87
  511. package/front_end/third_party/lighthouse/locales/ko.json +90 -87
  512. package/front_end/third_party/lighthouse/locales/lt.json +90 -87
  513. package/front_end/third_party/lighthouse/locales/lv.json +91 -88
  514. package/front_end/third_party/lighthouse/locales/nl.json +90 -87
  515. package/front_end/third_party/lighthouse/locales/no.json +92 -89
  516. package/front_end/third_party/lighthouse/locales/pl.json +90 -87
  517. package/front_end/third_party/lighthouse/locales/pt-PT.json +111 -108
  518. package/front_end/third_party/lighthouse/locales/pt.json +97 -94
  519. package/front_end/third_party/lighthouse/locales/ro.json +94 -91
  520. package/front_end/third_party/lighthouse/locales/ru.json +93 -90
  521. package/front_end/third_party/lighthouse/locales/sk.json +93 -90
  522. package/front_end/third_party/lighthouse/locales/sl.json +91 -88
  523. package/front_end/third_party/lighthouse/locales/sr-Latn.json +91 -88
  524. package/front_end/third_party/lighthouse/locales/sr.json +91 -88
  525. package/front_end/third_party/lighthouse/locales/sv.json +92 -89
  526. package/front_end/third_party/lighthouse/locales/ta.json +101 -98
  527. package/front_end/third_party/lighthouse/locales/te.json +92 -89
  528. package/front_end/third_party/lighthouse/locales/th.json +95 -92
  529. package/front_end/third_party/lighthouse/locales/tr.json +91 -88
  530. package/front_end/third_party/lighthouse/locales/uk.json +93 -90
  531. package/front_end/third_party/lighthouse/locales/vi.json +95 -92
  532. package/front_end/third_party/lighthouse/locales/zh-HK.json +92 -89
  533. package/front_end/third_party/lighthouse/locales/zh-TW.json +98 -95
  534. package/front_end/third_party/lighthouse/locales/zh.json +96 -93
  535. package/front_end/third_party/puppeteer/README.chromium +2 -2
  536. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +10 -3
  537. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  538. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  539. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts +14 -3
  540. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.d.ts.map +1 -1
  541. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js +16 -2
  542. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/ElementHandle.js.map +1 -1
  543. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.d.ts.map +1 -1
  544. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js +3 -1
  545. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Frame.js.map +1 -1
  546. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.d.ts +1 -0
  547. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.d.ts.map +1 -1
  548. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.js +1 -0
  549. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/HTTPRequest.js.map +1 -1
  550. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts +34 -5
  551. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.d.ts.map +1 -1
  552. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js +51 -2
  553. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Input.js.map +1 -1
  554. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +4 -0
  555. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  556. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  557. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
  558. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js +10 -8
  559. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/ElementHandle.js.map +1 -1
  560. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.d.ts.map +1 -1
  561. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js +1 -1
  562. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Frame.js.map +1 -1
  563. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts +14 -4
  564. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.d.ts.map +1 -1
  565. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js +57 -23
  566. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Input.js.map +1 -1
  567. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +1 -0
  568. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  569. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +3 -0
  570. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  571. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +3 -2
  572. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  573. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +10 -4
  574. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  575. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserConnector.d.ts.map +1 -1
  576. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserConnector.js +2 -2
  577. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserConnector.js.map +1 -1
  578. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts +2 -0
  579. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  580. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js +7 -0
  581. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js.map +1 -1
  582. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts +1 -1
  583. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
  584. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js +13 -10
  585. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/ElementHandle.js.map +1 -1
  586. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.d.ts +1 -0
  587. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  588. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js +3 -0
  589. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPRequest.js.map +1 -1
  590. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.d.ts +1 -2
  591. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
  592. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.js +4 -4
  593. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/HTTPResponse.js.map +1 -1
  594. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts +15 -4
  595. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.d.ts.map +1 -1
  596. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js +55 -26
  597. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Input.js.map +1 -1
  598. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  599. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js +24 -12
  600. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/NetworkManager.js.map +1 -1
  601. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +1 -0
  602. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  603. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +3 -0
  604. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  605. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts +0 -8
  606. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
  607. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js +2 -11
  608. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/CallbackRegistry.js.map +1 -1
  609. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts +5 -0
  610. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  611. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +2 -1
  612. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  613. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js +5 -2
  614. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/ConsoleMessage.js.map +1 -1
  615. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.d.ts +30 -0
  616. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.d.ts.map +1 -0
  617. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.js +8 -0
  618. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/DownloadBehavior.js.map +1 -0
  619. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts +7 -0
  620. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.d.ts.map +1 -1
  621. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js +9 -1
  622. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/Errors.js.map +1 -1
  623. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.d.ts.map +1 -1
  624. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js +5 -3
  625. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/WaitTask.js.map +1 -1
  626. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/common.d.ts +1 -0
  627. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/common/common.d.ts.map +1 -1
  628. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts +1 -1
  629. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.d.ts.map +1 -1
  630. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js +0 -3
  631. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/environment.js.map +1 -1
  632. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
  633. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
  634. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.d.ts +1 -1
  635. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/version.js +1 -1
  636. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  637. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  638. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js +2 -2
  639. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/node/BrowserLauncher.js.map +1 -1
  640. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  641. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  642. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  643. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts +14 -0
  644. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
  645. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js +18 -0
  646. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/incremental-id-generator.js.map +1 -0
  647. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +100 -10
  648. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +291 -143
  649. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +10 -3
  650. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  651. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  652. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts +14 -3
  653. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.d.ts.map +1 -1
  654. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js +16 -2
  655. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/ElementHandle.js.map +1 -1
  656. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.d.ts.map +1 -1
  657. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js +3 -1
  658. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Frame.js.map +1 -1
  659. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.d.ts +1 -0
  660. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.d.ts.map +1 -1
  661. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.js +1 -0
  662. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/HTTPRequest.js.map +1 -1
  663. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts +34 -5
  664. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts.map +1 -1
  665. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js +51 -2
  666. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.js.map +1 -1
  667. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +4 -0
  668. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  669. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  670. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.d.ts.map +1 -1
  671. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js +10 -8
  672. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/ElementHandle.js.map +1 -1
  673. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.d.ts.map +1 -1
  674. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js +1 -1
  675. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Frame.js.map +1 -1
  676. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts +14 -4
  677. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.d.ts.map +1 -1
  678. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js +57 -23
  679. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Input.js.map +1 -1
  680. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +1 -0
  681. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  682. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +3 -0
  683. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  684. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +3 -2
  685. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  686. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +10 -4
  687. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  688. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserConnector.d.ts.map +1 -1
  689. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserConnector.js +2 -2
  690. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserConnector.js.map +1 -1
  691. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts +2 -0
  692. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  693. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js +7 -0
  694. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js.map +1 -1
  695. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts +1 -1
  696. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.d.ts.map +1 -1
  697. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js +13 -10
  698. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/ElementHandle.js.map +1 -1
  699. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.d.ts +1 -0
  700. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  701. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js +3 -0
  702. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPRequest.js.map +1 -1
  703. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.d.ts +1 -2
  704. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.d.ts.map +1 -1
  705. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.js +4 -4
  706. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/HTTPResponse.js.map +1 -1
  707. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts +15 -4
  708. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.d.ts.map +1 -1
  709. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js +55 -26
  710. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Input.js.map +1 -1
  711. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  712. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js +24 -12
  713. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/NetworkManager.js.map +1 -1
  714. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +1 -0
  715. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  716. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +3 -0
  717. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  718. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts +0 -8
  719. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.d.ts.map +1 -1
  720. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js +1 -9
  721. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/CallbackRegistry.js.map +1 -1
  722. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts +5 -0
  723. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  724. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts +2 -1
  725. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.d.ts.map +1 -1
  726. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js +5 -2
  727. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/ConsoleMessage.js.map +1 -1
  728. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.d.ts +30 -0
  729. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.d.ts.map +1 -0
  730. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.js +7 -0
  731. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/DownloadBehavior.js.map +1 -0
  732. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts +7 -0
  733. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.d.ts.map +1 -1
  734. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js +7 -0
  735. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/Errors.js.map +1 -1
  736. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.d.ts.map +1 -1
  737. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js +5 -3
  738. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/WaitTask.js.map +1 -1
  739. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/common.d.ts +1 -0
  740. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/common/common.d.ts.map +1 -1
  741. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts +1 -1
  742. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.d.ts.map +1 -1
  743. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js +0 -3
  744. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/environment.js.map +1 -1
  745. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
  746. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
  747. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.d.ts +1 -1
  748. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/version.js +1 -1
  749. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  750. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js +2 -2
  751. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/node/BrowserLauncher.js.map +1 -1
  752. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  753. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  754. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts +14 -0
  755. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.d.ts.map +1 -0
  756. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js +15 -0
  757. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/incremental-id-generator.js.map +1 -0
  758. package/front_end/third_party/puppeteer/package/lib/types.d.ts +100 -10
  759. package/front_end/third_party/puppeteer/package/package.json +5 -5
  760. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +10 -3
  761. package/front_end/third_party/puppeteer/package/src/api/ElementHandle.ts +21 -3
  762. package/front_end/third_party/puppeteer/package/src/api/Frame.ts +3 -1
  763. package/front_end/third_party/puppeteer/package/src/api/HTTPRequest.ts +1 -0
  764. package/front_end/third_party/puppeteer/package/src/api/Input.ts +57 -8
  765. package/front_end/third_party/puppeteer/package/src/api/Page.ts +5 -0
  766. package/front_end/third_party/puppeteer/package/src/bidi/ElementHandle.ts +9 -7
  767. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -0
  768. package/front_end/third_party/puppeteer/package/src/bidi/Input.ts +72 -31
  769. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +4 -0
  770. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +11 -3
  771. package/front_end/third_party/puppeteer/package/src/cdp/BrowserConnector.ts +2 -0
  772. package/front_end/third_party/puppeteer/package/src/cdp/BrowserContext.ts +11 -0
  773. package/front_end/third_party/puppeteer/package/src/cdp/ElementHandle.ts +14 -9
  774. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +4 -0
  775. package/front_end/third_party/puppeteer/package/src/cdp/HTTPResponse.ts +3 -5
  776. package/front_end/third_party/puppeteer/package/src/cdp/Input.ts +71 -26
  777. package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +34 -17
  778. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +4 -0
  779. package/front_end/third_party/puppeteer/package/src/common/CallbackRegistry.ts +1 -15
  780. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +5 -0
  781. package/front_end/third_party/puppeteer/package/src/common/ConsoleMessage.ts +8 -1
  782. package/front_end/third_party/puppeteer/package/src/common/DownloadBehavior.ts +31 -0
  783. package/front_end/third_party/puppeteer/package/src/common/Errors.ts +7 -0
  784. package/front_end/third_party/puppeteer/package/src/common/WaitTask.ts +9 -9
  785. package/front_end/third_party/puppeteer/package/src/common/common.ts +1 -0
  786. package/front_end/third_party/puppeteer/package/src/environment.ts +1 -4
  787. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  788. package/front_end/third_party/puppeteer/package/src/generated/version.ts +1 -1
  789. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +2 -0
  790. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  791. package/front_end/third_party/puppeteer/package/src/util/incremental-id-generator.ts +20 -0
  792. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +2 -0
  793. package/front_end/ui/components/buttons/Button.test.ts +14 -0
  794. package/front_end/ui/components/buttons/Button.ts +27 -4
  795. package/front_end/ui/components/cards/card.css +7 -4
  796. package/front_end/ui/components/data_grid/DataGridControllerIntegrator.ts +4 -1
  797. package/front_end/ui/components/dialogs/ButtonDialog.test.ts +78 -0
  798. package/front_end/ui/components/dialogs/ButtonDialog.ts +131 -0
  799. package/front_end/ui/components/dialogs/Dialog.test.ts +43 -0
  800. package/front_end/ui/components/dialogs/Dialog.ts +63 -3
  801. package/front_end/ui/components/dialogs/ShortcutDialog.test.ts +15 -1
  802. package/front_end/ui/components/dialogs/ShortcutDialog.ts +33 -23
  803. package/front_end/ui/components/dialogs/buttonDialog.css +9 -0
  804. package/front_end/ui/components/dialogs/dialog.css +15 -4
  805. package/front_end/ui/components/dialogs/dialogs.ts +2 -0
  806. package/front_end/ui/components/dialogs/shortcutDialog.css +58 -38
  807. package/front_end/ui/components/docs/dialog/button_dialog.html +28 -0
  808. package/front_end/ui/components/docs/dialog/button_dialog.ts +29 -0
  809. package/front_end/ui/components/docs/freestyler/basic.ts +6 -8
  810. package/front_end/ui/components/docs/freestyler/empty_state.ts +6 -8
  811. package/front_end/ui/components/docs/performance_panel/basic.ts +1 -1
  812. package/front_end/ui/components/docs/performance_panel/timeline_history_manager.ts +6 -4
  813. package/front_end/ui/components/docs/performance_panel/track_example.html +1 -1
  814. package/front_end/ui/components/floating_button/FloatingButton.ts +3 -2
  815. package/front_end/ui/components/icon_button/fileSourceIcon.css +7 -3
  816. package/front_end/ui/components/issue_counter/IssueCounter.ts +15 -2
  817. package/front_end/ui/components/legacy_wrapper/LegacyWrapper.ts +1 -1
  818. package/front_end/ui/components/markdown_view/MarkdownView.test.ts +39 -17
  819. package/front_end/ui/components/markdown_view/MarkdownView.ts +92 -14
  820. package/front_end/ui/components/markdown_view/markdownView.css +15 -0
  821. package/front_end/ui/components/render_coordinator/RenderCoordinator.ts +24 -18
  822. package/front_end/ui/components/settings/SettingCheckbox.ts +3 -2
  823. package/front_end/ui/components/switch/SwitchImpl.ts +2 -2
  824. package/front_end/ui/legacy/ContextMenu.ts +2 -2
  825. package/front_end/ui/legacy/Infobar.ts +6 -0
  826. package/front_end/ui/legacy/InplaceEditor.ts +18 -14
  827. package/front_end/ui/legacy/InspectorView.ts +40 -0
  828. package/front_end/ui/legacy/ListWidget.ts +4 -2
  829. package/front_end/ui/legacy/TabbedPane.ts +0 -14
  830. package/front_end/ui/legacy/ThrottledWidget.ts +2 -2
  831. package/front_end/ui/legacy/Toolbar.ts +3 -3
  832. package/front_end/ui/legacy/UIUtils.ts +8 -13
  833. package/front_end/ui/legacy/Widget.ts +32 -0
  834. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +7 -2
  835. package/front_end/ui/legacy/components/data_grid/DataGrid.test.ts +6 -9
  836. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +43 -38
  837. package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +21 -12
  838. package/front_end/ui/legacy/components/inline_editor/LinkSwatch.test.ts +19 -0
  839. package/front_end/ui/legacy/components/inline_editor/LinkSwatch.ts +1 -1
  840. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +1 -1
  841. package/front_end/ui/legacy/components/perf_ui/ChartViewport.ts +2 -2
  842. package/front_end/ui/legacy/components/perf_ui/FilmStripView.ts +1 -1
  843. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +37 -47
  844. package/front_end/ui/legacy/components/perf_ui/OverviewGrid.ts +129 -100
  845. package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +4 -2
  846. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.test.ts +9 -4
  847. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewCalculator.ts +23 -9
  848. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +102 -43
  849. package/front_end/ui/legacy/components/perf_ui/flameChart.css +0 -2
  850. package/front_end/ui/legacy/components/perf_ui/perf_ui-meta.ts +4 -4
  851. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.test.ts +49 -0
  852. package/front_end/ui/legacy/components/source_frame/BinaryResourceViewFactory.ts +23 -46
  853. package/front_end/ui/legacy/components/source_frame/ImageView.ts +1 -1
  854. package/front_end/ui/legacy/components/utils/ImagePreview.ts +1 -1
  855. package/front_end/ui/legacy/components/utils/jsUtils.css +8 -0
  856. package/front_end/ui/legacy/filter.css +1 -1
  857. package/front_end/ui/legacy/inspectorCommon.css +1 -1
  858. package/front_end/ui/legacy/listWidget.css +4 -1
  859. package/front_end/ui/legacy/reportView.css +1 -1
  860. package/front_end/ui/legacy/textPrompt.css +1 -1
  861. package/front_end/ui/legacy/toolbar.css +7 -11
  862. package/front_end/ui/legacy/treeoutline.css +3 -1
  863. package/front_end/ui/visual_logging/KnownContextValues.ts +186 -1
  864. package/front_end/ui/visual_logging/LoggingConfig.ts +6 -2
  865. package/front_end/ui/visual_logging/LoggingDriver.test.ts +27 -1
  866. package/front_end/ui/visual_logging/LoggingDriver.ts +7 -4
  867. package/package.json +8 -8
  868. package/scripts/build/ninja/bundle.gni +3 -3
  869. package/scripts/build/{rollup.config.js → rollup.config.mjs} +4 -4
  870. package/scripts/build/wasm-as.py +1 -1
  871. package/scripts/devtools_paths.py +8 -4
  872. package/scripts/eslint_rules/tests/check_test_definitions_test.js +8 -3
  873. package/scripts/freestyler/auto_freestyler.js +12 -4
  874. package/scripts/freestyler/to_tsv.mjs +40 -0
  875. package/scripts/tools/update_goldens.py +11 -13
  876. package/scripts/tools/update_goldens_v2.py +1 -1
  877. package/front_end/models/timeline_model/TimelineModelFilter.ts +0 -61
  878. package/front_end/panels/timeline/components/insights/SidebarInsight.test.ts +0 -72
  879. package/front_end/ui/components/docs/two_states_counter/basic.html +0 -27
  880. package/front_end/ui/components/docs/two_states_counter/basic.ts +0 -45
  881. package/front_end/ui/components/two_states_counter/TwoStatesCounter.test.ts +0 -73
  882. package/front_end/ui/components/two_states_counter/TwoStatesCounter.ts +0 -104
  883. package/front_end/ui/components/two_states_counter/twoStatesCounter.css +0 -37
  884. package/front_end/ui/components/two_states_counter/two_states_counter.ts +0 -9
  885. /package/front_end/Images/{rollup.config.js → rollup.config.mjs} +0 -0
@@ -9,9 +9,6 @@ import * as Common from '../../../core/common/common.js';
9
9
  import * as Host from '../../../core/host/host.js';
10
10
  import * as i18n from '../../../core/i18n/i18n.js';
11
11
  import type * as Platform from '../../../core/platform/platform.js';
12
- import * as SDK from '../../../core/sdk/sdk.js';
13
- import type * as Workspace from '../../../models/workspace/workspace.js';
14
- import * as TimelineUtils from '../../../panels/timeline/utils/utils.js';
15
12
  import * as Marked from '../../../third_party/marked/marked.js';
16
13
  import * as Buttons from '../../../ui/components/buttons/buttons.js';
17
14
  import type * as IconButton from '../../../ui/components/icon_button/icon_button.js';
@@ -19,13 +16,12 @@ import * as MarkdownView from '../../../ui/components/markdown_view/markdown_vie
19
16
  import * as UI from '../../../ui/legacy/legacy.js';
20
17
  import * as LitHtml from '../../../ui/lit-html/lit-html.js';
21
18
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
22
- import {PanelUtils} from '../../utils/utils.js';
23
- import {AgentType, type ContextDetail, ErrorType} from '../AiAgent.js';
19
+ import {AgentType, type ContextDetail, type ConversationContext, ErrorType} from '../AiAgent.js';
24
20
 
25
21
  import freestylerChatUiStyles from './freestylerChatUi.css.js';
26
22
  import type {UserActionRowProps} from './UserActionRow.js';
27
23
 
28
- const {html, Directives: {ifDefined}} = LitHtml;
24
+ const {html, Directives: {ifDefined, ref}} = LitHtml;
29
25
 
30
26
  const UIStrings = {
31
27
  /**
@@ -115,10 +111,22 @@ const UIStringsNotTranslate = {
115
111
  *@description Placeholder text for the chat UI input.
116
112
  */
117
113
  inputPlaceholderForDrJonesPerformanceAgent: 'Ask a question about the selected item and its call tree',
114
+ /**
115
+ * @description Placeholder text for the input shown when the conversation is blocked because a cross-origin context was selected.
116
+ */
117
+ crossOriginError: 'To talk about data from another origin, start a new chat',
118
+ /**
119
+ * @description Placeholder text for the input shown when the conversation is blocked because a cross-origin context was selected.
120
+ */
121
+ newConversationError: 'To talk about this data, start a new chat',
118
122
  /**
119
123
  *@description Title for the send icon button.
120
124
  */
121
125
  sendButtonTitle: 'Send',
126
+ /**
127
+ *@description Title for the start new chat
128
+ */
129
+ startNewChat: 'Start new chat',
122
130
  /**
123
131
  *@description Title for the cancel icon button.
124
132
  */
@@ -135,6 +143,10 @@ const UIStringsNotTranslate = {
135
143
  *@description Text for the empty state of the AI assistance panel.
136
144
  */
137
145
  emptyStateText: 'How can I help you?',
146
+ /**
147
+ *@description Text for the empty state of the AI assistance panel when there is no agent selected.
148
+ */
149
+ noAgentStateText: 'Explore AI assistance',
138
150
  /**
139
151
  * @description The error message when the LLM loop is stopped for some reason (Max steps reached or request to LLM failed)
140
152
  */
@@ -200,67 +212,17 @@ const UIStringsNotTranslate = {
200
212
  *@description Aria label for the cancel icon to be read by screen reader
201
213
  */
202
214
  canceled: 'Canceled',
203
- /*
204
- * @description Header text for instructions on how to use the AI assistance feature.
205
- */
206
- getStarted: 'Hi! Here’s how to get started:',
207
- /**
208
- * @description AI assistance for CSS.
209
- */
210
- cssHelp: 'CSS help:',
211
- /**
212
- * @description Explanation on how to use AI assistance for DOM elements.
213
- */
214
- cssHelpExplainer:
215
- 'Navigate to the Elements panel, right-click a DOM element, and select "Ask AI assistant". I’ll be happy to explain its styles or behavior.',
216
215
  /**
217
- * @description AI assistance for files.
216
+ *@description Text displayed when the chat input is disabled due to reading past conversation.
218
217
  */
219
- fileHelp: 'File insights:',
220
- /**
221
- * @description Explanation on how to use AI assistance for files in the Sources panel.
222
- */
223
- fileHelpExplainer:
224
- 'Open the Sources panel, right-click a file, and select "Ask AI". I can provide insights into its purpose or origin.',
225
- /**
226
- * @description AI assistance for network requests.
227
- */
228
- networkHelp: 'Network request insights:',
229
- /**
230
- * @description Explanation on how to use AI assistance for network requests.
231
- */
232
- networkHelpExplainer:
233
- 'In the Network panel, right-click any request and select "Ask AI assistant". I’ll help break down what’s happening with each request.',
234
- /**
235
- * @description AI assistance for performance traces.
236
- */
237
- performanceHelp: 'Performance analysis:',
238
- /**
239
- * @description Explanation on how to use AI assistance for performance traces.
240
- */
241
- performanceHelpExplainer:
242
- 'In the Performance panel, run a trace. Then, right-click any function in the timeline and select "Ask AI". I’ll help you analyze its performance impact and suggest improvements.',
218
+ pastConversation: 'You\'re viewing a past conversation.',
243
219
  };
244
220
 
245
221
  const str_ = i18n.i18n.registerUIStrings('panels/freestyler/components/FreestylerChatUi.ts', UIStrings);
246
222
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
247
223
  const lockedString = i18n.i18n.lockedString;
248
224
 
249
- function getInputPlaceholderString(state: State, agentType?: AgentType): Platform.UIString.LocalizedString {
250
- if (state === State.CONSENT_VIEW || !agentType) {
251
- return i18nString(UIStrings.followTheSteps);
252
- }
253
- switch (agentType) {
254
- case AgentType.FREESTYLER:
255
- return lockedString(UIStringsNotTranslate.inputPlaceholderForFreestylerAgent);
256
- case AgentType.DRJONES_FILE:
257
- return lockedString(UIStringsNotTranslate.inputPlaceholderForDrJonesFileAgent);
258
- case AgentType.DRJONES_NETWORK_REQUEST:
259
- return lockedString(UIStringsNotTranslate.inputPlaceholderForDrJonesNetworkAgent);
260
- case AgentType.DRJONES_PERFORMANCE:
261
- return lockedString(UIStringsNotTranslate.inputPlaceholderForDrJonesPerformanceAgent);
262
- }
263
- }
225
+ const SCROLL_ROUNDING_OFFSET = 1;
264
226
 
265
227
  export interface Step {
266
228
  isLoading: boolean;
@@ -307,20 +269,22 @@ export interface Props {
307
269
  onInspectElementClick: () => void;
308
270
  onFeedbackSubmit: (rpcId: number, rate: Host.AidaClient.Rating, feedback?: string) => void;
309
271
  onCancelClick: () => void;
310
- onSelectedNetworkRequestClick: () => void | Promise<void>;
311
- onSelectedFileRequestClick: () => void | Promise<void>;
272
+ onContextClick: () => void | Promise<void>;
273
+ onNewConversation: () => void;
274
+ onCancelCrossOriginChat?: () => void;
312
275
  inspectElementToggled: boolean;
313
276
  state: State;
314
277
  aidaAvailability: Host.AidaClient.AidaAccessPreconditions;
315
278
  messages: ChatMessage[];
316
- selectedElement: SDK.DOMModel.DOMNode|null;
317
- selectedFile: Workspace.UISourceCode.UISourceCode|null;
318
- selectedNetworkRequest: SDK.NetworkRequest.NetworkRequest|null;
319
- selectedAiCallTree: TimelineUtils.AICallTree.AICallTree|null;
279
+ selectedContext: ConversationContext<unknown>|null;
320
280
  isLoading: boolean;
321
281
  canShowFeedbackForm: boolean;
322
282
  userInfo: Pick<Host.InspectorFrontendHostAPI.SyncInformation, 'accountImage'|'accountFullName'>;
323
283
  agentType?: AgentType;
284
+ isReadOnly: boolean;
285
+ blockedByCrossOrigin: boolean;
286
+ requiresNewConversation?: boolean;
287
+ stripLinks: boolean;
324
288
  }
325
289
 
326
290
  // The model returns multiline code blocks in an erroneous way with the language being in new line.
@@ -334,6 +298,11 @@ export interface Props {
334
298
  // }
335
299
  // ```
336
300
  class MarkdownRendererWithCodeBlock extends MarkdownView.MarkdownView.MarkdownInsightRenderer {
301
+ #stripLinks: boolean = false;
302
+ constructor(opts: {stripLinks?: boolean} = {}) {
303
+ super();
304
+ this.#stripLinks = Boolean(opts.stripLinks);
305
+ }
337
306
  override templateForToken(token: Marked.Marked.MarkedToken): LitHtml.TemplateResult|null {
338
307
  if (token.type === 'code') {
339
308
  const lines = (token.text as string).split('\n');
@@ -343,15 +312,50 @@ class MarkdownRendererWithCodeBlock extends MarkdownView.MarkdownView.MarkdownIn
343
312
  }
344
313
  }
345
314
 
315
+ // Potentially remove links from the rendered result
316
+ if (this.#stripLinks && (token.type === 'link' || token.type === 'image')) {
317
+ // Insert an extra text node at the end after any link text. Show the link as plaintext (surrounded by parentheses)
318
+ const urlText = ` ( ${token.href} )`;
319
+ // Images would be turned into as links (but we'll skip that) https://source.chromium.org/chromium/chromium/src/+/main:third_party/devtools-frontend/src/front_end/ui/components/markdown_view/MarkdownView.ts;l=286-291;drc=d2cc89e48c913666655542d818ad0a09d25d0d08
320
+ const childTokens = token.type === 'image' ? undefined : [
321
+ ...token.tokens,
322
+ {type: 'text', text: urlText, raw: urlText},
323
+ ];
324
+
325
+ token = {
326
+ ...token,
327
+ // Marked doesn't read .text or .raw of a link, but we'll update anyway
328
+ // https://github.com/markedjs/marked/blob/035af38ab1e5aae95ece213dcc9a9c6d79cff46f/src/Renderer.ts#L178-L191
329
+ text: `${token.text}${urlText}`,
330
+ raw: `${token.text}${urlText}`,
331
+ type: 'text',
332
+ tokens: childTokens,
333
+ };
334
+ }
335
+
346
336
  return super.templateForToken(token);
347
337
  }
348
338
  }
349
339
 
350
340
  export class FreestylerChatUi extends HTMLElement {
351
341
  readonly #shadow = this.attachShadow({mode: 'open'});
352
- readonly #markdownRenderer = new MarkdownRendererWithCodeBlock();
342
+ #markdownRenderer = new MarkdownRendererWithCodeBlock();
353
343
  #scrollTop?: number;
354
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;
355
359
 
356
360
  constructor(props: Props) {
357
361
  super();
@@ -359,6 +363,7 @@ export class FreestylerChatUi extends HTMLElement {
359
363
  }
360
364
 
361
365
  set props(props: Props) {
366
+ this.#markdownRenderer = new MarkdownRendererWithCodeBlock({stripLinks: props.stripLinks});
362
367
  this.#props = props;
363
368
  this.#render();
364
369
  }
@@ -366,6 +371,14 @@ export class FreestylerChatUi extends HTMLElement {
366
371
  connectedCallback(): void {
367
372
  this.#shadow.adoptedStyleSheets = [freestylerChatUiStyles];
368
373
  this.#render();
374
+
375
+ if (this.#messagesContainerElement) {
376
+ this.#messagesContainerResizeObserver.observe(this.#messagesContainerElement);
377
+ }
378
+ }
379
+
380
+ disconnectedCallback(): void {
381
+ this.#messagesContainerResizeObserver.disconnect();
369
382
  }
370
383
 
371
384
  focusTextInput(): void {
@@ -382,20 +395,41 @@ export class FreestylerChatUi extends HTMLElement {
382
395
  return;
383
396
  }
384
397
 
385
- const scrollContainer = this.#shadow.querySelector('.chat-ui main') as HTMLElement;
386
- if (!scrollContainer) {
398
+ if (!this.#mainElementRef?.value) {
387
399
  return;
388
400
  }
389
401
 
390
- scrollContainer.scrollTop = this.#scrollTop;
402
+ this.#mainElementRef.value.scrollTop = this.#scrollTop;
391
403
  }
392
404
 
393
- scrollToLastMessage(): void {
394
- const message = this.#shadow.querySelector('.chat-message:last-child') as HTMLDivElement;
395
- if (!message) {
405
+ finishTextAnimations(): void {
406
+ if (!this.#lastAnswerMarkdownView) {
396
407
  return;
397
408
  }
398
- message.scrollIntoViewIfNeeded();
409
+
410
+ this.#lastAnswerMarkdownView.finishAnimations();
411
+ }
412
+
413
+ scrollToBottom(): void {
414
+ if (!this.#mainElementRef?.value) {
415
+ return;
416
+ }
417
+
418
+ this.#mainElementRef.value.scrollTop = this.#mainElementRef.value.scrollHeight;
419
+ }
420
+
421
+ #handleMessagesContainerResize(): void {
422
+ if (!this.#pinScrollToBottom) {
423
+ return;
424
+ }
425
+
426
+ if (!this.#mainElementRef?.value) {
427
+ return;
428
+ }
429
+
430
+ if (this.#pinScrollToBottom) {
431
+ this.#mainElementRef.value.scrollTop = this.#mainElementRef.value.scrollHeight;
432
+ }
399
433
  }
400
434
 
401
435
  #setInputText(text: string): void {
@@ -408,6 +442,9 @@ export class FreestylerChatUi extends HTMLElement {
408
442
  }
409
443
 
410
444
  #isTextInputDisabled = (): boolean => {
445
+ if (this.#props.blockedByCrossOrigin || this.#props.requiresNewConversation) {
446
+ return true;
447
+ }
411
448
  const isAidaAvailable = this.#props.aidaAvailability === Host.AidaClient.AidaAccessPreconditions.AVAILABLE;
412
449
  const isConsentView = this.#props.state === State.CONSENT_VIEW;
413
450
  const showsSideEffects = this.#props.messages.some(message => {
@@ -416,23 +453,57 @@ export class FreestylerChatUi extends HTMLElement {
416
453
  });
417
454
  });
418
455
 
419
- const isInputDisabledCheckForFreestylerAgent = !Boolean(this.#props.selectedElement) || showsSideEffects;
420
- const isInputDisabledCheckForDrJonesNetworkAgent = !Boolean(this.#props.selectedNetworkRequest);
421
- const isInputDisabledCheckForDrJonesFileAgent =
422
- !Boolean(this.#props.selectedFile) || !this.#props.selectedFile?.contentType().isTextType();
456
+ if (!isAidaAvailable || isConsentView || !this.#props.agentType) {
457
+ return true;
458
+ }
423
459
 
424
- return (this.#props.agentType === AgentType.FREESTYLER && isInputDisabledCheckForFreestylerAgent) ||
425
- (this.#props.agentType === AgentType.DRJONES_NETWORK_REQUEST && isInputDisabledCheckForDrJonesNetworkAgent) ||
426
- (this.#props.agentType === AgentType.DRJONES_FILE && isInputDisabledCheckForDrJonesFileAgent) ||
427
- !isAidaAvailable || isConsentView || !this.#props.agentType;
460
+ if (!this.#props.selectedContext) {
461
+ return true;
462
+ }
463
+
464
+ // Agent-specific input disabled rules.
465
+ switch (this.#props.agentType) {
466
+ case AgentType.FREESTYLER:
467
+ return showsSideEffects;
468
+ case AgentType.DRJONES_NETWORK_REQUEST:
469
+ return false;
470
+ case AgentType.DRJONES_FILE:
471
+ return false;
472
+ case AgentType.DRJONES_PERFORMANCE:
473
+ return false;
474
+ }
428
475
  };
429
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
+
430
499
  #handleScroll = (ev: Event): void => {
431
500
  if (!ev.target || !(ev.target instanceof HTMLElement)) {
432
501
  return;
433
502
  }
434
503
 
435
504
  this.#scrollTop = ev.target.scrollTop;
505
+ this.#pinScrollToBottom =
506
+ ev.target.scrollTop + ev.target.clientHeight + SCROLL_ROUNDING_OFFSET > ev.target.scrollHeight;
436
507
  };
437
508
 
438
509
  #handleSubmit = (ev: SubmitEvent): void => {
@@ -496,7 +567,10 @@ export class FreestylerChatUi extends HTMLElement {
496
567
  // clang-format on
497
568
  }
498
569
 
499
- #renderTextAsMarkdown(text: string): LitHtml.TemplateResult {
570
+ #renderTextAsMarkdown(text: string, {animate, ref: refFn}: {
571
+ animate?: boolean,
572
+ ref?: (element?: Element) => void,
573
+ } = {}): LitHtml.TemplateResult {
500
574
  let tokens = [];
501
575
  try {
502
576
  tokens = Marked.Marked.lexer(text);
@@ -516,7 +590,8 @@ export class FreestylerChatUi extends HTMLElement {
516
590
 
517
591
  // clang-format off
518
592
  return html`<devtools-markdown-view
519
- .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}>
520
595
  </devtools-markdown-view>`;
521
596
  // clang-format on
522
597
  }
@@ -743,14 +818,14 @@ export class FreestylerChatUi extends HTMLElement {
743
818
  // clang-format on
744
819
  }
745
820
 
746
- const shouldShowSuggestions = (isLast && !this.#props.isLoading && message.suggestions);
747
821
  // clang-format off
748
822
  return html`
749
- <section class="chat-message answer" jslog=${VisualLogging.section('answer')}>
823
+ <section
824
+ class="chat-message answer"
825
+ jslog=${VisualLogging.section('answer')}
826
+ >
750
827
  <div class="message-info">
751
- <devtools-icon
752
- name="smart-assistant"
753
- ></devtools-icon>
828
+ <devtools-icon name="smart-assistant"></devtools-icon>
754
829
  <div class="message-name">
755
830
  <h2>${lockedString(UIStringsNotTranslate.ai)}</h2>
756
831
  </div>
@@ -764,14 +839,17 @@ export class FreestylerChatUi extends HTMLElement {
764
839
  });
765
840
  },
766
841
  )}
767
- ${
768
- message.answer
769
- ? html`<p>${this.#renderTextAsMarkdown(message.answer)}</p>`
770
- : LitHtml.nothing
771
- }
842
+ ${message.answer
843
+ ? html`<p>${this.#renderTextAsMarkdown(message.answer, { animate: !this.#props.isReadOnly, ref: this.#handleLastAnswerMarkdownViewRef })}</p>`
844
+ : LitHtml.nothing}
772
845
  ${this.#renderError(message)}
773
846
  <div class="actions">
774
- ${this.#renderUserActionRow(message.rpcId, shouldShowSuggestions ? message.suggestions : undefined)}
847
+ ${isLast && this.#props.isLoading
848
+ ? LitHtml.nothing
849
+ : this.#renderUserActionRow(
850
+ message.rpcId,
851
+ isLast ? message.suggestions : undefined,
852
+ )}
775
853
  </div>
776
854
  </section>
777
855
  `;
@@ -782,135 +860,57 @@ export class FreestylerChatUi extends HTMLElement {
782
860
  if (!this.#props.agentType) {
783
861
  return LitHtml.nothing;
784
862
  }
785
- switch (this.#props.agentType) {
786
- case AgentType.FREESTYLER:
787
- return this.#renderSelectAnElement();
788
- case AgentType.DRJONES_FILE:
789
- return this.#renderSelectedFileName();
790
- case AgentType.DRJONES_NETWORK_REQUEST:
791
- return this.#renderSelectedNetworkRequest();
792
- case AgentType.DRJONES_PERFORMANCE:
793
- return this.#renderSelectedTask();
794
- }
863
+ return this.#renderContextSelector();
795
864
  }
796
865
 
797
- #renderSelectedFileName(): LitHtml.TemplateResult {
866
+ #renderContextSelector(): LitHtml.LitTemplate {
798
867
  const resourceClass = LitHtml.Directives.classMap({
799
- 'not-selected': !this.#props.selectedFile,
868
+ 'not-selected': !this.#props.selectedContext,
800
869
  'resource-link': true,
801
870
  });
802
871
 
803
- if (!this.#props.selectedFile) {
804
- return html`${LitHtml.nothing}`;
805
- }
806
-
807
- const icon = PanelUtils.getIconForSourceFile(this.#props.selectedFile);
808
-
809
- // clang-format off
810
- return html`<div class="select-element">
811
- <div role=button class=${resourceClass}
812
- @click=${this.#props.onSelectedFileRequestClick}>
813
- ${icon}${this.#props.selectedFile?.displayName()}
814
- </div></div>`;
815
- // clang-format on
816
- }
817
-
818
- #renderSelectedNetworkRequest = (): LitHtml.TemplateResult => {
819
- const resourceClass = LitHtml.Directives.classMap({
820
- 'not-selected': !this.#props.selectedNetworkRequest,
821
- 'resource-link': true,
822
- });
823
-
824
- if (!this.#props.selectedNetworkRequest) {
825
- return html`${LitHtml.nothing}`;
826
- }
827
-
828
- const icon = PanelUtils.getIconForNetworkRequest(this.#props.selectedNetworkRequest);
829
- // clang-format off
830
- return html`<div class="select-element">
831
- <div role=button class=${resourceClass}
832
- @click=${this.#props.onSelectedNetworkRequestClick}>
833
- ${icon}${this.#props.selectedNetworkRequest?.name()}
834
- </div></div>`;
835
- // clang-format on
836
- };
872
+ // TODO: currently the picker behavior is SDKNode specific.
873
+ const hasPickerBehavior = this.#props.agentType === AgentType.FREESTYLER;
837
874
 
838
- #renderSelectAnElement = (): LitHtml.TemplateResult => {
839
- const resourceClass = LitHtml.Directives.classMap({
840
- 'not-selected': !this.#props.selectedElement,
841
- 'resource-link': true,
842
- });
843
-
844
- // clang-format off
845
- return html`
846
- <div class="select-element">
847
- <devtools-button
848
- .data=${{
849
- variant: Buttons.Button.Variant.ICON_TOGGLE,
850
- size: Buttons.Button.Size.REGULAR,
851
- iconName: 'select-element',
852
- toggledIconName: 'select-element',
853
- toggleType: Buttons.Button.ToggleType.PRIMARY,
854
- toggled: this.#props.inspectElementToggled,
855
- title: lockedString(UIStringsNotTranslate.selectAnElement),
856
- jslogContext: 'select-element',
857
- } as Buttons.Button.ButtonData}
858
- @click=${this.#props.onInspectElementClick}
859
- ></devtools-button>
860
- <div class=${resourceClass}>${
861
- this.#props.selectedElement
862
- ? LitHtml.Directives.until(
863
- Common.Linkifier.Linkifier.linkify(this.#props.selectedElement),
864
- )
865
- : html`<span>${
866
- lockedString(UIStringsNotTranslate.noElementSelected)
867
- }</span>`
868
- }</div>
869
- </div>`;
870
- // clang-format on
871
- };
872
-
873
- #renderSelectedTask = (): LitHtml.TemplateResult => {
874
- const resourceClass = LitHtml.Directives.classMap({
875
- 'not-selected': !this.#props.selectedAiCallTree,
876
- 'resource-task': true,
877
- });
878
-
879
- if (!this.#props.selectedAiCallTree) {
880
- return html`${LitHtml.nothing}`;
881
- }
882
-
883
- const {event} = this.#props.selectedAiCallTree.selectedNode;
884
- if (!event) {
885
- return html`${LitHtml.nothing}`;
875
+ if (!this.#props.selectedContext && !hasPickerBehavior) {
876
+ return LitHtml.nothing;
886
877
  }
887
878
 
888
- const displayName = TimelineUtils.EntryName.nameForEntry(event);
889
- const handleClick = (): void => {
890
- const trace = new SDK.TraceObject.RevealableEvent(event);
891
- void Common.Revealer.reveal(trace);
892
- };
893
-
894
- const iconData = {
895
- iconName: 'performance',
896
- color: 'var(--sys-color-on-surface-subtle)',
897
- };
898
- const icon = PanelUtils.createIconElement(iconData, 'Performance');
899
- icon.classList.add('icon');
879
+ const icon = this.#props.selectedContext?.getIcon() ?? LitHtml.nothing;
900
880
 
901
881
  // clang-format off
902
882
  return html`<div class="select-element">
903
- <div role=button class=${resourceClass} @click=${handleClick}>
904
- ${icon}${displayName}
883
+ ${
884
+ hasPickerBehavior ? html`
885
+ <devtools-button
886
+ .data=${{
887
+ variant: Buttons.Button.Variant.ICON_TOGGLE,
888
+ size: Buttons.Button.Size.REGULAR,
889
+ iconName: 'select-element',
890
+ toggledIconName: 'select-element',
891
+ toggleType: Buttons.Button.ToggleType.PRIMARY,
892
+ toggled: this.#props.inspectElementToggled,
893
+ title: lockedString(UIStringsNotTranslate.selectAnElement),
894
+ jslogContext: 'select-element',
895
+ } as Buttons.Button.ButtonData}
896
+ @click=${this.#props.onInspectElementClick}
897
+ ></devtools-button>
898
+ ` : LitHtml.nothing
899
+ }
900
+ <div role=button class=${resourceClass}
901
+ @click=${this.#props.onContextClick}>
902
+ ${icon}${this.#props.selectedContext?.getTitle() ?? html`<span>${
903
+ lockedString(UIStringsNotTranslate.noElementSelected)
904
+ }</span>`}
905
905
  </div>
906
906
  </div>`;
907
907
  // clang-format on
908
- };
908
+ }
909
909
 
910
910
  #renderMessages = (): LitHtml.TemplateResult => {
911
911
  // clang-format off
912
912
  return html`
913
- <div class="messages-container">
913
+ <div class="messages-container" ${ref(this.#handleMessageContainerRef)}>
914
914
  ${this.#props.messages.map((message, _, array) =>
915
915
  this.#renderChatMessage(message, {
916
916
  isLast: array.at(-1) === message,
@@ -934,7 +934,7 @@ export class FreestylerChatUi extends HTMLElement {
934
934
  </div>
935
935
  <h1>${lockedString(UIStringsNotTranslate.emptyStateText)}</h1>
936
936
  </div>
937
- <div class="suggestions">
937
+ <div class="empty-state-content">
938
938
  ${suggestions.map(suggestion => {
939
939
  return html`<devtools-button
940
940
  class="suggestion"
@@ -955,6 +955,14 @@ export class FreestylerChatUi extends HTMLElement {
955
955
  // clang-format on
956
956
  };
957
957
 
958
+ #onNewConversation(): void {
959
+ this.#props.onNewConversation();
960
+ }
961
+
962
+ #onCancelCrossOriginChat(): void {
963
+ this.#props.onCancelCrossOriginChat?.();
964
+ }
965
+
958
966
  #getEmptyStateSuggestions = (): string[] => {
959
967
  if (!this.#props.agentType) {
960
968
  return [];
@@ -987,53 +995,160 @@ export class FreestylerChatUi extends HTMLElement {
987
995
  }
988
996
  };
989
997
 
990
- #renderChatInput = (): LitHtml.TemplateResult => {
998
+ #getInputPlaceholderString(): Platform.UIString.LocalizedString {
999
+ const state = this.#props.state;
1000
+ const agentType = this.#props.agentType;
1001
+ if (state === State.CONSENT_VIEW || !agentType) {
1002
+ return i18nString(UIStrings.followTheSteps);
1003
+ }
1004
+ if (this.#props.requiresNewConversation) {
1005
+ return lockedString(UIStringsNotTranslate.newConversationError);
1006
+ }
1007
+ if (this.#props.blockedByCrossOrigin) {
1008
+ return lockedString(UIStringsNotTranslate.crossOriginError);
1009
+ }
1010
+ switch (agentType) {
1011
+ case AgentType.FREESTYLER:
1012
+ return lockedString(UIStringsNotTranslate.inputPlaceholderForFreestylerAgent);
1013
+ case AgentType.DRJONES_FILE:
1014
+ return lockedString(UIStringsNotTranslate.inputPlaceholderForDrJonesFileAgent);
1015
+ case AgentType.DRJONES_NETWORK_REQUEST:
1016
+ return lockedString(UIStringsNotTranslate.inputPlaceholderForDrJonesNetworkAgent);
1017
+ case AgentType.DRJONES_PERFORMANCE:
1018
+ return lockedString(UIStringsNotTranslate.inputPlaceholderForDrJonesPerformanceAgent);
1019
+ }
1020
+ }
1021
+
1022
+ #renderReadOnlySection(): LitHtml.LitTemplate {
1023
+ if (!this.#props.agentType) {
1024
+ return LitHtml.nothing;
1025
+ }
1026
+
1027
+ // clang-format off
1028
+ return html`<div
1029
+ class="chat-readonly-container"
1030
+ jslog=${VisualLogging.section('read-only')}
1031
+ >
1032
+ <span>${lockedString(UIStringsNotTranslate.pastConversation)}</span>
1033
+ <devtools-button
1034
+ aria-label=${lockedString(UIStringsNotTranslate.startNewChat)}
1035
+ @click=${this.#onNewConversation}
1036
+ .data=${{
1037
+ variant: Buttons.Button.Variant.TEXT,
1038
+ title: lockedString(UIStringsNotTranslate.startNewChat),
1039
+ jslogContext: 'start-new-chat',
1040
+ } as Buttons.Button.ButtonData}
1041
+ >${lockedString(UIStringsNotTranslate.startNewChat)}</devtools-button>
1042
+ </div>`;
1043
+ // clang-format on
1044
+ }
1045
+
1046
+ #renderChatInputButtons(): LitHtml.TemplateResult {
1047
+ if (this.#props.isLoading) {
1048
+ // clang-format off
1049
+ return html`<devtools-button
1050
+ class="chat-input-button"
1051
+ aria-label=${lockedString(UIStringsNotTranslate.cancelButtonTitle)}
1052
+ @click=${this.#handleCancel}
1053
+ .data=${
1054
+ {
1055
+ variant: Buttons.Button.Variant.ICON,
1056
+ size: Buttons.Button.Size.REGULAR,
1057
+ iconName: 'record-stop',
1058
+ title: lockedString(UIStringsNotTranslate.cancelButtonTitle),
1059
+ jslogContext: 'stop',
1060
+ } as Buttons.Button.ButtonData
1061
+ }
1062
+ ></devtools-button>`;
1063
+ // clang-format on
1064
+ }
1065
+ if (this.#props.blockedByCrossOrigin || this.#props.requiresNewConversation) {
1066
+ // clang-format off
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
+ `;
1093
+ // clang-format on
1094
+ }
1095
+ // clang-format off
1096
+ return html`<devtools-button
1097
+ class="chat-input-button"
1098
+ aria-label=${lockedString(UIStringsNotTranslate.sendButtonTitle)}
1099
+ .data=${
1100
+ {
1101
+ type: 'submit',
1102
+ variant: Buttons.Button.Variant.ICON,
1103
+ size: Buttons.Button.Size.REGULAR,
1104
+ disabled: this.#isTextInputDisabled(),
1105
+ iconName: 'send',
1106
+ title: lockedString(UIStringsNotTranslate.sendButtonTitle),
1107
+ jslogContext: 'send',
1108
+ } as Buttons.Button.ButtonData
1109
+ }
1110
+ ></devtools-button>`;
1111
+ }
1112
+
1113
+ #renderChatInput = (): LitHtml.LitTemplate => {
1114
+ if (!this.#props.agentType) {
1115
+ return LitHtml.nothing;
1116
+ }
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
+
991
1124
  // clang-format off
992
1125
  return html`
1126
+ <form class="input-form" @submit=${this.#handleSubmit}>
1127
+ ${this.#props.state !== State.CONSENT_VIEW ? html`
1128
+ <div class="input-header">
1129
+ <div class="header-link-container">
1130
+ ${this.#renderSelection()}
1131
+ </div>
1132
+ </div>
1133
+ ` : LitHtml.nothing}
993
1134
  <div class="chat-input-container">
994
- <textarea class="chat-input"
1135
+ <textarea class=${cls}
995
1136
  .disabled=${this.#isTextInputDisabled()}
996
1137
  wrap="hard"
997
1138
  @keydown=${this.#handleTextAreaKeyDown}
998
- placeholder=${getInputPlaceholderString(this.#props.state, this.#props.agentType)}
999
- jslog=${VisualLogging.textField('query').track({ keydown: 'Enter' })}></textarea>
1000
- ${this.#props.isLoading
1001
- ? html`<devtools-button
1002
- class="chat-input-button"
1003
- aria-label=${lockedString(UIStringsNotTranslate.cancelButtonTitle)}
1004
- @click=${this.#handleCancel}
1005
- .data=${
1006
- {
1007
- variant: Buttons.Button.Variant.ICON,
1008
- size: Buttons.Button.Size.REGULAR,
1009
- disabled: this.#isTextInputDisabled(),
1010
- iconName: 'record-stop',
1011
- title: lockedString(UIStringsNotTranslate.cancelButtonTitle),
1012
- jslogContext: 'stop',
1013
- } as Buttons.Button.ButtonData
1014
- }
1015
- ></devtools-button>`
1016
- : html`<devtools-button
1017
- class="chat-input-button"
1018
- aria-label=${lockedString(UIStringsNotTranslate.sendButtonTitle)}
1019
- .data=${
1020
- {
1021
- type: 'submit',
1022
- variant: Buttons.Button.Variant.ICON,
1023
- size: Buttons.Button.Size.REGULAR,
1024
- disabled: this.#isTextInputDisabled(),
1025
- iconName: 'send',
1026
- title: lockedString(UIStringsNotTranslate.sendButtonTitle),
1027
- jslogContext: 'send',
1028
- } as Buttons.Button.ButtonData
1029
- }
1030
- ></devtools-button>`}
1031
- </div>`;
1139
+ placeholder=${this.#getInputPlaceholderString()}
1140
+ jslog=${VisualLogging.textField('query').track({ keydown: 'Enter' })}
1141
+ ></textarea>
1142
+ <div class="chat-input-buttons">
1143
+ ${this.#renderChatInputButtons()}
1144
+ </div>
1145
+ </div>
1146
+ </form>`;
1032
1147
  // clang-format on
1033
1148
  };
1034
1149
 
1035
1150
  #getDisclaimerText = (): Platform.UIString.LocalizedString => {
1036
- if (this.#props.state === State.CONSENT_VIEW || !this.#props.agentType) {
1151
+ if (this.#props.state === State.CONSENT_VIEW || !this.#props.agentType || this.#props.isReadOnly) {
1037
1152
  return i18nString(UIStrings.inputDisclaimerForEmptyState);
1038
1153
  }
1039
1154
  switch (this.#props.agentType) {
@@ -1062,14 +1177,13 @@ export class FreestylerChatUi extends HTMLElement {
1062
1177
 
1063
1178
  #getStringForConsentView(): string {
1064
1179
  const config = Common.Settings.Settings.instance().getHostConfig();
1065
- if (config.devToolsAiAssistancePerformanceAgent?.enabled ||
1066
- config.devToolsAiAssistancePerformanceAgentDogfood?.enabled) {
1180
+ if (config.devToolsAiAssistancePerformanceAgent?.enabled) {
1067
1181
  return UIStrings.turnOnForStylesRequestsPerformanceAndFiles;
1068
1182
  }
1069
- if (config.devToolsAiAssistanceFileAgent?.enabled || config.devToolsAiAssistanceFileAgentDogfood?.enabled) {
1183
+ if (config.devToolsAiAssistanceFileAgent?.enabled) {
1070
1184
  return UIStrings.turnOnForStylesRequestsAndFiles;
1071
1185
  }
1072
- if (config.devToolsAiAssistanceNetworkAgent?.enabled || config.devToolsExplainThisResourceDogfood?.enabled) {
1186
+ if (config.devToolsAiAssistanceNetworkAgent?.enabled) {
1073
1187
  return UIStrings.turnOnForStylesAndRequests;
1074
1188
  }
1075
1189
  return UIStrings.turnOnForStyles;
@@ -1114,33 +1228,76 @@ export class FreestylerChatUi extends HTMLElement {
1114
1228
 
1115
1229
  #renderNoAgentState(): LitHtml.TemplateResult {
1116
1230
  const config = Common.Settings.Settings.instance().getHostConfig();
1231
+ const featureCards: {
1232
+ icon: string,
1233
+ heading: string,
1234
+ content: LitHtml.TemplateResult,
1235
+ }[] =
1236
+ [
1237
+ ...(config.devToolsFreestyler?.enabled ? [{
1238
+ icon: 'brush-2',
1239
+ heading: 'CSS styles',
1240
+ content: html`Open <button class="link" role="link" jslog=${
1241
+ VisualLogging.link('open-elements-panel').track({click: true})} @click=${() => {
1242
+ void UI.ViewManager.ViewManager.instance().showView('elements');
1243
+ }}>Elements</button> to ask about CSS styles`,
1244
+ }] :
1245
+ []),
1246
+ ...(config.devToolsAiAssistanceNetworkAgent?.enabled) ? [{
1247
+ icon: 'arrow-up-down',
1248
+ heading: 'Network',
1249
+ content: html`Open <button class="link" role="link" jslog=${
1250
+ VisualLogging.link('open-network-panel').track({click: true})} @click=${() => {
1251
+ void UI.ViewManager.ViewManager.instance().showView('network');
1252
+ }}>Network</button> to ask about a request's details`,
1253
+ }] :
1254
+ [],
1255
+ ...(config.devToolsAiAssistanceFileAgent?.enabled) ? [{
1256
+ icon: 'document',
1257
+ heading: 'Files',
1258
+ content: html`Open <button class="link" role="link" jslog=${
1259
+ VisualLogging.link('open-sources-panel').track({click: true})} @click=${() => {
1260
+ void UI.ViewManager.ViewManager.instance().showView('sources');
1261
+ }}>Sources</button> to ask about a file's content`,
1262
+ }] :
1263
+ [],
1264
+ ...(config.devToolsAiAssistancePerformanceAgent?.enabled ? [{
1265
+ icon: 'performance',
1266
+ heading: 'Performance',
1267
+ content: html`Open <button class="link" role="link" jslog=${
1268
+ VisualLogging.link('open-performance-panel').track({click: true})} @click=${() => {
1269
+ void UI.ViewManager.ViewManager.instance().showView('timeline');
1270
+ }}>Performance</button> to ask about a trace item`,
1271
+ }] :
1272
+ []),
1273
+ ];
1117
1274
 
1118
1275
  // clang-format off
1119
1276
  return html`
1120
- <div class="messages-container">
1121
- <section class="no-agent-message" jslog=${VisualLogging.section('no-agent-entrypoint')}>
1122
- <div class="header">
1123
- <devtools-icon name="smart-assistant"></devtools-icon>
1124
- <h2>${lockedString(UIStringsNotTranslate.ai)}</h2>
1125
- </div>
1126
- <div class="instructions">
1127
- <p>${lockedString(UIStringsNotTranslate.getStarted)}</p>
1128
- ${config.devToolsFreestyler?.enabled ? html`
1129
- <p><strong>${lockedString(UIStringsNotTranslate.cssHelp)}</strong> ${lockedString(UIStringsNotTranslate.cssHelpExplainer)}</p>
1130
- ` : LitHtml.nothing}
1131
- ${(config.devToolsAiAssistanceFileAgent?.enabled || config.devToolsAiAssistanceFileAgentDogfood?.enabled) ? html`
1132
- <p><strong>${lockedString(UIStringsNotTranslate.fileHelp)}</strong> ${lockedString(UIStringsNotTranslate.fileHelpExplainer)}</p>
1133
- ` : LitHtml.nothing}
1134
- ${(config.devToolsAiAssistanceNetworkAgent?.enabled || config.devToolsExplainThisResourceDogfood?.enabled) ? html`
1135
- <p><strong>${lockedString(UIStringsNotTranslate.networkHelp)}</strong> ${lockedString(UIStringsNotTranslate.networkHelpExplainer)}</p>
1136
- ` : LitHtml.nothing}
1137
- ${(config.devToolsAiAssistancePerformanceAgent?.enabled || config.devToolsAiAssistancePerformanceAgentDogfood?.enabled) ? html`
1138
- <p><strong>${lockedString(UIStringsNotTranslate.performanceHelp)}</strong> ${lockedString(UIStringsNotTranslate.performanceHelpExplainer)}</p>
1139
- ` : LitHtml.nothing}
1277
+ <div class="empty-state-container">
1278
+ <div class="header">
1279
+ <div class="icon">
1280
+ <devtools-icon
1281
+ name="smart-assistant"
1282
+ ></devtools-icon>
1140
1283
  </div>
1141
- </section>
1142
- </div>
1143
- `;
1284
+ <h1>${lockedString(UIStringsNotTranslate.noAgentStateText)}</h1>
1285
+ <p>To chat about an item, right-click and select <strong>Ask AI</strong></p>
1286
+ </div>
1287
+ <div class="empty-state-content">
1288
+ ${featureCards.map(featureCard => html`
1289
+ <div class="feature-card">
1290
+ <div class="feature-card-icon">
1291
+ <devtools-icon name=${featureCard.icon}></devtools-icon>
1292
+ </div>
1293
+ <div class="feature-card-content">
1294
+ <h3>${featureCard.heading}</h3>
1295
+ <p>${featureCard.content}</p>
1296
+ </div>
1297
+ </div>
1298
+ `)}
1299
+ </div>
1300
+ </div>`;
1144
1301
  // clang-format on
1145
1302
  }
1146
1303
 
@@ -1168,18 +1325,12 @@ export class FreestylerChatUi extends HTMLElement {
1168
1325
  // clang-format off
1169
1326
  LitHtml.render(html`
1170
1327
  <div class="chat-ui">
1171
- <main @scroll=${this.#handleScroll}>
1328
+ <main @scroll=${this.#handleScroll} ${ref(this.#mainElementRef)}>
1172
1329
  ${this.#renderMainContents()}
1173
- <form class="input-form" @submit=${this.#handleSubmit}>
1174
- ${this.#props.state !== State.CONSENT_VIEW ? html`
1175
- <div class="input-header">
1176
- <div class="header-link-container">
1177
- ${this.#renderSelection()}
1178
- </div>
1179
- </div>
1180
- ` : LitHtml.nothing}
1181
- ${this.#renderChatInput()}
1182
- </form>
1330
+ ${this.#props.isReadOnly ?
1331
+ this.#renderReadOnlySection() :
1332
+ this.#renderChatInput()
1333
+ }
1183
1334
  </main>
1184
1335
  <footer class="disclaimer">
1185
1336
  <p class="disclaimer-text">