chrome-devtools-frontend 1.0.1473514 → 1.0.1506453

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 (1522) hide show
  1. package/.gemini/commands/migrate-e2e-non-hosted.toml +43 -0
  2. package/.gemini/commands/review.toml +85 -0
  3. package/.geminiignore +6 -0
  4. package/.github/workflows/auto-close-prs.yml +30 -0
  5. package/.stylelintignore +0 -1
  6. package/.vscode/devtools-workspace-settings.json +2 -1
  7. package/AUTHORS +3 -0
  8. package/WATCHLISTS +0 -4
  9. package/config/gni/devtools_grd_files.gni +92 -47
  10. package/config/gni/devtools_image_files.gni +8 -0
  11. package/config/gni/i18n.gni +3 -2
  12. package/config/owner/COMMON_OWNERS +2 -0
  13. package/docs/README.md +2 -2
  14. package/docs/architecture_of_devtools.md +8 -8
  15. package/docs/committers_policy.md +2 -0
  16. package/docs/contributing/README.md +29 -5
  17. package/docs/contributing/changes.md +1 -1
  18. package/docs/contributing/images/quickstart-vscode-tsversion.png +0 -0
  19. package/docs/contributing/infrastructure.md +89 -0
  20. package/docs/cookbook/localization.md +86 -79
  21. package/docs/get_the_code.md +9 -9
  22. package/docs/styleguide/ux/components.md +190 -2
  23. package/docs/styleguide/ux/glossary.md +16 -0
  24. package/docs/styleguide/ux/images/context-menu-example.png +0 -0
  25. package/docs/ui_engineering.md +80 -19
  26. package/eslint.config.mjs +64 -23
  27. package/extension-api/ExtensionAPI.d.ts +3 -0
  28. package/extensions/cxx_debugging/CMakeLists.txt +0 -6
  29. package/extensions/cxx_debugging/e2e/MochaRootHooks.ts +3 -1
  30. package/extensions/cxx_debugging/e2e/TestDriver.ts +1 -2
  31. package/extensions/cxx_debugging/src/GlobMatch.ts +1 -1
  32. package/extensions/cxx_debugging/src/ModuleConfiguration.ts +2 -2
  33. package/extensions/cxx_debugging/third_party/llvm/README.chromium +2 -0
  34. package/extensions/cxx_debugging/tools/bootstrap.py +7 -0
  35. package/front_end/Images/generate-css-vars.js +1 -1
  36. package/front_end/Images/readme.md +1 -2
  37. package/front_end/Images/rollup.config.mjs +12 -1
  38. package/front_end/Images/src/baseline-high-availability.svg +17 -0
  39. package/front_end/Images/src/baseline-limited-availability.svg +19 -0
  40. package/front_end/Images/src/baseline-low-availability.svg +31 -0
  41. package/front_end/Images/src/bucket.svg +4 -0
  42. package/front_end/Images/src/label-auto.svg +3 -0
  43. package/front_end/Images/src/shield.svg +3 -0
  44. package/front_end/Images/src/smart-assistant.svg +3 -1
  45. package/front_end/Images/src/speculative-loads.svg +1 -0
  46. package/front_end/Images/src/text-analysis.svg +3 -0
  47. package/front_end/Tests.js +78 -230
  48. package/front_end/application_tokens.css +7 -1
  49. package/front_end/core/common/Base64.test.ts +1 -1
  50. package/front_end/core/common/Base64.ts +3 -3
  51. package/front_end/core/common/Color.ts +38 -0
  52. package/front_end/core/common/Debouncer.ts +3 -3
  53. package/front_end/core/common/EventTarget.test.ts +1 -0
  54. package/front_end/core/common/Gzip.test.ts +63 -0
  55. package/front_end/core/common/Gzip.ts +72 -0
  56. package/front_end/core/common/ResourceType.ts +29 -29
  57. package/front_end/core/common/ReturnToPanel.ts +15 -0
  58. package/front_end/core/common/Revealer.ts +10 -10
  59. package/front_end/core/common/SettingRegistration.ts +22 -22
  60. package/front_end/core/common/Settings.test.ts +151 -18
  61. package/front_end/core/common/Settings.ts +99 -8
  62. package/front_end/core/common/SimpleHistoryManager.ts +0 -17
  63. package/front_end/core/common/common.ts +4 -0
  64. package/front_end/core/host/AidaClient.test.ts +103 -2
  65. package/front_end/core/host/AidaClient.ts +161 -31
  66. package/front_end/core/host/InspectorFrontendHost.ts +57 -48
  67. package/front_end/core/host/InspectorFrontendHostAPI.ts +11 -0
  68. package/front_end/core/host/ResourceLoader.ts +15 -15
  69. package/front_end/core/host/UserMetrics.ts +27 -13
  70. package/front_end/core/i18n/NumberFormatter.test.ts +92 -0
  71. package/front_end/core/i18n/NumberFormatter.ts +9 -9
  72. package/front_end/core/i18n/collect-ui-strings.js +3 -3
  73. package/front_end/core/i18n/time-utilities.ts +3 -14
  74. package/front_end/core/platform/Brand.ts +8 -1
  75. package/front_end/core/platform/DevToolsPath.ts +1 -1
  76. package/front_end/core/platform/StringUtilities.test.ts +54 -1
  77. package/front_end/core/platform/StringUtilities.ts +34 -8
  78. package/front_end/core/protocol_client/InspectorBackend.ts +9 -9
  79. package/front_end/core/root/Runtime.ts +52 -8
  80. package/front_end/core/sdk/AnimationModel.test.ts +0 -24
  81. package/front_end/core/sdk/AnimationModel.ts +1 -95
  82. package/front_end/core/sdk/AutofillModel.ts +8 -2
  83. package/front_end/core/sdk/CPUProfilerModel.ts +2 -2
  84. package/front_end/core/sdk/CSSContainerQuery.test.ts +15 -0
  85. package/front_end/core/sdk/CSSContainerQuery.ts +3 -1
  86. package/front_end/core/sdk/CSSMatchedStyles.test.ts +2 -1
  87. package/front_end/core/sdk/CSSMatchedStyles.ts +79 -50
  88. package/front_end/core/sdk/CSSModel.ts +20 -7
  89. package/front_end/core/sdk/CSSPropertyParser.test.ts +4 -3
  90. package/front_end/core/sdk/CSSPropertyParser.ts +12 -4
  91. package/front_end/core/sdk/CSSPropertyParserMatchers.test.ts +46 -15
  92. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +131 -58
  93. package/front_end/core/sdk/CSSRule.ts +44 -44
  94. package/front_end/core/sdk/CSSStyleSheetHeader.ts +2 -6
  95. package/front_end/core/sdk/ChildTargetManager.ts +1 -1
  96. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +3 -8
  97. package/front_end/core/sdk/Connections.ts +17 -30
  98. package/front_end/core/sdk/ConsoleModel.ts +9 -9
  99. package/front_end/core/sdk/DOMModel.ts +45 -16
  100. package/front_end/core/sdk/DebuggerModel.test.ts +7 -4
  101. package/front_end/core/sdk/DebuggerModel.ts +55 -11
  102. package/front_end/core/sdk/EmulationModel.ts +13 -0
  103. package/front_end/core/sdk/EventBreakpointsModel.ts +2 -2
  104. package/front_end/core/sdk/IOModel.ts +28 -2
  105. package/front_end/core/sdk/NetworkManager.test.ts +0 -27
  106. package/front_end/core/sdk/NetworkManager.ts +137 -105
  107. package/front_end/core/sdk/NetworkRequest.ts +747 -616
  108. package/front_end/core/sdk/OverlayModel.ts +4 -8
  109. package/front_end/core/sdk/PageResourceLoader.ts +32 -13
  110. package/front_end/core/sdk/PreloadingModel.ts +1 -0
  111. package/front_end/core/sdk/RehydratingConnection.ts +13 -14
  112. package/front_end/core/sdk/RemoteObject.test.ts +24 -2
  113. package/front_end/core/sdk/RemoteObject.ts +0 -3
  114. package/front_end/core/sdk/Resource.ts +0 -5
  115. package/front_end/core/sdk/RuntimeModel.ts +2 -1
  116. package/front_end/core/sdk/Script.ts +2 -7
  117. package/front_end/core/sdk/ServerTiming.ts +12 -12
  118. package/front_end/core/sdk/ServiceWorkerCacheModel.ts +7 -3
  119. package/front_end/core/sdk/ServiceWorkerManager.ts +14 -18
  120. package/front_end/core/sdk/SourceMap.test.ts +55 -73
  121. package/front_end/core/sdk/SourceMap.ts +14 -11
  122. package/front_end/core/sdk/SourceMapFunctionRanges.ts +15 -9
  123. package/front_end/core/sdk/SourceMapScopeChainEntry.test.ts +6 -5
  124. package/front_end/core/sdk/SourceMapScopeChainEntry.ts +14 -14
  125. package/front_end/core/sdk/SourceMapScopesInfo.test.ts +232 -317
  126. package/front_end/core/sdk/SourceMapScopesInfo.ts +26 -25
  127. package/front_end/core/sdk/StorageBucketsModel.ts +4 -0
  128. package/front_end/core/sdk/Target.ts +2 -2
  129. package/front_end/core/sdk/TargetManager.ts +1 -1
  130. package/front_end/core/sdk/sdk-meta.ts +86 -86
  131. package/front_end/core/sdk/sdk.ts +0 -2
  132. package/front_end/design_system_tokens.css +1 -1
  133. package/front_end/devtools_compatibility.js +201 -177
  134. package/front_end/entrypoints/inspector_main/InspectorMain.ts +12 -0
  135. package/front_end/entrypoints/inspector_main/OutermostTargetSelector.ts +3 -3
  136. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +1 -1
  137. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +1 -1
  138. package/front_end/entrypoints/js_app/js_app.ts +3 -3
  139. package/front_end/entrypoints/lighthouse_worker/LighthouseWorkerService.ts +1 -1
  140. package/front_end/entrypoints/main/GlobalAiButton.test.ts +132 -0
  141. package/front_end/entrypoints/main/GlobalAiButton.ts +141 -0
  142. package/front_end/entrypoints/main/MainImpl.test.ts +27 -0
  143. package/front_end/entrypoints/main/MainImpl.ts +179 -47
  144. package/front_end/entrypoints/main/globalAiButton.css +72 -0
  145. package/front_end/entrypoints/main/main-meta.ts +82 -42
  146. package/front_end/entrypoints/main/main.ts +2 -0
  147. package/front_end/entrypoints/node_app/NodeConnectionsPanel.ts +6 -6
  148. package/front_end/entrypoints/node_app/NodeMain.ts +8 -7
  149. package/front_end/entrypoints/node_app/node_app.ts +5 -5
  150. package/front_end/entrypoints/wasmparser_worker/WasmParserWorker.ts +1 -1
  151. package/front_end/entrypoints/worker_app/WorkerMain.ts +1 -1
  152. package/front_end/generated/Deprecation.ts +7 -29
  153. package/front_end/generated/InspectorBackendCommands.js +183 -167
  154. package/front_end/generated/SupportedCSSProperties.js +252 -166
  155. package/front_end/generated/protocol-mapping.d.ts +687 -608
  156. package/front_end/generated/protocol-proxy-api.d.ts +782 -672
  157. package/front_end/generated/protocol.ts +11862 -11509
  158. package/front_end/global_typings/global_defs.d.ts +5 -0
  159. package/front_end/legacy_test_runner/accessibility_test_runner/accessibility_test_runner.js +1 -1
  160. package/front_end/legacy_test_runner/application_test_runner/CacheStorageTestRunner.js +1 -1
  161. package/front_end/legacy_test_runner/application_test_runner/IndexedDBTestRunner.js +1 -1
  162. package/front_end/legacy_test_runner/application_test_runner/ResourceTreeTestRunner.js +1 -1
  163. package/front_end/legacy_test_runner/application_test_runner/ResourcesTestRunner.js +1 -1
  164. package/front_end/legacy_test_runner/application_test_runner/ServiceWorkersTestRunner.js +1 -1
  165. package/front_end/legacy_test_runner/application_test_runner/StorageTestRunner.js +1 -1
  166. package/front_end/legacy_test_runner/axe_core_test_runner/axe_core_test_runner.js +1 -1
  167. package/front_end/legacy_test_runner/bindings_test_runner/AutomappingTestRunner.js +1 -1
  168. package/front_end/legacy_test_runner/bindings_test_runner/BindingsTestRunner.js +1 -1
  169. package/front_end/legacy_test_runner/bindings_test_runner/IsolatedFilesystemTestRunner.js +1 -1
  170. package/front_end/legacy_test_runner/bindings_test_runner/OverridesTestRunner.js +1 -1
  171. package/front_end/legacy_test_runner/bindings_test_runner/PersistenceTestRunner.js +1 -1
  172. package/front_end/legacy_test_runner/console_test_runner/console_test_runner.js +20 -20
  173. package/front_end/legacy_test_runner/coverage_test_runner/coverage_test_runner.js +11 -11
  174. package/front_end/legacy_test_runner/data_grid_test_runner/data_grid_test_runner.js +1 -1
  175. package/front_end/legacy_test_runner/device_mode_test_runner/device_mode_test_runner.js +1 -1
  176. package/front_end/legacy_test_runner/elements_test_runner/EditDOMTestRunner.js +1 -1
  177. package/front_end/legacy_test_runner/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js +1 -1
  178. package/front_end/legacy_test_runner/elements_test_runner/ElementsTestRunner.js +6 -80
  179. package/front_end/legacy_test_runner/elements_test_runner/SetOuterHTMLTestRunner.js +1 -1
  180. package/front_end/legacy_test_runner/elements_test_runner/StylesUpdateLinksTestRunner.js +1 -1
  181. package/front_end/legacy_test_runner/extensions_test_runner/ExtensionsNetworkTestRunner.js +1 -1
  182. package/front_end/legacy_test_runner/extensions_test_runner/ExtensionsTestRunner.js +1 -1
  183. package/front_end/legacy_test_runner/heap_profiler_test_runner/heap_profiler_test_runner.js +2 -2
  184. package/front_end/legacy_test_runner/layers_test_runner/layers_test_runner.js +1 -1
  185. package/front_end/legacy_test_runner/network_test_runner/network_test_runner.js +1 -1
  186. package/front_end/legacy_test_runner/performance_test_runner/TimelineDataTestRunner.js +1 -1
  187. package/front_end/legacy_test_runner/performance_test_runner/TimelineTestRunner.js +1 -10
  188. package/front_end/legacy_test_runner/sdk_test_runner/sdk_test_runner.js +1 -1
  189. package/front_end/legacy_test_runner/security_test_runner/security_test_runner.js +1 -1
  190. package/front_end/legacy_test_runner/sources_test_runner/AutocompleteTestRunner.js +1 -1
  191. package/front_end/legacy_test_runner/sources_test_runner/DebuggerTestRunner.js +4 -4
  192. package/front_end/legacy_test_runner/sources_test_runner/EditorTestRunner.js +1 -1
  193. package/front_end/legacy_test_runner/sources_test_runner/LiveEditTestRunner.js +1 -1
  194. package/front_end/legacy_test_runner/sources_test_runner/SearchTestRunner.js +1 -1
  195. package/front_end/legacy_test_runner/sources_test_runner/SourcesTestRunner.js +2 -2
  196. package/front_end/legacy_test_runner/test_runner/TestRunner.js +45 -45
  197. package/front_end/legacy_test_runner/test_runner/test_runner.js +4 -4
  198. package/front_end/models/ai_assistance/AiHistoryStorage.snapshot.txt +66 -0
  199. package/front_end/models/ai_assistance/AiHistoryStorage.test.ts +82 -3
  200. package/front_end/models/ai_assistance/AiHistoryStorage.ts +95 -6
  201. package/front_end/models/ai_assistance/AiUtils.ts +1 -1
  202. package/front_end/models/ai_assistance/ConversationHandler.test.ts +355 -0
  203. package/front_end/models/ai_assistance/ConversationHandler.ts +380 -0
  204. package/front_end/models/ai_assistance/ExtensionScope.ts +1 -4
  205. package/front_end/models/ai_assistance/README.md +79 -0
  206. package/front_end/models/ai_assistance/agents/AiAgent.test.ts +22 -1
  207. package/front_end/models/ai_assistance/agents/AiAgent.ts +76 -95
  208. package/front_end/models/ai_assistance/agents/FileAgent.test.ts +3 -2
  209. package/front_end/models/ai_assistance/agents/FileAgent.ts +1 -1
  210. package/front_end/models/ai_assistance/agents/NetworkAgent.ts +7 -7
  211. package/front_end/models/ai_assistance/agents/PerformanceAgent.test.ts +591 -62
  212. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +1111 -117
  213. package/front_end/models/ai_assistance/agents/PerformanceAnnotationsAgent.test.ts +4 -2
  214. package/front_end/models/ai_assistance/agents/PerformanceAnnotationsAgent.ts +75 -5
  215. package/front_end/models/ai_assistance/agents/StylingAgent.test.ts +166 -507
  216. package/front_end/models/ai_assistance/agents/StylingAgent.ts +125 -319
  217. package/front_end/models/ai_assistance/ai_assistance.ts +2 -1
  218. package/front_end/models/ai_assistance/data_formatters/FileFormatter.test.ts +3 -2
  219. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +725 -0
  220. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.test.ts +249 -274
  221. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +494 -83
  222. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +556 -0
  223. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.test.ts +92 -0
  224. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +359 -0
  225. package/front_end/models/ai_assistance/debug.ts +1 -1
  226. package/front_end/models/ai_assistance/injected.ts +1 -1
  227. package/front_end/models/ai_code_completion/AiCodeCompletion.test.ts +328 -0
  228. package/front_end/models/ai_code_completion/AiCodeCompletion.ts +289 -0
  229. package/front_end/models/ai_code_completion/ai_code_completion.ts +6 -0
  230. package/front_end/models/ai_code_completion/debug.ts +30 -0
  231. package/front_end/models/autofill_manager/AutofillManager.test.ts +0 -6
  232. package/front_end/models/autofill_manager/AutofillManager.ts +16 -9
  233. package/front_end/models/bindings/CSSWorkspaceBinding.ts +0 -4
  234. package/front_end/models/bindings/CompilerScriptMapping.test.ts +8 -4
  235. package/front_end/models/bindings/CompilerScriptMapping.ts +12 -5
  236. package/front_end/models/bindings/DebuggerLanguagePlugins.test.ts +7 -2
  237. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +33 -24
  238. package/front_end/models/bindings/DebuggerWorkspaceBinding.test.ts +95 -3
  239. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +94 -21
  240. package/front_end/models/bindings/DefaultScriptMapping.test.ts +3 -2
  241. package/front_end/models/bindings/FileUtils.test.ts +1 -10
  242. package/front_end/models/bindings/FileUtils.ts +6 -22
  243. package/front_end/models/bindings/LiveLocation.ts +0 -5
  244. package/front_end/models/bindings/PresentationConsoleMessageHelper.test.ts +7 -2
  245. package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +0 -4
  246. package/front_end/models/bindings/ResourceMapping.test.ts +7 -2
  247. package/front_end/models/bindings/ResourceMapping.ts +0 -4
  248. package/front_end/models/bindings/ResourceScriptMapping.test.ts +2 -1
  249. package/front_end/models/bindings/ResourceScriptMapping.ts +4 -4
  250. package/front_end/models/bindings/SASSSourceMapping.ts +1 -1
  251. package/front_end/models/bindings/StylesSourceMapping.ts +0 -5
  252. package/front_end/models/bindings/bindings.ts +0 -2
  253. package/front_end/models/breakpoints/BreakpointManager.test.ts +9 -2
  254. package/front_end/models/cpu_profile/CPUProfileDataModel.ts +4 -2
  255. package/front_end/models/elements/ElementUpdateRecord.ts +101 -0
  256. package/front_end/models/elements/elements.ts +9 -0
  257. package/front_end/models/emulation/DeviceModeModel.ts +6 -22
  258. package/front_end/models/emulation/EmulatedDevices.ts +12 -12
  259. package/front_end/models/extensions/ExtensionAPI.ts +9 -5
  260. package/front_end/models/extensions/ExtensionPanel.ts +5 -2
  261. package/front_end/models/extensions/ExtensionServer.test.ts +122 -16
  262. package/front_end/models/extensions/ExtensionServer.ts +114 -31
  263. package/front_end/models/extensions/ExtensionView.ts +1 -1
  264. package/front_end/models/extensions/LanguageExtensionEndpoint.ts +14 -7
  265. package/front_end/models/har/HARFormat.ts +1 -1
  266. package/front_end/models/har/Importer.test.ts +40 -0
  267. package/front_end/models/har/Importer.ts +35 -1
  268. package/front_end/models/har/Writer.test.ts +3 -2
  269. package/front_end/models/har/Writer.ts +2 -2
  270. package/front_end/models/issues_manager/BounceTrackingIssue.ts +1 -1
  271. package/front_end/models/issues_manager/ClientHintIssue.ts +1 -1
  272. package/front_end/models/issues_manager/ContentSecurityPolicyIssue.ts +5 -5
  273. package/front_end/models/issues_manager/CookieIssue.ts +2 -2
  274. package/front_end/models/issues_manager/CorsIssue.ts +3 -3
  275. package/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.ts +2 -2
  276. package/front_end/models/issues_manager/{SelectElementAccessibilityIssue.test.ts → ElementAccessibilityIssue.test.ts} +22 -21
  277. package/front_end/models/issues_manager/{SelectElementAccessibilityIssue.ts → ElementAccessibilityIssue.ts} +29 -21
  278. package/front_end/models/issues_manager/FederatedAuthRequestIssue.ts +1 -1
  279. package/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.ts +1 -1
  280. package/front_end/models/issues_manager/GenericIssue.ts +4 -4
  281. package/front_end/models/issues_manager/HeavyAdIssue.ts +1 -1
  282. package/front_end/models/issues_manager/Issue.ts +6 -6
  283. package/front_end/models/issues_manager/IssuesManager.ts +8 -3
  284. package/front_end/models/issues_manager/LowTextContrastIssue.ts +1 -1
  285. package/front_end/models/issues_manager/MarkdownIssueDescription.ts +1 -1
  286. package/front_end/models/issues_manager/MixedContentIssue.ts +1 -1
  287. package/front_end/models/issues_manager/PartitioningBlobURLIssue.ts +2 -2
  288. package/front_end/models/issues_manager/QuirksModeIssue.ts +1 -1
  289. package/front_end/models/issues_manager/SRIMessageSignatureIssue.ts +3 -3
  290. package/front_end/models/issues_manager/SharedArrayBufferIssue.ts +1 -1
  291. package/front_end/models/issues_manager/SharedDictionaryIssue.ts +1 -1
  292. package/front_end/models/issues_manager/UnencodedDigestIssue.test.ts +49 -0
  293. package/front_end/models/issues_manager/UnencodedDigestIssue.ts +88 -0
  294. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueNotInnerList.md +1 -1
  295. package/front_end/models/issues_manager/descriptions/sriValidationFailedIntegrityMismatch.md +1 -3
  296. package/front_end/models/issues_manager/descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +3 -0
  297. package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestLength.md +12 -0
  298. package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestType.md +17 -0
  299. package/front_end/models/issues_manager/descriptions/unencodedDigestMalformedDictionary.md +14 -0
  300. package/front_end/models/issues_manager/descriptions/unencodedDigestUnknownAlgorithm.md +15 -0
  301. package/front_end/models/issues_manager/descriptions/userReidentificationBlocked.md +1 -1
  302. package/front_end/models/issues_manager/issues_manager.ts +4 -2
  303. package/front_end/models/javascript_metadata/NativeFunctions.js +201 -127
  304. package/front_end/models/live-metrics/web-vitals-injected/OnEachInteraction.ts +1 -1
  305. package/front_end/models/live-metrics/web-vitals-injected/rollup.config.mjs +1 -1
  306. package/front_end/models/logs/NetworkLog.ts +74 -83
  307. package/front_end/models/logs/logs-meta.ts +4 -4
  308. package/front_end/models/persistence/AutomaticFileSystemManager.test.ts +0 -39
  309. package/front_end/models/persistence/AutomaticFileSystemManager.ts +14 -21
  310. package/front_end/models/persistence/EditFileSystemView.ts +6 -6
  311. package/front_end/models/persistence/IsolatedFileSystem.ts +27 -9
  312. package/front_end/models/persistence/IsolatedFileSystemManager.ts +16 -3
  313. package/front_end/models/persistence/NetworkPersistenceManager.ts +7 -3
  314. package/front_end/models/persistence/PersistenceAction.test.ts +10 -7
  315. package/front_end/models/persistence/PersistenceActions.ts +26 -15
  316. package/front_end/models/persistence/PersistenceImpl.test.ts +2 -1
  317. package/front_end/models/persistence/PersistenceImpl.ts +7 -4
  318. package/front_end/models/persistence/PersistenceUtils.ts +10 -7
  319. package/front_end/models/persistence/PlatformFileSystem.ts +11 -2
  320. package/front_end/models/persistence/WorkspaceSettingsTab.ts +6 -6
  321. package/front_end/models/persistence/editFileSystemView.css +17 -15
  322. package/front_end/models/persistence/persistence-meta.ts +10 -10
  323. package/front_end/models/persistence/workspaceSettingsTab.css +29 -27
  324. package/front_end/models/project_settings/ProjectSettingsModel.ts +2 -2
  325. package/front_end/models/source_map_scopes/NamesResolver.test.ts +3 -2
  326. package/front_end/models/source_map_scopes/NamesResolver.ts +1 -1
  327. package/front_end/models/source_map_scopes/ScopeChainModel.test.ts +2 -1
  328. package/front_end/models/stack_trace/README.md +14 -0
  329. package/front_end/models/stack_trace/StackTrace.ts +35 -0
  330. package/front_end/models/stack_trace/StackTraceImpl.test.ts +74 -0
  331. package/front_end/models/stack_trace/StackTraceImpl.ts +82 -0
  332. package/front_end/models/stack_trace/StackTraceModel.test.ts +296 -0
  333. package/front_end/models/stack_trace/StackTraceModel.ts +127 -0
  334. package/front_end/models/stack_trace/Trie.test.ts +129 -0
  335. package/front_end/models/stack_trace/Trie.ts +154 -0
  336. package/front_end/models/stack_trace/stack_trace.ts +9 -0
  337. package/front_end/models/stack_trace/stack_trace_impl.ts +13 -0
  338. package/front_end/models/text_utils/ContentProvider.ts +1 -3
  339. package/front_end/models/text_utils/StaticContentProvider.test.ts +1 -1
  340. package/front_end/models/text_utils/StaticContentProvider.ts +1 -5
  341. package/front_end/models/text_utils/TextUtils.ts +2 -3
  342. package/front_end/models/trace/LanternComputationData.ts +1 -0
  343. package/front_end/models/trace/ModelImpl.ts +18 -7
  344. package/front_end/models/trace/Processor.test.ts +15 -14
  345. package/front_end/models/trace/Processor.ts +49 -32
  346. package/front_end/models/trace/extras/ScriptDuplication.test.ts +13 -10
  347. package/front_end/models/trace/extras/StackTraceForEvent.test.ts +10 -8
  348. package/front_end/models/trace/extras/ThirdParties.ts +2 -3
  349. package/front_end/models/trace/extras/TraceTree.ts +7 -6
  350. package/front_end/models/trace/extras/extras.ts +0 -2
  351. package/front_end/models/trace/handlers/AnimationFramesHandler.test.ts +5 -5
  352. package/front_end/models/trace/handlers/AnimationFramesHandler.ts +10 -0
  353. package/front_end/models/trace/handlers/ExtensionTraceDataHandler.test.ts +177 -85
  354. package/front_end/models/trace/handlers/ExtensionTraceDataHandler.ts +28 -27
  355. package/front_end/models/trace/handlers/FramesHandler.test.ts +2 -7
  356. package/front_end/models/trace/handlers/FramesHandler.ts +46 -37
  357. package/front_end/models/trace/handlers/ImagePaintingHandler.test.ts +41 -0
  358. package/front_end/models/trace/handlers/ImagePaintingHandler.ts +44 -1
  359. package/front_end/models/trace/handlers/InitiatorsHandler.test.ts +62 -15
  360. package/front_end/models/trace/handlers/InitiatorsHandler.ts +24 -0
  361. package/front_end/models/trace/handlers/LayoutShiftsHandler.test.ts +6 -18
  362. package/front_end/models/trace/handlers/LayoutShiftsHandler.ts +21 -17
  363. package/front_end/models/trace/handlers/MetaHandler.test.ts +12 -0
  364. package/front_end/models/trace/handlers/MetaHandler.ts +5 -4
  365. package/front_end/models/trace/handlers/NetworkRequestsHandler.test.ts +21 -21
  366. package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +79 -32
  367. package/front_end/models/trace/handlers/PageLoadMetricsHandler.test.ts +6 -18
  368. package/front_end/models/trace/handlers/RendererHandler.test.ts +26 -39
  369. package/front_end/models/trace/handlers/RendererHandler.ts +10 -17
  370. package/front_end/models/trace/handlers/SamplesHandler.test.ts +3 -4
  371. package/front_end/models/trace/handlers/SamplesHandler.ts +13 -12
  372. package/front_end/models/trace/handlers/ScriptsHandler.test.ts +1 -1
  373. package/front_end/models/trace/handlers/ScriptsHandler.ts +8 -4
  374. package/front_end/models/trace/handlers/SelectorStatsHandler.test.ts +1 -3
  375. package/front_end/models/trace/handlers/SelectorStatsHandler.ts +65 -0
  376. package/front_end/models/trace/handlers/UserInteractionsHandler.test.ts +4 -2
  377. package/front_end/models/trace/handlers/UserInteractionsHandler.ts +4 -2
  378. package/front_end/models/trace/handlers/UserTimingsHandler.test.ts +326 -0
  379. package/front_end/models/trace/handlers/UserTimingsHandler.ts +61 -24
  380. package/front_end/models/trace/handlers/helpers.test.ts +7 -6
  381. package/front_end/models/trace/handlers/helpers.ts +19 -14
  382. package/front_end/models/trace/handlers/types.ts +5 -1
  383. package/front_end/models/trace/helpers/SamplesIntegrator.test.ts +3 -3
  384. package/front_end/models/trace/helpers/SamplesIntegrator.ts +24 -33
  385. package/front_end/models/trace/helpers/SyntheticEvents.ts +2 -2
  386. package/front_end/models/trace/helpers/Timing.ts +66 -3
  387. package/front_end/models/trace/helpers/Trace.test.ts +6 -7
  388. package/front_end/models/trace/helpers/Trace.ts +47 -19
  389. package/front_end/models/trace/helpers/TreeHelpers.test.ts +0 -8
  390. package/front_end/models/trace/helpers/TreeHelpers.ts +1 -1
  391. package/front_end/models/trace/insights/CLSCulprits.test.ts +10 -7
  392. package/front_end/models/trace/insights/CLSCulprits.ts +85 -23
  393. package/front_end/models/trace/insights/Cache.ts +12 -0
  394. package/front_end/models/trace/insights/Common.test.ts +3 -3
  395. package/front_end/models/trace/insights/Common.ts +56 -22
  396. package/front_end/models/trace/insights/DOMSize.test.ts +4 -1
  397. package/front_end/models/trace/insights/DOMSize.ts +48 -1
  398. package/front_end/models/trace/insights/DocumentLatency.test.ts +5 -1
  399. package/front_end/models/trace/insights/DocumentLatency.ts +59 -4
  400. package/front_end/models/trace/insights/DuplicatedJavaScript.test.ts +2 -3
  401. package/front_end/models/trace/insights/DuplicatedJavaScript.ts +15 -4
  402. package/front_end/models/trace/insights/FontDisplay.test.ts +1 -1
  403. package/front_end/models/trace/insights/FontDisplay.ts +8 -0
  404. package/front_end/models/trace/insights/ForcedReflow.ts +25 -4
  405. package/front_end/models/trace/insights/{InteractionToNextPaint.test.ts → INPBreakdown.test.ts} +2 -2
  406. package/front_end/models/trace/insights/{InteractionToNextPaint.ts → INPBreakdown.ts} +63 -16
  407. package/front_end/models/trace/insights/ImageDelivery.ts +39 -7
  408. package/front_end/models/trace/insights/LCPBreakdown.test.ts +100 -0
  409. package/front_end/models/trace/insights/LCPBreakdown.ts +255 -0
  410. package/front_end/models/trace/insights/LCPDiscovery.ts +84 -8
  411. package/front_end/models/trace/insights/LegacyJavaScript.ts +14 -4
  412. package/front_end/models/trace/insights/Models.ts +2 -2
  413. package/front_end/models/trace/insights/ModernHTTP.test.ts +3 -2
  414. package/front_end/models/trace/insights/ModernHTTP.ts +35 -18
  415. package/front_end/models/trace/insights/NetworkDependencyTree.test.ts +10 -1
  416. package/front_end/models/trace/insights/NetworkDependencyTree.ts +41 -13
  417. package/front_end/models/trace/insights/RenderBlocking.test.ts +8 -12
  418. package/front_end/models/trace/insights/RenderBlocking.ts +13 -1
  419. package/front_end/models/trace/insights/SlowCSSSelector.test.ts +12 -34
  420. package/front_end/models/trace/insights/SlowCSSSelector.ts +46 -27
  421. package/front_end/models/trace/insights/ThirdParties.test.ts +1 -1
  422. package/front_end/models/trace/insights/ThirdParties.ts +36 -0
  423. package/front_end/models/trace/insights/Viewport.test.ts +16 -1
  424. package/front_end/models/trace/insights/Viewport.ts +41 -3
  425. package/front_end/models/trace/insights/types.ts +5 -2
  426. package/front_end/models/trace/lantern/core/NetworkAnalyzer.test.ts +4 -0
  427. package/front_end/models/trace/lantern/graph/BaseNode.ts +1 -1
  428. package/front_end/models/trace/lantern/simulation/SimulationTimingMap.ts +1 -1
  429. package/front_end/models/trace/trace.ts +0 -2
  430. package/front_end/models/trace/types/Configuration.ts +8 -0
  431. package/front_end/models/trace/types/Extensions.ts +24 -3
  432. package/front_end/models/trace/types/File.ts +5 -2
  433. package/front_end/models/trace/types/Overlays.ts +140 -0
  434. package/front_end/models/trace/types/Timing.ts +1 -0
  435. package/front_end/models/trace/types/TraceEvents.test.ts +2 -1
  436. package/front_end/models/trace/types/TraceEvents.ts +98 -62
  437. package/front_end/models/trace/types/types.ts +1 -0
  438. package/front_end/models/workspace/FileManager.ts +5 -3
  439. package/front_end/models/{bindings → workspace}/IgnoreListManager.test.ts +11 -7
  440. package/front_end/models/{bindings → workspace}/IgnoreListManager.ts +36 -33
  441. package/front_end/models/workspace/UISourceCode.test.ts +18 -17
  442. package/front_end/models/workspace/UISourceCode.ts +17 -7
  443. package/front_end/models/workspace/WorkspaceImpl.ts +1 -1
  444. package/front_end/models/workspace/workspace.ts +2 -0
  445. package/front_end/models/workspace_diff/WorkspaceDiff.test.ts +2 -0
  446. package/front_end/models/workspace_diff/WorkspaceDiff.ts +7 -2
  447. package/front_end/panels/accessibility/ARIAAttributesView.test.ts +101 -0
  448. package/front_end/panels/accessibility/ARIAAttributesView.ts +16 -4
  449. package/front_end/panels/accessibility/AXBreadcrumbsPane.ts +12 -9
  450. package/front_end/panels/accessibility/AccessibilityNodeView.ts +31 -28
  451. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +8 -12
  452. package/front_end/panels/accessibility/AccessibilityStrings.ts +87 -87
  453. package/front_end/panels/accessibility/AccessibilitySubPane.ts +6 -6
  454. package/front_end/panels/accessibility/SourceOrderView.ts +95 -61
  455. package/front_end/panels/accessibility/accessibilityProperties.css +5 -0
  456. package/front_end/panels/ai_assistance/AiAssistancePanel.snapshot.txt +32 -0
  457. package/front_end/panels/ai_assistance/AiAssistancePanel.test.ts +465 -377
  458. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +289 -339
  459. package/front_end/panels/ai_assistance/PatchWidget.ts +30 -29
  460. package/front_end/panels/ai_assistance/SelectWorkspaceDialog.test.ts +11 -1
  461. package/front_end/panels/ai_assistance/SelectWorkspaceDialog.ts +29 -19
  462. package/front_end/panels/ai_assistance/aiAssistancePanel.css +1 -0
  463. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +40 -20
  464. package/front_end/panels/ai_assistance/components/ChatView.test.ts +1 -0
  465. package/front_end/panels/ai_assistance/components/ChatView.ts +55 -44
  466. package/front_end/panels/ai_assistance/components/ExploreWidget.ts +10 -24
  467. package/front_end/panels/ai_assistance/components/UserActionRow.test.ts +4 -0
  468. package/front_end/panels/ai_assistance/components/UserActionRow.ts +25 -3
  469. package/front_end/panels/ai_assistance/components/chatView.css +0 -9
  470. package/front_end/panels/ai_assistance/components/exploreWidget.css +104 -102
  471. package/front_end/panels/ai_assistance/components/userActionRow.css +95 -94
  472. package/front_end/panels/ai_assistance/selectWorkspaceDialog.css +70 -69
  473. package/front_end/panels/animation/AnimationGroupPreviewUI.ts +1 -10
  474. package/front_end/panels/animation/AnimationTimeline.test.ts +6 -13
  475. package/front_end/panels/animation/AnimationTimeline.ts +183 -169
  476. package/front_end/panels/animation/AnimationUI.ts +4 -4
  477. package/front_end/panels/animation/animation.ts +0 -2
  478. package/front_end/panels/animation/animationTimeline.css +0 -67
  479. package/front_end/panels/application/AppManifestView.test.ts +21 -0
  480. package/front_end/panels/application/AppManifestView.ts +158 -139
  481. package/front_end/panels/application/ApplicationPanelSidebar.test.ts +13 -8
  482. package/front_end/panels/application/ApplicationPanelSidebar.ts +53 -54
  483. package/front_end/panels/application/BackForwardCacheTreeElement.ts +1 -1
  484. package/front_end/panels/application/BackgroundServiceView.test.ts +4 -8
  485. package/front_end/panels/application/BackgroundServiceView.ts +46 -44
  486. package/front_end/panels/application/CookieItemsView.ts +13 -14
  487. package/front_end/panels/application/DOMStorageItemsView.ts +5 -5
  488. package/front_end/panels/application/ExtensionStorageItemsView.ts +3 -3
  489. package/front_end/panels/application/IndexedDBModel.test.ts +2 -2
  490. package/front_end/panels/application/IndexedDBModel.ts +3 -0
  491. package/front_end/panels/application/IndexedDBViews.ts +58 -32
  492. package/front_end/panels/application/InterestGroupStorageModel.ts +3 -0
  493. package/front_end/panels/application/InterestGroupStorageView.ts +4 -4
  494. package/front_end/panels/application/InterestGroupTreeElement.ts +1 -1
  495. package/front_end/panels/application/KeyValueStorageItemsView.ts +10 -10
  496. package/front_end/panels/application/OpenedWindowDetailsView.ts +18 -18
  497. package/front_end/panels/application/PreloadingTreeElement.ts +5 -5
  498. package/front_end/panels/application/ReportingApiTreeElement.ts +1 -1
  499. package/front_end/panels/application/ReportingApiView.test.ts +161 -30
  500. package/front_end/panels/application/ReportingApiView.ts +153 -50
  501. package/front_end/panels/application/ServiceWorkerCacheTreeElement.ts +5 -5
  502. package/front_end/panels/application/ServiceWorkerCacheViews.ts +20 -17
  503. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +7 -7
  504. package/front_end/panels/application/ServiceWorkersView.ts +40 -76
  505. package/front_end/panels/application/SharedStorageEventsView.test.ts +2 -2
  506. package/front_end/panels/application/SharedStorageEventsView.ts +10 -20
  507. package/front_end/panels/application/SharedStorageItemsView.ts +11 -11
  508. package/front_end/panels/application/SharedStorageListTreeElement.ts +1 -1
  509. package/front_end/panels/application/SharedStorageModel.ts +3 -0
  510. package/front_end/panels/application/StorageBucketsTreeElement.test.ts +5 -4
  511. package/front_end/panels/application/StorageBucketsTreeElement.ts +4 -4
  512. package/front_end/panels/application/StorageItemsToolbar.ts +7 -7
  513. package/front_end/panels/application/StorageView.test.ts +5 -1
  514. package/front_end/panels/application/StorageView.ts +15 -13
  515. package/front_end/panels/application/application-meta.ts +7 -7
  516. package/front_end/panels/application/application.ts +0 -2
  517. package/front_end/panels/application/components/BackForwardCacheStrings.ts +5 -0
  518. package/front_end/panels/application/components/BackForwardCacheView.ts +11 -37
  519. package/front_end/panels/application/components/BounceTrackingMitigationsView.ts +1 -0
  520. package/front_end/panels/application/components/EndpointsGrid.ts +6 -2
  521. package/front_end/panels/application/components/FrameDetailsView.test.ts +4 -2
  522. package/front_end/panels/application/components/FrameDetailsView.ts +88 -57
  523. package/front_end/panels/application/components/InterestGroupAccessGrid.ts +9 -10
  524. package/front_end/panels/application/components/OriginTrialTreeView.ts +13 -22
  525. package/front_end/panels/application/components/PermissionsPolicySection.ts +11 -16
  526. package/front_end/panels/application/components/ProtocolHandlersView.ts +10 -10
  527. package/front_end/panels/application/components/ReportsGrid.ts +10 -11
  528. package/front_end/panels/application/components/SharedStorageAccessGrid.test.ts +4 -4
  529. package/front_end/panels/application/components/SharedStorageAccessGrid.ts +107 -101
  530. package/front_end/panels/application/components/SharedStorageMetadataView.ts +8 -8
  531. package/front_end/panels/application/components/StackTrace.ts +6 -12
  532. package/front_end/panels/application/components/StorageMetadataView.ts +22 -26
  533. package/front_end/panels/application/components/TrustTokensView.ts +3 -3
  534. package/front_end/panels/application/components/frameDetailsReportView.css +1 -1
  535. package/front_end/panels/application/components/sharedStorageAccessGrid.css +19 -17
  536. package/front_end/panels/application/preloading/PreloadingView.ts +29 -24
  537. package/front_end/panels/application/preloading/components/MismatchedPreloadingGrid.ts +9 -9
  538. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +22 -22
  539. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +28 -29
  540. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +5 -7
  541. package/front_end/panels/application/preloading/components/PreloadingMismatchedHeadersGrid.test.ts +2 -2
  542. package/front_end/panels/application/preloading/components/PreloadingMismatchedHeadersGrid.ts +4 -4
  543. package/front_end/panels/application/preloading/components/PreloadingString.ts +34 -34
  544. package/front_end/panels/application/preloading/components/RuleSetDetailsView.test.ts +28 -1
  545. package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +4 -10
  546. package/front_end/panels/application/preloading/components/RuleSetGrid.test.ts +21 -0
  547. package/front_end/panels/application/preloading/components/RuleSetGrid.ts +10 -10
  548. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +22 -23
  549. package/front_end/panels/application/resourcesSidebar.css +0 -4
  550. package/front_end/panels/autofill/AutofillView.test.ts +188 -259
  551. package/front_end/panels/autofill/AutofillView.ts +207 -217
  552. package/front_end/panels/autofill/autofill-meta.ts +3 -4
  553. package/front_end/panels/autofill/autofillView.css +85 -82
  554. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.test.ts +179 -0
  555. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +146 -35
  556. package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +27 -27
  557. package/front_end/panels/browser_debugger/ObjectEventListenersSidebarPane.ts +3 -2
  558. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +16 -14
  559. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +17 -17
  560. package/front_end/panels/browser_debugger/browser_debugger.ts +2 -0
  561. package/front_end/panels/changes/ChangesSidebar.ts +7 -7
  562. package/front_end/panels/changes/ChangesView.ts +6 -5
  563. package/front_end/panels/changes/CombinedDiffView.test.ts +2 -0
  564. package/front_end/panels/changes/CombinedDiffView.ts +2 -2
  565. package/front_end/panels/common/AiCodeCompletionDisclaimer.test.ts +57 -0
  566. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +186 -0
  567. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.test.ts +85 -0
  568. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +139 -0
  569. package/front_end/panels/common/AiCodeCompletionTeaser.test.ts +98 -0
  570. package/front_end/panels/common/AiCodeCompletionTeaser.ts +258 -0
  571. package/front_end/panels/common/FreDialog.ts +139 -0
  572. package/front_end/panels/common/aiCodeCompletionDisclaimer.css +57 -0
  573. package/front_end/panels/common/aiCodeCompletionSummaryToolbar.css +101 -0
  574. package/front_end/panels/common/aiCodeCompletionTeaser.css +42 -0
  575. package/front_end/panels/common/common.css +0 -83
  576. package/front_end/panels/common/common.ts +8 -107
  577. package/front_end/panels/common/freDialog.css +88 -0
  578. package/front_end/panels/console/ConsoleContextSelector.ts +5 -5
  579. package/front_end/panels/console/ConsoleFormat.test.ts +1 -1
  580. package/front_end/panels/console/ConsolePanel.ts +1 -2
  581. package/front_end/panels/console/ConsolePinPane.ts +9 -9
  582. package/front_end/panels/console/ConsolePrompt.test.ts +47 -1
  583. package/front_end/panels/console/ConsolePrompt.ts +188 -19
  584. package/front_end/panels/console/ConsoleSidebar.test.ts +130 -0
  585. package/front_end/panels/console/ConsoleSidebar.ts +170 -207
  586. package/front_end/panels/console/ConsoleView.test.ts +4 -4
  587. package/front_end/panels/console/ConsoleView.ts +146 -54
  588. package/front_end/panels/console/ConsoleViewMessage.test.ts +1 -1
  589. package/front_end/panels/console/ConsoleViewMessage.ts +66 -71
  590. package/front_end/panels/console/console-meta.ts +27 -27
  591. package/front_end/panels/console/consoleSidebar.css +2 -0
  592. package/front_end/panels/console/consoleView.css +22 -15
  593. package/front_end/panels/console_counters/WarningErrorCounter.ts +133 -100
  594. package/front_end/panels/coverage/CoverageDecorationManager.test.ts +2 -1
  595. package/front_end/panels/coverage/CoverageListView.ts +30 -30
  596. package/front_end/panels/coverage/CoverageView.test.ts +3 -2
  597. package/front_end/panels/coverage/CoverageView.ts +35 -34
  598. package/front_end/panels/coverage/coverage-meta.ts +7 -7
  599. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +49 -49
  600. package/front_end/panels/css_overview/CSSOverviewPanel.test.ts +3 -3
  601. package/front_end/panels/css_overview/CSSOverviewPanel.ts +1 -1
  602. package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +3 -3
  603. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +3 -3
  604. package/front_end/panels/css_overview/CSSOverviewStartView.ts +8 -8
  605. package/front_end/panels/css_overview/CSSOverviewUnusedDeclarations.ts +7 -7
  606. package/front_end/panels/css_overview/cssOverviewCompletedView.css +289 -287
  607. package/front_end/panels/css_overview/cssOverviewSidebarPanel.css +43 -42
  608. package/front_end/panels/css_overview/cssOverviewStartView.css +68 -66
  609. package/front_end/panels/css_overview/css_overview-meta.ts +2 -2
  610. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +14 -14
  611. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +5 -5
  612. package/front_end/panels/developer_resources/developerResourcesListView.css +19 -18
  613. package/front_end/panels/developer_resources/developerResourcesView.css +32 -30
  614. package/front_end/panels/elements/AccessibilityTreeView.ts +2 -1
  615. package/front_end/panels/elements/CSSRuleValidator.test.ts +39 -0
  616. package/front_end/panels/elements/CSSRuleValidator.ts +41 -37
  617. package/front_end/panels/elements/CSSRuleValidatorHelper.ts +8 -0
  618. package/front_end/panels/elements/CSSValueTraceView.test.ts +2 -1
  619. package/front_end/panels/elements/CSSValueTraceView.ts +1 -2
  620. package/front_end/panels/elements/ClassesPaneWidget.ts +5 -3
  621. package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +18 -9
  622. package/front_end/panels/elements/ComputedStyleWidget.ts +4 -3
  623. package/front_end/panels/elements/DOMLinkifier.ts +6 -4
  624. package/front_end/panels/elements/DOMTreeWidget.test.ts +58 -0
  625. package/front_end/panels/elements/ElementIssueUtils.ts +14 -9
  626. package/front_end/panels/elements/ElementStatePaneWidget.ts +3 -3
  627. package/front_end/panels/elements/ElementsPanel.test.ts +69 -2
  628. package/front_end/panels/elements/ElementsPanel.ts +105 -187
  629. package/front_end/panels/elements/ElementsSidebarPane.ts +1 -1
  630. package/front_end/panels/elements/ElementsTreeElement.test.ts +401 -0
  631. package/front_end/panels/elements/ElementsTreeElement.ts +434 -82
  632. package/front_end/panels/elements/ElementsTreeOutline.test.ts +9 -6
  633. package/front_end/panels/elements/ElementsTreeOutline.ts +425 -258
  634. package/front_end/panels/elements/ElementsTreeOutlineRenderer.ts +80 -0
  635. package/front_end/panels/elements/EventListenersWidget.test.ts +129 -0
  636. package/front_end/panels/elements/EventListenersWidget.ts +112 -78
  637. package/front_end/panels/elements/ImagePreviewPopover.ts +1 -1
  638. package/front_end/panels/elements/InspectElementModeController.test.ts +77 -2
  639. package/front_end/panels/elements/InspectElementModeController.ts +13 -2
  640. package/front_end/panels/elements/LayersWidget.ts +95 -63
  641. package/front_end/panels/elements/{components/LayoutPane.test.ts → LayoutPane.test.ts} +60 -49
  642. package/front_end/panels/elements/LayoutPane.ts +593 -0
  643. package/front_end/panels/elements/MarkerDecorator.ts +2 -2
  644. package/front_end/panels/elements/MetricsSidebarPane.ts +6 -6
  645. package/front_end/panels/elements/NodeStackTraceWidget.ts +16 -14
  646. package/front_end/panels/elements/PlatformFontsWidget.ts +8 -8
  647. package/front_end/panels/elements/PropertiesWidget.ts +2 -2
  648. package/front_end/panels/elements/PropertyRenderer.test.ts +1 -1
  649. package/front_end/panels/elements/PropertyRenderer.ts +8 -11
  650. package/front_end/panels/elements/ShortcutTreeElement.ts +157 -0
  651. package/front_end/panels/elements/StyleEditorWidget.ts +1 -1
  652. package/front_end/panels/elements/StylePropertiesSection.test.ts +10 -10
  653. package/front_end/panels/elements/StylePropertiesSection.ts +42 -44
  654. package/front_end/panels/elements/StylePropertyHighlighter.test.ts +32 -21
  655. package/front_end/panels/elements/StylePropertyHighlighter.ts +9 -11
  656. package/front_end/panels/elements/StylePropertyTreeElement.test.ts +111 -53
  657. package/front_end/panels/elements/StylePropertyTreeElement.ts +166 -100
  658. package/front_end/panels/elements/StylesSidebarPane.ts +47 -48
  659. package/front_end/panels/elements/TopLayerContainer.ts +8 -7
  660. package/front_end/panels/elements/WebCustomData.test.ts +2 -2
  661. package/front_end/panels/elements/components/AccessibilityTreeNode.ts +1 -1
  662. package/front_end/panels/elements/components/AdornerManager.ts +15 -0
  663. package/front_end/panels/elements/components/CSSHintDetailsView.ts +1 -1
  664. package/front_end/panels/elements/components/CSSPropertyDocsView.test.ts +101 -2
  665. package/front_end/panels/elements/components/CSSPropertyDocsView.ts +188 -5
  666. package/front_end/panels/elements/components/CSSPropertyIconResolver.test.ts +1 -1
  667. package/front_end/panels/elements/components/CSSPropertyIconResolver.ts +2 -2
  668. package/front_end/panels/elements/components/CSSVariableValueView.ts +5 -5
  669. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +2 -7
  670. package/front_end/panels/elements/components/ElementsTreeExpandButton.ts +1 -1
  671. package/front_end/panels/elements/components/QueryContainer.ts +1 -4
  672. package/front_end/panels/elements/components/components.ts +0 -4
  673. package/front_end/panels/elements/components/cssPropertyDocsView.css +12 -1
  674. package/front_end/panels/elements/components/cssVariableValueView.css +1 -0
  675. package/front_end/panels/elements/domLinkifier.css +36 -35
  676. package/front_end/panels/elements/elementStatePaneWidget.css +46 -45
  677. package/front_end/panels/elements/elements-meta.ts +4 -13
  678. package/front_end/panels/elements/elements.ts +4 -3
  679. package/front_end/panels/elements/elementsTreeOutline.css +2 -1
  680. package/front_end/panels/elements/layersWidget.css +2 -11
  681. package/front_end/panels/elements/layoutPane.css +145 -0
  682. package/front_end/panels/elements/metricsSidebarPane.css +1 -1
  683. package/front_end/panels/elements/nodeStackTraceWidget.css +5 -4
  684. package/front_end/panels/elements/platformFontsWidget.css +32 -31
  685. package/front_end/panels/elements/stylePropertiesTreeOutline.css +2 -2
  686. package/front_end/panels/elements/stylesSidebarPane.css +1 -0
  687. package/front_end/panels/emulation/DeviceModeToolbar.ts +13 -50
  688. package/front_end/panels/emulation/DeviceModeView.ts +3 -4
  689. package/front_end/panels/emulation/InspectedPagePlaceholder.ts +1 -1
  690. package/front_end/panels/emulation/MediaQueryInspector.ts +4 -2
  691. package/front_end/panels/emulation/emulation-meta.ts +7 -7
  692. package/front_end/panels/event_listeners/EventListenersView.test.ts +4 -4
  693. package/front_end/panels/event_listeners/EventListenersView.ts +34 -31
  694. package/front_end/panels/explain/PromptBuilder.test.ts +7 -2
  695. package/front_end/panels/explain/PromptBuilder.ts +3 -1
  696. package/front_end/panels/explain/components/ConsoleInsight.test.ts +14 -10
  697. package/front_end/panels/explain/components/ConsoleInsight.ts +13 -34
  698. package/front_end/panels/explain/explain-meta.ts +3 -3
  699. package/front_end/panels/issues/AffectedBlockedByResponseView.ts +4 -4
  700. package/front_end/panels/issues/AffectedCookiesView.ts +6 -6
  701. package/front_end/panels/issues/AffectedDescendantsWithinSelectElementView.ts +6 -6
  702. package/front_end/panels/issues/AffectedDirectivesView.ts +9 -9
  703. package/front_end/panels/issues/AffectedDocumentsInQuirksModeView.ts +4 -4
  704. package/front_end/panels/issues/AffectedElementsView.ts +1 -1
  705. package/front_end/panels/issues/AffectedElementsWithLowContrastView.ts +6 -6
  706. package/front_end/panels/issues/AffectedHeavyAdView.ts +7 -7
  707. package/front_end/panels/issues/AffectedMetadataAllowedSitesView.ts +1 -1
  708. package/front_end/panels/issues/AffectedResourcesView.ts +6 -6
  709. package/front_end/panels/issues/AffectedSharedArrayBufferIssueDetailsView.ts +10 -10
  710. package/front_end/panels/issues/AffectedSourcesView.ts +1 -1
  711. package/front_end/panels/issues/AffectedTrackingSitesView.ts +1 -1
  712. package/front_end/panels/issues/CorsIssueDetailsView.ts +27 -27
  713. package/front_end/panels/issues/GenericIssueDetailsView.ts +3 -3
  714. package/front_end/panels/issues/HiddenIssuesRow.ts +55 -29
  715. package/front_end/panels/issues/IssueAggregator.ts +5 -11
  716. package/front_end/panels/issues/IssueKindView.ts +2 -2
  717. package/front_end/panels/issues/IssueView.ts +13 -13
  718. package/front_end/panels/issues/IssuesPane.ts +5 -4
  719. package/front_end/panels/issues/components/HideIssuesMenu.ts +1 -1
  720. package/front_end/panels/issues/issues-meta.ts +2 -2
  721. package/front_end/panels/js_timeline/js_timeline-meta.ts +6 -6
  722. package/front_end/panels/layer_viewer/LayerDetailsView.ts +43 -41
  723. package/front_end/panels/layer_viewer/LayerTreeOutline.ts +7 -7
  724. package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
  725. package/front_end/panels/layer_viewer/Layers3DView.ts +19 -13
  726. package/front_end/panels/layer_viewer/PaintProfilerView.ts +9 -9
  727. package/front_end/panels/layer_viewer/TransformController.ts +14 -8
  728. package/front_end/panels/layer_viewer/layer_viewer-meta.ts +9 -9
  729. package/front_end/panels/layers/LayersPanel.ts +3 -3
  730. package/front_end/panels/layers/layers-meta.ts +2 -2
  731. package/front_end/panels/lighthouse/LighthouseController.ts +27 -27
  732. package/front_end/panels/lighthouse/LighthousePanel.ts +7 -7
  733. package/front_end/panels/lighthouse/LighthouseProtocolService.ts +31 -33
  734. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +4 -2
  735. package/front_end/panels/lighthouse/LighthouseReportSelector.ts +2 -4
  736. package/front_end/panels/lighthouse/LighthouseStartView.ts +4 -3
  737. package/front_end/panels/lighthouse/LighthouseStatusView.ts +31 -31
  738. package/front_end/panels/lighthouse/lighthouse-meta.ts +1 -1
  739. package/front_end/panels/lighthouse/lighthousePanel.css +9 -0
  740. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +2 -2
  741. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +5 -6
  742. package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +6 -10
  743. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +3 -3
  744. package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +6 -6
  745. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +2 -2
  746. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +6 -7
  747. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +1 -1
  748. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
  749. package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +2 -2
  750. package/front_end/panels/media/EventDisplayTable.ts +5 -7
  751. package/front_end/panels/media/EventTimelineView.ts +4 -4
  752. package/front_end/panels/media/MainView.test.ts +1 -1
  753. package/front_end/panels/media/MainView.ts +4 -4
  754. package/front_end/panels/media/MediaModel.ts +2 -2
  755. package/front_end/panels/media/PlayerDetailView.ts +8 -8
  756. package/front_end/panels/media/PlayerListView.ts +8 -8
  757. package/front_end/panels/media/PlayerMessagesView.ts +15 -17
  758. package/front_end/panels/media/PlayerPropertiesView.ts +66 -51
  759. package/front_end/panels/media/TickingFlameChart.ts +6 -5
  760. package/front_end/panels/media/media-meta.ts +3 -3
  761. package/front_end/panels/mobile_throttling/CalibrationController.ts +3 -4
  762. package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +3 -3
  763. package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +4 -4
  764. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +189 -51
  765. package/front_end/panels/mobile_throttling/ThrottlingManager.test.ts +37 -1
  766. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +114 -126
  767. package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +8 -8
  768. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.test.ts +115 -0
  769. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +178 -143
  770. package/front_end/panels/mobile_throttling/mobile_throttling-meta.ts +6 -6
  771. package/front_end/panels/mobile_throttling/throttlingSettingsTab.css +30 -36
  772. package/front_end/panels/network/BinaryResourceView.ts +7 -7
  773. package/front_end/panels/network/BlockedURLsPane.ts +18 -17
  774. package/front_end/panels/network/EventSourceMessagesView.ts +9 -10
  775. package/front_end/panels/network/NetworkConfigView.test.ts +35 -0
  776. package/front_end/panels/network/NetworkConfigView.ts +19 -17
  777. package/front_end/panels/network/NetworkDataGridNode.test.ts +19 -8
  778. package/front_end/panels/network/NetworkDataGridNode.ts +129 -90
  779. package/front_end/panels/network/NetworkItemView.test.ts +3 -3
  780. package/front_end/panels/network/NetworkItemView.ts +79 -79
  781. package/front_end/panels/network/NetworkLogView.test.ts +61 -23
  782. package/front_end/panels/network/NetworkLogView.ts +207 -130
  783. package/front_end/panels/network/NetworkLogViewColumns.ts +60 -63
  784. package/front_end/panels/network/NetworkManageCustomHeadersView.ts +5 -5
  785. package/front_end/panels/network/NetworkPanel.test.ts +3 -3
  786. package/front_end/panels/network/NetworkPanel.ts +69 -68
  787. package/front_end/panels/network/NetworkSearchScope.ts +1 -1
  788. package/front_end/panels/network/NetworkTimeCalculator.ts +35 -40
  789. package/front_end/panels/network/NetworkWaterfallColumn.ts +2 -12
  790. package/front_end/panels/network/RequestCookiesView.ts +10 -11
  791. package/front_end/panels/network/RequestHTMLView.ts +2 -2
  792. package/front_end/panels/network/RequestInitiatorView.ts +16 -16
  793. package/front_end/panels/network/RequestPayloadView.ts +12 -13
  794. package/front_end/panels/network/RequestPreviewView.ts +3 -4
  795. package/front_end/panels/network/RequestResponseView.test.ts +36 -0
  796. package/front_end/panels/network/RequestResponseView.ts +5 -5
  797. package/front_end/panels/network/RequestTimingView.ts +54 -54
  798. package/front_end/panels/network/ResourceChunkView.ts +13 -13
  799. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +26 -17
  800. package/front_end/panels/network/ResourceWebSocketFrameView.ts +9 -9
  801. package/front_end/panels/network/SignedExchangeInfoView.ts +24 -24
  802. package/front_end/panels/network/binaryResourceView.css +1 -0
  803. package/front_end/panels/network/components/DirectSocketConnectionView.ts +18 -16
  804. package/front_end/panels/network/components/HeaderSectionRow.ts +17 -42
  805. package/front_end/panels/network/components/RequestHeaderSection.ts +6 -11
  806. package/front_end/panels/network/components/RequestHeadersView.css +2 -2
  807. package/front_end/panels/network/components/RequestHeadersView.test.ts +5 -2
  808. package/front_end/panels/network/components/RequestHeadersView.ts +24 -34
  809. package/front_end/panels/network/components/RequestTrustTokensView.ts +19 -23
  810. package/front_end/panels/network/components/ResponseHeaderSection.ts +16 -15
  811. package/front_end/panels/network/components/WebBundleInfoView.ts +4 -9
  812. package/front_end/panels/network/network-meta.ts +27 -27
  813. package/front_end/panels/network/networkConfigView.css +13 -6
  814. package/front_end/panels/network/networkLogView.css +1 -1
  815. package/front_end/panels/network/networkPanel.css +3 -2
  816. package/front_end/panels/network/requestHTMLView.css +9 -8
  817. package/front_end/panels/network/resourceChunkView.css +21 -28
  818. package/front_end/panels/performance_monitor/PerformanceMonitor.test.ts +121 -6
  819. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +252 -168
  820. package/front_end/panels/performance_monitor/performanceMonitor.css +7 -9
  821. package/front_end/panels/performance_monitor/performance_monitor-meta.ts +7 -7
  822. package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +19 -52
  823. package/front_end/panels/profiler/HeapDetachedElementsView.ts +9 -6
  824. package/front_end/panels/profiler/HeapProfileView.ts +24 -24
  825. package/front_end/panels/profiler/HeapProfilerPanel.ts +1 -1
  826. package/front_end/panels/profiler/HeapSnapshotDataGrids.ts +20 -20
  827. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +27 -27
  828. package/front_end/panels/profiler/HeapSnapshotProxy.ts +2 -6
  829. package/front_end/panels/profiler/HeapSnapshotView.ts +59 -56
  830. package/front_end/panels/profiler/HeapTimelineOverview.ts +1 -2
  831. package/front_end/panels/profiler/IsolateSelector.ts +16 -16
  832. package/front_end/panels/profiler/LiveHeapProfileView.ts +14 -14
  833. package/front_end/panels/profiler/ModuleUIStrings.ts +26 -26
  834. package/front_end/panels/profiler/ProfileDataGrid.ts +5 -5
  835. package/front_end/panels/profiler/ProfileHeader.ts +0 -9
  836. package/front_end/panels/profiler/ProfileLauncherView.ts +6 -6
  837. package/front_end/panels/profiler/ProfileSidebarTreeElement.ts +1 -1
  838. package/front_end/panels/profiler/ProfileView.ts +23 -20
  839. package/front_end/panels/profiler/ProfilesPanel.ts +9 -9
  840. package/front_end/panels/profiler/heapProfiler.css +8 -0
  841. package/front_end/panels/profiler/profiler-meta.ts +12 -12
  842. package/front_end/panels/protocol_monitor/JSONEditor.test.ts +2 -2
  843. package/front_end/panels/protocol_monitor/JSONEditor.ts +36 -19
  844. package/front_end/panels/protocol_monitor/ProtocolMonitor.test.ts +105 -103
  845. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +24 -25
  846. package/front_end/panels/protocol_monitor/protocolMonitor.css +15 -9
  847. package/front_end/panels/protocol_monitor/protocol_monitor-meta.ts +1 -1
  848. package/front_end/panels/recorder/RecorderController.test.ts +9 -2
  849. package/front_end/panels/recorder/RecorderController.ts +82 -85
  850. package/front_end/panels/recorder/components/CreateRecordingView.ts +2 -2
  851. package/front_end/panels/recorder/components/RecordingListView.test.ts +42 -53
  852. package/front_end/panels/recorder/components/RecordingListView.ts +141 -125
  853. package/front_end/panels/recorder/components/RecordingView.test.ts +73 -122
  854. package/front_end/panels/recorder/components/RecordingView.ts +912 -929
  855. package/front_end/panels/recorder/components/StepEditor.ts +13 -13
  856. package/front_end/panels/recorder/components/StepView.ts +23 -24
  857. package/front_end/panels/recorder/components/recordingListView.css +76 -75
  858. package/front_end/panels/recorder/components/recordingView.css +303 -308
  859. package/front_end/panels/recorder/components/stepView.css +197 -196
  860. package/front_end/panels/recorder/components/timelineSection.css +1 -1
  861. package/front_end/panels/recorder/injected/rollup.config.mjs +1 -1
  862. package/front_end/panels/recorder/injected/selectors/ARIASelector.ts +2 -2
  863. package/front_end/panels/recorder/injected/selectors/CSSSelector.ts +4 -4
  864. package/front_end/panels/recorder/injected/selectors/PierceSelector.ts +2 -2
  865. package/front_end/panels/recorder/injected/selectors/TextSelector.ts +2 -2
  866. package/front_end/panels/recorder/injected/selectors/XPath.ts +3 -3
  867. package/front_end/panels/recorder/models/RecorderSettings.ts +0 -1
  868. package/front_end/panels/recorder/models/RecordingPlayer.test.ts +48 -68
  869. package/front_end/panels/recorder/models/RecordingPlayer.ts +9 -9
  870. package/front_end/panels/recorder/models/RecordingSession.ts +3 -3
  871. package/front_end/panels/recorder/recorder-meta.ts +5 -5
  872. package/front_end/panels/recorder/recorderController.css +3 -3
  873. package/front_end/panels/screencast/ScreencastApp.ts +1 -1
  874. package/front_end/panels/screencast/ScreencastView.ts +13 -18
  875. package/front_end/panels/search/SearchResultsPane.ts +8 -8
  876. package/front_end/panels/search/SearchView.test.ts +2 -2
  877. package/front_end/panels/search/SearchView.ts +130 -127
  878. package/front_end/panels/search/searchResultsPane.css +2 -2
  879. package/front_end/panels/search/searchView.css +2 -2
  880. package/front_end/panels/security/CookieControlsView.ts +27 -27
  881. package/front_end/panels/security/CookieReportView.ts +40 -73
  882. package/front_end/panels/security/IPProtectionTreeElement.ts +21 -0
  883. package/front_end/panels/security/IPProtectionView.ts +179 -0
  884. package/front_end/panels/security/SecurityModel.ts +10 -10
  885. package/front_end/panels/security/SecurityPanel.test.ts +22 -0
  886. package/front_end/panels/security/SecurityPanel.ts +107 -107
  887. package/front_end/panels/security/SecurityPanelSidebar.ts +27 -11
  888. package/front_end/panels/security/ipProtectionView.css +109 -0
  889. package/front_end/panels/security/security-meta.ts +4 -4
  890. package/front_end/panels/security/security.ts +2 -0
  891. package/front_end/panels/sensors/LocationsSettingsTab.ts +32 -31
  892. package/front_end/panels/sensors/SensorsView.ts +50 -42
  893. package/front_end/panels/sensors/sensors-meta.ts +20 -20
  894. package/front_end/panels/settings/AISettingsTab.test.ts +19 -6
  895. package/front_end/panels/settings/AISettingsTab.ts +118 -72
  896. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +22 -20
  897. package/front_end/panels/settings/KeybindsSettingsTab.ts +31 -30
  898. package/front_end/panels/settings/SettingsScreen.ts +19 -20
  899. package/front_end/panels/settings/components/SyncSection.test.ts +43 -9
  900. package/front_end/panels/settings/components/SyncSection.ts +63 -29
  901. package/front_end/panels/settings/components/syncSection.css +16 -7
  902. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +14 -16
  903. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.test.ts +61 -0
  904. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +134 -28
  905. package/front_end/panels/settings/emulation/components/userAgentClientHintsForm.css +19 -0
  906. package/front_end/panels/settings/emulation/emulation-meta.ts +2 -2
  907. package/front_end/panels/settings/settings-meta.ts +12 -12
  908. package/front_end/panels/settings/settingsScreen.css +0 -1
  909. package/front_end/panels/snippets/ScriptSnippetFileSystem.ts +5 -5
  910. package/front_end/panels/snippets/SnippetsQuickOpen.ts +4 -4
  911. package/front_end/panels/sources/AddSourceMapURLDialog.ts +5 -5
  912. package/front_end/panels/sources/AiCodeCompletionPlugin.test.ts +119 -0
  913. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +400 -0
  914. package/front_end/panels/sources/AiWarningInfobarPlugin.ts +3 -3
  915. package/front_end/panels/sources/BreakpointEditDialog.ts +13 -11
  916. package/front_end/panels/sources/{components/BreakpointsView.test.ts → BreakpointsView.test.ts} +237 -225
  917. package/front_end/panels/sources/{components/BreakpointsView.ts → BreakpointsView.ts} +336 -301
  918. package/front_end/panels/sources/{components/BreakpointsViewUtils.test.ts → BreakpointsViewUtils.test.ts} +29 -29
  919. package/front_end/panels/sources/{components/BreakpointsViewUtils.ts → BreakpointsViewUtils.ts} +3 -3
  920. package/front_end/panels/sources/CSSPlugin.ts +26 -17
  921. package/front_end/panels/sources/CallStackSidebarPane.ts +34 -58
  922. package/front_end/panels/sources/CategorizedBreakpointL10n.ts +18 -18
  923. package/front_end/panels/sources/CoveragePlugin.test.ts +2 -0
  924. package/front_end/panels/sources/CoveragePlugin.ts +5 -5
  925. package/front_end/panels/sources/DebuggerPausedMessage.test.ts +2 -0
  926. package/front_end/panels/sources/DebuggerPausedMessage.ts +33 -39
  927. package/front_end/panels/sources/DebuggerPlugin.test.ts +4 -3
  928. package/front_end/panels/sources/DebuggerPlugin.ts +68 -49
  929. package/front_end/panels/sources/FilteredUISourceCodeListProvider.test.ts +3 -4
  930. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +7 -7
  931. package/front_end/panels/sources/GoToLineQuickOpen.ts +15 -15
  932. package/front_end/panels/sources/InplaceFormatterEditorAction.ts +9 -6
  933. package/front_end/panels/sources/NavigatorView.test.ts +2 -1
  934. package/front_end/panels/sources/NavigatorView.ts +39 -35
  935. package/front_end/panels/sources/OpenFileQuickOpen.ts +6 -6
  936. package/front_end/panels/sources/OutlineQuickOpen.ts +3 -3
  937. package/front_end/panels/sources/ProfilePlugin.ts +3 -3
  938. package/front_end/panels/sources/ResourceOriginPlugin.ts +1 -1
  939. package/front_end/panels/sources/ScopeChainSidebarPane.ts +11 -9
  940. package/front_end/panels/sources/SnippetsPlugin.ts +2 -2
  941. package/front_end/panels/sources/SourcesNavigator.test.ts +3 -2
  942. package/front_end/panels/sources/SourcesNavigator.ts +32 -20
  943. package/front_end/panels/sources/SourcesPanel.test.ts +90 -0
  944. package/front_end/panels/sources/SourcesPanel.ts +71 -28
  945. package/front_end/panels/sources/SourcesSearchScope.ts +1 -1
  946. package/front_end/panels/sources/SourcesView.test.ts +5 -2
  947. package/front_end/panels/sources/SourcesView.ts +7 -8
  948. package/front_end/panels/sources/TabbedEditorContainer.ts +11 -8
  949. package/front_end/panels/sources/ThreadsSidebarPane.ts +7 -10
  950. package/front_end/panels/sources/UISourceCodeFrame.test.ts +104 -0
  951. package/front_end/panels/sources/UISourceCodeFrame.ts +40 -17
  952. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +14 -9
  953. package/front_end/panels/sources/breakpointsView.css +276 -0
  954. package/front_end/panels/sources/components/HeadersView.ts +17 -13
  955. package/front_end/panels/sources/components/components.ts +0 -4
  956. package/front_end/panels/sources/scopeChainSidebarPane.css +1 -1
  957. package/front_end/panels/sources/sources-meta.ts +103 -112
  958. package/front_end/panels/sources/sources.ts +6 -0
  959. package/front_end/panels/timeline/ActiveFilters.ts +2 -1
  960. package/front_end/panels/timeline/AnimationsTrackAppender.ts +1 -1
  961. package/front_end/panels/timeline/AnnotationHelpers.test.ts +14 -8
  962. package/front_end/panels/timeline/AnnotationHelpers.ts +28 -23
  963. package/front_end/panels/timeline/AppenderUtils.ts +2 -2
  964. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +1 -14
  965. package/front_end/panels/timeline/CountersGraph.test.ts +80 -0
  966. package/front_end/panels/timeline/CountersGraph.ts +27 -18
  967. package/front_end/panels/timeline/EntriesFilter.test.ts +22 -15
  968. package/front_end/panels/timeline/EventsTimelineTreeView.ts +4 -25
  969. package/front_end/panels/timeline/ExtensionTrackAppender.ts +4 -9
  970. package/front_end/panels/timeline/GPUTrackAppender.ts +3 -3
  971. package/front_end/panels/timeline/Initiators.test.ts +22 -19
  972. package/front_end/panels/timeline/Initiators.ts +19 -6
  973. package/front_end/panels/timeline/InteractionsTrackAppender.ts +6 -6
  974. package/front_end/panels/timeline/IsolateSelector.ts +2 -2
  975. package/front_end/panels/timeline/LayoutShiftsTrackAppender.ts +6 -5
  976. package/front_end/panels/timeline/ModificationsManager.test.ts +98 -188
  977. package/front_end/panels/timeline/ModificationsManager.ts +51 -48
  978. package/front_end/panels/timeline/NetworkTrackAppender.ts +3 -3
  979. package/front_end/panels/timeline/README.md +5 -13
  980. package/front_end/{models/trace/extras/Metadata.test.ts → panels/timeline/RecordingMetadata.test.ts} +61 -29
  981. package/front_end/panels/timeline/RecordingMetadata.ts +79 -0
  982. package/front_end/panels/timeline/SaveFileFormatter.test.ts +1 -3
  983. package/front_end/panels/timeline/SaveFileFormatter.ts +0 -8
  984. package/front_end/panels/timeline/StatusDialog.ts +12 -8
  985. package/front_end/panels/timeline/ThirdPartyTreeView.ts +5 -5
  986. package/front_end/panels/timeline/ThreadAppender.ts +29 -29
  987. package/front_end/panels/timeline/TimelineController.ts +14 -18
  988. package/front_end/panels/timeline/TimelineDetailsView.test.ts +49 -15
  989. package/front_end/panels/timeline/TimelineDetailsView.ts +213 -105
  990. package/front_end/panels/timeline/TimelineEventOverview.ts +6 -6
  991. package/front_end/panels/timeline/TimelineFlameChartDataProvider.test.ts +56 -95
  992. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +94 -65
  993. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.test.ts +3 -62
  994. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +10 -30
  995. package/front_end/panels/timeline/TimelineFlameChartView.test.ts +105 -80
  996. package/front_end/panels/timeline/TimelineFlameChartView.ts +107 -102
  997. package/front_end/panels/timeline/TimelineHistoryManager.test.ts +0 -5
  998. package/front_end/panels/timeline/TimelineHistoryManager.ts +8 -8
  999. package/front_end/panels/timeline/TimelineLoader.test.ts +4 -7
  1000. package/front_end/panels/timeline/TimelineLoader.ts +22 -3
  1001. package/front_end/panels/timeline/TimelineMiniMap.ts +13 -5
  1002. package/front_end/panels/timeline/TimelinePaintProfilerView.ts +1 -1
  1003. package/front_end/panels/timeline/TimelinePanel.test.ts +381 -117
  1004. package/front_end/panels/timeline/TimelinePanel.ts +576 -345
  1005. package/front_end/panels/timeline/TimelineSelectorStatsView.ts +195 -80
  1006. package/front_end/panels/timeline/TimelineTreeView.test.ts +5 -5
  1007. package/front_end/panels/timeline/TimelineTreeView.ts +25 -25
  1008. package/front_end/panels/timeline/TimelineUIUtils.test.ts +58 -55
  1009. package/front_end/panels/timeline/TimelineUIUtils.ts +159 -345
  1010. package/front_end/panels/timeline/TimingsTrackAppender.ts +12 -7
  1011. package/front_end/panels/timeline/TrackConfigBanner.test.ts +68 -0
  1012. package/front_end/panels/timeline/TrackConfigBanner.ts +97 -0
  1013. package/front_end/panels/timeline/TrackConfiguration.test.ts +3 -3
  1014. package/front_end/panels/timeline/TrackConfiguration.ts +1 -0
  1015. package/front_end/panels/timeline/UIDevtoolsUtils.ts +15 -15
  1016. package/front_end/panels/timeline/components/BreadcrumbsUI.ts +4 -9
  1017. package/front_end/panels/timeline/components/DetailsView.ts +13 -13
  1018. package/front_end/panels/timeline/components/ExportTraceOptions.test.ts +281 -0
  1019. package/front_end/panels/timeline/components/ExportTraceOptions.ts +262 -0
  1020. package/front_end/panels/timeline/components/FieldSettingsDialog.test.ts +1 -1
  1021. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +2 -1
  1022. package/front_end/panels/timeline/components/IgnoreListSetting.test.ts +5 -4
  1023. package/front_end/panels/timeline/components/IgnoreListSetting.ts +7 -7
  1024. package/front_end/panels/timeline/components/InteractionBreakdown.ts +3 -3
  1025. package/front_end/panels/timeline/components/Invalidations.test.ts +2 -1
  1026. package/front_end/panels/timeline/components/LayoutShiftDetails.test.ts +21 -11
  1027. package/front_end/panels/timeline/components/LayoutShiftDetails.ts +325 -307
  1028. package/front_end/panels/timeline/components/LiveMetricsView.test.ts +14 -22
  1029. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -1
  1030. package/front_end/panels/timeline/components/MetricCard.test.ts +2 -2
  1031. package/front_end/panels/timeline/components/NetworkRequestDetails.test.ts +38 -44
  1032. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +318 -278
  1033. package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +8 -8
  1034. package/front_end/panels/timeline/components/NetworkThrottlingSelector.test.ts +3 -0
  1035. package/front_end/panels/timeline/components/OriginMap.ts +1 -1
  1036. package/front_end/panels/timeline/components/RelatedInsightChips.test.ts +17 -31
  1037. package/front_end/panels/timeline/components/RelatedInsightChips.ts +87 -66
  1038. package/front_end/panels/timeline/components/Sidebar.test.ts +43 -4
  1039. package/front_end/panels/timeline/components/Sidebar.ts +47 -20
  1040. package/front_end/panels/timeline/components/SidebarAnnotationsTab.test.ts +47 -72
  1041. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +228 -218
  1042. package/front_end/panels/timeline/components/SidebarInsightsTab.test.ts +1 -0
  1043. package/front_end/panels/timeline/components/SidebarInsightsTab.ts +18 -54
  1044. package/front_end/panels/timeline/components/SidebarSingleInsightSet.test.ts +7 -53
  1045. package/front_end/panels/timeline/components/SidebarSingleInsightSet.ts +61 -44
  1046. package/front_end/panels/timeline/components/TimelineSummary.ts +4 -4
  1047. package/front_end/panels/timeline/components/Utils.ts +9 -9
  1048. package/front_end/panels/timeline/components/components.ts +2 -0
  1049. package/front_end/panels/timeline/components/exportTraceOptions.css +26 -0
  1050. package/front_end/panels/timeline/components/insights/BaseInsightComponent.test.ts +40 -16
  1051. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +28 -34
  1052. package/front_end/panels/timeline/components/insights/CLSCulprits.test.ts +5 -5
  1053. package/front_end/panels/timeline/components/insights/CLSCulprits.ts +32 -23
  1054. package/front_end/panels/timeline/components/insights/Cache.ts +4 -22
  1055. package/front_end/panels/timeline/components/insights/Checklist.ts +6 -7
  1056. package/front_end/panels/timeline/components/insights/DOMSize.ts +35 -15
  1057. package/front_end/panels/timeline/components/insights/DocumentLatency.ts +1 -61
  1058. package/front_end/panels/timeline/components/insights/DuplicatedJavaScript.ts +5 -17
  1059. package/front_end/panels/timeline/components/insights/EventRef.ts +7 -9
  1060. package/front_end/panels/timeline/components/insights/FontDisplay.ts +20 -21
  1061. package/front_end/panels/timeline/components/insights/ForcedReflow.ts +5 -28
  1062. package/front_end/panels/timeline/components/insights/{InteractionToNextPaint.test.ts → INPBreakdown.test.ts} +8 -5
  1063. package/front_end/panels/timeline/components/insights/INPBreakdown.ts +70 -0
  1064. package/front_end/panels/timeline/components/insights/ImageDelivery.ts +7 -21
  1065. package/front_end/panels/timeline/components/insights/LCPBreakdown.ts +146 -0
  1066. package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +28 -80
  1067. package/front_end/panels/timeline/components/insights/LegacyJavaScript.ts +3 -15
  1068. package/front_end/panels/timeline/components/insights/ModernHTTP.ts +18 -23
  1069. package/front_end/panels/timeline/components/insights/NetworkDependencyTree.test.ts +76 -0
  1070. package/front_end/panels/timeline/components/insights/NetworkDependencyTree.ts +35 -29
  1071. package/front_end/panels/timeline/components/insights/NodeLink.test.ts +113 -0
  1072. package/front_end/panels/timeline/components/insights/NodeLink.ts +50 -10
  1073. package/front_end/panels/timeline/components/insights/README.md +1 -1
  1074. package/front_end/panels/timeline/components/insights/RenderBlocking.ts +4 -22
  1075. package/front_end/panels/timeline/components/insights/SidebarInsight.ts +1 -2
  1076. package/front_end/panels/timeline/components/insights/SlowCSSSelector.ts +16 -28
  1077. package/front_end/panels/timeline/components/insights/Table.ts +2 -3
  1078. package/front_end/panels/timeline/components/insights/ThirdParties.ts +7 -47
  1079. package/front_end/panels/timeline/components/insights/Viewport.ts +0 -6
  1080. package/front_end/panels/timeline/components/insights/insights.ts +4 -4
  1081. package/front_end/panels/timeline/components/insights/table.css +18 -0
  1082. package/front_end/panels/timeline/components/insights/types.ts +2 -2
  1083. package/front_end/panels/timeline/components/layoutShiftDetails.css +99 -92
  1084. package/front_end/panels/timeline/components/networkRequestDetails.css +110 -104
  1085. package/front_end/panels/timeline/components/networkRequestTooltip.css +88 -83
  1086. package/front_end/panels/timeline/components/relatedInsightChips.css +60 -58
  1087. package/front_end/panels/timeline/components/sidebarAnnotationsTab.css +80 -78
  1088. package/front_end/panels/timeline/components/sidebarInsightsTab.css +0 -25
  1089. package/front_end/panels/timeline/components/sidebarSingleInsightSet.css +1 -1
  1090. package/front_end/panels/timeline/docs/flame_chart_migration.md +2 -2
  1091. package/front_end/panels/timeline/overlays/OverlaysImpl.test.ts +149 -42
  1092. package/front_end/panels/timeline/overlays/OverlaysImpl.ts +218 -283
  1093. package/front_end/panels/timeline/overlays/components/EntriesLinkOverlay.ts +1 -1
  1094. package/front_end/panels/timeline/overlays/components/EntryLabelOverlay.ts +69 -104
  1095. package/front_end/panels/timeline/overlays/components/TimeRangeOverlay.ts +1 -1
  1096. package/front_end/panels/timeline/overlays/components/entryLabelOverlay.css +13 -0
  1097. package/front_end/panels/timeline/overlays/components/timeRangeOverlay.css +2 -1
  1098. package/front_end/panels/timeline/timeline-meta.ts +14 -14
  1099. package/front_end/panels/timeline/timeline.ts +4 -4
  1100. package/front_end/panels/timeline/timelineDetailsView.css +118 -0
  1101. package/front_end/panels/timeline/timelineFlameChartView.css +18 -117
  1102. package/front_end/panels/timeline/timelineMiniMap.css +5 -0
  1103. package/front_end/panels/timeline/timelinePanel.css +2 -10
  1104. package/front_end/panels/timeline/timelineTreeView.css +0 -4
  1105. package/front_end/panels/timeline/track_appenders/CompatibilityTracksAppender.test.ts +16 -15
  1106. package/front_end/panels/timeline/track_appenders/ExtensionTrackAppender.test.ts +6 -4
  1107. package/front_end/panels/timeline/track_appenders/InteractionsTrackAppender.test.ts +0 -1
  1108. package/front_end/panels/timeline/track_appenders/ThreadAppender.test.ts +34 -49
  1109. package/front_end/panels/timeline/utils/AICallTree.test.ts +54 -120
  1110. package/front_end/panels/timeline/utils/AICallTree.ts +31 -74
  1111. package/front_end/panels/timeline/utils/AIContext.ts +67 -0
  1112. package/front_end/panels/timeline/utils/EntityMapper.test.ts +5 -4
  1113. package/front_end/panels/timeline/utils/EntityMapper.ts +3 -3
  1114. package/front_end/panels/timeline/utils/EntryName.test.ts +3 -3
  1115. package/front_end/panels/timeline/utils/EntryName.ts +10 -10
  1116. package/front_end/panels/timeline/utils/EntryNodes.test.ts +137 -0
  1117. package/front_end/panels/timeline/utils/EntryNodes.ts +107 -0
  1118. package/front_end/panels/timeline/utils/EntryStyles.ts +110 -110
  1119. package/front_end/panels/timeline/{EventsSerializer.test.ts → utils/EventsSerializer.test.ts} +7 -7
  1120. package/front_end/panels/timeline/{EventsSerializer.ts → utils/EventsSerializer.ts} +1 -1
  1121. package/front_end/panels/timeline/{FreshRecording.test.ts → utils/FreshRecording.test.ts} +5 -5
  1122. package/front_end/panels/timeline/{FreshRecording.ts → utils/FreshRecording.ts} +1 -1
  1123. package/front_end/panels/timeline/utils/Helpers.ts +6 -0
  1124. package/front_end/panels/timeline/utils/IgnoreList.test.ts +7 -6
  1125. package/front_end/panels/timeline/utils/IgnoreList.ts +6 -6
  1126. package/front_end/panels/timeline/utils/InsightAIContext.test.ts +61 -25
  1127. package/front_end/panels/timeline/utils/InsightAIContext.ts +102 -81
  1128. package/front_end/panels/timeline/utils/SourceMapsResolver.test.ts +5 -4
  1129. package/front_end/panels/timeline/utils/Treemap.ts +5 -20
  1130. package/front_end/panels/timeline/utils/utils.ts +8 -0
  1131. package/front_end/panels/utils/utils.test.ts +1 -7
  1132. package/front_end/panels/utils/utils.ts +17 -21
  1133. package/front_end/panels/web_audio/WebAudioView.test.ts +224 -11
  1134. package/front_end/panels/web_audio/WebAudioView.ts +219 -267
  1135. package/front_end/panels/web_audio/web_audio-meta.ts +3 -3
  1136. package/front_end/panels/web_audio/web_audio.ts +0 -12
  1137. package/front_end/panels/webauthn/WebauthnPane.test.ts +75 -72
  1138. package/front_end/panels/webauthn/WebauthnPane.ts +517 -578
  1139. package/front_end/panels/webauthn/webauthn-meta.ts +2 -2
  1140. package/front_end/panels/webauthn/webauthnPane.css +157 -155
  1141. package/front_end/panels/whats_new/ReleaseNoteText.ts +11 -11
  1142. package/front_end/panels/whats_new/ReleaseNoteView.ts +2 -2
  1143. package/front_end/panels/whats_new/releaseNoteView.css +92 -91
  1144. package/front_end/panels/whats_new/resources/WNDT.md +6 -10
  1145. package/front_end/panels/whats_new/whats_new-meta.ts +7 -7
  1146. package/front_end/services/trace_bounds/TraceBounds.ts +1 -1
  1147. package/front_end/services/tracing/ExternalRequests.test.ts +39 -0
  1148. package/front_end/services/tracing/ExternalRequests.ts +74 -0
  1149. package/front_end/services/tracing/PerformanceTracing.ts +5 -4
  1150. package/front_end/{models/trace → services/tracing}/TracingManager.test.ts +9 -7
  1151. package/front_end/{models/trace → services/tracing}/TracingManager.ts +3 -4
  1152. package/front_end/services/tracing/tracing.ts +4 -0
  1153. package/front_end/testing/AiAssistanceHelpers.ts +10 -8
  1154. package/front_end/testing/DOMHelpers.ts +8 -6
  1155. package/front_end/testing/EnvironmentHelpers.ts +21 -6
  1156. package/front_end/testing/ExpectStubCall.ts +2 -1
  1157. package/front_end/testing/InsightHelpers.ts +11 -4
  1158. package/front_end/testing/MockConnection.ts +3 -2
  1159. package/front_end/testing/MockSettingStorage.ts +23 -0
  1160. package/front_end/testing/MutationHelpers.test.ts +1 -3
  1161. package/front_end/testing/OverridesHelpers.ts +9 -3
  1162. package/front_end/testing/PropertyParser.ts +1 -1
  1163. package/front_end/testing/README.md +34 -0
  1164. package/front_end/testing/SnapshotTester.snapshot.txt +9 -0
  1165. package/front_end/testing/SnapshotTester.test.ts +32 -0
  1166. package/front_end/testing/SnapshotTester.ts +150 -0
  1167. package/front_end/testing/SourceMapEncoder.ts +1 -237
  1168. package/front_end/testing/SourceMapHelpers.ts +3 -5
  1169. package/front_end/testing/StackTraceHelpers.ts +47 -0
  1170. package/front_end/testing/StyleHelpers.ts +43 -22
  1171. package/front_end/testing/TraceHelpers.ts +135 -122
  1172. package/front_end/testing/TraceLoader.ts +23 -65
  1173. package/front_end/testing/test_setup.ts +31 -4
  1174. package/front_end/ui/components/buttons/Button.ts +1 -1
  1175. package/front_end/ui/components/buttons/FloatingButton.ts +37 -6
  1176. package/front_end/ui/components/cards/Card.ts +2 -2
  1177. package/front_end/ui/components/copy_to_clipboard/copyToClipboard.ts +1 -1
  1178. package/front_end/ui/components/dialogs/ButtonDialog.test.ts +2 -6
  1179. package/front_end/ui/components/dialogs/ButtonDialog.ts +15 -0
  1180. package/front_end/ui/components/dialogs/Dialog.ts +68 -8
  1181. package/front_end/ui/components/dialogs/ShortcutDialog.test.ts +1 -3
  1182. package/front_end/ui/components/diff_view/DiffView.ts +6 -6
  1183. package/front_end/ui/components/docs/console_insight/basic.ts +1 -1
  1184. package/front_end/ui/components/docs/console_insight/error.ts +1 -1
  1185. package/front_end/ui/components/docs/console_insight/loading.ts +1 -1
  1186. package/front_end/ui/components/docs/context_menu/basic.html +45 -0
  1187. package/front_end/ui/components/docs/context_menu/basic.ts +102 -0
  1188. package/front_end/ui/components/docs/icon_component/basic.html +1 -3
  1189. package/front_end/ui/components/docs/icon_component/basic.ts +1 -1
  1190. package/front_end/ui/components/docs/recorder_recording_list_view/basic.ts +4 -1
  1191. package/front_end/ui/components/docs/select_menu/basic.html +1 -27
  1192. package/front_end/ui/components/docs/select_menu/basic.ts +86 -194
  1193. package/front_end/ui/components/icon_button/Icon.ts +16 -10
  1194. package/front_end/ui/components/icon_button/IconButton.ts +1 -3
  1195. package/front_end/ui/components/icon_button/icon.css +73 -0
  1196. package/front_end/ui/components/issue_counter/IssueCounter.ts +13 -14
  1197. package/front_end/ui/components/issue_counter/IssueLinkIcon.ts +3 -3
  1198. package/front_end/ui/components/markdown_view/MarkdownImagesMap.ts +4 -4
  1199. package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +9 -6
  1200. package/front_end/ui/components/markdown_view/MarkdownView.test.ts +73 -0
  1201. package/front_end/ui/components/panel_feedback/PanelFeedback.ts +5 -11
  1202. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +4 -9
  1203. package/front_end/ui/components/settings/SettingCheckbox.ts +3 -3
  1204. package/front_end/ui/components/settings/SettingDeprecationWarning.ts +2 -4
  1205. package/front_end/ui/components/snackbars/Snackbar.ts +32 -17
  1206. package/front_end/ui/components/snackbars/snackbar.css +1 -1
  1207. package/front_end/ui/components/spinners/Spinner.ts +50 -2
  1208. package/front_end/ui/components/spinners/spinner.css +10 -1
  1209. package/front_end/ui/components/srgb_overlay/SrgbOverlay.ts +0 -1
  1210. package/front_end/ui/components/survey_link/SurveyLink.ts +4 -8
  1211. package/front_end/ui/components/text_editor/AiCodeCompletionTeaserPlaceholder.test.ts +84 -0
  1212. package/front_end/ui/components/text_editor/AiCodeCompletionTeaserPlaceholder.ts +83 -0
  1213. package/front_end/ui/components/text_editor/ExecutionPositionHighlighter.ts +0 -1
  1214. package/front_end/ui/components/text_editor/TextEditor.test.ts +72 -12
  1215. package/front_end/ui/components/text_editor/TextEditor.ts +2 -0
  1216. package/front_end/ui/components/text_editor/config.ts +120 -12
  1217. package/front_end/ui/{legacy/components/inline_editor/bezierSwatch.css → components/text_editor/textEditor.css} +2 -6
  1218. package/front_end/ui/components/text_editor/text_editor.ts +1 -0
  1219. package/front_end/ui/components/tooltips/Tooltip.test.ts +70 -40
  1220. package/front_end/ui/components/tooltips/Tooltip.ts +208 -33
  1221. package/front_end/ui/components/tooltips/tooltip.css +13 -77
  1222. package/front_end/ui/components/tree_outline/TreeOutline.ts +11 -0
  1223. package/front_end/ui/legacy/ARIAUtils.test.ts +101 -20
  1224. package/front_end/ui/legacy/ARIAUtils.ts +77 -49
  1225. package/front_end/ui/legacy/ActionRegistration.test.ts +0 -2
  1226. package/front_end/ui/legacy/ActionRegistration.ts +24 -24
  1227. package/front_end/ui/legacy/ContextMenu.test.ts +60 -1
  1228. package/front_end/ui/legacy/ContextMenu.ts +349 -29
  1229. package/front_end/ui/legacy/DockController.ts +13 -7
  1230. package/front_end/ui/legacy/EmptyWidget.ts +62 -32
  1231. package/front_end/ui/legacy/FilterBar.ts +14 -9
  1232. package/front_end/ui/legacy/GlassPane.ts +10 -4
  1233. package/front_end/ui/legacy/Infobar.ts +2 -2
  1234. package/front_end/ui/legacy/InspectorView.test.ts +99 -0
  1235. package/front_end/ui/legacy/InspectorView.ts +71 -25
  1236. package/front_end/ui/legacy/ListWidget.ts +9 -9
  1237. package/front_end/ui/legacy/Panel.ts +1 -1
  1238. package/front_end/ui/legacy/ProgressIndicator.ts +44 -41
  1239. package/front_end/ui/legacy/RemoteDebuggingTerminatedScreen.ts +4 -4
  1240. package/front_end/ui/legacy/ReportView.ts +1 -1
  1241. package/front_end/ui/legacy/SearchableView.ts +24 -24
  1242. package/front_end/ui/legacy/SettingsUI.ts +2 -2
  1243. package/front_end/ui/legacy/ShortcutRegistry.ts +2 -1
  1244. package/front_end/ui/legacy/SoftContextMenu.ts +23 -9
  1245. package/front_end/ui/legacy/SoftDropDown.ts +1 -1
  1246. package/front_end/ui/legacy/SplitWidget.test.ts +8 -0
  1247. package/front_end/ui/legacy/SplitWidget.ts +3 -3
  1248. package/front_end/ui/legacy/SuggestBox.ts +15 -15
  1249. package/front_end/ui/legacy/TabbedPane.ts +27 -31
  1250. package/front_end/ui/legacy/TargetCrashedScreen.ts +4 -4
  1251. package/front_end/ui/legacy/TextPrompt.ts +4 -2
  1252. package/front_end/ui/legacy/ThrottledWidget.ts +1 -1
  1253. package/front_end/ui/legacy/Toolbar.test.ts +13 -0
  1254. package/front_end/ui/legacy/Toolbar.ts +39 -19
  1255. package/front_end/ui/legacy/Treeoutline.test.ts +140 -0
  1256. package/front_end/ui/legacy/Treeoutline.ts +244 -8
  1257. package/front_end/ui/legacy/UIUtils.test.ts +59 -0
  1258. package/front_end/ui/legacy/UIUtils.ts +235 -25
  1259. package/front_end/ui/legacy/View.test.ts +14 -1
  1260. package/front_end/ui/legacy/View.ts +33 -9
  1261. package/front_end/ui/legacy/ViewManager.test.ts +235 -0
  1262. package/front_end/ui/legacy/ViewManager.ts +109 -15
  1263. package/front_end/ui/legacy/ViewRegistration.ts +17 -7
  1264. package/front_end/ui/legacy/Widget.test.ts +35 -3
  1265. package/front_end/ui/legacy/Widget.ts +127 -16
  1266. package/front_end/ui/legacy/XLink.ts +1 -1
  1267. package/front_end/ui/legacy/components/color_picker/ContrastDetails.ts +36 -26
  1268. package/front_end/ui/legacy/components/color_picker/FormatPickerContextMenu.ts +4 -8
  1269. package/front_end/ui/legacy/components/color_picker/Spectrum.test.ts +36 -1
  1270. package/front_end/ui/legacy/components/color_picker/Spectrum.ts +72 -49
  1271. package/front_end/ui/legacy/components/color_picker/spectrum.css +1 -1
  1272. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +14 -19
  1273. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +31 -30
  1274. package/front_end/ui/legacy/components/data_grid/DataGridElement.test.ts +19 -15
  1275. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +15 -3
  1276. package/front_end/ui/legacy/components/data_grid/ShowMoreDataGridNode.ts +2 -2
  1277. package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +6 -3
  1278. package/front_end/ui/legacy/components/data_grid/dataGrid.css +9 -3
  1279. package/front_end/ui/legacy/components/inline_editor/BezierEditor.ts +1 -1
  1280. package/front_end/ui/legacy/components/inline_editor/BezierUI.ts +1 -1
  1281. package/front_end/ui/legacy/components/inline_editor/CSSAngle.test.ts +25 -25
  1282. package/front_end/ui/legacy/components/inline_editor/CSSAngle.ts +11 -5
  1283. package/front_end/ui/legacy/components/inline_editor/CSSShadowEditor.ts +5 -5
  1284. package/front_end/ui/legacy/components/inline_editor/ColorSwatch.test.ts +1 -9
  1285. package/front_end/ui/legacy/components/inline_editor/ColorSwatch.ts +35 -20
  1286. package/front_end/ui/legacy/components/inline_editor/FontEditor.ts +32 -31
  1287. package/front_end/ui/legacy/components/inline_editor/FontEditorUnitConverter.ts +1 -1
  1288. package/front_end/ui/legacy/components/inline_editor/Swatches.ts +3 -47
  1289. package/front_end/ui/legacy/components/inline_editor/cssAngle.css +4 -5
  1290. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +2 -2
  1291. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
  1292. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.test.ts +19 -1
  1293. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +31 -28
  1294. package/front_end/ui/legacy/components/object_ui/objectPropertiesSection.css +2 -0
  1295. package/front_end/ui/legacy/components/perf_ui/BrickBreaker.ts +2 -2
  1296. package/front_end/ui/legacy/components/perf_ui/ChartViewport.ts +7 -3
  1297. package/front_end/ui/legacy/components/perf_ui/FilmStripView.ts +7 -7
  1298. package/front_end/ui/legacy/components/perf_ui/FlameChart.test.ts +162 -1
  1299. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +153 -99
  1300. package/front_end/ui/legacy/components/perf_ui/NetworkPriorities.ts +5 -5
  1301. package/front_end/ui/legacy/components/perf_ui/OverviewGrid.ts +3 -3
  1302. package/front_end/ui/legacy/components/perf_ui/PieChart.ts +1 -1
  1303. package/front_end/ui/legacy/components/perf_ui/TimelineGrid.ts +0 -4
  1304. package/front_end/ui/legacy/components/perf_ui/TimelineOverviewPane.ts +54 -6
  1305. package/front_end/ui/legacy/components/perf_ui/perf_ui-meta.ts +6 -6
  1306. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +29 -3
  1307. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +14 -5
  1308. package/front_end/ui/legacy/components/quick_open/HelpQuickOpen.ts +2 -5
  1309. package/front_end/ui/legacy/components/quick_open/filteredListWidget.css +2 -0
  1310. package/front_end/ui/legacy/components/quick_open/quick_open-meta.ts +2 -2
  1311. package/front_end/ui/legacy/components/source_frame/FontView.ts +8 -5
  1312. package/front_end/ui/legacy/components/source_frame/ImageView.ts +17 -29
  1313. package/front_end/ui/legacy/components/source_frame/JSONView.ts +3 -3
  1314. package/front_end/ui/legacy/components/source_frame/PreviewFactory.ts +2 -2
  1315. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.test.ts +0 -4
  1316. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +2 -2
  1317. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +41 -31
  1318. package/front_end/ui/legacy/components/source_frame/StreamingContentHexView.ts +1 -1
  1319. package/front_end/ui/legacy/components/source_frame/XMLView.ts +2 -2
  1320. package/front_end/ui/legacy/components/source_frame/fontView.css +1 -1
  1321. package/front_end/ui/legacy/components/source_frame/source_frame-meta.ts +9 -9
  1322. package/front_end/ui/legacy/components/utils/ImagePreview.ts +4 -4
  1323. package/front_end/ui/legacy/components/utils/JSPresentationUtils.test.ts +6 -5
  1324. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +76 -34
  1325. package/front_end/ui/legacy/components/utils/Linkifier.test.ts +154 -2
  1326. package/front_end/ui/legacy/components/utils/Linkifier.ts +108 -50
  1327. package/front_end/ui/legacy/components/utils/TargetDetachedDialog.ts +2 -1
  1328. package/front_end/ui/legacy/confirmDialog.css +1 -1
  1329. package/front_end/ui/legacy/filter.css +12 -4
  1330. package/front_end/ui/legacy/inspectorCommon.css +25 -20
  1331. package/front_end/ui/legacy/remoteDebuggingTerminatedScreen.css +18 -17
  1332. package/front_end/ui/legacy/softContextMenu.css +4 -0
  1333. package/front_end/ui/legacy/tabbedPane.css +5 -1
  1334. package/front_end/ui/legacy/targetCrashedScreen.css +9 -8
  1335. package/front_end/ui/legacy/viewContainers.css +8 -0
  1336. package/front_end/ui/visual_logging/Debugging.ts +122 -26
  1337. package/front_end/ui/visual_logging/KnownContextValues.ts +139 -1
  1338. package/front_end/ui/visual_logging/LoggingConfig.ts +1 -1
  1339. package/front_end/ui/visual_logging/LoggingDriver.test.ts +74 -44
  1340. package/front_end/ui/visual_logging/LoggingDriver.ts +3 -2
  1341. package/front_end/ui/visual_logging/LoggingState.ts +6 -4
  1342. package/front_end/ui/visual_logging/README.md +1 -3
  1343. package/front_end/ui/visual_logging/visual_logging.ts +9 -0
  1344. package/front_end/ui/visual_logging/visual_logging_debugging.png +0 -0
  1345. package/inspector_overlay/css_grid_label_helpers.ts +4 -4
  1346. package/inspector_overlay/highlight_flex_common.ts +2 -2
  1347. package/inspector_overlay/loadCSS.rollup.js +2 -2
  1348. package/inspector_overlay/main.ts +0 -4
  1349. package/inspector_overlay/tool_highlight.css +1 -1
  1350. package/inspector_overlay/tool_highlight.ts +7 -7
  1351. package/package.json +32 -36
  1352. package/scripts/add_icon_paths.py +1 -1
  1353. package/scripts/ai_assistance/README.md +1 -0
  1354. package/scripts/ai_assistance/auto-run/auto-run.ts +46 -6
  1355. package/scripts/ai_assistance/auto-run/shared/comment-parsers.test.ts +2 -2
  1356. package/scripts/ai_assistance/auto-run/shared/comment-parsers.ts +2 -2
  1357. package/scripts/ai_assistance/auto-run/shared/puppeteer-helpers.ts +18 -15
  1358. package/scripts/ai_assistance/auto-run/targets/elements-executor.ts +2 -0
  1359. package/scripts/ai_assistance/auto-run/targets/elements-multimodal-executor.ts +2 -0
  1360. package/scripts/ai_assistance/auto-run/targets/interface.ts +1 -0
  1361. package/scripts/ai_assistance/auto-run/targets/patching-executor.ts +1 -0
  1362. package/scripts/ai_assistance/auto-run/targets/performance-insights-executor.ts +2 -0
  1363. package/scripts/ai_assistance/auto-run/targets/performance-main-thread-executor.ts +2 -0
  1364. package/scripts/ai_assistance/eval/index.js +5 -1
  1365. package/scripts/ai_assistance/package.json +2 -1
  1366. package/scripts/ai_assistance/suite/README.md +57 -0
  1367. package/scripts/ai_assistance/suite/helpers/evaluators.ts +183 -0
  1368. package/scripts/ai_assistance/suite/helpers/gemini.ts +122 -0
  1369. package/scripts/ai_assistance/suite/helpers/outputs.ts +112 -0
  1370. package/scripts/ai_assistance/suite/instructions/lcp-breakdown.md +12 -0
  1371. package/scripts/ai_assistance/suite/instructions/load.ts +13 -0
  1372. package/scripts/ai_assistance/suite/instructions/scoring.md +27 -0
  1373. package/scripts/ai_assistance/suite/performance.eval.ts +18 -0
  1374. package/scripts/ai_assistance/suite/to_eval_output.ts +166 -0
  1375. package/scripts/ai_assistance/suite/types.d.ts +40 -0
  1376. package/scripts/ai_assistance/suite/upload_to_gcp.ts +104 -0
  1377. package/scripts/ai_assistance/tsconfig.json +1 -1
  1378. package/scripts/ai_assistance/types.d.ts +8 -3
  1379. package/scripts/build/assert_grd.py +1 -1
  1380. package/scripts/build/compress_files.js +9 -4
  1381. package/scripts/build/cross_reference_ninja_and_tsc.js +5 -5
  1382. package/scripts/build/devtools_plugin.js +9 -2
  1383. package/scripts/build/esbuild.js +4 -1
  1384. package/scripts/build/generate_html_entrypoint.js +5 -4
  1385. package/scripts/build/ninja/README.md +2 -3
  1386. package/scripts/build/ninja/bundle.gni +7 -30
  1387. package/scripts/build/ninja/devtools_entrypoint.gni +4 -4
  1388. package/scripts/build/ninja/devtools_pre_built.gni +2 -1
  1389. package/scripts/build/ninja/generate_css.gni +4 -2
  1390. package/scripts/build/ninja/vars.gni +5 -1
  1391. package/scripts/build/ninja/write-if-changed.js +2 -2
  1392. package/scripts/build/typescript/ts_library.py +7 -1
  1393. package/scripts/build/typescript/typescript.gni +2 -1
  1394. package/scripts/component_server/server.js +8 -7
  1395. package/scripts/devtools_build.mjs +93 -26
  1396. package/scripts/devtools_build.test.mjs +48 -48
  1397. package/scripts/devtools_paths.py +0 -5
  1398. package/scripts/eslint_rules/README.md +4 -2
  1399. package/scripts/eslint_rules/lib/canvas-context-tracking.ts +1 -1
  1400. package/scripts/eslint_rules/lib/check-css-import.ts +2 -2
  1401. package/scripts/eslint_rules/lib/check-license-header.ts +3 -3
  1402. package/scripts/eslint_rules/lib/check-test-definitions.ts +2 -2
  1403. package/scripts/eslint_rules/lib/enforce-custom-element-definitions-location.ts +1 -1
  1404. package/scripts/eslint_rules/lib/enforce-optional-properties-last.ts +1 -1
  1405. package/scripts/eslint_rules/lib/enforce-ui-strings-as-const.ts +1 -1
  1406. package/scripts/eslint_rules/lib/es-modules-import.ts +3 -2
  1407. package/scripts/eslint_rules/lib/html-tagged-template.ts +2 -2
  1408. package/scripts/eslint_rules/lib/inject-checkbox-styles.ts +36 -24
  1409. package/scripts/eslint_rules/lib/inline-type-imports.ts +1 -1
  1410. package/scripts/eslint_rules/lib/jslog-context-list.ts +32 -7
  1411. package/scripts/eslint_rules/lib/no-adopted-style-sheets.ts +2 -2
  1412. package/scripts/eslint_rules/lib/no-assert-deep-strict-equal.ts +17 -16
  1413. package/scripts/eslint_rules/lib/no-assert-equal-boolean-null-undefined.ts +1 -1
  1414. package/scripts/eslint_rules/lib/no-assert-equal.ts +1 -1
  1415. package/scripts/eslint_rules/lib/no-assert-strict-equal-for-arrays-and-objects.ts +1 -1
  1416. package/scripts/eslint_rules/lib/no-commented-out-console.ts +4 -2
  1417. package/scripts/eslint_rules/lib/no-customized-builtin-elements.ts +1 -4
  1418. package/scripts/eslint_rules/lib/no-imperative-dom-api/adorner.ts +5 -9
  1419. package/scripts/eslint_rules/lib/no-imperative-dom-api/aria-utils.ts +5 -8
  1420. package/scripts/eslint_rules/lib/no-imperative-dom-api/ast.ts +24 -1
  1421. package/scripts/eslint_rules/lib/no-imperative-dom-api/button.ts +5 -4
  1422. package/scripts/eslint_rules/lib/no-imperative-dom-api/class-member.ts +1 -1
  1423. package/scripts/eslint_rules/lib/no-imperative-dom-api/data-grid.ts +23 -25
  1424. package/scripts/eslint_rules/lib/no-imperative-dom-api/dom-api-devtools-extensions.ts +5 -9
  1425. package/scripts/eslint_rules/lib/no-imperative-dom-api/dom-api.ts +11 -16
  1426. package/scripts/eslint_rules/lib/no-imperative-dom-api/dom-fragment.ts +2 -2
  1427. package/scripts/eslint_rules/lib/no-imperative-dom-api/split-widget.ts +14 -18
  1428. package/scripts/eslint_rules/lib/no-imperative-dom-api/toolbar.ts +17 -18
  1429. package/scripts/eslint_rules/lib/no-imperative-dom-api/ui-fragment.ts +7 -12
  1430. package/scripts/eslint_rules/lib/no-imperative-dom-api/ui-utils.ts +7 -7
  1431. package/scripts/eslint_rules/lib/no-imperative-dom-api/widget.ts +8 -13
  1432. package/scripts/eslint_rules/lib/no-imperative-dom-api.ts +3 -22
  1433. package/scripts/eslint_rules/lib/no-importing-images-from-src.ts +1 -1
  1434. package/scripts/eslint_rules/lib/no-imports-in-directory.ts +18 -7
  1435. package/scripts/eslint_rules/lib/no-lit-render-outside-of-view.ts +48 -37
  1436. package/scripts/eslint_rules/lib/no-new-lit-element-components.ts +5 -2
  1437. package/scripts/eslint_rules/lib/no-underscored-properties.ts +36 -28
  1438. package/scripts/eslint_rules/lib/prefer-assert-instance-of.ts +24 -20
  1439. package/scripts/eslint_rules/lib/prefer-assert-is-ok.ts +54 -45
  1440. package/scripts/eslint_rules/lib/prefer-assert-length-of.ts +24 -17
  1441. package/scripts/eslint_rules/lib/prefer-assert-strict-equal.ts +22 -16
  1442. package/scripts/eslint_rules/lib/prefer-private-class-members.ts +11 -4
  1443. package/scripts/eslint_rules/lib/prefer-sinon-assert.ts +37 -29
  1444. package/scripts/eslint_rules/lib/prefer-url-string.ts +1 -1
  1445. package/scripts/eslint_rules/lib/utils/lit.ts +26 -9
  1446. package/scripts/eslint_rules/lib/validate-timing-types.ts +330 -0
  1447. package/scripts/eslint_rules/rules-dir.mjs +4 -1
  1448. package/scripts/eslint_rules/tests/check-license-header.test.ts +8 -8
  1449. package/scripts/eslint_rules/tests/check-test-definitions.test.ts +0 -10
  1450. package/scripts/eslint_rules/tests/enforce-optional-properties-last.test.ts +1 -1
  1451. package/scripts/eslint_rules/tests/inject-checkbox-styles.test.ts +49 -0
  1452. package/scripts/eslint_rules/tests/no-imports-in-directory.test.ts +20 -5
  1453. package/scripts/eslint_rules/tests/no-lit-render-outside-of-view.test.ts +60 -10
  1454. package/scripts/eslint_rules/tests/no-new-lit-element-components.test.ts +4 -0
  1455. package/scripts/eslint_rules/tests/prefer-private-class-members.test.ts +2 -2
  1456. package/scripts/eslint_rules/tests/utils/RuleTester.ts +19 -1
  1457. package/scripts/eslint_rules/tests/utils.test.ts +1 -1
  1458. package/scripts/eslint_rules/tests/validate-timing-types.test.ts +289 -0
  1459. package/scripts/eslint_rules/tsconfig.json +3 -2
  1460. package/scripts/extract_bugs.ts +2 -3
  1461. package/scripts/javascript_natives/helpers.js +9 -9
  1462. package/scripts/migration/e2e_non_hosted_gemini.mjs +102 -0
  1463. package/scripts/migration/web-tests-esm/rename-legacy-global.mjs +1 -1
  1464. package/scripts/npm_test.js +1 -1
  1465. package/scripts/protocol_typescript/protocol_dts_generator.ts +27 -16
  1466. package/scripts/protocol_typescript/protocol_schema.d.ts +9 -4
  1467. package/scripts/reformat-clang-js-ts.js +1 -1
  1468. package/scripts/run_build.mjs +14 -2
  1469. package/scripts/run_start.mjs +6 -3
  1470. package/scripts/scaffold/scaffold-widget.js +7 -7
  1471. package/scripts/scaffold/templates/WidgetTemplate.ts.txt +1 -1
  1472. package/scripts/tools/update_goldens.py +143 -168
  1473. package/scripts/tsconfig.json +2 -1
  1474. package/scripts/whitespaces.txt +1 -1
  1475. package/front_end/core/sdk/SourceMapScopes.test.ts +0 -507
  1476. package/front_end/core/sdk/SourceMapScopes.ts +0 -472
  1477. package/front_end/models/ai_assistance/agents/PerformanceInsightsAgent.test.ts +0 -448
  1478. package/front_end/models/ai_assistance/agents/PerformanceInsightsAgent.ts +0 -498
  1479. package/front_end/models/trace/extras/FetchNodes.test.ts +0 -261
  1480. package/front_end/models/trace/extras/FetchNodes.ts +0 -254
  1481. package/front_end/models/trace/extras/Metadata.ts +0 -79
  1482. package/front_end/models/trace/insights/LCPPhases.test.ts +0 -71
  1483. package/front_end/models/trace/insights/LCPPhases.ts +0 -222
  1484. package/front_end/panels/animation/AnimationScreenshotPopover.ts +0 -65
  1485. package/front_end/panels/animation/animationScreenshotPopover.css +0 -18
  1486. package/front_end/panels/application/ReportingApiReportsView.test.ts +0 -117
  1487. package/front_end/panels/application/ReportingApiReportsView.ts +0 -88
  1488. package/front_end/panels/elements/ElementsTreeElementHighlighter.test.ts +0 -51
  1489. package/front_end/panels/elements/ElementsTreeElementHighlighter.ts +0 -107
  1490. package/front_end/panels/elements/components/LayoutPane.ts +0 -515
  1491. package/front_end/panels/elements/components/LayoutPaneUtils.ts +0 -41
  1492. package/front_end/panels/elements/components/layoutPane.css +0 -168
  1493. package/front_end/panels/sources/components/breakpointsView.css +0 -275
  1494. package/front_end/panels/timeline/components/insights/InteractionToNextPaint.ts +0 -118
  1495. package/front_end/panels/timeline/components/insights/LCPPhases.ts +0 -256
  1496. package/front_end/panels/web_audio/AudioContextContentBuilder.ts +0 -113
  1497. package/front_end/panels/web_audio/AudioContextSelector.ts +0 -140
  1498. package/front_end/panels/web_audio/audioContextSelector.css +0 -20
  1499. package/front_end/panels/web_audio/graph_visualizer/EdgeView.ts +0 -80
  1500. package/front_end/panels/web_audio/graph_visualizer/GraphManager.ts +0 -46
  1501. package/front_end/panels/web_audio/graph_visualizer/GraphStyle.ts +0 -96
  1502. package/front_end/panels/web_audio/graph_visualizer/GraphView.ts +0 -197
  1503. package/front_end/panels/web_audio/graph_visualizer/NodeRendererUtility.ts +0 -43
  1504. package/front_end/panels/web_audio/graph_visualizer/NodeView.ts +0 -258
  1505. package/front_end/panels/web_audio/graph_visualizer/graph_visualizer.ts +0 -19
  1506. package/front_end/ui/components/docs/recorder_recording_view/basic.html +0 -20
  1507. package/front_end/ui/components/docs/recorder_recording_view/basic.ts +0 -99
  1508. package/front_end/ui/legacy/inspectorViewTabbedPane.css +0 -13
  1509. package/inspector_overlay/debug/tool_distances.html +0 -25
  1510. package/inspector_overlay/tool_distances.ts +0 -125
  1511. package/scripts/eslint_rules/lib/no-it-screenshot-only-or-repeat.ts +0 -47
  1512. package/scripts/eslint_rules/lib/no-screenshot-test-outside-perf-panel.ts +0 -77
  1513. package/scripts/eslint_rules/lib/screenshot-assertion-in-it-screenshot.ts +0 -110
  1514. package/scripts/eslint_rules/lib/single-screenshot-assertion-per-test.ts +0 -85
  1515. package/scripts/eslint_rules/tests/no-it-screenshot-only-or-repeat.test.ts +0 -34
  1516. package/scripts/eslint_rules/tests/no-screenshot-test-outside-perf-panel.test.ts +0 -99
  1517. package/scripts/eslint_rules/tests/screenshot-assertion-in-it-screenshot.test.ts +0 -79
  1518. package/scripts/eslint_rules/tests/single-screenshot-assertion-per-test.test.ts +0 -97
  1519. package/scripts/tools/update_goldens_unittest.py +0 -88
  1520. package/scripts/tools/update_goldens_v2.py +0 -68
  1521. package/scripts/watch_build.js +0 -230
  1522. /package/front_end/panels/recorder/models/{RecorderShorcutHelper.test.ts → RecorderShortcutHelper.test.ts} +0 -0
@@ -1,7 +1,6 @@
1
1
  // Copyright 2023 The Chromium Authors. All rights reserved.
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
- /* eslint-disable rulesdir/no-lit-render-outside-of-view */
5
4
 
6
5
  import '../../../ui/components/icon_button/icon_button.js';
7
6
  import './ExtensionView.js';
@@ -38,7 +37,6 @@ import {
38
37
  type StepView,
39
38
  type StepViewData,
40
39
  } from './StepView.js';
41
-
42
40
  const {html} = Lit;
43
41
 
44
42
  const UIStrings = {
@@ -161,112 +159,17 @@ export interface ReplayState {
161
159
  isPausedOnBreakpoint: boolean; // Replay is in progress and is in stopped state
162
160
  }
163
161
 
164
- export interface RecordingViewData {
165
- replayState: ReplayState;
166
- isRecording: boolean;
167
- recordingTogglingInProgress: boolean;
168
- recording: Models.Schema.UserFlow;
169
- currentStep?: Models.Schema.Step;
170
- currentError?: Error;
171
- sections: Models.Section.Section[];
172
- settings?: Models.RecordingSettings.RecordingSettings;
173
- recorderSettings?: Models.RecorderSettings.RecorderSettings;
174
- lastReplayResult?: Models.RecordingPlayer.ReplayResult;
175
- replayAllowed: boolean;
176
- breakpointIndexes: Set<number>;
177
- builtInConverters: Converters.Converter.Converter[];
178
- extensionConverters: Converters.Converter.Converter[];
179
- replayExtensions: Extensions.ExtensionManager.Extension[];
180
- extensionDescriptor?: PublicExtensions.RecorderPluginManager.ViewDescriptor;
181
- }
182
-
183
- export class RecordingFinishedEvent extends Event {
184
- static readonly eventName = 'recordingfinished';
185
-
186
- constructor() {
187
- super(RecordingFinishedEvent.eventName);
188
- }
189
- }
190
-
191
162
  export const enum TargetPanel {
192
163
  PERFORMANCE_PANEL = 'timeline',
193
164
  DEFAULT = 'chrome-recorder',
194
165
  }
195
166
 
196
- interface PlayRecordingEventData {
167
+ export interface PlayRecordingEvent {
197
168
  targetPanel: TargetPanel;
198
169
  speed: PlayRecordingSpeed;
199
170
  extension?: Extensions.ExtensionManager.Extension;
200
171
  }
201
172
 
202
- export class PlayRecordingEvent extends Event {
203
- static readonly eventName = 'playrecording';
204
- readonly data: PlayRecordingEventData;
205
- constructor(
206
- data: PlayRecordingEventData = {
207
- targetPanel: TargetPanel.DEFAULT,
208
- speed: PlayRecordingSpeed.NORMAL,
209
- },
210
- ) {
211
- super(PlayRecordingEvent.eventName);
212
- this.data = data;
213
- }
214
- }
215
-
216
- export class AbortReplayEvent extends Event {
217
- static readonly eventName = 'abortreplay';
218
- constructor() {
219
- super(AbortReplayEvent.eventName);
220
- }
221
- }
222
-
223
- export class RecordingChangedEvent extends Event {
224
- static readonly eventName = 'recordingchanged';
225
- data: {currentStep: Models.Schema.Step, newStep: Models.Schema.Step};
226
- constructor(currentStep: Models.Schema.Step, newStep: Models.Schema.Step) {
227
- super(RecordingChangedEvent.eventName);
228
- this.data = {currentStep, newStep};
229
- }
230
- }
231
-
232
- export class AddAssertionEvent extends Event {
233
- static readonly eventName = 'addassertion';
234
- constructor() {
235
- super(AddAssertionEvent.eventName);
236
- }
237
- }
238
-
239
- export class RecordingTitleChangedEvent extends Event {
240
- static readonly eventName = 'recordingtitlechanged';
241
- title: string;
242
-
243
- constructor(title: string) {
244
- super(RecordingTitleChangedEvent.eventName, {});
245
- this.title = title;
246
- }
247
- }
248
-
249
- export class NetworkConditionsChanged extends Event {
250
- static readonly eventName = 'networkconditionschanged';
251
- data?: SDK.NetworkManager.Conditions;
252
- constructor(data?: SDK.NetworkManager.Conditions) {
253
- super(NetworkConditionsChanged.eventName, {
254
- composed: true,
255
- bubbles: true,
256
- });
257
- this.data = data;
258
- }
259
- }
260
-
261
- export class TimeoutChanged extends Event {
262
- static readonly eventName = 'timeoutchanged';
263
- data?: number;
264
- constructor(data?: number) {
265
- super(TimeoutChanged.eventName, {composed: true, bubbles: true});
266
- this.data = data;
267
- }
268
- }
269
-
270
173
  const networkConditionPresets = [
271
174
  SDK.NetworkManager.NoThrottlingConditions,
272
175
  SDK.NetworkManager.OfflineConditions,
@@ -307,230 +210,903 @@ function converterIdToStepMetric(
307
210
  }
308
211
  }
309
212
 
310
- export class RecordingView extends HTMLElement {
311
- readonly #shadow = this.attachShadow({mode: 'open'});
312
- #replayState: ReplayState = {isPlaying: false, isPausedOnBreakpoint: false};
313
- #userFlow: Models.Schema.UserFlow|null = null;
314
- #isRecording = false;
315
- #recordingTogglingInProgress = false;
316
- #isTitleInvalid = false;
317
- #currentStep?: Models.Schema.Step;
318
- #steps: Models.Schema.Step[] = [];
319
- #currentError?: Error;
320
- #sections: Models.Section.Section[] = [];
321
- #settings?: Models.RecordingSettings.RecordingSettings;
322
- #recorderSettings?: Models.RecorderSettings.RecorderSettings;
323
- #lastReplayResult?: Models.RecordingPlayer.ReplayResult;
324
- #breakpointIndexes = new Set<number>();
325
- #selectedStep?: Models.Schema.Step|null;
326
-
327
- #replaySettingsExpanded = false;
328
- #replayAllowed = true;
329
- #builtInConverters: Converters.Converter.Converter[] = [];
330
- #extensionConverters: Converters.Converter.Converter[] = [];
331
- #replayExtensions?: Extensions.ExtensionManager.Extension[];
332
- #showCodeView = false;
333
- #code = '';
334
- #converterId = '';
335
- #editorState?: CodeMirror.EditorState;
336
- #sourceMap: PuppeteerReplay.SourceMap|undefined;
337
- #extensionDescriptor?: PublicExtensions.RecorderPluginManager.ViewDescriptor;
338
-
339
- #onCopyBound = this.#onCopy.bind(this);
340
-
341
- set data(data: RecordingViewData) {
342
- this.#isRecording = data.isRecording;
343
- this.#replayState = data.replayState;
344
- this.#recordingTogglingInProgress = data.recordingTogglingInProgress;
345
- this.#currentStep = data.currentStep;
346
-
347
- this.#userFlow = data.recording;
348
- this.#steps = this.#userFlow.steps;
349
- this.#sections = data.sections;
350
- this.#settings = data.settings;
351
- this.#recorderSettings = data.recorderSettings;
352
-
353
- this.#currentError = data.currentError;
354
- this.#lastReplayResult = data.lastReplayResult;
355
- this.#replayAllowed = data.replayAllowed;
356
- this.#isTitleInvalid = false;
357
- this.#breakpointIndexes = data.breakpointIndexes;
358
- this.#builtInConverters = data.builtInConverters;
359
- this.#extensionConverters = data.extensionConverters;
360
- this.#replayExtensions = data.replayExtensions;
361
- this.#extensionDescriptor = data.extensionDescriptor;
362
-
363
- this.#converterId = this.#recorderSettings?.preferredCopyFormat ?? data.builtInConverters[0]?.getId();
364
- void this.#convertToCode();
365
-
366
- this.#render();
367
- }
368
-
369
- connectedCallback(): void {
370
- document.addEventListener('copy', this.#onCopyBound);
371
- this.#render();
372
- }
373
-
374
- disconnectedCallback(): void {
375
- document.removeEventListener('copy', this.#onCopyBound);
376
- }
377
-
378
- scrollToBottom(): void {
379
- const wrapper = this.shadowRoot?.querySelector('.sections');
380
- if (!wrapper) {
381
- return;
382
- }
383
- wrapper.scrollTop = wrapper.scrollHeight;
384
- }
385
-
386
- #dispatchAddAssertionEvent(): void {
387
- this.dispatchEvent(new AddAssertionEvent());
388
- }
389
-
390
- #dispatchRecordingFinished(): void {
391
- this.dispatchEvent(new RecordingFinishedEvent());
392
- }
393
-
394
- #handleAbortReplay(): void {
395
- this.dispatchEvent(new AbortReplayEvent());
213
+ function renderSettings({
214
+ settings,
215
+ replaySettingsExpanded,
216
+ onSelectMenuLabelClick,
217
+ onNetworkConditionsChange,
218
+ onTimeoutInput,
219
+ isRecording,
220
+ replayState,
221
+ onReplaySettingsKeydown,
222
+ onToggleReplaySettings
223
+ }: ViewInput): Lit.TemplateResult {
224
+ if (!settings) {
225
+ return html``;
396
226
  }
397
-
398
- #handleTogglePlaying(event: StartReplayEvent): void {
399
- this.dispatchEvent(
400
- new PlayRecordingEvent({
401
- targetPanel: TargetPanel.DEFAULT,
402
- speed: event.speed,
403
- extension: event.extension,
404
- }),
227
+ const environmentFragments = [];
228
+ if (settings.viewportSettings) {
229
+ // clang-format off
230
+ environmentFragments.push(
231
+ html`<div>${
232
+ settings.viewportSettings.isMobile
233
+ ? i18nString(UIStrings.mobile)
234
+ : i18nString(UIStrings.desktop)
235
+ }</div>`,
236
+ );
237
+ environmentFragments.push(html`<div class="separator"></div>`);
238
+ environmentFragments.push(
239
+ html`<div>${settings.viewportSettings.width}×${
240
+ settings.viewportSettings.height
241
+ } px</div>`,
405
242
  );
243
+ // clang-format on
406
244
  }
407
-
408
- #getStepState(step: Models.Schema.Step): State {
409
- if (!this.#currentStep) {
410
- return State.DEFAULT;
411
- }
412
- if (step === this.#currentStep) {
413
- if (this.#currentError) {
414
- return State.ERROR;
415
- }
416
- if (!this.#replayState.isPlaying) {
417
- return State.SUCCESS;
418
- }
419
-
420
- if (this.#replayState.isPausedOnBreakpoint) {
421
- return State.STOPPED;
245
+ const replaySettingsFragments = [];
246
+ if (!replaySettingsExpanded) {
247
+ if (settings.networkConditionsSettings) {
248
+ if (settings.networkConditionsSettings.title) {
249
+ // clang-format off
250
+ replaySettingsFragments.push(
251
+ html`<div>${
252
+ settings.networkConditionsSettings.title
253
+ }</div>`,
254
+ );
255
+ // clang-format on
256
+ } else {
257
+ // clang-format off
258
+ replaySettingsFragments.push(html`<div>
259
+ ${i18nString(UIStrings.download, {
260
+ value: i18n.ByteUtilities.bytesToString(
261
+ settings.networkConditionsSettings.download,
262
+ ),
263
+ })},
264
+ ${i18nString(UIStrings.upload, {
265
+ value: i18n.ByteUtilities.bytesToString(
266
+ settings.networkConditionsSettings.upload,
267
+ ),
268
+ })},
269
+ ${i18nString(UIStrings.latency, {
270
+ value: settings.networkConditionsSettings.latency,
271
+ })}
272
+ </div>`);
273
+ // clang-format on
422
274
  }
423
-
424
- return State.CURRENT;
275
+ } else {
276
+ // clang-format off
277
+ replaySettingsFragments.push(
278
+ html`<div>${
279
+ SDK.NetworkManager.NoThrottlingConditions.title instanceof Function
280
+ ? SDK.NetworkManager.NoThrottlingConditions.title()
281
+ : SDK.NetworkManager.NoThrottlingConditions.title
282
+ }</div>`,
283
+ );
284
+ // clang-format on
425
285
  }
426
- const currentIndex = this.#steps.indexOf(this.#currentStep);
427
- if (currentIndex === -1) {
428
- return State.DEFAULT;
286
+ // clang-format off
287
+ replaySettingsFragments.push(html`<div class="separator"></div>`);
288
+ replaySettingsFragments.push(
289
+ html`<div>${i18nString(UIStrings.timeout, {
290
+ value: settings.timeout || Models.RecordingPlayer.defaultTimeout,
291
+ })}</div>`,
292
+ );
293
+ // clang-format on
294
+ } else {
295
+ // clang-format off
296
+ const selectedOption =
297
+ settings.networkConditionsSettings?.i18nTitleKey ||
298
+ SDK.NetworkManager.NoThrottlingConditions.i18nTitleKey;
299
+ const selectedOptionTitle = networkConditionPresets.find(
300
+ preset => preset.i18nTitleKey === selectedOption,
301
+ );
302
+ let menuButtonTitle = '';
303
+ if (selectedOptionTitle) {
304
+ menuButtonTitle =
305
+ selectedOptionTitle.title instanceof Function
306
+ ? selectedOptionTitle.title()
307
+ : selectedOptionTitle.title;
429
308
  }
430
309
 
431
- const index = this.#steps.indexOf(step);
432
- return index < currentIndex ? State.SUCCESS : State.OUTSTANDING;
310
+ replaySettingsFragments.push(html`<div class="editable-setting">
311
+ <label class="wrapping-label" @click=${onSelectMenuLabelClick}>
312
+ ${i18nString(UIStrings.network)}
313
+ <select
314
+ title=${menuButtonTitle}
315
+ jslog=${VisualLogging.dropDown('network-conditions').track({change: true})}
316
+ @change=${onNetworkConditionsChange}>
317
+ ${networkConditionPresets.map(condition => html`
318
+ <option jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(condition.i18nTitleKey || ''))}
319
+ value=${condition.i18nTitleKey || ''} ?selected=${selectedOption === condition.i18nTitleKey}>
320
+ ${
321
+ condition.title instanceof Function
322
+ ? condition.title()
323
+ : condition.title
324
+ }
325
+ </option>`)}
326
+ </select>
327
+ </label>
328
+ </div>`);
329
+ replaySettingsFragments.push(html`<div class="editable-setting">
330
+ <label class="wrapping-label" title=${i18nString(
331
+ UIStrings.timeoutExplanation,
332
+ )}>
333
+ ${i18nString(UIStrings.timeoutLabel)}
334
+ <input
335
+ @input=${onTimeoutInput}
336
+ required
337
+ min=${Models.SchemaUtils.minTimeout}
338
+ max=${Models.SchemaUtils.maxTimeout}
339
+ value=${
340
+ settings.timeout || Models.RecordingPlayer.defaultTimeout
341
+ }
342
+ jslog=${VisualLogging.textField('timeout').track({change: true})}
343
+ class="devtools-text-input"
344
+ type="number">
345
+ </label>
346
+ </div>`);
347
+ // clang-format on
433
348
  }
349
+ const isEditable = !isRecording && !replayState.isPlaying;
350
+ const replaySettingsButtonClassMap = {
351
+ 'settings-title': true,
352
+ expanded: replaySettingsExpanded,
353
+ };
354
+ const replaySettingsClassMap = {
355
+ expanded: replaySettingsExpanded,
356
+ settings: true,
357
+ };
358
+ // clang-format off
359
+ return html`
360
+ <div class="settings-row">
361
+ <div class="settings-container">
362
+ <div
363
+ class=${Lit.Directives.classMap(replaySettingsButtonClassMap)}
364
+ @keydown=${isEditable && onReplaySettingsKeydown}
365
+ @click=${isEditable && onToggleReplaySettings}
366
+ tabindex="0"
367
+ role="button"
368
+ jslog=${VisualLogging.action('replay-settings').track({click: true})}
369
+ aria-label=${i18nString(UIStrings.editReplaySettings)}>
370
+ <span>${i18nString(UIStrings.replaySettings)}</span>
371
+ ${
372
+ isEditable
373
+ ? html`<devtools-icon
374
+ class="chevron"
375
+ name="triangle-down">
376
+ </devtools-icon>`
377
+ : ''
378
+ }
379
+ </div>
380
+ <div class=${Lit.Directives.classMap(replaySettingsClassMap)}>
381
+ ${
382
+ replaySettingsFragments.length
383
+ ? replaySettingsFragments
384
+ : html`<div>${i18nString(UIStrings.default)}</div>`
385
+ }
386
+ </div>
387
+ </div>
388
+ <div class="settings-container">
389
+ <div class="settings-title">${i18nString(UIStrings.environment)}</div>
390
+ <div class="settings">
391
+ ${
392
+ environmentFragments.length
393
+ ? environmentFragments
394
+ : html`<div>${i18nString(UIStrings.default)}</div>`
395
+ }
396
+ </div>
397
+ </div>
398
+ </div>
399
+ `;
400
+ // clang-format on
401
+ }
434
402
 
435
- #getSectionState(section: Models.Section.Section): State {
436
- const currentStep = this.#currentStep;
437
- if (!currentStep) {
438
- return State.DEFAULT;
439
- }
403
+ function renderTimelineArea(input: ViewInput, output: ViewOutput): Lit.LitTemplate {
404
+ if (input.extensionDescriptor) {
405
+ // clang-format off
406
+ return html`
407
+ <devtools-recorder-extension-view .descriptor=${input.extensionDescriptor}>
408
+ </devtools-recorder-extension-view>
409
+ `;
410
+ // clang-format on
411
+ }
412
+ // clang-format off
413
+ /* eslint-disable rulesdir/no-deprecated-component-usages */
414
+ return html`
415
+ <devtools-split-view
416
+ direction="auto"
417
+ sidebar-position="second"
418
+ sidebar-initial-size="300"
419
+ sidebar-visibility=${input.showCodeView ? '' : 'hidden'}
420
+ >
421
+ <div slot="main">
422
+ ${renderSections(input)}
423
+ </div>
424
+ <div slot="sidebar" jslog=${VisualLogging.pane('source-code').track({resize: true})}>
425
+ ${input.showCodeView ? html`
426
+ <div class="section-toolbar" jslog=${VisualLogging.toolbar()}>
427
+ <devtools-select-menu
428
+ @selectmenuselected=${input.onCodeFormatChange}
429
+ .showDivider=${true}
430
+ .showArrow=${true}
431
+ .sideButton=${false}
432
+ .showSelectedItem=${true}
433
+ .position=${Dialogs.Dialog.DialogVerticalPosition.BOTTOM}
434
+ .buttonTitle=${input.converterName || ''}
435
+ .jslogContext=${'code-format'}
436
+ >
437
+ ${input.builtInConverters.map(converter => {
438
+ return html`<devtools-menu-item
439
+ .value=${converter.getId()}
440
+ .selected=${input.converterId === converter.getId()}
441
+ jslog=${VisualLogging.action().track({click: true}).context(`converter-${Platform.StringUtilities.toKebabCase(converter.getId())}`)}
442
+ >
443
+ ${converter.getFormatName()}
444
+ </devtools-menu-item>`;
445
+ })}
446
+ ${input.extensionConverters.map(converter => {
447
+ return html`<devtools-menu-item
448
+ .value=${converter.getId()}
449
+ .selected=${input.converterId === converter.getId()}
450
+ jslog=${VisualLogging.action().track({click: true}).context('converter-extension')}
451
+ >
452
+ ${converter.getFormatName()}
453
+ </devtools-menu-item>`;
454
+ })}
455
+ </devtools-select-menu>
456
+ <devtools-button
457
+ title=${Models.Tooltip.getTooltipForActions(
458
+ i18nString(UIStrings.hideCode),
459
+ Actions.RecorderActions.TOGGLE_CODE_VIEW,
460
+ )}
461
+ .data=${
462
+ {
463
+ variant: Buttons.Button.Variant.ICON,
464
+ size: Buttons.Button.Size.SMALL,
465
+ iconName: 'cross',
466
+ } as Buttons.Button.ButtonData
467
+ }
468
+ @click=${input.showCodeToggle}
469
+ jslog=${VisualLogging.close().track({click: true})}
470
+ ></devtools-button>
471
+ </div>
472
+ ${renderTextEditor(input, output)}`
473
+ : Lit.nothing}
474
+ </div>
475
+ </devtools-split-view>
476
+ `;
477
+ /* eslint-enable rulesdir/no-deprecated-component-usages */
478
+ // clang-format on
479
+ }
440
480
 
441
- const currentSection = this.#sections.find(
442
- section => section.steps.includes(currentStep),
443
- ) as Models.Section.Section;
481
+ function renderTextEditor(input: ViewInput, output: ViewOutput): Lit.TemplateResult {
482
+ if (!input.editorState) {
483
+ throw new Error('Unexpected: trying to render the text editor without editorState');
484
+ }
444
485
 
445
- if (!currentSection) {
446
- if (this.#currentError) {
447
- return State.ERROR;
448
- }
449
- }
486
+ // clang-format off
487
+ return html`
488
+ <div class="text-editor" jslog=${VisualLogging.textField().track({change: true})}>
489
+ <devtools-text-editor .state=${input.editorState} ${Lit.Directives.ref((editor: Element | undefined) => {
490
+ if (!editor || !(editor instanceof TextEditor.TextEditor.TextEditor)) {
491
+ return;
492
+ }
493
+ output.highlightLinesInEditor = (line: number, length: number, scroll = false) => {
494
+ const cm = editor.editor;
495
+ let selection = editor.createSelection(
496
+ {lineNumber: line + length, columnNumber: 0},
497
+ {lineNumber: line, columnNumber: 0},
498
+ );
499
+ const lastLine = editor.state.doc.lineAt(selection.main.anchor);
500
+ selection = editor.createSelection(
501
+ {lineNumber: line + length - 1, columnNumber: lastLine.length + 1},
502
+ {lineNumber: line, columnNumber: 0},
503
+ );
450
504
 
451
- if (section === currentSection) {
452
- return State.SUCCESS;
453
- }
505
+ cm.dispatch({
506
+ selection,
507
+ effects: scroll ?
508
+ [
509
+ CodeMirror.EditorView.scrollIntoView(selection.main, {
510
+ y: 'nearest',
511
+ }),
512
+ ] :
513
+ undefined,
514
+ });
515
+ };
516
+ })}></devtools-text-editor>
517
+ </div>
518
+ `;
519
+ // clang-format on
520
+ }
454
521
 
455
- const index = this.#sections.indexOf(currentSection);
456
- const ownIndex = this.#sections.indexOf(section);
457
- return index >= ownIndex ? State.SUCCESS : State.OUTSTANDING;
522
+ function renderScreenshot(
523
+ section: Models.Section.Section,
524
+ ): Lit.TemplateResult|null {
525
+ if (!section.screenshot) {
526
+ return null;
458
527
  }
459
528
 
460
- #renderStep(
461
- section: Models.Section.Section,
462
- step: Models.Schema.Step,
463
- isLastSection: boolean,
464
- ): Lit.TemplateResult {
465
- const stepIndex = this.#steps.indexOf(step);
466
- // clang-format off
529
+ // clang-format off
467
530
  return html`
468
- <devtools-step-view
469
- @click=${this.#onStepClick}
470
- @mouseover=${this.#onStepHover}
471
- @copystep=${this.#onCopyStepEvent}
472
- .data=${
473
- {
474
- step,
475
- state: this.#getStepState(step),
476
- error: this.#currentStep === step ? this.#currentError : undefined,
477
- isFirstSection: false,
478
- isLastSection:
479
- isLastSection && this.#steps[this.#steps.length - 1] === step,
480
- isStartOfGroup: false,
481
- isEndOfGroup: section.steps[section.steps.length - 1] === step,
482
- stepIndex,
483
- hasBreakpoint: this.#breakpointIndexes.has(stepIndex),
484
- sectionIndex: -1,
485
- isRecording: this.#isRecording,
486
- isPlaying: this.#replayState.isPlaying,
487
- removable: this.#steps.length > 1,
488
- builtInConverters: this.#builtInConverters,
489
- extensionConverters: this.#extensionConverters,
490
- isSelected: this.#selectedStep === step,
491
- recorderSettings: this.#recorderSettings,
492
- } as StepViewData
493
- }
494
- jslog=${VisualLogging.section('step').track({click: true})}
495
- ></devtools-step-view>
531
+ <img class="screenshot" src=${section.screenshot} alt=${i18nString(
532
+ UIStrings.screenshotForSection,
533
+ )} />
496
534
  `;
497
- // clang-format on
498
- }
499
-
500
- #onStepHover = (event: MouseEvent): void => {
501
- const stepView = event.target as StepView;
502
- const step = stepView.step || stepView.section?.causingStep;
503
- if (!step || this.#selectedStep) {
504
- return;
505
- }
506
- this.#highlightCodeForStep(step);
507
- };
535
+ // clang-format on
536
+ }
508
537
 
509
- #onStepClick(event: Event): void {
510
- event.stopPropagation();
511
- const stepView = event.target as StepView;
512
- const selectedStep = stepView.step || stepView.section?.causingStep || null;
513
- if (this.#selectedStep === selectedStep) {
514
- return;
515
- }
516
- this.#selectedStep = selectedStep;
517
- this.#render();
518
- if (selectedStep) {
519
- this.#highlightCodeForStep(selectedStep, /* scroll=*/ true);
520
- }
538
+ function renderReplayOrAbortButton(input: ViewInput): Lit.LitTemplate {
539
+ if (input.replayState.isPlaying) {
540
+ return html`
541
+ <devtools-button .jslogContext=${'abort-replay'} @click=${input.onAbortReplay} .iconName=${'pause'} .variant=${
542
+ Buttons.Button.Variant.OUTLINED}>
543
+ ${i18nString(UIStrings.cancelReplay)}
544
+ </devtools-button>`;
521
545
  }
522
546
 
523
- #onWrapperClick(): void {
524
- if (this.#selectedStep === undefined) {
525
- return;
526
- }
527
- this.#selectedStep = undefined;
528
- this.#render();
547
+ if (!input.recorderSettings) {
548
+ return Lit.nothing;
529
549
  }
530
550
 
531
- #onReplaySettingsKeydown(event: Event): void {
532
- if ((event as KeyboardEvent).key !== 'Enter') {
533
- return;
551
+ // clang-format off
552
+ return html`<devtools-replay-section
553
+ .data=${
554
+ {
555
+ settings: input.recorderSettings,
556
+ replayExtensions: input.replayExtensions,
557
+ } as ReplaySectionData
558
+ }
559
+ .disabled=${input.replayState.isPlaying}
560
+ @startreplay=${input.onTogglePlaying}
561
+ >
562
+ </devtools-replay-section>`;
563
+ // clang-format on
564
+ }
565
+
566
+ function renderSections(input: ViewInput): Lit.LitTemplate {
567
+ // clang-format off
568
+ return html`
569
+ <div class="sections">
570
+ ${
571
+ !input.showCodeView
572
+ ? html`<div class="section-toolbar">
573
+ <devtools-button
574
+ @click=${input.showCodeToggle}
575
+ class="show-code"
576
+ .data=${
577
+ {
578
+ variant: Buttons.Button.Variant.OUTLINED,
579
+ title: Models.Tooltip.getTooltipForActions(
580
+ i18nString(UIStrings.showCode),
581
+ Actions.RecorderActions.TOGGLE_CODE_VIEW,
582
+ ),
583
+ } as Buttons.Button.ButtonData
584
+ }
585
+ jslog=${VisualLogging.toggleSubpane(Actions.RecorderActions.TOGGLE_CODE_VIEW).track({click: true})}
586
+ >
587
+ ${i18nString(UIStrings.showCode)}
588
+ </devtools-button>
589
+ </div>`
590
+ : ''
591
+ }
592
+ ${input.sections.map(
593
+ (section, i) => html`
594
+ <div class="section">
595
+ <div class="screenshot-wrapper">
596
+ ${renderScreenshot(section)}
597
+ </div>
598
+ <div class="content">
599
+ <div class="steps">
600
+ <devtools-step-view
601
+ @click=${input.onStepClick}
602
+ @mouseover=${input.onStepHover}
603
+ .data=${
604
+ {
605
+ section,
606
+ state: input.getSectionState(section),
607
+ isStartOfGroup: true,
608
+ isEndOfGroup: section.steps.length === 0,
609
+ isFirstSection: i === 0,
610
+ isLastSection:
611
+ i === input.sections.length - 1 &&
612
+ section.steps.length === 0,
613
+ isSelected:
614
+ input.selectedStep === (section.causingStep || null),
615
+ sectionIndex: i,
616
+ isRecording: input.isRecording,
617
+ isPlaying: input.replayState.isPlaying,
618
+ error:
619
+ input.getSectionState(section) === State.ERROR
620
+ ? input.currentError
621
+ : undefined,
622
+ hasBreakpoint: false,
623
+ removable: input.recording.steps.length > 1 && section.causingStep,
624
+ } as StepViewData
625
+ }
626
+ >
627
+ </devtools-step-view>
628
+ ${section.steps.map(step => {
629
+ const stepIndex = input.recording.steps.indexOf(step);
630
+ return html`
631
+ <devtools-step-view
632
+ @click=${input.onStepClick}
633
+ @mouseover=${input.onStepHover}
634
+ @copystep=${input.onCopyStep}
635
+ .data=${
636
+ {
637
+ step,
638
+ state: input.getStepState(step),
639
+ error: input.currentStep === step ? input.currentError : undefined,
640
+ isFirstSection: false,
641
+ isLastSection:
642
+ i === input.sections.length - 1 && input.recording.steps[input.recording.steps.length - 1] === step,
643
+ isStartOfGroup: false,
644
+ isEndOfGroup: section.steps[section.steps.length - 1] === step,
645
+ stepIndex,
646
+ hasBreakpoint: input.breakpointIndexes.has(stepIndex),
647
+ sectionIndex: -1,
648
+ isRecording: input.isRecording,
649
+ isPlaying: input.replayState.isPlaying,
650
+ removable: input.recording.steps.length > 1,
651
+ builtInConverters: input.builtInConverters,
652
+ extensionConverters: input.extensionConverters,
653
+ isSelected: input.selectedStep === step,
654
+ recorderSettings: input.recorderSettings,
655
+ } as StepViewData
656
+ }
657
+ jslog=${VisualLogging.section('step').track({click: true})}
658
+ ></devtools-step-view>
659
+ `;
660
+ })}
661
+ ${!input.recordingTogglingInProgress && input.isRecording && i === input.sections.length - 1 ? html`<devtools-button
662
+ class="step add-assertion-button"
663
+ .data=${
664
+ {
665
+ variant: Buttons.Button.Variant.OUTLINED,
666
+ title: i18nString(UIStrings.addAssertion),
667
+ jslogContext: 'add-assertion',
668
+ } as Buttons.Button.ButtonData
669
+ }
670
+ @click=${input.onAddAssertion}
671
+ >${i18nString(UIStrings.addAssertion)}</devtools-button>` : undefined}
672
+ ${
673
+ input.isRecording && i === input.sections.length - 1
674
+ ? html`<div class="step recording">${i18nString(
675
+ UIStrings.recording,
676
+ )}</div>`
677
+ : null
678
+ }
679
+ </div>
680
+ </div>
681
+ </div>
682
+ `,
683
+ )}
684
+ </div>
685
+ `;
686
+ // clang-format on
687
+ }
688
+
689
+ function renderHeader(input: ViewInput): Lit.LitTemplate {
690
+ if (!input.recording) {
691
+ return Lit.nothing;
692
+ }
693
+ const {title} = input.recording;
694
+ const isTitleEditable = !input.replayState.isPlaying && !input.isRecording;
695
+ // clang-format off
696
+ return html`
697
+ <div class="header">
698
+ <div class="header-title-wrapper">
699
+ <div class="header-title">
700
+ <input @blur=${input.onTitleBlur}
701
+ @keydown=${input.onTitleInputKeyDown}
702
+ id="title-input"
703
+ jslog=${VisualLogging.value('title').track({change: true})}
704
+ class=${Lit.Directives.classMap({
705
+ 'has-error': input.isTitleInvalid,
706
+ disabled: !isTitleEditable,
707
+ })}
708
+ .value=${Lit.Directives.live(title)}
709
+ .disabled=${!isTitleEditable}
710
+ >
711
+ <div class="title-button-bar">
712
+ <devtools-button
713
+ @click=${input.onEditTitleButtonClick}
714
+ .data=${
715
+ {
716
+ disabled: !isTitleEditable,
717
+ variant: Buttons.Button.Variant.TOOLBAR,
718
+ iconName: 'edit',
719
+ title: i18nString(UIStrings.editTitle),
720
+ jslogContext: 'edit-title',
721
+ } as Buttons.Button.ButtonData
722
+ }
723
+ ></devtools-button>
724
+ </div>
725
+ </div>
726
+ ${
727
+ input.isTitleInvalid
728
+ ? html`<div class="title-input-error-text">
729
+ ${
730
+ i18nString(UIStrings.requiredTitleError)
731
+ }
732
+ </div>`
733
+ : Lit.nothing
734
+ }
735
+ </div>
736
+ ${
737
+ !input.isRecording && input.replayAllowed
738
+ ? html`<div class="actions">
739
+ <devtools-button
740
+ @click=${input.onMeasurePerformanceClick}
741
+ .data=${
742
+ {
743
+ disabled: input.replayState.isPlaying,
744
+ variant: Buttons.Button.Variant.OUTLINED,
745
+ iconName: 'performance',
746
+ title: i18nString(UIStrings.performancePanel),
747
+ jslogContext: 'measure-performance',
748
+ } as Buttons.Button.ButtonData
749
+ }
750
+ >
751
+ ${i18nString(UIStrings.performancePanel)}
752
+ </devtools-button>
753
+ <div class="separator"></div>
754
+ ${renderReplayOrAbortButton(input)}
755
+ </div>`
756
+ : Lit.nothing
757
+ }
758
+ </div>`;
759
+ // clang-format on
760
+ }
761
+
762
+ interface ViewInput {
763
+ breakpointIndexes: Set<number>;
764
+ builtInConverters: readonly Converters.Converter.Converter[];
765
+ converterId: string;
766
+ converterName: string|null;
767
+ currentError: Error|null;
768
+ currentStep: Models.Schema.Step|null;
769
+ editorState: CodeMirror.EditorState|null;
770
+ extensionConverters: readonly Converters.Converter.Converter[];
771
+ extensionDescriptor?: PublicExtensions.RecorderPluginManager.ViewDescriptor;
772
+ isRecording: boolean;
773
+ isTitleInvalid: boolean;
774
+ lastReplayResult: Models.RecordingPlayer.ReplayResult|null;
775
+ recorderSettings: Models.RecorderSettings.RecorderSettings|null;
776
+ recording: Models.Schema.UserFlow;
777
+ recordingTogglingInProgress: boolean;
778
+ replayAllowed: boolean;
779
+ replayExtensions: Extensions.ExtensionManager.Extension[];
780
+ replaySettingsExpanded: boolean;
781
+ replayState: ReplayState;
782
+ sections: Models.Section.Section[];
783
+ selectedStep: Models.Schema.Step|null;
784
+ settings: Models.RecordingSettings.RecordingSettings|null;
785
+ showCodeView: boolean;
786
+
787
+ onAddAssertion: () => void;
788
+ onRecordingFinished: () => void;
789
+ getSectionState: (section: Models.Section.Section) => State;
790
+ getStepState: (step: Models.Schema.Step) => State;
791
+ onAbortReplay: () => void;
792
+ onMeasurePerformanceClick: (event: Event) => void;
793
+ onTogglePlaying: (event: StartReplayEvent) => void;
794
+ onCodeFormatChange: (event: Menus.SelectMenu.SelectMenuItemSelectedEvent) => void;
795
+ onCopyStep: (event: CopyStepEvent) => void;
796
+ onEditTitleButtonClick: (event: Event) => void;
797
+ onNetworkConditionsChange: (event: Event) => void;
798
+ onReplaySettingsKeydown: (event: Event) => void;
799
+ onSelectMenuLabelClick: (event: Event) => void;
800
+ onStepClick: (event: Event) => void;
801
+ onStepHover: (event: MouseEvent) => void;
802
+ onTimeoutInput: (event: Event) => void;
803
+ onTitleBlur: (event: Event) => void;
804
+ onTitleInputKeyDown: (event: KeyboardEvent) => void;
805
+ onToggleReplaySettings: (event: Event) => void;
806
+ onWrapperClick: () => void;
807
+ showCodeToggle: () => void;
808
+ }
809
+
810
+ export interface ViewOutput {
811
+ highlightLinesInEditor?: (line: number, length: number, scroll?: boolean) => void;
812
+ }
813
+
814
+ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLElement): void => {
815
+ const classNames = {
816
+ wrapper: true,
817
+ 'is-recording': input.isRecording,
818
+ 'is-playing': input.replayState.isPlaying,
819
+ 'was-successful': input.lastReplayResult === Models.RecordingPlayer.ReplayResult.SUCCESS,
820
+ 'was-failure': input.lastReplayResult === Models.RecordingPlayer.ReplayResult.FAILURE,
821
+ };
822
+
823
+ const footerButtonTitle = input.recordingTogglingInProgress ? i18nString(UIStrings.recordingIsBeingStopped) :
824
+ i18nString(UIStrings.endRecording);
825
+ // clang-format off
826
+ Lit.render(
827
+ html`
828
+ <style>${UI.inspectorCommonStyles}</style>
829
+ <style>${recordingViewStyles}</style>
830
+ <style>${Input.textInputStyles}</style>
831
+ <div @click=${input.onWrapperClick} class=${Lit.Directives.classMap(
832
+ classNames,
833
+ )}>
834
+ <div class="recording-view main">
835
+ ${renderHeader(input)}
836
+ ${
837
+ input.extensionDescriptor
838
+ ? html`
839
+ <devtools-recorder-extension-view .descriptor=${
840
+ input.extensionDescriptor
841
+ }></devtools-recorder-extension-view>` : html`
842
+ ${renderSettings(input)}
843
+ ${renderTimelineArea(input, output)}
844
+ `}
845
+ ${input.isRecording ? html`<div class="footer">
846
+ <div class="controls">
847
+ <devtools-control-button
848
+ jslog=${VisualLogging.toggle('toggle-recording').track({click: true})}
849
+ @click=${input.onRecordingFinished}
850
+ .disabled=${input.recordingTogglingInProgress}
851
+ .shape=${'square'}
852
+ .label=${footerButtonTitle}
853
+ title=${Models.Tooltip.getTooltipForActions(
854
+ footerButtonTitle,
855
+ Actions.RecorderActions.START_RECORDING,
856
+ )}
857
+ >
858
+ </devtools-control-button>
859
+ </div>
860
+ </div>`: Lit.nothing}
861
+ </div>
862
+ </div>
863
+ `,
864
+ target,
865
+ );
866
+ // clang-format on
867
+ };
868
+
869
+ export class RecordingView extends UI.Widget.Widget {
870
+ replayState: ReplayState = {isPlaying: false, isPausedOnBreakpoint: false};
871
+ isRecording = false;
872
+ recordingTogglingInProgress = false;
873
+ recording: Models.Schema.UserFlow = {
874
+ title: '',
875
+ steps: [],
876
+ };
877
+ currentStep?: Models.Schema.Step;
878
+ currentError?: Error;
879
+ sections: Models.Section.Section[] = [];
880
+ settings?: Models.RecordingSettings.RecordingSettings;
881
+ lastReplayResult?: Models.RecordingPlayer.ReplayResult;
882
+ replayAllowed = false;
883
+ breakpointIndexes = new Set<number>();
884
+ extensionConverters: readonly Converters.Converter.Converter[] = [];
885
+ replayExtensions?: Extensions.ExtensionManager.Extension[];
886
+ extensionDescriptor?: PublicExtensions.RecorderPluginManager.ViewDescriptor;
887
+
888
+ addAssertion?: () => void;
889
+ abortReplay?: () => void;
890
+ recordingFinished?: () => void;
891
+ playRecording?: (event: PlayRecordingEvent) => void;
892
+ networkConditionsChanged?: (data?: SDK.NetworkManager.Conditions) => void;
893
+ timeoutChanged?: (timeout?: number) => void;
894
+ titleChanged?: (title: string) => void;
895
+
896
+ #recorderSettings?: Models.RecorderSettings.RecorderSettings;
897
+ get recorderSettings(): Models.RecorderSettings.RecorderSettings|undefined {
898
+ return this.#recorderSettings;
899
+ }
900
+ set recorderSettings(settings: Models.RecorderSettings.RecorderSettings|undefined) {
901
+ this.#recorderSettings = settings;
902
+ this.#converterId = this.recorderSettings?.preferredCopyFormat ?? this.#builtInConverters[0]?.getId();
903
+ void this.#convertToCode();
904
+ }
905
+
906
+ #builtInConverters: readonly Converters.Converter.Converter[] = [];
907
+ get builtInConverters(): readonly Converters.Converter.Converter[] {
908
+ return this.#builtInConverters;
909
+ }
910
+ set builtInConverters(converters: readonly Converters.Converter.Converter[]) {
911
+ this.#builtInConverters = converters;
912
+ this.#converterId = this.recorderSettings?.preferredCopyFormat ?? this.#builtInConverters[0]?.getId();
913
+ void this.#convertToCode();
914
+ }
915
+
916
+ #isTitleInvalid = false;
917
+ #selectedStep?: Models.Schema.Step|null;
918
+ #replaySettingsExpanded = false;
919
+ #showCodeView = false;
920
+ #code = '';
921
+ #converterId = '';
922
+ #sourceMap: PuppeteerReplay.SourceMap|undefined;
923
+ #editorState?: CodeMirror.EditorState;
924
+
925
+ #onCopyBound = this.#onCopy.bind(this);
926
+ #view: typeof DEFAULT_VIEW;
927
+ #viewOutput: ViewOutput = {};
928
+
929
+ constructor(element?: HTMLElement, view?: typeof DEFAULT_VIEW) {
930
+ super(element, {useShadowDom: true});
931
+ this.#view = view || DEFAULT_VIEW;
932
+ }
933
+
934
+ override performUpdate(): void {
935
+ const converter =
936
+ [
937
+ ...(this.builtInConverters || []),
938
+ ...(this.extensionConverters || []),
939
+ ].find(converter => converter.getId() === this.#converterId) ??
940
+ this.builtInConverters[0];
941
+
942
+ this.#view(
943
+ {
944
+ breakpointIndexes: this.breakpointIndexes,
945
+ builtInConverters: this.builtInConverters,
946
+ converterId: this.#converterId,
947
+ converterName: converter?.getFormatName(),
948
+ currentError: this.currentError ?? null,
949
+ currentStep: this.currentStep ?? null,
950
+ editorState: this.#editorState ?? null,
951
+ extensionConverters: this.extensionConverters,
952
+ extensionDescriptor: this.extensionDescriptor,
953
+ isRecording: this.isRecording,
954
+ isTitleInvalid: this.#isTitleInvalid,
955
+ lastReplayResult: this.lastReplayResult ?? null,
956
+ recorderSettings: this.#recorderSettings ?? null,
957
+ recording: this.recording,
958
+ recordingTogglingInProgress: this.recordingTogglingInProgress,
959
+ replayAllowed: this.replayAllowed,
960
+ replayExtensions: this.replayExtensions ?? [],
961
+ replaySettingsExpanded: this.#replaySettingsExpanded,
962
+ replayState: this.replayState,
963
+ sections: this.sections,
964
+ selectedStep: this.#selectedStep ?? null,
965
+ settings: this.settings ?? null,
966
+ showCodeView: this.#showCodeView,
967
+
968
+ onAddAssertion: () => {
969
+ this.addAssertion?.();
970
+ },
971
+ onRecordingFinished: () => {
972
+ this.recordingFinished?.();
973
+ },
974
+ getSectionState: this.#getSectionState.bind(this),
975
+ getStepState: this.#getStepState.bind(this),
976
+ onAbortReplay: () => {
977
+ this.abortReplay?.();
978
+ },
979
+ onMeasurePerformanceClick: this.#handleMeasurePerformanceClickEvent.bind(this),
980
+ onTogglePlaying: (event: StartReplayEvent) => {
981
+ this.playRecording?.({
982
+ targetPanel: TargetPanel.DEFAULT,
983
+ speed: event.speed,
984
+ extension: event.extension,
985
+ });
986
+ },
987
+ onCodeFormatChange: this.#onCodeFormatChange.bind(this),
988
+ onCopyStep: this.#onCopyStepEvent.bind(this),
989
+ onEditTitleButtonClick: this.#onEditTitleButtonClick.bind(this),
990
+ onNetworkConditionsChange: this.#onNetworkConditionsChange.bind(this),
991
+ onReplaySettingsKeydown: this.#onReplaySettingsKeydown.bind(this),
992
+ onSelectMenuLabelClick: this.#onSelectMenuLabelClick.bind(this),
993
+ onStepClick: this.#onStepClick.bind(this),
994
+ onStepHover: this.#onStepHover.bind(this),
995
+ onTimeoutInput: this.#onTimeoutInput.bind(this),
996
+ onTitleBlur: this.#onTitleBlur.bind(this),
997
+ onTitleInputKeyDown: this.#onTitleInputKeyDown.bind(this),
998
+ onToggleReplaySettings: this.#onToggleReplaySettings.bind(this),
999
+ onWrapperClick: this.#onWrapperClick.bind(this),
1000
+ showCodeToggle: this.showCodeToggle.bind(this),
1001
+ },
1002
+ this.#viewOutput, this.contentElement);
1003
+ }
1004
+
1005
+ override wasShown(): void {
1006
+ super.wasShown();
1007
+ document.addEventListener('copy', this.#onCopyBound);
1008
+ this.performUpdate();
1009
+ }
1010
+
1011
+ override willHide(): void {
1012
+ super.willHide();
1013
+ document.removeEventListener('copy', this.#onCopyBound);
1014
+ }
1015
+
1016
+ scrollToBottom(): void {
1017
+ const wrapper = this.contentElement?.querySelector('.sections');
1018
+ if (!wrapper) {
1019
+ return;
1020
+ }
1021
+ wrapper.scrollTop = wrapper.scrollHeight;
1022
+ }
1023
+
1024
+ #getStepState(step: Models.Schema.Step): State {
1025
+ if (!this.currentStep) {
1026
+ return State.DEFAULT;
1027
+ }
1028
+ if (step === this.currentStep) {
1029
+ if (this.currentError) {
1030
+ return State.ERROR;
1031
+ }
1032
+ if (!this.replayState?.isPlaying) {
1033
+ return State.SUCCESS;
1034
+ }
1035
+
1036
+ if (this.replayState?.isPausedOnBreakpoint) {
1037
+ return State.STOPPED;
1038
+ }
1039
+
1040
+ return State.CURRENT;
1041
+ }
1042
+ const currentIndex = this.recording.steps.indexOf(this.currentStep);
1043
+ if (currentIndex === -1) {
1044
+ return State.DEFAULT;
1045
+ }
1046
+
1047
+ const index = this.recording.steps.indexOf(step);
1048
+ return index < currentIndex ? State.SUCCESS : State.OUTSTANDING;
1049
+ }
1050
+
1051
+ #getSectionState(section: Models.Section.Section): State {
1052
+ const currentStep = this.currentStep;
1053
+ if (!currentStep) {
1054
+ return State.DEFAULT;
1055
+ }
1056
+
1057
+ const currentSection = this.sections.find(
1058
+ section => section.steps.includes(currentStep),
1059
+ ) as Models.Section.Section;
1060
+
1061
+ if (!currentSection) {
1062
+ if (this.currentError) {
1063
+ return State.ERROR;
1064
+ }
1065
+ }
1066
+
1067
+ if (section === currentSection) {
1068
+ return State.SUCCESS;
1069
+ }
1070
+
1071
+ const index = this.sections.indexOf(currentSection);
1072
+ const ownIndex = this.sections.indexOf(section);
1073
+ return index >= ownIndex ? State.SUCCESS : State.OUTSTANDING;
1074
+ }
1075
+
1076
+ #onStepHover = (event: MouseEvent): void => {
1077
+ const stepView = event.target as StepView;
1078
+ const step = stepView.step || stepView.section?.causingStep;
1079
+ if (!step || this.#selectedStep) {
1080
+ return;
1081
+ }
1082
+ this.#highlightCodeForStep(step);
1083
+ };
1084
+
1085
+ #onStepClick(event: Event): void {
1086
+ event.stopPropagation();
1087
+ const stepView = event.target as StepView;
1088
+ const selectedStep = stepView.step || stepView.section?.causingStep || null;
1089
+ if (this.#selectedStep === selectedStep) {
1090
+ return;
1091
+ }
1092
+ this.#selectedStep = selectedStep;
1093
+ this.performUpdate();
1094
+ if (selectedStep) {
1095
+ this.#highlightCodeForStep(selectedStep, /* scroll=*/ true);
1096
+ }
1097
+ }
1098
+
1099
+ #onWrapperClick(): void {
1100
+ if (this.#selectedStep === undefined) {
1101
+ return;
1102
+ }
1103
+ this.#selectedStep = undefined;
1104
+ this.performUpdate();
1105
+ }
1106
+
1107
+ #onReplaySettingsKeydown(event: Event): void {
1108
+ if ((event as KeyboardEvent).key !== 'Enter') {
1109
+ return;
534
1110
  }
535
1111
  event.preventDefault();
536
1112
  this.#onToggleReplaySettings(event);
@@ -539,7 +1115,7 @@ export class RecordingView extends HTMLElement {
539
1115
  #onToggleReplaySettings(event: Event): void {
540
1116
  event.stopPropagation();
541
1117
  this.#replaySettingsExpanded = !this.#replaySettingsExpanded;
542
- this.#render();
1118
+ this.performUpdate();
543
1119
  }
544
1120
 
545
1121
  #onNetworkConditionsChange(event: Event): void {
@@ -548,10 +1124,8 @@ export class RecordingView extends HTMLElement {
548
1124
  const preset = networkConditionPresets.find(
549
1125
  preset => preset.i18nTitleKey === throttlingMenu.value,
550
1126
  );
551
- this.dispatchEvent(
552
- new NetworkConditionsChanged(
553
- preset?.i18nTitleKey === SDK.NetworkManager.NoThrottlingConditions.i18nTitleKey ? undefined : preset,
554
- ),
1127
+ this.networkConditionsChanged?.(
1128
+ preset?.i18nTitleKey === SDK.NetworkManager.NoThrottlingConditions.i18nTitleKey ? undefined : preset,
555
1129
  );
556
1130
  }
557
1131
  }
@@ -562,7 +1136,7 @@ export class RecordingView extends HTMLElement {
562
1136
  target.reportValidity();
563
1137
  return;
564
1138
  }
565
- this.dispatchEvent(new TimeoutChanged(Number(target.value)));
1139
+ this.timeoutChanged?.(Number(target.value));
566
1140
  }
567
1141
 
568
1142
  #onTitleBlur = (event: Event): void => {
@@ -570,10 +1144,10 @@ export class RecordingView extends HTMLElement {
570
1144
  const title = target.value.trim();
571
1145
  if (!title) {
572
1146
  this.#isTitleInvalid = true;
573
- this.#render();
1147
+ this.performUpdate();
574
1148
  return;
575
1149
  }
576
- this.dispatchEvent(new RecordingTitleChangedEvent(title));
1150
+ this.titleChanged?.(title);
577
1151
  };
578
1152
 
579
1153
  #onTitleInputKeyDown = (event: KeyboardEvent): void => {
@@ -587,7 +1161,10 @@ export class RecordingView extends HTMLElement {
587
1161
  };
588
1162
 
589
1163
  #onEditTitleButtonClick = (): void => {
590
- const input = this.#shadow.getElementById('title-input') as HTMLInputElement;
1164
+ const input = this.contentElement.querySelector<HTMLInputElement>('#title-input');
1165
+ if (!input) {
1166
+ throw new Error('Missing #title-input');
1167
+ }
591
1168
  input.focus();
592
1169
  };
593
1170
 
@@ -601,14 +1178,14 @@ export class RecordingView extends HTMLElement {
601
1178
  async #copyCurrentSelection(step?: Models.Schema.Step|null): Promise<void> {
602
1179
  let converter =
603
1180
  [
604
- ...this.#builtInConverters,
605
- ...this.#extensionConverters,
1181
+ ...this.builtInConverters,
1182
+ ...this.extensionConverters,
606
1183
  ]
607
1184
  .find(
608
- converter => converter.getId() === this.#recorderSettings?.preferredCopyFormat,
1185
+ converter => converter.getId() === this.recorderSettings?.preferredCopyFormat,
609
1186
  );
610
1187
  if (!converter) {
611
- converter = this.#builtInConverters[0];
1188
+ converter = this.builtInConverters[0];
612
1189
  }
613
1190
  if (!converter) {
614
1191
  throw new Error('No default converter found');
@@ -617,8 +1194,8 @@ export class RecordingView extends HTMLElement {
617
1194
  let text = '';
618
1195
  if (step) {
619
1196
  text = await converter.stringifyStep(step);
620
- } else if (this.#userFlow) {
621
- [text] = await converter.stringify(this.#userFlow);
1197
+ } else if (this.recording) {
1198
+ [text] = await converter.stringify(this.recording);
622
1199
  }
623
1200
 
624
1201
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(text);
@@ -641,339 +1218,13 @@ export class RecordingView extends HTMLElement {
641
1218
  Host.userMetrics.keyboardShortcutFired(Actions.RecorderActions.COPY_RECORDING_OR_STEP);
642
1219
  }
643
1220
 
644
- #renderSettings(): Lit.TemplateResult {
645
- if (!this.#settings) {
646
- return html``;
647
- }
648
- const environmentFragments = [];
649
- if (this.#settings.viewportSettings) {
650
- // clang-format off
651
- environmentFragments.push(
652
- html`<div>${
653
- this.#settings.viewportSettings.isMobile
654
- ? i18nString(UIStrings.mobile)
655
- : i18nString(UIStrings.desktop)
656
- }</div>`,
657
- );
658
- environmentFragments.push(html`<div class="separator"></div>`);
659
- environmentFragments.push(
660
- html`<div>${this.#settings.viewportSettings.width}×${
661
- this.#settings.viewportSettings.height
662
- } px</div>`,
663
- );
664
- // clang-format on
665
- }
666
- const replaySettingsFragments = [];
667
- if (!this.#replaySettingsExpanded) {
668
- if (this.#settings.networkConditionsSettings) {
669
- if (this.#settings.networkConditionsSettings.title) {
670
- // clang-format off
671
- replaySettingsFragments.push(
672
- html`<div>${
673
- this.#settings.networkConditionsSettings.title
674
- }</div>`,
675
- );
676
- // clang-format on
677
- } else {
678
- // clang-format off
679
- replaySettingsFragments.push(html`<div>
680
- ${i18nString(UIStrings.download, {
681
- value: i18n.ByteUtilities.bytesToString(
682
- this.#settings.networkConditionsSettings.download,
683
- ),
684
- })},
685
- ${i18nString(UIStrings.upload, {
686
- value: i18n.ByteUtilities.bytesToString(
687
- this.#settings.networkConditionsSettings.upload,
688
- ),
689
- })},
690
- ${i18nString(UIStrings.latency, {
691
- value: this.#settings.networkConditionsSettings.latency,
692
- })}
693
- </div>`);
694
- // clang-format on
695
- }
696
- } else {
697
- // clang-format off
698
- replaySettingsFragments.push(
699
- html`<div>${
700
- SDK.NetworkManager.NoThrottlingConditions.title instanceof Function
701
- ? SDK.NetworkManager.NoThrottlingConditions.title()
702
- : SDK.NetworkManager.NoThrottlingConditions.title
703
- }</div>`,
704
- );
705
- // clang-format on
706
- }
707
- // clang-format off
708
- replaySettingsFragments.push(html`<div class="separator"></div>`);
709
- replaySettingsFragments.push(
710
- html`<div>${i18nString(UIStrings.timeout, {
711
- value: this.#settings.timeout || Models.RecordingPlayer.defaultTimeout,
712
- })}</div>`,
713
- );
714
- // clang-format on
715
- } else {
716
- // clang-format off
717
- const selectedOption =
718
- this.#settings.networkConditionsSettings?.i18nTitleKey ||
719
- SDK.NetworkManager.NoThrottlingConditions.i18nTitleKey;
720
- const selectedOptionTitle = networkConditionPresets.find(
721
- preset => preset.i18nTitleKey === selectedOption,
722
- );
723
- let menuButtonTitle = '';
724
- if (selectedOptionTitle) {
725
- menuButtonTitle =
726
- selectedOptionTitle.title instanceof Function
727
- ? selectedOptionTitle.title()
728
- : selectedOptionTitle.title;
729
- }
730
-
731
- replaySettingsFragments.push(html`<div class="editable-setting">
732
- <label class="wrapping-label" @click=${this.#onSelectMenuLabelClick}>
733
- ${i18nString(UIStrings.network)}
734
- <select
735
- title=${menuButtonTitle}
736
- jslog=${VisualLogging.dropDown('network-conditions').track({change: true})}
737
- @change=${this.#onNetworkConditionsChange}>
738
- ${networkConditionPresets.map(condition => html`
739
- <option jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(condition.i18nTitleKey || ''))}
740
- value=${condition.i18nTitleKey || ''} ?selected=${selectedOption === condition.i18nTitleKey}>
741
- ${
742
- condition.title instanceof Function
743
- ? condition.title()
744
- : condition.title
745
- }
746
- </option>`)}
747
- </select>
748
- </label>
749
- </div>`);
750
- replaySettingsFragments.push(html`<div class="editable-setting">
751
- <label class="wrapping-label" title=${i18nString(
752
- UIStrings.timeoutExplanation,
753
- )}>
754
- ${i18nString(UIStrings.timeoutLabel)}
755
- <input
756
- @input=${this.#onTimeoutInput}
757
- required
758
- min=${Models.SchemaUtils.minTimeout}
759
- max=${Models.SchemaUtils.maxTimeout}
760
- value=${
761
- this.#settings.timeout || Models.RecordingPlayer.defaultTimeout
762
- }
763
- jslog=${VisualLogging.textField('timeout').track({change: true})}
764
- class="devtools-text-input"
765
- type="number">
766
- </label>
767
- </div>`);
768
- // clang-format on
769
- }
770
- const isEditable = !this.#isRecording && !this.#replayState.isPlaying;
771
- const replaySettingsButtonClassMap = {
772
- 'settings-title': true,
773
- expanded: this.#replaySettingsExpanded,
774
- };
775
- const replaySettingsClassMap = {
776
- expanded: this.#replaySettingsExpanded,
777
- settings: true,
778
- };
779
- // clang-format off
780
- return html`
781
- <div class="settings-row">
782
- <div class="settings-container">
783
- <div
784
- class=${Lit.Directives.classMap(replaySettingsButtonClassMap)}
785
- @keydown=${isEditable && this.#onReplaySettingsKeydown}
786
- @click=${isEditable && this.#onToggleReplaySettings}
787
- tabindex="0"
788
- role="button"
789
- jslog=${VisualLogging.action('replay-settings').track({click: true})}
790
- aria-label=${i18nString(UIStrings.editReplaySettings)}>
791
- <span>${i18nString(UIStrings.replaySettings)}</span>
792
- ${
793
- isEditable
794
- ? html`<devtools-icon
795
- class="chevron"
796
- name="triangle-down">
797
- </devtools-icon>`
798
- : ''
799
- }
800
- </div>
801
- <div class=${Lit.Directives.classMap(replaySettingsClassMap)}>
802
- ${
803
- replaySettingsFragments.length
804
- ? replaySettingsFragments
805
- : html`<div>${i18nString(UIStrings.default)}</div>`
806
- }
807
- </div>
808
- </div>
809
- <div class="settings-container">
810
- <div class="settings-title">${i18nString(UIStrings.environment)}</div>
811
- <div class="settings">
812
- ${
813
- environmentFragments.length
814
- ? environmentFragments
815
- : html`<div>${i18nString(UIStrings.default)}</div>`
816
- }
817
- </div>
818
- </div>
819
- </div>
820
- `;
821
- // clang-format on
822
- }
823
-
824
- #getCurrentConverter(): Converters.Converter.Converter|undefined {
825
- const currentConverter = [
826
- ...(this.#builtInConverters || []),
827
- ...(this.#extensionConverters || []),
828
- ].find(converter => converter.getId() === this.#converterId);
829
- if (!currentConverter) {
830
- return this.#builtInConverters[0];
831
- }
832
- return currentConverter;
833
- }
834
-
835
- #renderTimelineArea(): Lit.LitTemplate {
836
- if (this.#extensionDescriptor) {
837
- // clang-format off
838
- return html`
839
- <devtools-recorder-extension-view .descriptor=${this.#extensionDescriptor}>
840
- </devtools-recorder-extension-view>
841
- `;
842
- // clang-format on
843
- }
844
- const currentConverter = this.#getCurrentConverter();
845
- const converterFormatName = currentConverter?.getFormatName();
846
- // clang-format off
847
- /* eslint-disable rulesdir/no-deprecated-component-usages */
848
- return html`
849
- <devtools-split-view
850
- direction="auto"
851
- sidebar-position="second"
852
- sidebar-initial-size="300"
853
- sidebar-visibility=${this.#showCodeView ? '' : 'hidden'}
854
- >
855
- <div slot="main">
856
- ${this.#renderSections()}
857
- </div>
858
- <div slot="sidebar" jslog=${VisualLogging.pane('source-code').track({resize: true})}>
859
- ${this.#showCodeView ? html`
860
- <div class="section-toolbar" jslog=${VisualLogging.toolbar()}>
861
- <devtools-select-menu
862
- @selectmenuselected=${this.#onCodeFormatChange}
863
- .showDivider=${true}
864
- .showArrow=${true}
865
- .sideButton=${false}
866
- .showSelectedItem=${true}
867
- .position=${Dialogs.Dialog.DialogVerticalPosition.BOTTOM}
868
- .buttonTitle=${converterFormatName || ''}
869
- .jslogContext=${'code-format'}
870
- >
871
- ${this.#builtInConverters.map(converter => {
872
- return html`<devtools-menu-item
873
- .value=${converter.getId()}
874
- .selected=${this.#converterId === converter.getId()}
875
- jslog=${VisualLogging.action().track({click: true}).context(`converter-${Platform.StringUtilities.toKebabCase(converter.getId())}`)}
876
- >
877
- ${converter.getFormatName()}
878
- </devtools-menu-item>`;
879
- })}
880
- ${this.#extensionConverters.map(converter => {
881
- return html`<devtools-menu-item
882
- .value=${converter.getId()}
883
- .selected=${this.#converterId === converter.getId()}
884
- jslog=${VisualLogging.action().track({click: true}).context('converter-extension')}
885
- >
886
- ${converter.getFormatName()}
887
- </devtools-menu-item>`;
888
- })}
889
- </devtools-select-menu>
890
- <devtools-button
891
- title=${Models.Tooltip.getTooltipForActions(
892
- i18nString(UIStrings.hideCode),
893
- Actions.RecorderActions.TOGGLE_CODE_VIEW,
894
- )}
895
- .data=${
896
- {
897
- variant: Buttons.Button.Variant.ICON,
898
- size: Buttons.Button.Size.SMALL,
899
- iconName: 'cross',
900
- } as Buttons.Button.ButtonData
901
- }
902
- @click=${this.showCodeToggle}
903
- jslog=${VisualLogging.close().track({click: true})}
904
- ></devtools-button>
905
- </div>
906
- ${this.#renderTextEditor()}`
907
- : Lit.nothing}
908
- </div>
909
- </devtools-split-view>
910
- `;
911
- /* eslint-enable rulesdir/no-deprecated-component-usages */
912
- // clang-format on
913
- }
914
-
915
- #renderTextEditor(): Lit.TemplateResult {
916
- if (!this.#editorState) {
917
- throw new Error('Unexpected: trying to render the text editor without editorState');
918
- }
919
- // clang-format off
920
- return html`
921
- <div class="text-editor" jslog=${VisualLogging.textField().track({change: true})}>
922
- <devtools-text-editor .state=${this.#editorState}></devtools-text-editor>
923
- </div>
924
- `;
925
- // clang-format on
926
- }
927
-
928
- #renderScreenshot(
929
- section: Models.Section.Section,
930
- ): Lit.TemplateResult|null {
931
- if (!section.screenshot) {
932
- return null;
933
- }
934
-
935
- // clang-format off
936
- return html`
937
- <img class="screenshot" src=${section.screenshot} alt=${i18nString(
938
- UIStrings.screenshotForSection,
939
- )} />
940
- `;
941
- // clang-format on
942
- }
943
-
944
- #renderReplayOrAbortButton(): Lit.TemplateResult {
945
- if (this.#replayState.isPlaying) {
946
- return html`
947
- <devtools-button .jslogContext=${'abort-replay'} @click=${
948
- this.#handleAbortReplay} .iconName=${'pause'} .variant=${Buttons.Button.Variant.OUTLINED}>
949
- ${i18nString(UIStrings.cancelReplay)}
950
- </devtools-button>`;
951
- }
952
-
953
- // clang-format off
954
- return html`<devtools-replay-section
955
- .data=${
956
- {
957
- settings: this.#recorderSettings,
958
- replayExtensions: this.#replayExtensions,
959
- } as ReplaySectionData
960
- }
961
- .disabled=${this.#replayState.isPlaying}
962
- @startreplay=${this.#handleTogglePlaying}
963
- >
964
- </devtools-replay-section>`;
965
- // clang-format on
966
- }
967
-
968
1221
  #handleMeasurePerformanceClickEvent(event: Event): void {
969
1222
  event.stopPropagation();
970
1223
 
971
- this.dispatchEvent(
972
- new PlayRecordingEvent({
973
- targetPanel: TargetPanel.PERFORMANCE_PANEL,
974
- speed: PlayRecordingSpeed.NORMAL,
975
- }),
976
- );
1224
+ this.playRecording?.({
1225
+ targetPanel: TargetPanel.PERFORMANCE_PANEL,
1226
+ speed: PlayRecordingSpeed.NORMAL,
1227
+ });
977
1228
  }
978
1229
 
979
1230
  showCodeToggle = (): void => {
@@ -986,14 +1237,21 @@ export class RecordingView extends HTMLElement {
986
1237
  };
987
1238
 
988
1239
  #convertToCode = async(): Promise<void> => {
989
- if (!this.#userFlow) {
1240
+ if (!this.recording) {
990
1241
  return;
991
1242
  }
992
- const converter = this.#getCurrentConverter();
1243
+ const converter =
1244
+ [
1245
+ ...(this.builtInConverters || []),
1246
+ ...(this.extensionConverters || []),
1247
+ ].find(converter => converter.getId() === this.#converterId) ??
1248
+ this.builtInConverters[0];
1249
+
993
1250
  if (!converter) {
994
1251
  return;
995
1252
  }
996
- const [code, sourceMap] = await converter.stringify(this.#userFlow);
1253
+
1254
+ const [code, sourceMap] = await converter.stringify(this.recording);
997
1255
  this.#code = code;
998
1256
  this.#sourceMap = sourceMap;
999
1257
  this.#sourceMap?.shift();
@@ -1008,9 +1266,9 @@ export class RecordingView extends HTMLElement {
1008
1266
  languageSupport ? languageSupport : [],
1009
1267
  ],
1010
1268
  });
1011
- this.#render();
1269
+ this.performUpdate();
1012
1270
  // Used by tests.
1013
- this.dispatchEvent(new Event('code-generated'));
1271
+ this.contentElement.dispatchEvent(new Event('code-generated'));
1014
1272
  };
1015
1273
 
1016
1274
  #highlightCodeForStep = (step: Models.Schema.Step, scroll = false): void => {
@@ -1018,298 +1276,23 @@ export class RecordingView extends HTMLElement {
1018
1276
  return;
1019
1277
  }
1020
1278
 
1021
- const stepIndex = this.#steps.indexOf(step);
1279
+ const stepIndex = this.recording.steps.indexOf(step);
1022
1280
  if (stepIndex === -1) {
1023
1281
  return;
1024
1282
  }
1025
1283
 
1026
- const editor = this.#shadow.querySelector('devtools-text-editor') as | TextEditor.TextEditor.TextEditor | undefined;
1027
- if (!editor) {
1028
- return;
1029
- }
1030
-
1031
- const cm = editor.editor;
1032
- if (!cm) {
1033
- return;
1034
- }
1035
-
1036
1284
  const line = this.#sourceMap[stepIndex * 2];
1037
1285
  const length = this.#sourceMap[stepIndex * 2 + 1];
1038
1286
 
1039
- let selection = editor.createSelection(
1040
- {lineNumber: line + length, columnNumber: 0},
1041
- {lineNumber: line, columnNumber: 0},
1042
- );
1043
- const lastLine = editor.state.doc.lineAt(selection.main.anchor);
1044
- selection = editor.createSelection(
1045
- {lineNumber: line + length - 1, columnNumber: lastLine.length + 1},
1046
- {lineNumber: line, columnNumber: 0},
1047
- );
1048
-
1049
- cm.dispatch({
1050
- selection,
1051
- effects: scroll ?
1052
- [
1053
- CodeMirror.EditorView.scrollIntoView(selection.main, {
1054
- y: 'nearest',
1055
- }),
1056
- ] :
1057
- undefined,
1058
- });
1287
+ this.#viewOutput.highlightLinesInEditor?.(line, length, scroll);
1059
1288
  };
1060
1289
 
1061
1290
  #onCodeFormatChange = (event: Menus.SelectMenu.SelectMenuItemSelectedEvent): void => {
1062
1291
  this.#converterId = event.itemValue as string;
1063
- if (this.#recorderSettings) {
1064
- this.#recorderSettings.preferredCopyFormat = event.itemValue as string;
1292
+ if (this.recorderSettings) {
1293
+ this.recorderSettings.preferredCopyFormat = event.itemValue as string;
1065
1294
  }
1066
1295
 
1067
1296
  void this.#convertToCode();
1068
1297
  };
1069
-
1070
- #renderSections(): Lit.LitTemplate {
1071
- // clang-format off
1072
- return html`
1073
- <div class="sections">
1074
- ${
1075
- !this.#showCodeView
1076
- ? html`<div class="section-toolbar">
1077
- <devtools-button
1078
- @click=${this.showCodeToggle}
1079
- class="show-code"
1080
- .data=${
1081
- {
1082
- variant: Buttons.Button.Variant.OUTLINED,
1083
- title: Models.Tooltip.getTooltipForActions(
1084
- i18nString(UIStrings.showCode),
1085
- Actions.RecorderActions.TOGGLE_CODE_VIEW,
1086
- ),
1087
- } as Buttons.Button.ButtonData
1088
- }
1089
- jslog=${VisualLogging.toggleSubpane(Actions.RecorderActions.TOGGLE_CODE_VIEW).track({click: true})}
1090
- >
1091
- ${i18nString(UIStrings.showCode)}
1092
- </devtools-button>
1093
- </div>`
1094
- : ''
1095
- }
1096
- ${this.#sections.map(
1097
- (section, i) => html`
1098
- <div class="section">
1099
- <div class="screenshot-wrapper">
1100
- ${this.#renderScreenshot(section)}
1101
- </div>
1102
- <div class="content">
1103
- <div class="steps">
1104
- <devtools-step-view
1105
- @click=${this.#onStepClick}
1106
- @mouseover=${this.#onStepHover}
1107
- .data=${
1108
- {
1109
- section,
1110
- state: this.#getSectionState(section),
1111
- isStartOfGroup: true,
1112
- isEndOfGroup: section.steps.length === 0,
1113
- isFirstSection: i === 0,
1114
- isLastSection:
1115
- i === this.#sections.length - 1 &&
1116
- section.steps.length === 0,
1117
- isSelected:
1118
- this.#selectedStep === (section.causingStep || null),
1119
- sectionIndex: i,
1120
- isRecording: this.#isRecording,
1121
- isPlaying: this.#replayState.isPlaying,
1122
- error:
1123
- this.#getSectionState(section) === State.ERROR
1124
- ? this.#currentError
1125
- : undefined,
1126
- hasBreakpoint: false,
1127
- removable: this.#steps.length > 1 && section.causingStep,
1128
- } as StepViewData
1129
- }
1130
- >
1131
- </devtools-step-view>
1132
- ${section.steps.map(step =>
1133
- this.#renderStep(
1134
- section,
1135
- step,
1136
- i === this.#sections.length - 1,
1137
- ),
1138
- )}
1139
- ${!this.#recordingTogglingInProgress && this.#isRecording && i === this.#sections.length - 1 ? html`<devtools-button
1140
- class="step add-assertion-button"
1141
- .data=${
1142
- {
1143
- variant: Buttons.Button.Variant.OUTLINED,
1144
- title: i18nString(UIStrings.addAssertion),
1145
- jslogContext: 'add-assertion',
1146
- } as Buttons.Button.ButtonData
1147
- }
1148
- @click=${this.#dispatchAddAssertionEvent}
1149
- >${i18nString(UIStrings.addAssertion)}</devtools-button>` : undefined}
1150
- ${
1151
- this.#isRecording && i === this.#sections.length - 1
1152
- ? html`<div class="step recording">${i18nString(
1153
- UIStrings.recording,
1154
- )}</div>`
1155
- : null
1156
- }
1157
- </div>
1158
- </div>
1159
- </div>
1160
- `,
1161
- )}
1162
- </div>
1163
- `;
1164
- // clang-format on
1165
- }
1166
-
1167
- #renderHeader(): Lit.LitTemplate|string {
1168
- if (!this.#userFlow) {
1169
- return '';
1170
- }
1171
- const {title} = this.#userFlow;
1172
- const isTitleEditable = !this.#replayState.isPlaying && !this.#isRecording;
1173
- // clang-format off
1174
- return html`
1175
- <div class="header">
1176
- <div class="header-title-wrapper">
1177
- <div class="header-title">
1178
- <input @blur=${this.#onTitleBlur}
1179
- @keydown=${this.#onTitleInputKeyDown}
1180
- id="title-input"
1181
- jslog=${VisualLogging.value('title').track({change: true})}
1182
- class=${Lit.Directives.classMap({
1183
- 'has-error': this.#isTitleInvalid,
1184
- disabled: !isTitleEditable,
1185
- })}
1186
- .value=${Lit.Directives.live(title)}
1187
- .disabled=${!isTitleEditable}
1188
- >
1189
- <div class="title-button-bar">
1190
- <devtools-button
1191
- @click=${this.#onEditTitleButtonClick}
1192
- .data=${
1193
- {
1194
- disabled: !isTitleEditable,
1195
- variant: Buttons.Button.Variant.TOOLBAR,
1196
- iconName: 'edit',
1197
- title: i18nString(UIStrings.editTitle),
1198
- jslogContext: 'edit-title',
1199
- } as Buttons.Button.ButtonData
1200
- }
1201
- ></devtools-button>
1202
- </div>
1203
- </div>
1204
- ${
1205
- this.#isTitleInvalid
1206
- ? html`<div class="title-input-error-text">
1207
- ${
1208
- i18nString(UIStrings.requiredTitleError)
1209
- }
1210
- </div>`
1211
- : ''
1212
- }
1213
- </div>
1214
- ${
1215
- !this.#isRecording && this.#replayAllowed
1216
- ? html`<div class="actions">
1217
- <devtools-button
1218
- @click=${this.#handleMeasurePerformanceClickEvent}
1219
- .data=${
1220
- {
1221
- disabled: this.#replayState.isPlaying,
1222
- variant: Buttons.Button.Variant.OUTLINED,
1223
- iconName: 'performance',
1224
- title: i18nString(UIStrings.performancePanel),
1225
- jslogContext: 'measure-performance',
1226
- } as Buttons.Button.ButtonData
1227
- }
1228
- >
1229
- ${i18nString(UIStrings.performancePanel)}
1230
- </devtools-button>
1231
- <div class="separator"></div>
1232
- ${this.#renderReplayOrAbortButton()}
1233
- </div>`
1234
- : ''
1235
- }
1236
- </div>`;
1237
- // clang-format on
1238
- }
1239
-
1240
- #renderFooter(): Lit.LitTemplate|string {
1241
- if (!this.#isRecording) {
1242
- return '';
1243
- }
1244
- const translation = this.#recordingTogglingInProgress ? i18nString(UIStrings.recordingIsBeingStopped) :
1245
- i18nString(UIStrings.endRecording);
1246
- // clang-format off
1247
- return html`
1248
- <div class="footer">
1249
- <div class="controls">
1250
- <devtools-control-button
1251
- jslog=${VisualLogging.toggle('toggle-recording').track({click: true})}
1252
- @click=${this.#dispatchRecordingFinished}
1253
- .disabled=${this.#recordingTogglingInProgress}
1254
- .shape=${'square'}
1255
- .label=${translation}
1256
- title=${Models.Tooltip.getTooltipForActions(
1257
- translation,
1258
- Actions.RecorderActions.START_RECORDING,
1259
- )}
1260
- >
1261
- </devtools-control-button>
1262
- </div>
1263
- </div>
1264
- `;
1265
- // clang-format on
1266
- }
1267
-
1268
- #render(): void {
1269
- const classNames = {
1270
- wrapper: true,
1271
- 'is-recording': this.#isRecording,
1272
- 'is-playing': this.#replayState.isPlaying,
1273
- 'was-successful': this.#lastReplayResult === Models.RecordingPlayer.ReplayResult.SUCCESS,
1274
- 'was-failure': this.#lastReplayResult === Models.RecordingPlayer.ReplayResult.FAILURE,
1275
- };
1276
-
1277
- // clang-format off
1278
- Lit.render(
1279
- html`
1280
- <style>${UI.inspectorCommonStyles}</style>
1281
- <style>${recordingViewStyles}</style>
1282
- <style>${Input.textInputStyles}</style>
1283
- <div @click=${this.#onWrapperClick} class=${Lit.Directives.classMap(
1284
- classNames,
1285
- )}>
1286
- <div class="main">
1287
- ${this.#renderHeader()}
1288
- ${
1289
- this.#extensionDescriptor
1290
- ? html`
1291
- <devtools-recorder-extension-view .descriptor=${
1292
- this.#extensionDescriptor
1293
- }>
1294
- </devtools-recorder-extension-view>
1295
- `
1296
- : html`
1297
- ${this.#renderSettings()}
1298
- ${this.#renderTimelineArea()}
1299
- `
1300
- }
1301
- ${this.#renderFooter()}
1302
- </div>
1303
- </div>
1304
- `,
1305
- this.#shadow,
1306
- { host: this },
1307
- );
1308
- // clang-format on
1309
- }
1310
1298
  }
1311
-
1312
- customElements.define(
1313
- 'devtools-recording-view',
1314
- RecordingView,
1315
- );