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,9 +1,9 @@
1
1
  // Copyright 2020 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-imperative-dom-api */
5
4
 
6
5
  import '../../ui/legacy/legacy.js';
6
+ import '../../ui/legacy/components/data_grid/data_grid.js';
7
7
 
8
8
  import * as Common from '../../core/common/common.js';
9
9
  import * as Host from '../../core/host/host.js';
@@ -12,143 +12,141 @@ import type * as Platform from '../../core/platform/platform.js';
12
12
  import * as SDK from '../../core/sdk/sdk.js';
13
13
  import * as Protocol from '../../generated/protocol.js';
14
14
  import * as Buttons from '../../ui/components/buttons/buttons.js';
15
- import * as DataGrid from '../../ui/legacy/components/data_grid/data_grid.js';
15
+ import * as Input from '../../ui/components/input/input.js';
16
16
  import * as UI from '../../ui/legacy/legacy.js';
17
17
  import * as Lit from '../../ui/lit/lit.js';
18
18
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
19
19
 
20
20
  import webauthnPaneStyles from './webauthnPane.css.js';
21
- const {render, html} = Lit;
21
+
22
+ const {render, html, Directives: {ref, repeat, classMap}} = Lit;
23
+ const {widgetConfig} = UI.Widget;
22
24
 
23
25
  const UIStrings = {
24
26
  /**
25
- *@description Label for button that allows user to download the private key related to a credential.
27
+ * @description Label for button that allows user to download the private key related to a credential.
26
28
  */
27
29
  export: 'Export',
28
30
  /**
29
- *@description Label for an item to remove something
31
+ * @description Label for an item to remove something
30
32
  */
31
33
  remove: 'Remove',
32
34
  /**
33
- *@description Label for empty credentials table.
34
- *@example {navigator.credentials.create()} PH1
35
+ * @description Label for empty credentials table.
36
+ * @example {navigator.credentials.create()} PH1
35
37
  */
36
38
  noCredentialsTryCallingSFromYour: 'No credentials. Try calling {PH1} from your website.',
37
39
  /**
38
- *@description Label for checkbox to toggle the virtual authenticator environment allowing user to interact with software-based virtual authenticators.
40
+ * @description Label for checkbox to toggle the virtual authenticator environment allowing user to interact with software-based virtual authenticators.
39
41
  */
40
42
  enableVirtualAuthenticator: 'Enable virtual authenticator environment',
41
43
  /**
42
- *@description Label for ID field for credentials.
44
+ * @description Label for ID field for credentials.
43
45
  */
44
46
  id: 'ID',
45
47
  /**
46
- *@description Label for field that describes whether a credential is a resident credential.
48
+ * @description Label for field that describes whether a credential is a resident credential.
47
49
  */
48
50
  isResident: 'Is Resident',
49
51
  /**
50
- *@description Label for credential field that represents the Relying Party ID that the credential is scoped to.
52
+ * @description Label for credential field that represents the Relying Party ID that the credential is scoped to.
51
53
  */
52
54
  rpId: 'RP ID',
53
55
  /**
54
- *@description Label for a column in a table. A field/unique ID that represents the user a credential is mapped to.
56
+ * @description Label for a column in a table. A field/unique ID that represents the user a credential is mapped to.
55
57
  */
56
58
  userHandle: 'User Handle',
57
59
  /**
58
- *@description Label for signature counter field for credentials which represents the number of successful assertions.
60
+ * @description Label for signature counter field for credentials which represents the number of successful assertions.
59
61
  * See https://w3c.github.io/webauthn/#signature-counter.
60
62
  */
61
63
  signCount: 'Signature Count',
62
64
  /**
63
- *@description Label for column with actions for credentials.
65
+ * @description Label for column with actions for credentials.
64
66
  */
65
67
  actions: 'Actions',
66
68
  /**
67
- *@description Title for the table that holds the credentials that a authenticator has registered.
69
+ * @description Title for the table that holds the credentials that a authenticator has registered.
68
70
  */
69
71
  credentials: 'Credentials',
70
72
  /**
71
- *@description Text that shows before the virtual environment is enabled.
73
+ * @description Text that shows before the virtual environment is enabled.
72
74
  */
73
75
  noAuthenticator: 'No authenticator set up',
74
76
  /**
75
- *@description That that shows before virtual environment is enabled explaining the panel.
77
+ * @description That that shows before virtual environment is enabled explaining the panel.
76
78
  */
77
79
  useWebauthnForPhishingresistant: 'Use WebAuthn for phishing-resistant authentication.',
78
80
  /**
79
- *@description Title for section of interface that allows user to add a new virtual authenticator.
81
+ * @description Title for section of interface that allows user to add a new virtual authenticator.
80
82
  */
81
83
  newAuthenticator: 'New authenticator',
82
84
  /**
83
- *@description Text for security or network protocol
85
+ * @description Text for security or network protocol
84
86
  */
85
87
  protocol: 'Protocol',
86
88
  /**
87
- *@description Label for input to select which transport option to use on virtual authenticators, e.g. USB or Bluetooth.
89
+ * @description Label for input to select which transport option to use on virtual authenticators, e.g. USB or Bluetooth.
88
90
  */
89
91
  transport: 'Transport',
90
92
  /**
91
- *@description Label for checkbox that toggles resident key support on virtual authenticators.
93
+ * @description Label for checkbox that toggles resident key support on virtual authenticators.
92
94
  */
93
95
  supportsResidentKeys: 'Supports resident keys',
94
96
  /**
95
- *@description Label for checkbox that toggles large blob support on virtual authenticators. Large blobs are opaque data associated
97
+ * @description Label for checkbox that toggles large blob support on virtual authenticators. Large blobs are opaque data associated
96
98
  * with a WebAuthn credential that a website can store, like an SSH certificate or a symmetric encryption key.
97
99
  * See https://w3c.github.io/webauthn/#sctn-large-blob-extension
98
100
  */
99
101
  supportsLargeBlob: 'Supports large blob',
100
102
  /**
101
- *@description Text to add something
103
+ * @description Text to add something
102
104
  */
103
105
  add: 'Add',
104
106
  /**
105
- *@description Label for button to add a new virtual authenticator.
106
- */
107
- addAuthenticator: 'Add authenticator',
108
- /**
109
- *@description Label for radio button that toggles whether an authenticator is active.
107
+ * @description Label for radio button that toggles whether an authenticator is active.
110
108
  */
111
109
  active: 'Active',
112
110
  /**
113
- *@description Title for button that enables user to customize name of authenticator.
111
+ * @description Title for button that enables user to customize name of authenticator.
114
112
  */
115
113
  editName: 'Edit name',
116
114
  /**
117
- *@description Placeholder for the input box to customize name of authenticator.
115
+ * @description Placeholder for the input box to customize name of authenticator.
118
116
  */
119
117
  enterNewName: 'Enter new name',
120
118
  /**
121
- *@description Title for button that enables user to save name of authenticator after editing it.
119
+ * @description Title for button that enables user to save name of authenticator after editing it.
122
120
  */
123
121
  saveName: 'Save name',
124
122
  /**
125
- *@description Title for a user-added virtual authenticator which is uniquely identified with its AUTHENTICATORID.
126
- *@example {8c7873be-0b13-4996-a794-1521331bbd96} PH1
123
+ * @description Title for a user-added virtual authenticator which is uniquely identified with its AUTHENTICATORID.
124
+ * @example {8c7873be-0b13-4996-a794-1521331bbd96} PH1
127
125
  */
128
126
  authenticatorS: 'Authenticator {PH1}',
129
127
  /**
130
- *@description Name for generated file which user can download. A private key is a secret code which enables encoding and decoding of a credential. .pem is the file extension.
128
+ * @description Name for generated file which user can download. A private key is a secret code which enables encoding and decoding of a credential. .pem is the file extension.
131
129
  */
132
130
  privateKeypem: 'Private key.pem',
133
131
  /**
134
- *@description Label for field that holds an authenticator's universally unique identifier (UUID).
132
+ * @description Label for field that holds an authenticator's universally unique identifier (UUID).
135
133
  */
136
134
  uuid: 'UUID',
137
135
  /**
138
- *@description Label for checkbox that toggles user verification support on virtual authenticators.
136
+ * @description Label for checkbox that toggles user verification support on virtual authenticators.
139
137
  */
140
138
  supportsUserVerification: 'Supports user verification',
141
139
  /**
142
- *@description Text in Timeline indicating that input has happened recently
140
+ * @description Text in Timeline indicating that input has happened recently
143
141
  */
144
142
  yes: 'Yes',
145
143
  /**
146
- *@description Text in Timeline indicating that input has not happened recently
144
+ * @description Text in Timeline indicating that input has not happened recently
147
145
  */
148
146
  no: 'No',
149
147
  /**
150
- *@description Title of radio button that sets an authenticator as active.
151
- *@example {Authenticator ABCDEF} PH1
148
+ * @description Title of radio button that sets an authenticator as active.
149
+ * @example {Authenticator ABCDEF} PH1
152
150
  */
153
151
  setSAsTheActiveAuthenticator: 'Set {PH1} as the active authenticator',
154
152
  } as const;
@@ -159,67 +157,57 @@ const i18nTemplate = Lit.i18nTemplate.bind(undefined, str_);
159
157
  const WEB_AUTHN_EXPLANATION_URL =
160
158
  'https://developer.chrome.com/docs/devtools/webauthn' as Platform.DevToolsPath.UrlString;
161
159
 
162
- class DataGridNode extends DataGrid.DataGrid.DataGridNode<DataGridNode> {
163
- constructor(private readonly credential: Protocol.WebAuthn.Credential) {
164
- super(credential);
165
- }
166
-
167
- override nodeSelfHeight(): number {
168
- return 24;
169
- }
170
-
171
- override createCell(columnId: string): HTMLElement {
172
- const cell = super.createCell(columnId);
173
- UI.Tooltip.Tooltip.install(cell, cell.textContent || '');
174
-
175
- if (columnId !== 'actions') {
176
- return cell;
177
- }
178
-
179
- const onExportCredential = (): void => {
180
- if (this.dataGrid) {
181
- (this.dataGrid as WebauthnDataGrid).onExportCredential(this.credential);
182
- }
183
- };
184
- const onRemoveCredential = (): void => {
185
- if (this.dataGrid) {
186
- (this.dataGrid as WebauthnDataGrid).onRemoveCredential(this.credential);
187
- }
188
- };
189
- // clang-format off
190
- // eslint-disable-next-line rulesdir/no-lit-render-outside-of-view
191
- render(html`
192
- <devtools-button .variant=${Buttons.Button.Variant.OUTLINED}
193
- @click=${onExportCredential} .jslogContext=${'webauthn.export-credential'}>
194
- ${i18nString(UIStrings.export)}
195
- </devtools-button>
196
- <devtools-button .variant=${Buttons.Button.Variant.OUTLINED}
197
- @click=${onRemoveCredential} .jslogContext=${'webauthn.remove-credential'}>
198
- ${i18nString(UIStrings.remove)}
199
- </devtools-button>`, cell);
200
- // clang-format on
201
-
202
- return cell;
203
- }
204
- }
205
-
206
- class WebauthnDataGrid extends DataGrid.DataGrid.DataGridImpl<DataGridNode> {
207
- onExportCredential = (_: Protocol.WebAuthn.Credential): void => {};
208
- onRemoveCredential = (_: Protocol.WebAuthn.Credential): void => {};
209
- }
210
-
211
- class EmptyDataGridNode extends DataGrid.DataGrid.DataGridNode<DataGridNode> {
212
- override createCells(element: Element): void {
213
- element.removeChildren();
214
- // clang-format off
215
- // eslint-disable-next-line rulesdir/no-lit-render-outside-of-view
216
- render(html`
217
- <td class=${DataGrid.DataGrid.Align.CENTER} colspan=${this.dataGrid?.visibleColumnsArray.length ?? 1}>
218
- ${i18nTemplate(UIStrings.noCredentialsTryCallingSFromYour,
219
- {PH1: html`<span class="code">navigator.credentials.create()</span>`})}
220
- </td>`, element as HTMLElement);
221
- // clang-format on
222
- }
160
+ function renderCredentialsDataGrid(
161
+ authenticatorId: Protocol.WebAuthn.AuthenticatorId, credentials: Protocol.WebAuthn.Credential[],
162
+ onExport: (credential: Protocol.WebAuthn.Credential) => void,
163
+ onRemove: (credentialId: string) => void): Lit.TemplateResult {
164
+ // clang-format off
165
+ return html`
166
+ <devtools-data-grid name=${i18nString(UIStrings.credentials)} inline striped>
167
+ <table>
168
+ <thead>
169
+ <tr>
170
+ <th id="credentialId" weight="24" text-overflow="ellipsis">${i18nString(UIStrings.id)}</th>
171
+ <th id="isResidentCredential" type="boolean" weight="10">${i18nString(UIStrings.isResident)}</th>
172
+ <th id="rpId" weight="16.5">${i18nString(UIStrings.rpId)}</th>
173
+ <th id="userHandle" weight="16.5">${i18nString(UIStrings.userHandle)}</th>
174
+ <th id="signCount" weight="16.5">${i18nString(UIStrings.signCount)}</th>
175
+ <th id="actions" weight="16.5">${i18nString(UIStrings.actions)}</th>
176
+ </tr>
177
+ </thead>
178
+ <tbody>
179
+ ${credentials.length ? repeat(credentials, c => c.credentialId, credential => html`
180
+ <tr>
181
+ <td>${credential.credentialId}</td>
182
+ <td>${credential.isResidentCredential}</td>
183
+ <td>${credential.rpId}</td>
184
+ <td>${credential.userHandle}</td>
185
+ <td>${credential.signCount}</td>
186
+ <td>
187
+ <devtools-button .variant=${Buttons.Button.Variant.OUTLINED}
188
+ part="action-button"
189
+ @click=${() => onExport(credential)}
190
+ .jslogContext=${'webauthn.export-credential'}>
191
+ ${i18nString(UIStrings.export)}
192
+ </devtools-button>
193
+ <devtools-button .variant=${Buttons.Button.Variant.OUTLINED}
194
+ part="action-button"
195
+ @click=${() => onRemove(credential.credentialId)}
196
+ .jslogContext=${'webauthn.remove-credential'}>
197
+ ${i18nString(UIStrings.remove)}
198
+ </devtools-button>
199
+ </td>
200
+ </tr>`) : html`
201
+ <tr>
202
+ <td class="center" colspan=6>
203
+ ${i18nTemplate(UIStrings.noCredentialsTryCallingSFromYour,
204
+ {PH1: html`<span class="code">navigator.credentials.create()</span>`})}
205
+ </td>
206
+ </tr>`}
207
+ </tbody>
208
+ </table>
209
+ </devtools-data-grid>`;
210
+ // clang-format on
223
211
  }
224
212
 
225
213
  type AvailableAuthenticatorOptions = Protocol.WebAuthn.VirtualAuthenticatorOptions&{
@@ -240,46 +228,388 @@ const PROTOCOL_AUTHENTICATOR_VALUES: Protocol.EnumerableEnum<typeof Protocol.Web
240
228
  U2f: Protocol.WebAuthn.AuthenticatorProtocol.U2f,
241
229
  };
242
230
 
243
- export class WebauthnPaneImpl extends UI.Widget.VBox implements
231
+ interface Authenticator {
232
+ name: string;
233
+ options: Protocol.WebAuthn.VirtualAuthenticatorOptions;
234
+ credentials: Protocol.WebAuthn.Credential[];
235
+ }
236
+
237
+ interface Authenticator {
238
+ name: string;
239
+ options: Protocol.WebAuthn.VirtualAuthenticatorOptions;
240
+ credentials: Protocol.WebAuthn.Credential[];
241
+ }
242
+
243
+ interface ViewInput {
244
+ enabled: boolean;
245
+ onToggleEnabled: () => void;
246
+ authenticators: Map<Protocol.WebAuthn.AuthenticatorId, Authenticator>;
247
+ activeAuthenticatorId: Protocol.WebAuthn.AuthenticatorId|null;
248
+ editingAuthenticatorId: Protocol.WebAuthn.AuthenticatorId|null;
249
+ newAuthenticatorOptions: Protocol.WebAuthn.VirtualAuthenticatorOptions;
250
+ internalTransportAvailable: boolean;
251
+ updateNewAuthenticatorOptions: (change: Partial<Protocol.WebAuthn.VirtualAuthenticatorOptions>) => void;
252
+ addAuthenticator: () => void;
253
+ onActivateAuthenticator: (id: Protocol.WebAuthn.AuthenticatorId) => void;
254
+ onEditName: (id: Protocol.WebAuthn.AuthenticatorId) => void;
255
+ onSaveName: (id: Protocol.WebAuthn.AuthenticatorId, name: string) => void;
256
+ onRemoveAuthenticator: (id: Protocol.WebAuthn.AuthenticatorId) => void;
257
+ onExportCredential: (credential: Protocol.WebAuthn.Credential) => void;
258
+ onRemoveCredential: (id: Protocol.WebAuthn.AuthenticatorId, credentialId: string) => void;
259
+ }
260
+
261
+ interface ViewOutput {
262
+ revealSection: Map<string, () => void>;
263
+ }
264
+
265
+ type ViewFunction = (input: ViewInput, output: ViewOutput, target: HTMLElement) => void;
266
+
267
+ function renderToolbar(enabled: boolean, onToggle: () => void): Lit.TemplateResult {
268
+ const enableCheckboxTitle = i18nString(UIStrings.enableVirtualAuthenticator);
269
+ // clang-format off
270
+ return html`
271
+ <div class="webauthn-toolbar-container" jslog=${VisualLogging.toolbar()} role="toolbar">
272
+ <devtools-toolbar class="webauthn-toolbar" role="presentation">
273
+ <devtools-checkbox title=${enableCheckboxTitle}
274
+ @click=${onToggle}
275
+ .jslogContext=${'virtual-authenticators'}
276
+ .checked=${enabled}>
277
+ ${enableCheckboxTitle}
278
+ </devtools-checkbox>
279
+ </devtools-toolbar>
280
+ </div>`;
281
+ // clang-format on
282
+ }
283
+
284
+ function renderLearnMoreView(): Lit.TemplateResult {
285
+ // clang-format off
286
+ return html`
287
+ <devtools-widget class="learn-more" .widgetConfig=${widgetConfig(UI.EmptyWidget.EmptyWidget, {
288
+ header: i18nString(UIStrings.noAuthenticator),
289
+ text: i18nString(UIStrings.useWebauthnForPhishingresistant),
290
+ link: WEB_AUTHN_EXPLANATION_URL})}>
291
+ </devtools-widget>`;
292
+ // clang-format on
293
+ }
294
+
295
+ function renderNewAuthenticatorSection(
296
+ options: Protocol.WebAuthn.VirtualAuthenticatorOptions, internalTransportAvailable: boolean,
297
+ onUpdate: (change: Partial<Protocol.WebAuthn.VirtualAuthenticatorOptions>) => void,
298
+ onAdd: () => void): Lit.TemplateResult {
299
+ const isCtap2 = options.protocol === Protocol.WebAuthn.AuthenticatorProtocol.Ctap2;
300
+ // clang-format off
301
+ return html`
302
+ <div class="new-authenticator-container">
303
+ <label class="new-authenticator-title">
304
+ ${i18nString(UIStrings.newAuthenticator)}
305
+ </label>
306
+ <div class="new-authenticator-form" jslog=${VisualLogging.section('new-authenticator')}>
307
+ <div class="authenticator-option">
308
+ <label class="authenticator-option-label" for="protocol">
309
+ ${i18nString(UIStrings.protocol)}
310
+ </label>
311
+ <select id="protocol" jslog=${VisualLogging.dropDown('protocol').track({change: true})}
312
+ value=${options.protocol}
313
+ @change=${(e:Event) => onUpdate({protocol: (e.target as HTMLSelectElement).value as Protocol.WebAuthn.AuthenticatorProtocol})}>
314
+ ${Object.values(PROTOCOL_AUTHENTICATOR_VALUES).sort().map(option => html`
315
+ <option value=${option} jslog=${VisualLogging.item(option).track({click: true})}>
316
+ ${option}
317
+ </option>`)}
318
+ </select>
319
+ </div>
320
+ <div class="authenticator-option">
321
+ <label for="transport" class="authenticator-option-label">
322
+ ${i18nString(UIStrings.transport)}
323
+ </label>
324
+ <select id="transport"
325
+ value=${options.transport}
326
+ jslog=${VisualLogging.dropDown('transport').track({change: true})}
327
+ @change=${(e: Event) => onUpdate({transport: (e.target as HTMLSelectElement).value as Protocol.WebAuthn.AuthenticatorTransport})}>
328
+ ${[
329
+ Protocol.WebAuthn.AuthenticatorTransport.Usb,
330
+ Protocol.WebAuthn.AuthenticatorTransport.Ble,
331
+ Protocol.WebAuthn.AuthenticatorTransport.Nfc,
332
+ ...(isCtap2 ? [Protocol.WebAuthn.AuthenticatorTransport.Internal] : [])
333
+ ].map(option => html`
334
+ <option value=${option} jslog=${VisualLogging.item(option).track({click: true})}
335
+ .selected=${options.transport === option}
336
+ .disabled=${!internalTransportAvailable
337
+ && option === Protocol.WebAuthn.AuthenticatorTransport.Internal}>
338
+ ${option}
339
+ </option>`)
340
+ }
341
+ </select>
342
+ </div>
343
+ <div class="authenticator-option">
344
+ <label for="resident-key" class="authenticator-option-label">
345
+ ${i18nString(UIStrings.supportsResidentKeys)}
346
+ </label>
347
+ <input id="resident-key" class="authenticator-option-checkbox" type="checkbox"
348
+ jslog=${VisualLogging.toggle('resident-key').track({change: true})}
349
+ @change=${(e:Event) => onUpdate({hasResidentKey: (e.target as HTMLInputElement).checked})}
350
+ .checked=${Boolean(options.hasResidentKey && isCtap2)} .disabled=${!isCtap2}>
351
+ </div>
352
+ <div class="authenticator-option">
353
+ <label for="user-verification" class="authenticator-option-label">
354
+ ${i18nString(UIStrings.supportsUserVerification)}
355
+ </label>
356
+ <input id="user-verification" class="authenticator-option-checkbox" type="checkbox"
357
+ jslog=${VisualLogging.toggle('user-verification').track({change: true})}
358
+ @change=${(e: Event) => onUpdate({hasUserVerification: (e.target as HTMLInputElement).checked})}
359
+ .checked=${Boolean(options.hasUserVerification && isCtap2)}
360
+ .disabled=${!isCtap2}>
361
+ </div>
362
+ <div class="authenticator-option">
363
+ <label for="large-blob" class="authenticator-option-label">
364
+ ${i18nString(UIStrings.supportsLargeBlob)}
365
+ </label>
366
+ <input id="large-blob" class="authenticator-option-checkbox" type="checkbox"
367
+ jslog=${VisualLogging.toggle('large-blob').track({change: true})}
368
+ @change=${(e: Event) => onUpdate({hasLargeBlob: (e.target as HTMLInputElement).checked})}
369
+ .checked=${Boolean(options.hasLargeBlob && isCtap2 && options.hasResidentKey)}
370
+ .disabled=${!options.hasResidentKey || !isCtap2}>
371
+ </div>
372
+ <div class="authenticator-option">
373
+ <div class="authenticator-option-label"></div>
374
+ <devtools-button @click=${onAdd}
375
+ id="add-authenticator"
376
+ .jslogContext=${'webauthn.add-authenticator'}
377
+ .variant=${Buttons.Button.Variant.OUTLINED}>
378
+ ${i18nString(UIStrings.add)}
379
+ </devtools-button>
380
+ </div>
381
+ </div>
382
+ </div>`;
383
+ }
384
+
385
+ function renderAuthenticatorSection(
386
+ authenticatorId: Protocol.WebAuthn.AuthenticatorId,
387
+ authenticator: Authenticator, active: boolean, editing: boolean,
388
+ onActivate: () => void, onEditName: () => void, onSaveName: (name: string) => void, onRemove: () => void,
389
+ onExportCredential : (credential: Protocol.WebAuthn.Credential) => void,
390
+ onRemoveCredential : (credentialId: string) => void,
391
+ output: ViewOutput): Lit.TemplateResult {
392
+ function revealSection(section: Element|undefined): void {
393
+ if (!section) {
394
+ return;
395
+ }
396
+ const mediaQueryList = window.matchMedia('(prefers-reduced-motion: reduce)');
397
+ const prefersReducedMotion = mediaQueryList.matches;
398
+ section.scrollIntoView({block: 'nearest', behavior: prefersReducedMotion ? 'auto' : 'smooth'});
399
+ }
400
+ // clang-format off
401
+ return html`
402
+ <div class="authenticator-section" data-authenticator-id=${authenticatorId}
403
+ jslog=${VisualLogging.section('authenticator')}
404
+ ${ref(e => { output.revealSection.set(authenticatorId, revealSection.bind(null, e));})}>
405
+ <div class="authenticator-section-header">
406
+ <div class="authenticator-section-title" role="heading" aria-level="2">
407
+ <devtools-toolbar class="edit-name-toolbar">
408
+ <devtools-button title=${i18nString(UIStrings.editName)}
409
+ class=${classMap({hidden: editing})}
410
+ @click=${onEditName}
411
+ .iconName=${'edit'} .variant=${Buttons.Button.Variant.TOOLBAR}
412
+ .jslogContext=${'edit-name'}></devtools-button>
413
+ <devtools-button title=${i18nString(UIStrings.saveName)}
414
+ @click=${(e: Event) => onSaveName(((e.target as HTMLElement).parentElement?.nextSibling as HTMLInputElement).value)}
415
+ .iconName=${'checkmark'} .variant=${Buttons.Button.Variant.TOOLBAR}
416
+ class=${classMap({hidden: !editing})}
417
+ .jslogContext=${'save-name'}></devtools-button>
418
+ </devtools-toolbar>
419
+ <input class="authenticator-name-field"
420
+ placeholder=${i18nString(UIStrings.enterNewName)}
421
+ jslog=${VisualLogging.textField('name').track({keydown: 'Enter', change: true})}
422
+ value=${i18nString(UIStrings.authenticatorS, {PH1: authenticator.name})} .disabled=${!editing}
423
+ ${ref(e => { if(e instanceof HTMLInputElement && editing) { e.focus(); } })}
424
+ @focusout=${(e: Event) => onSaveName((e.target as HTMLInputElement).value)}
425
+ @keydown=${(event: KeyboardEvent) => {
426
+ if (event.key === 'Enter') {
427
+ onSaveName((event.target as HTMLInputElement).value);
428
+ }
429
+ }}>
430
+ </div>
431
+ <div class="active-button-container">
432
+ <label title=${i18nString(UIStrings.setSAsTheActiveAuthenticator, {PH1: authenticator.name})}>
433
+ <input type="radio" .checked=${active} @change=${(e:Event) => { if ((e.target as HTMLInputElement).checked) { onActivate(); }}}
434
+ jslog=${VisualLogging.toggle('webauthn.active-authenticator').track({change: true})}>
435
+ ${i18nString(UIStrings.active)}
436
+ </label>
437
+ </div>
438
+ <button class="text-button" @click=${onRemove}
439
+ jslog=${VisualLogging.action('webauthn.remove-authenticator').track({click: true})}>
440
+ ${i18nString(UIStrings.remove)}
441
+ </button>
442
+ </div>
443
+ ${renderAuthenticatorFields(authenticatorId, authenticator.options)}
444
+ <div class="credentials-title">${i18nString(UIStrings.credentials)}</div>
445
+ ${renderCredentialsDataGrid(authenticatorId, authenticator.credentials, onExportCredential, onRemoveCredential)}
446
+ <div class="divider"></div>
447
+ </div>`;
448
+ // clang-format on
449
+ }
450
+
451
+ /**
452
+ * Creates the fields describing the authenticator in the front end.
453
+ */
454
+ function renderAuthenticatorFields(
455
+ authenticatorId: string, options: Protocol.WebAuthn.VirtualAuthenticatorOptions): Lit.TemplateResult {
456
+ // clang-format off
457
+ return html`
458
+ <div class="authenticator-fields">
459
+ <div class="authenticator-field">
460
+ <label class="authenticator-option-label">${i18nString(UIStrings.uuid)}</label>
461
+ <div class="authenticator-field-value">${authenticatorId}</div>
462
+ </div>
463
+ <div class="authenticator-field">
464
+ <label class="authenticator-option-label">${i18nString(UIStrings.protocol)}</label>
465
+ <div class="authenticator-field-value">${options.protocol}</div>
466
+ </div>
467
+ <div class="authenticator-field">
468
+ <label class="authenticator-option-label">${i18nString(UIStrings.transport)}</label>
469
+ <div class="authenticator-field-value">${options.transport}</div>
470
+ </div>
471
+ <div class="authenticator-field">
472
+ <label class="authenticator-option-label">
473
+ ${i18nString(UIStrings.supportsResidentKeys)}
474
+ </label>
475
+ <div class="authenticator-field-value">
476
+ ${options.hasResidentKey ? i18nString(UIStrings.yes) : i18nString(UIStrings.no)}
477
+ </div>
478
+ </div>
479
+ <div class="authenticator-field">
480
+ <label class="authenticator-option-label">
481
+ ${i18nString(UIStrings.supportsLargeBlob)}
482
+ </label>
483
+ <div class="authenticator-field-value">
484
+ ${options.hasLargeBlob ? i18nString(UIStrings.yes) : i18nString(UIStrings.no)}
485
+ </div>
486
+ </div>
487
+ <div class="authenticator-field">
488
+ <label class="authenticator-option-label">
489
+ ${i18nString(UIStrings.supportsUserVerification)}
490
+ </label>
491
+ <div class="authenticator-field-value">
492
+ ${options.hasUserVerification ? i18nString(UIStrings.yes) : i18nString(UIStrings.no)}
493
+ </div>
494
+ </div>
495
+ </div>`;
496
+ // clang-format on
497
+ }
498
+
499
+ export const DEFAULT_VIEW: ViewFunction = (input, output, target) => {
500
+ // clang-format off
501
+ render(html`
502
+ <style>${Input.checkboxStyles}</style>
503
+ <style>${webauthnPaneStyles}</style>
504
+ <div class="webauthn-pane flex-auto ${classMap({enabled: input.enabled})}">
505
+ ${renderToolbar(input.enabled, input.onToggleEnabled)}
506
+ <div class="authenticators-view">
507
+ ${repeat([...input.authenticators.entries()],
508
+ ([id]) => id,
509
+ ([id, authenticator]) => renderAuthenticatorSection(
510
+ id, authenticator,
511
+ input.activeAuthenticatorId === id,
512
+ input.editingAuthenticatorId === id,
513
+ input.onActivateAuthenticator.bind(input, id),
514
+ input.onEditName.bind(input, id),
515
+ input.onSaveName.bind(input, id),
516
+ input.onRemoveAuthenticator.bind(input, id),
517
+ input.onExportCredential,
518
+ input.onRemoveCredential.bind(input, id),
519
+ output))}
520
+ </div>
521
+ ${renderLearnMoreView()}
522
+ ${renderNewAuthenticatorSection(
523
+ input.newAuthenticatorOptions, input.internalTransportAvailable, input.updateNewAuthenticatorOptions, input.addAuthenticator)}
524
+ </div>`,
525
+ target);
526
+ // clang-format on
527
+ };
528
+
529
+ export class WebauthnPaneImpl extends UI.Panel.Panel implements
244
530
  SDK.TargetManager.SDKModelObserver<SDK.WebAuthnModel.WebAuthnModel> {
531
+ async #addAuthenticator(options: Protocol.WebAuthn.VirtualAuthenticatorOptions):
532
+ Promise<Protocol.WebAuthn.AuthenticatorId> {
533
+ if (!this.#model) {
534
+ throw new Error('WebAuthn model is not available.');
535
+ }
536
+
537
+ const authenticatorId = await this.#model.addAuthenticator(options);
538
+ const userFriendlyName = authenticatorId.slice(-5); // User friendly name defaults to last 5 chars of UUID.
539
+ this.#authenticators.set(authenticatorId, {
540
+ name: userFriendlyName,
541
+ options,
542
+ credentials: [],
543
+ });
544
+ this.requestUpdate();
545
+ this.#model.addEventListener(
546
+ SDK.WebAuthnModel.Events.CREDENTIAL_ADDED, this.#addCredential.bind(this, authenticatorId));
547
+ this.#model.addEventListener(
548
+ SDK.WebAuthnModel.Events.CREDENTIAL_ASSERTED, this.#updateCredential.bind(this, authenticatorId));
549
+ this.#model.addEventListener(
550
+ SDK.WebAuthnModel.Events.CREDENTIAL_UPDATED, this.#updateCredential.bind(this, authenticatorId));
551
+ this.#model.addEventListener(
552
+ SDK.WebAuthnModel.Events.CREDENTIAL_DELETED, this.#deleteCredential.bind(this, authenticatorId));
553
+ return authenticatorId;
554
+ }
555
+
245
556
  #activeAuthId: Protocol.WebAuthn.AuthenticatorId|null = null;
557
+ #editingAuthId: Protocol.WebAuthn.AuthenticatorId|null = null;
246
558
  #hasBeenEnabled = false;
247
- readonly dataGrids = new Map<Protocol.WebAuthn.AuthenticatorId, DataGrid.DataGrid.DataGridImpl<DataGridNode>>();
248
- #enableCheckbox!: UI.Toolbar.ToolbarCheckbox;
559
+ readonly #authenticators = new Map<Protocol.WebAuthn.AuthenticatorId, Authenticator>();
560
+ #enabled = false;
249
561
  readonly #availableAuthenticatorSetting: Common.Settings.Setting<AvailableAuthenticatorOptions[]>;
250
562
  #model?: SDK.WebAuthnModel.WebAuthnModel;
251
- #authenticatorsView: HTMLElement;
252
- #topToolbarContainer: HTMLElement|undefined;
253
- #topToolbar: UI.Toolbar.Toolbar|undefined;
254
- #learnMoreView: UI.EmptyWidget.EmptyWidget|undefined;
255
- #newAuthenticatorSection: HTMLElement|undefined;
256
- #newAuthenticatorForm: HTMLElement|undefined;
257
- #protocolSelect: HTMLSelectElement|undefined;
258
- transportSelect: HTMLSelectElement|undefined;
259
- residentKeyCheckbox: HTMLInputElement|undefined;
260
- #userVerificationCheckbox: HTMLInputElement|undefined;
261
- largeBlobCheckbox: HTMLInputElement|undefined;
262
- addAuthenticatorButton: Buttons.Button.Button|undefined;
563
+ #newAuthenticatorOptions: Protocol.WebAuthn.VirtualAuthenticatorOptions = {
564
+ protocol: Protocol.WebAuthn.AuthenticatorProtocol.Ctap2,
565
+ transport: Protocol.WebAuthn.AuthenticatorTransport.Usb,
566
+ hasResidentKey: false,
567
+ hasUserVerification: false,
568
+ hasLargeBlob: false,
569
+ automaticPresenceSimulation: true,
570
+ isUserVerified: true,
571
+ };
572
+ #hasInternalAuthenticator = false;
263
573
  #isEnabling?: Promise<void>;
574
+ #view: ViewFunction;
575
+ #viewOutput: ViewOutput = {
576
+ revealSection: new Map(),
577
+ };
264
578
 
265
- constructor() {
266
- super(true);
267
- this.registerRequiredCSS(webauthnPaneStyles);
579
+ constructor(view = DEFAULT_VIEW) {
580
+ super('webauthn');
268
581
 
269
- this.element.setAttribute('jslog', `${VisualLogging.panel('webauthn').track({resize: true})}`);
582
+ this.#view = view;
270
583
 
271
584
  SDK.TargetManager.TargetManager.instance().observeModels(SDK.WebAuthnModel.WebAuthnModel, this, {scoped: true});
272
585
 
273
- this.contentElement.classList.add('webauthn-pane');
274
-
275
586
  this.#availableAuthenticatorSetting =
276
587
  Common.Settings.Settings.instance().createSetting<AvailableAuthenticatorOptions[]>(
277
588
  'webauthn-authenticators', []);
589
+ this.#updateInternalTransportAvailability();
278
590
 
279
- this.#createToolbar();
280
- this.#authenticatorsView = this.contentElement.createChild('div', 'authenticators-view');
281
- this.#createNewAuthenticatorSection();
282
- this.#updateVisibility(false);
591
+ this.performUpdate();
592
+ }
593
+
594
+ override performUpdate(): void {
595
+ const viewInput = {
596
+ enabled: this.#enabled,
597
+ onToggleEnabled: this.#handleCheckboxToggle.bind(this),
598
+ authenticators: this.#authenticators,
599
+ activeAuthenticatorId: this.#activeAuthId,
600
+ editingAuthenticatorId: this.#editingAuthId,
601
+ newAuthenticatorOptions: this.#newAuthenticatorOptions,
602
+ internalTransportAvailable: !this.#hasInternalAuthenticator,
603
+ updateNewAuthenticatorOptions: this.#updateNewAuthenticatorSectionOptions.bind(this),
604
+ addAuthenticator: this.#handleAddAuthenticatorButton.bind(this),
605
+ onActivateAuthenticator: this.#setActiveAuthenticator.bind(this),
606
+ onEditName: this.#handleEditNameButton.bind(this),
607
+ onSaveName: this.#handleSaveNameButton.bind(this),
608
+ onRemoveAuthenticator: this.removeAuthenticator.bind(this),
609
+ onExportCredential: this.#exportCredential.bind(this),
610
+ onRemoveCredential: this.#removeCredential.bind(this),
611
+ };
612
+ this.#view(viewInput, this.#viewOutput, this.contentElement);
283
613
  }
284
614
 
285
615
  modelAdded(model: SDK.WebAuthnModel.WebAuthnModel): void {
@@ -302,8 +632,7 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
302
632
  continue;
303
633
  }
304
634
 
305
- const authenticatorId = await this.#model.addAuthenticator(options);
306
- void this.#addAuthenticatorSection(authenticatorId, options);
635
+ const authenticatorId = await this.#addAuthenticator(options);
307
636
  // Update the authenticatorIds in the options.
308
637
  options.authenticatorId = authenticatorId;
309
638
  if (options.active) {
@@ -319,86 +648,19 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
319
648
  }
320
649
 
321
650
  override async ownerViewDisposed(): Promise<void> {
322
- if (this.#enableCheckbox) {
323
- this.#enableCheckbox.setChecked(false);
324
- }
651
+ this.#enabled = false;
325
652
  await this.#setVirtualAuthEnvEnabled(false);
326
653
  }
327
654
 
328
- #createToolbar(): void {
329
- this.#topToolbarContainer = this.contentElement.createChild('div', 'webauthn-toolbar-container');
330
- this.#topToolbarContainer.setAttribute('jslog', `${VisualLogging.toolbar()}`);
331
- this.#topToolbarContainer.role = 'toolbar';
332
- this.#topToolbar = this.#topToolbarContainer.createChild('devtools-toolbar', 'webauthn-toolbar');
333
- this.#topToolbar.role = 'presentation';
334
- const enableCheckboxTitle = i18nString(UIStrings.enableVirtualAuthenticator);
335
- this.#enableCheckbox = new UI.Toolbar.ToolbarCheckbox(
336
- enableCheckboxTitle, enableCheckboxTitle, this.#handleCheckboxToggle.bind(this), 'virtual-authenticators');
337
- this.#topToolbar.appendToolbarItem(this.#enableCheckbox);
338
- }
339
-
340
- #createCredentialsDataGrid(authenticatorId: Protocol.WebAuthn.AuthenticatorId):
341
- DataGrid.DataGrid.DataGridImpl<DataGridNode> {
342
- const columns = ([
343
- {
344
- id: 'credentialId',
345
- title: i18nString(UIStrings.id),
346
- longText: true,
347
- weight: 24,
348
- },
349
- {
350
- id: 'isResidentCredential',
351
- title: i18nString(UIStrings.isResident),
352
- dataType: DataGrid.DataGrid.DataType.BOOLEAN,
353
- weight: 10,
354
- },
355
- {
356
- id: 'rpId',
357
- title: i18nString(UIStrings.rpId),
358
- },
359
- {
360
- id: 'userHandle',
361
- title: i18nString(UIStrings.userHandle),
362
- },
363
- {
364
- id: 'signCount',
365
- title: i18nString(UIStrings.signCount),
366
- },
367
- {id: 'actions', title: i18nString(UIStrings.actions)},
368
- ] as DataGrid.DataGrid.ColumnDescriptor[]);
369
-
370
- const dataGridConfig = {
371
- displayName: i18nString(UIStrings.credentials),
372
- columns,
373
- editCallback: undefined,
374
- deleteCallback: undefined,
375
- refreshCallback: undefined,
376
- };
377
- const dataGrid = new WebauthnDataGrid(dataGridConfig);
378
- dataGrid.renderInline();
379
- dataGrid.setStriped(true);
380
- dataGrid.onExportCredential = this.#exportCredential.bind(this);
381
- dataGrid.onRemoveCredential = ({credentialId}) => this.#removeCredential(authenticatorId, credentialId);
382
- dataGrid.rootNode().appendChild(new EmptyDataGridNode());
383
-
384
- this.dataGrids.set(authenticatorId, dataGrid);
385
-
386
- return dataGrid;
387
- }
388
-
389
655
  #addCredential(authenticatorId: Protocol.WebAuthn.AuthenticatorId, {
390
656
  data: event,
391
657
  }: Common.EventTarget.EventTargetEvent<Protocol.WebAuthn.CredentialAddedEvent>): void {
392
- const dataGrid = this.dataGrids.get(authenticatorId);
393
- if (!dataGrid) {
658
+ const authenticator = this.#authenticators.get(authenticatorId);
659
+ if (!authenticator) {
394
660
  return;
395
661
  }
396
- const emptyNode = dataGrid.rootNode().children.find(node => !Object.keys(node.data).length);
397
- if (emptyNode) {
398
- dataGrid.rootNode().removeChild(emptyNode);
399
- }
400
- const node = new DataGridNode(event.credential);
401
- dataGrid.rootNode().appendChild(node);
662
+ authenticator.credentials.push(event.credential);
663
+ this.requestUpdate();
402
664
  }
403
665
 
404
666
  #updateCredential(
@@ -407,29 +669,33 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
407
669
  data: event,
408
670
  }: Common.EventTarget
409
671
  .EventTargetEvent<Protocol.WebAuthn.CredentialAssertedEvent&Protocol.WebAuthn.CredentialUpdatedEvent>): void {
410
- const dataGrid = this.dataGrids.get(authenticatorId);
411
- if (!dataGrid) {
672
+ const authenticator = this.#authenticators.get(authenticatorId);
673
+ if (!authenticator) {
412
674
  return;
413
675
  }
414
- const node = dataGrid.rootNode().children.find(node => node.data?.credentialId === event.credential.credentialId);
415
- if (!node) {
676
+ const credential =
677
+ authenticator.credentials.find(credential => credential.credentialId === event.credential.credentialId);
678
+ if (!credential) {
416
679
  return;
417
680
  }
418
- node.data = event.credential;
681
+ Object.assign(credential, event.credential);
682
+ this.requestUpdate();
419
683
  }
420
684
 
421
685
  #deleteCredential(authenticatorId: Protocol.WebAuthn.AuthenticatorId, {
422
686
  data: event,
423
687
  }: Common.EventTarget.EventTargetEvent<Protocol.WebAuthn.CredentialDeletedEvent>): void {
424
- const dataGrid = this.dataGrids.get(authenticatorId);
425
- if (!dataGrid) {
688
+ const authenticator = this.#authenticators.get(authenticatorId);
689
+ if (!authenticator) {
426
690
  return;
427
691
  }
428
- const node = dataGrid.rootNode().children.find(node => node.data?.credentialId === event.credentialId);
429
- if (!node) {
692
+ const credentialIndex =
693
+ authenticator.credentials.findIndex(credential => credential.credentialId === event.credentialId);
694
+ if (credentialIndex < 0) {
430
695
  return;
431
696
  }
432
- node.remove();
697
+ authenticator.credentials.splice(credentialIndex, 1);
698
+ this.requestUpdate();
433
699
  }
434
700
 
435
701
  async #setVirtualAuthEnvEnabled(enable: boolean): Promise<void> {
@@ -450,289 +716,51 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
450
716
  this.#removeAuthenticatorSections();
451
717
  }
452
718
 
453
- this.#updateVisibility(enable);
454
719
  this.#isEnabling = undefined;
720
+ this.#enabled = enable;
721
+ this.requestUpdate();
455
722
  resolve();
456
723
  });
457
724
  }
458
725
 
459
- #updateVisibility(enabled: boolean): void {
460
- this.contentElement.classList.toggle('enabled', enabled);
461
- }
462
-
463
726
  #removeAuthenticatorSections(): void {
464
- this.#authenticatorsView.innerHTML = '';
465
- for (const dataGrid of this.dataGrids.values()) {
466
- dataGrid.asWidget().detach();
467
- }
468
- this.dataGrids.clear();
727
+ this.#authenticators.clear();
469
728
  }
470
729
 
471
- #handleCheckboxToggle(e: MouseEvent): void {
472
- void this.#setVirtualAuthEnvEnabled((e.target as HTMLInputElement).checked);
730
+ #handleCheckboxToggle(): void {
731
+ void this.#setVirtualAuthEnvEnabled(!this.#enabled);
473
732
  }
474
733
 
475
- #updateEnabledTransportOptions(enabledOptions: Protocol.WebAuthn.AuthenticatorTransport[]): void {
476
- if (!this.transportSelect) {
477
- return;
478
- }
479
-
480
- const prevValue = this.transportSelect.value;
481
- this.transportSelect.removeChildren();
482
-
483
- for (const option of enabledOptions) {
484
- this.transportSelect.appendChild(UI.UIUtils.createOption(option, option, option));
485
- }
486
-
487
- // Make sure the currently selected value stays the same.
488
- this.transportSelect.value = prevValue;
489
- // If the new set does not include the previous value.
490
- if (!this.transportSelect.value) {
491
- // Select the first available value.
492
- this.transportSelect.selectedIndex = 0;
493
- }
494
- this.#updateInternalTransportAvailability();
734
+ #updateNewAuthenticatorSectionOptions(change: Partial<Protocol.WebAuthn.VirtualAuthenticatorOptions>): void {
735
+ Object.assign(this.#newAuthenticatorOptions, change);
736
+ this.requestUpdate();
495
737
  }
496
738
 
497
739
  #updateInternalTransportAvailability(): void {
498
- if (!this.transportSelect?.options) {
499
- return;
500
- }
501
- const hasInternal = Boolean(this.#availableAuthenticatorSetting.get().find(
740
+ this.#hasInternalAuthenticator = Boolean(this.#availableAuthenticatorSetting.get().find(
502
741
  authenticator => authenticator.transport === Protocol.WebAuthn.AuthenticatorTransport.Internal));
503
- for (let i = 0; i < this.transportSelect.options.length; ++i) {
504
- const option = this.transportSelect.options[i];
505
- if (option.value === Protocol.WebAuthn.AuthenticatorTransport.Internal) {
506
- option.disabled = hasInternal;
507
- // This relies on "internal" never being the first or only element.
508
- if (i === this.transportSelect.selectedIndex) {
509
- --this.transportSelect.selectedIndex;
510
- }
511
- break;
512
- }
513
- }
514
- }
515
-
516
- #updateNewAuthenticatorSectionOptions(): void {
517
- if (!this.#protocolSelect || !this.residentKeyCheckbox || !this.#userVerificationCheckbox ||
518
- !this.largeBlobCheckbox) {
519
- return;
520
- }
521
-
522
- if (this.#protocolSelect.value === Protocol.WebAuthn.AuthenticatorProtocol.Ctap2) {
523
- this.residentKeyCheckbox.disabled = false;
524
- this.#userVerificationCheckbox.disabled = false;
525
- this.largeBlobCheckbox.disabled = !this.residentKeyCheckbox.checked;
526
- if (this.largeBlobCheckbox.disabled) {
527
- this.largeBlobCheckbox.checked = false;
528
- }
529
- this.#updateEnabledTransportOptions([
530
- Protocol.WebAuthn.AuthenticatorTransport.Usb,
531
- Protocol.WebAuthn.AuthenticatorTransport.Ble,
532
- Protocol.WebAuthn.AuthenticatorTransport.Nfc,
533
- Protocol.WebAuthn.AuthenticatorTransport.Internal,
534
- ]);
535
- } else {
536
- this.residentKeyCheckbox.checked = false;
537
- this.residentKeyCheckbox.disabled = true;
538
- this.#userVerificationCheckbox.checked = false;
539
- this.#userVerificationCheckbox.disabled = true;
540
- this.largeBlobCheckbox.checked = false;
541
- this.largeBlobCheckbox.disabled = true;
542
- this.#updateEnabledTransportOptions([
543
- Protocol.WebAuthn.AuthenticatorTransport.Usb,
544
- Protocol.WebAuthn.AuthenticatorTransport.Ble,
545
- Protocol.WebAuthn.AuthenticatorTransport.Nfc,
546
- ]);
547
- }
548
- }
549
-
550
- #createNewAuthenticatorSection(): void {
551
- this.#learnMoreView = new UI.EmptyWidget.EmptyWidget(
552
- i18nString(UIStrings.noAuthenticator), i18nString(UIStrings.useWebauthnForPhishingresistant));
553
- this.#learnMoreView.element.classList.add('learn-more');
554
- this.#learnMoreView.link = WEB_AUTHN_EXPLANATION_URL;
555
- this.#learnMoreView.show(this.contentElement);
556
-
557
- this.#newAuthenticatorSection = this.contentElement.createChild('div', 'new-authenticator-container');
558
- const newAuthenticatorTitle =
559
- UI.UIUtils.createLabel(i18nString(UIStrings.newAuthenticator), 'new-authenticator-title');
560
- this.#newAuthenticatorSection.appendChild(newAuthenticatorTitle);
561
- this.#newAuthenticatorForm = this.#newAuthenticatorSection.createChild('div', 'new-authenticator-form');
562
- this.#newAuthenticatorForm.setAttribute('jslog', `${VisualLogging.section('new-authenticator')}`);
563
-
564
- const protocolGroup = this.#newAuthenticatorForm.createChild('div', 'authenticator-option');
565
- const transportGroup = this.#newAuthenticatorForm.createChild('div', 'authenticator-option');
566
- const residentKeyGroup = this.#newAuthenticatorForm.createChild('div', 'authenticator-option');
567
- const userVerificationGroup = this.#newAuthenticatorForm.createChild('div', 'authenticator-option');
568
- const largeBlobGroup = this.#newAuthenticatorForm.createChild('div', 'authenticator-option');
569
- const addButtonGroup = this.#newAuthenticatorForm.createChild('div', 'authenticator-option');
570
-
571
- const protocolSelectTitle = UI.UIUtils.createLabel(i18nString(UIStrings.protocol), 'authenticator-option-label');
572
- protocolGroup.appendChild(protocolSelectTitle);
573
- this.#protocolSelect = protocolGroup.createChild('select');
574
- this.#protocolSelect.setAttribute('jslog', `${VisualLogging.dropDown('protocol').track({change: true})}`);
575
- UI.ARIAUtils.bindLabelToControl(protocolSelectTitle, (this.#protocolSelect as Element));
576
- Object.values(PROTOCOL_AUTHENTICATOR_VALUES).sort().forEach((option: Protocol.WebAuthn.AuthenticatorProtocol) => {
577
- if (this.#protocolSelect) {
578
- this.#protocolSelect.appendChild(UI.UIUtils.createOption(option, option, option));
579
- }
580
- });
581
-
582
- if (this.#protocolSelect) {
583
- this.#protocolSelect.value = Protocol.WebAuthn.AuthenticatorProtocol.Ctap2;
584
- }
585
-
586
- const transportSelectTitle = UI.UIUtils.createLabel(i18nString(UIStrings.transport), 'authenticator-option-label');
587
- transportGroup.appendChild(transportSelectTitle);
588
- this.transportSelect = transportGroup.createChild('select');
589
- this.transportSelect.setAttribute('jslog', `${VisualLogging.dropDown('transport').track({change: true})}`);
590
- UI.ARIAUtils.bindLabelToControl(transportSelectTitle, (this.transportSelect as Element));
591
- // transportSelect will be populated in updateNewAuthenticatorSectionOptions.
592
-
593
- const residentKeyCheckboxLabel =
594
- UI.UIUtils.createLabel(i18nString(UIStrings.supportsResidentKeys), 'authenticator-option-label');
595
- residentKeyCheckboxLabel.setAttribute('jslog', `${VisualLogging.toggle('resident-key').track({change: true})}`);
596
- residentKeyGroup.appendChild(residentKeyCheckboxLabel);
597
- this.residentKeyCheckbox = residentKeyGroup.createChild('input', 'authenticator-option-checkbox');
598
- this.residentKeyCheckbox.type = 'checkbox';
599
- this.residentKeyCheckbox.checked = false;
600
- UI.ARIAUtils.bindLabelToControl(residentKeyCheckboxLabel, this.residentKeyCheckbox);
601
-
602
- const userVerificationCheckboxLabel =
603
- UI.UIUtils.createLabel(i18nString(UIStrings.supportsUserVerification), 'authenticator-option-label');
604
- userVerificationCheckboxLabel.setAttribute(
605
- 'jslog', `${VisualLogging.toggle('user-verification').track({change: true})}`);
606
- userVerificationGroup.appendChild(userVerificationCheckboxLabel);
607
- this.#userVerificationCheckbox = userVerificationGroup.createChild('input', 'authenticator-option-checkbox');
608
- this.#userVerificationCheckbox.type = 'checkbox';
609
- this.#userVerificationCheckbox.checked = false;
610
- UI.ARIAUtils.bindLabelToControl(userVerificationCheckboxLabel, this.#userVerificationCheckbox);
611
-
612
- const largeBlobCheckboxLabel =
613
- UI.UIUtils.createLabel(i18nString(UIStrings.supportsLargeBlob), 'authenticator-option-label');
614
- largeBlobCheckboxLabel.setAttribute('jslog', `${VisualLogging.toggle('large-blob').track({change: true})}`);
615
- largeBlobGroup.appendChild(largeBlobCheckboxLabel);
616
- this.largeBlobCheckbox = largeBlobGroup.createChild('input', 'authenticator-option-checkbox');
617
- this.largeBlobCheckbox.type = 'checkbox';
618
- this.largeBlobCheckbox.checked = false;
619
- UI.ARIAUtils.bindLabelToControl(largeBlobCheckboxLabel, this.largeBlobCheckbox);
620
-
621
- this.addAuthenticatorButton = UI.UIUtils.createTextButton(
622
- i18nString(UIStrings.add), this.#handleAddAuthenticatorButton.bind(this),
623
- {jslogContext: 'webauthn.add-authenticator'});
624
- addButtonGroup.createChild('div', 'authenticator-option-label');
625
- addButtonGroup.appendChild(this.addAuthenticatorButton);
626
- const addAuthenticatorTitle = UI.UIUtils.createLabel(i18nString(UIStrings.addAuthenticator), '');
627
- UI.ARIAUtils.bindLabelToControl(addAuthenticatorTitle, this.addAuthenticatorButton);
628
-
629
- this.#updateNewAuthenticatorSectionOptions();
630
- if (this.#protocolSelect) {
631
- this.#protocolSelect.addEventListener('change', this.#updateNewAuthenticatorSectionOptions.bind(this));
632
- }
633
- if (this.residentKeyCheckbox) {
634
- this.residentKeyCheckbox.addEventListener('change', this.#updateNewAuthenticatorSectionOptions.bind(this));
742
+ if (this.#hasInternalAuthenticator &&
743
+ this.#newAuthenticatorOptions.transport === Protocol.WebAuthn.AuthenticatorTransport.Internal) {
744
+ this.#newAuthenticatorOptions.transport = Protocol.WebAuthn.AuthenticatorTransport.Nfc;
635
745
  }
746
+ this.requestUpdate();
636
747
  }
637
748
 
638
749
  async #handleAddAuthenticatorButton(): Promise<void> {
639
- const options = this.#createOptionsFromCurrentInputs();
750
+ const options = this.#newAuthenticatorOptions;
640
751
  if (this.#model) {
641
- const authenticatorId = await this.#model.addAuthenticator(options);
752
+ const authenticatorId = await this.#addAuthenticator(options);
753
+ this.#activeAuthId = authenticatorId; // Newly added authenticator is automatically set as active.
642
754
  const availableAuthenticators = this.#availableAuthenticatorSetting.get();
643
755
  availableAuthenticators.push({authenticatorId, active: true, ...options});
644
756
  this.#availableAuthenticatorSetting.set(
645
757
  availableAuthenticators.map(a => ({...a, active: a.authenticatorId === authenticatorId})));
646
- const section = await this.#addAuthenticatorSection(authenticatorId, options);
647
- const mediaQueryList = window.matchMedia('(prefers-reduced-motion: reduce)');
648
- const prefersReducedMotion = mediaQueryList.matches;
649
- section.scrollIntoView({block: 'start', behavior: prefersReducedMotion ? 'auto' : 'smooth'});
650
758
  this.#updateInternalTransportAvailability();
759
+ await this.updateComplete;
760
+ this.#viewOutput.revealSection.get(authenticatorId)?.();
651
761
  }
652
762
  }
653
763
 
654
- async #addAuthenticatorSection(
655
- authenticatorId: Protocol.WebAuthn.AuthenticatorId,
656
- options: Protocol.WebAuthn.VirtualAuthenticatorOptions): Promise<HTMLDivElement> {
657
- const section = document.createElement('div');
658
- section.classList.add('authenticator-section');
659
- section.setAttribute('data-authenticator-id', authenticatorId);
660
- section.setAttribute('jslog', `${VisualLogging.section('authenticator')}`);
661
- this.#authenticatorsView.appendChild(section);
662
-
663
- const headerElement = section.createChild('div', 'authenticator-section-header');
664
- const titleElement = headerElement.createChild('div', 'authenticator-section-title');
665
- UI.ARIAUtils.markAsHeading(titleElement, 2);
666
-
667
- await this.#clearActiveAuthenticator();
668
- const activeButtonContainer = headerElement.createChild('div', 'active-button-container');
669
- const {label: activeLabel, radio: activeRadio} = UI.UIUtils.createRadioButton(
670
- 'active-authenticator', i18nString(UIStrings.active), 'webauthn.active-authenticator');
671
- activeRadio.addEventListener('change', this.#setActiveAuthenticator.bind(this, authenticatorId));
672
- activeRadio.checked = true;
673
- activeButtonContainer.appendChild(activeLabel);
674
- this.#activeAuthId = authenticatorId; // Newly added authenticator is automatically set as active.
675
-
676
- const removeButton = headerElement.createChild('button', 'text-button');
677
- removeButton.textContent = i18nString(UIStrings.remove);
678
- removeButton.addEventListener('click', this.removeAuthenticator.bind(this, authenticatorId));
679
- removeButton.setAttribute('jslog', `${VisualLogging.action('webauthn.remove-authenticator').track({click: true})}`);
680
-
681
- const toolbar = titleElement.createChild('devtools-toolbar', 'edit-name-toolbar');
682
- const editName = new UI.Toolbar.ToolbarButton(i18nString(UIStrings.editName), 'edit', undefined, 'edit-name');
683
- const saveName = new UI.Toolbar.ToolbarButton(i18nString(UIStrings.saveName), 'checkmark', undefined, 'save-name');
684
- saveName.setVisible(false);
685
-
686
- const nameField = titleElement.createChild('input', 'authenticator-name-field');
687
- nameField.placeholder = i18nString(UIStrings.enterNewName);
688
- nameField.disabled = true;
689
- nameField.setAttribute('jslog', `${VisualLogging.textField('name').track({keydown: 'Enter', change: true})}`);
690
- const userFriendlyName = authenticatorId.slice(-5); // User friendly name defaults to last 5 chars of UUID.
691
- nameField.value = i18nString(UIStrings.authenticatorS, {PH1: userFriendlyName});
692
- this.#updateActiveLabelTitle(activeLabel, nameField.value);
693
-
694
- editName.addEventListener(
695
- UI.Toolbar.ToolbarButton.Events.CLICK,
696
- () => this.#handleEditNameButton(titleElement, nameField, editName, saveName));
697
- saveName.addEventListener(
698
- UI.Toolbar.ToolbarButton.Events.CLICK,
699
- () => this.#handleSaveNameButton(titleElement, nameField, editName, saveName, activeLabel));
700
-
701
- nameField.addEventListener(
702
- 'focusout', () => this.#handleSaveNameButton(titleElement, nameField, editName, saveName, activeLabel));
703
- nameField.addEventListener('keydown', (event: KeyboardEvent) => {
704
- if (event.key === 'Enter') {
705
- this.#handleSaveNameButton(titleElement, nameField, editName, saveName, activeLabel);
706
- }
707
- });
708
-
709
- toolbar.appendToolbarItem(editName);
710
- toolbar.appendToolbarItem(saveName);
711
-
712
- this.#createAuthenticatorFields(section, authenticatorId, options);
713
-
714
- const label = document.createElement('div');
715
- label.classList.add('credentials-title');
716
- label.textContent = i18nString(UIStrings.credentials);
717
- section.appendChild(label);
718
-
719
- const dataGrid = this.#createCredentialsDataGrid(authenticatorId);
720
- dataGrid.asWidget().show(section);
721
- if (this.#model) {
722
- this.#model.addEventListener(
723
- SDK.WebAuthnModel.Events.CREDENTIAL_ADDED, this.#addCredential.bind(this, authenticatorId));
724
- this.#model.addEventListener(
725
- SDK.WebAuthnModel.Events.CREDENTIAL_ASSERTED, this.#updateCredential.bind(this, authenticatorId));
726
- this.#model.addEventListener(
727
- SDK.WebAuthnModel.Events.CREDENTIAL_UPDATED, this.#updateCredential.bind(this, authenticatorId));
728
- this.#model.addEventListener(
729
- SDK.WebAuthnModel.Events.CREDENTIAL_DELETED, this.#deleteCredential.bind(this, authenticatorId));
730
- }
731
- section.createChild('div', 'divider');
732
-
733
- return section;
734
- }
735
-
736
764
  #exportCredential(credential: Protocol.WebAuthn.Credential): void {
737
765
  let pem = PRIVATE_KEY_HEADER;
738
766
  for (let i = 0; i < credential.privateKey.length; i += 64) {
@@ -740,6 +768,7 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
740
768
  }
741
769
  pem += PRIVATE_KEY_FOOTER;
742
770
 
771
+ /* eslint-disable-next-line rulesdir/no-imperative-dom-api */
743
772
  const link = document.createElement('a');
744
773
  link.download = i18nString(UIStrings.privateKeypem);
745
774
  link.href = 'data:application/x-pem-file,' + encodeURIComponent(pem);
@@ -747,103 +776,45 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
747
776
  }
748
777
 
749
778
  #removeCredential(authenticatorId: Protocol.WebAuthn.AuthenticatorId, credentialId: string): void {
750
- const dataGrid = this.dataGrids.get(authenticatorId);
751
- if (!dataGrid) {
779
+ const authenticator = this.#authenticators.get(authenticatorId);
780
+ if (!authenticator) {
752
781
  return;
753
782
  }
754
783
 
755
- // @ts-expect-error dataGrid node type is indeterminate.
756
- dataGrid.rootNode()
757
- .children.find((n: DataGrid.DataGrid.DataGridNode<DataGridNode>) => n.data.credentialId === credentialId)
758
- .remove();
759
-
760
- if (!dataGrid.rootNode().children.length) {
761
- dataGrid.rootNode().appendChild(new EmptyDataGridNode());
784
+ const authenticatorIndex =
785
+ authenticator.credentials.findIndex(credential => credential.credentialId === credentialId);
786
+ if (authenticatorIndex < 0) {
787
+ return;
762
788
  }
789
+ authenticator.credentials.splice(authenticatorIndex, 1);
790
+ this.requestUpdate();
763
791
 
764
792
  if (this.#model) {
765
793
  void this.#model.removeCredential(authenticatorId, credentialId);
766
794
  }
767
795
  }
768
796
 
769
- /**
770
- * Creates the fields describing the authenticator in the front end.
771
- */
772
- #createAuthenticatorFields(
773
- section: Element, authenticatorId: string, options: Protocol.WebAuthn.VirtualAuthenticatorOptions): void {
774
- const sectionFields = section.createChild('div', 'authenticator-fields');
775
- const uuidField = sectionFields.createChild('div', 'authenticator-field');
776
- const protocolField = sectionFields.createChild('div', 'authenticator-field');
777
- const transportField = sectionFields.createChild('div', 'authenticator-field');
778
- const srkField = sectionFields.createChild('div', 'authenticator-field');
779
- const slbField = sectionFields.createChild('div', 'authenticator-field');
780
- const suvField = sectionFields.createChild('div', 'authenticator-field');
781
-
782
- uuidField.appendChild(UI.UIUtils.createLabel(i18nString(UIStrings.uuid), 'authenticator-option-label'));
783
- protocolField.appendChild(UI.UIUtils.createLabel(i18nString(UIStrings.protocol), 'authenticator-option-label'));
784
- transportField.appendChild(UI.UIUtils.createLabel(i18nString(UIStrings.transport), 'authenticator-option-label'));
785
- srkField.appendChild(
786
- UI.UIUtils.createLabel(i18nString(UIStrings.supportsResidentKeys), 'authenticator-option-label'));
787
- slbField.appendChild(UI.UIUtils.createLabel(i18nString(UIStrings.supportsLargeBlob), 'authenticator-option-label'));
788
- suvField.appendChild(
789
- UI.UIUtils.createLabel(i18nString(UIStrings.supportsUserVerification), 'authenticator-option-label'));
790
-
791
- uuidField.createChild('div', 'authenticator-field-value').textContent = authenticatorId;
792
- protocolField.createChild('div', 'authenticator-field-value').textContent = options.protocol;
793
- transportField.createChild('div', 'authenticator-field-value').textContent = options.transport;
794
- srkField.createChild('div', 'authenticator-field-value').textContent =
795
- options.hasResidentKey ? i18nString(UIStrings.yes) : i18nString(UIStrings.no);
796
- slbField.createChild('div', 'authenticator-field-value').textContent =
797
- options.hasLargeBlob ? i18nString(UIStrings.yes) : i18nString(UIStrings.no);
798
- suvField.createChild('div', 'authenticator-field-value').textContent =
799
- options.hasUserVerification ? i18nString(UIStrings.yes) : i18nString(UIStrings.no);
800
- }
801
-
802
- #handleEditNameButton(
803
- titleElement: Element, nameField: HTMLInputElement, editName: UI.Toolbar.ToolbarButton,
804
- saveName: UI.Toolbar.ToolbarButton): void {
805
- nameField.disabled = false;
806
- titleElement.classList.add('editing-name');
807
- nameField.focus();
808
- saveName.setVisible(true);
809
- editName.setVisible(false);
797
+ #handleEditNameButton(authenticatorId: Protocol.WebAuthn.AuthenticatorId): void {
798
+ this.#editingAuthId = authenticatorId;
799
+ this.requestUpdate();
810
800
  }
811
801
 
812
- #handleSaveNameButton(
813
- titleElement: Element, nameField: HTMLInputElement, editName: UI.Toolbar.ToolbarItem,
814
- saveName: UI.Toolbar.ToolbarItem, activeLabel: HTMLLabelElement): void {
815
- const name = nameField.value;
816
- if (!name) {
802
+ #handleSaveNameButton(authenticatorId: Protocol.WebAuthn.AuthenticatorId, name: string): void {
803
+ const authenticator = this.#authenticators.get(authenticatorId);
804
+ if (!authenticator) {
817
805
  return;
818
806
  }
819
- nameField.disabled = true;
820
- titleElement.classList.remove('editing-name');
821
- editName.setVisible(true);
822
- saveName.setVisible(false);
823
- this.#updateActiveLabelTitle(activeLabel, name);
824
- }
825
-
826
- #updateActiveLabelTitle(activeLabel: HTMLLabelElement, authenticatorName: string): void {
827
- UI.Tooltip.Tooltip.install(
828
- activeLabel, i18nString(UIStrings.setSAsTheActiveAuthenticator, {PH1: authenticatorName}));
807
+ authenticator.name = name;
808
+ this.#editingAuthId = null;
809
+ this.requestUpdate();
829
810
  }
830
811
 
831
812
  /**
832
813
  * Removes both the authenticator and its respective UI element.
833
814
  */
834
815
  removeAuthenticator(authenticatorId: Protocol.WebAuthn.AuthenticatorId): void {
835
- if (this.#authenticatorsView) {
836
- const child = this.#authenticatorsView.querySelector(`[data-authenticator-id=${CSS.escape(authenticatorId)}]`);
837
- if (child) {
838
- child.remove();
839
- }
840
- }
841
- const dataGrid = this.dataGrids.get(authenticatorId);
842
- if (dataGrid) {
843
- dataGrid.asWidget().detach();
844
- this.dataGrids.delete(authenticatorId);
845
- }
846
-
816
+ this.#authenticators.delete(authenticatorId);
817
+ this.requestUpdate();
847
818
  if (this.#model) {
848
819
  void this.#model.removeAuthenticator(authenticatorId);
849
820
  }
@@ -854,7 +825,7 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
854
825
  this.#availableAuthenticatorSetting.set(newAvailableAuthenticators);
855
826
 
856
827
  if (this.#activeAuthId === authenticatorId) {
857
- const availableAuthenticatorIds = Array.from(this.dataGrids.keys());
828
+ const availableAuthenticatorIds = Array.from(this.#authenticators.keys());
858
829
  if (availableAuthenticatorIds.length) {
859
830
  void this.#setActiveAuthenticator(availableAuthenticatorIds[0]);
860
831
  } else {
@@ -864,27 +835,6 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
864
835
  this.#updateInternalTransportAvailability();
865
836
  }
866
837
 
867
- #createOptionsFromCurrentInputs(): Protocol.WebAuthn.VirtualAuthenticatorOptions {
868
- // TODO(crbug.com/1034663): Add optionality for isUserVerified param.
869
- if (!this.#protocolSelect || !this.transportSelect || !this.residentKeyCheckbox ||
870
- !this.#userVerificationCheckbox || !this.largeBlobCheckbox) {
871
- throw new Error('Unable to create options from current inputs');
872
- }
873
-
874
- return {
875
- protocol: this.#protocolSelect.options[this.#protocolSelect.selectedIndex].value as
876
- Protocol.WebAuthn.AuthenticatorProtocol,
877
- ctap2Version: Protocol.WebAuthn.Ctap2Version.Ctap2_1,
878
- transport: this.transportSelect.options[this.transportSelect.selectedIndex].value as
879
- Protocol.WebAuthn.AuthenticatorTransport,
880
- hasResidentKey: this.residentKeyCheckbox.checked,
881
- hasUserVerification: this.#userVerificationCheckbox.checked,
882
- hasLargeBlob: this.largeBlobCheckbox.checked,
883
- automaticPresenceSimulation: true,
884
- isUserVerified: true,
885
- };
886
- }
887
-
888
838
  /**
889
839
  * Sets the given authenticator as active.
890
840
  * Note that a newly added authenticator will automatically be set as active.
@@ -901,18 +851,7 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
901
851
  prevAvailableAuthenticators.map(a => ({...a, active: a.authenticatorId === authenticatorId}));
902
852
  this.#availableAuthenticatorSetting.set(newAvailableAuthenticators);
903
853
 
904
- this.#updateActiveButtons();
905
- }
906
-
907
- #updateActiveButtons(): void {
908
- const authenticators = this.#authenticatorsView.getElementsByClassName('authenticator-section');
909
- Array.from(authenticators).forEach((authenticator: Element) => {
910
- const button = (authenticator.querySelector('input[type="radio"]') as HTMLInputElement);
911
- if (!button) {
912
- return;
913
- }
914
- button.checked = (authenticator as HTMLElement).dataset.authenticatorId === this.#activeAuthId;
915
- });
854
+ this.requestUpdate();
916
855
  }
917
856
 
918
857
  async #clearActiveAuthenticator(): Promise<void> {
@@ -920,6 +859,6 @@ export class WebauthnPaneImpl extends UI.Widget.VBox implements
920
859
  await this.#model.setAutomaticPresenceSimulation(this.#activeAuthId, false);
921
860
  }
922
861
  this.#activeAuthId = null;
923
- this.#updateActiveButtons();
862
+ this.requestUpdate();
924
863
  }
925
864
  }