chrome-devtools-frontend 1.0.1657110 → 1.0.1660788

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 (317) hide show
  1. package/.agents/skills/devtools-ux-writing-refactor/SKILL.md +125 -0
  2. package/.agents/skills/migrate-chromium-test/SKILL.md +15 -70
  3. package/.agents/skills/repro-flaky-tests/SKILL.md +53 -0
  4. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +37 -18
  5. package/.agents/skills/version-control/SKILL.md +8 -1
  6. package/AUTHORS +1 -0
  7. package/SECURITY.md +3 -0
  8. package/docs/get_the_code.md +6 -0
  9. package/front_end/Images/src/ads.svg +1 -0
  10. package/front_end/Tests.js +6 -6
  11. package/front_end/core/common/Gzip.ts +12 -5
  12. package/front_end/core/common/ResourceType.ts +19 -19
  13. package/front_end/core/common/Revealer.ts +15 -15
  14. package/front_end/core/common/SettingRegistration.ts +19 -19
  15. package/front_end/core/host/AidaClient.ts +35 -9
  16. package/front_end/core/host/GdpClient.ts +10 -7
  17. package/front_end/core/platform/StringUtilities.ts +35 -0
  18. package/front_end/core/sdk/AccessibilityModel.snapshot.txt +17 -0
  19. package/front_end/core/sdk/AccessibilityModel.ts +132 -2
  20. package/front_end/core/sdk/CPUThrottlingManager.ts +8 -5
  21. package/front_end/core/sdk/CSSMetadata.ts +110 -16
  22. package/front_end/core/sdk/CompilerSourceMappingContentProvider.ts +2 -5
  23. package/front_end/core/sdk/ConsoleModel.ts +5 -5
  24. package/front_end/core/sdk/DOMDebuggerModel.ts +5 -1
  25. package/front_end/core/sdk/DOMModel.ts +32 -18
  26. package/front_end/core/sdk/NetworkManager.ts +58 -14
  27. package/front_end/core/sdk/NetworkRequest.ts +37 -1
  28. package/front_end/core/sdk/OverlayModel.ts +45 -6
  29. package/front_end/core/sdk/ResourceTreeModel.ts +6 -7
  30. package/front_end/core/sdk/ScreenCaptureModel.ts +2 -2
  31. package/front_end/core/sdk/ServerTiming.ts +17 -13
  32. package/front_end/core/sdk/ServiceWorkerCacheModel.ts +4 -2
  33. package/front_end/core/sdk/ServiceWorkerManager.ts +19 -5
  34. package/front_end/core/sdk/TargetManager.ts +10 -1
  35. package/front_end/core/sdk/TraceObject.ts +4 -2
  36. package/front_end/core/sdk/sdk-meta.ts +170 -0
  37. package/front_end/design_system_tokens.css +0 -5
  38. package/front_end/entrypoints/devtools_app/devtools_app.ts +1 -1
  39. package/front_end/entrypoints/formatter_worker/CSSFormatter.ts +13 -4
  40. package/front_end/entrypoints/formatter_worker/FormattedContentBuilder.ts +5 -2
  41. package/front_end/entrypoints/formatter_worker/FormatterWorker.ts +23 -4
  42. package/front_end/entrypoints/formatter_worker/HTMLFormatter.ts +33 -10
  43. package/front_end/entrypoints/formatter_worker/JavaScriptFormatter.ts +8 -3
  44. package/front_end/entrypoints/inspector_main/InspectorMain.ts +4 -4
  45. package/front_end/entrypoints/inspector_main/OutermostTargetSelector.ts +2 -2
  46. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +36 -37
  47. package/front_end/entrypoints/inspector_main/inspector_main-meta.ts +15 -33
  48. package/front_end/entrypoints/js_app/js_app.ts +6 -5
  49. package/front_end/entrypoints/main/GlobalAiButton.ts +4 -4
  50. package/front_end/entrypoints/main/MainImpl.ts +25 -55
  51. package/front_end/entrypoints/main/main-meta.ts +50 -50
  52. package/front_end/entrypoints/node_app/app/NodeConnectionsPanel.ts +5 -5
  53. package/front_end/entrypoints/node_app/app/NodeMain.ts +3 -3
  54. package/front_end/entrypoints/node_app/node_app.ts +10 -9
  55. package/front_end/entrypoints/worker_app/WorkerMain.ts +1 -1
  56. package/front_end/foundation/Universe.ts +76 -6
  57. package/front_end/generated/InspectorBackendCommands.ts +3 -3
  58. package/front_end/generated/SupportedCSSProperties.js +19 -12
  59. package/front_end/generated/protocol.ts +7 -1
  60. package/front_end/models/ai_assistance/AiConversation.ts +19 -17
  61. package/front_end/models/ai_assistance/AiHistoryStorage.ts +37 -14
  62. package/front_end/models/ai_assistance/AiUtils.ts +38 -42
  63. package/front_end/models/ai_assistance/agents/AiAgent.ts +5 -1
  64. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -2
  65. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -1
  66. package/front_end/models/ai_assistance/agents/StorageAgent.ts +7 -5
  67. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +270 -286
  68. package/front_end/models/ai_assistance/data_formatters/UnitFormatters.ts +20 -0
  69. package/front_end/models/ai_assistance/performance/AICallTree.ts +3 -1
  70. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +3 -2
  71. package/front_end/models/autofill_manager/AutofillManager.ts +3 -1
  72. package/front_end/models/bindings/CSSWorkspaceBinding.ts +8 -5
  73. package/front_end/models/bindings/CompilerScriptMapping.ts +2 -1
  74. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +15 -16
  75. package/front_end/models/bindings/DebuggerWorkspaceBinding.ts +6 -4
  76. package/front_end/models/bindings/FileUtils.ts +11 -12
  77. package/front_end/models/bindings/NetworkProject.ts +4 -0
  78. package/front_end/models/bindings/PresentationConsoleMessageHelper.ts +2 -1
  79. package/front_end/models/bindings/ResourceUtils.ts +1 -1
  80. package/front_end/models/bindings/SASSSourceMapping.ts +8 -5
  81. package/front_end/models/emulation/DeviceModeModel.ts +14 -14
  82. package/front_end/models/emulation/EmulatedDevices.ts +392 -11
  83. package/front_end/models/extensions/ExtensionAPI.ts +6 -6
  84. package/front_end/models/extensions/LanguageExtensionEndpoint.ts +13 -12
  85. package/front_end/models/issues_manager/BounceTrackingIssue.ts +1 -1
  86. package/front_end/models/issues_manager/ClientHintIssue.ts +1 -1
  87. package/front_end/models/issues_manager/ConnectionAllowlistIssue.ts +1 -1
  88. package/front_end/models/issues_manager/ContentSecurityPolicyIssue.ts +7 -7
  89. package/front_end/models/issues_manager/CookieDeprecationMetadataIssue.ts +2 -2
  90. package/front_end/models/issues_manager/CookieIssue.ts +6 -7
  91. package/front_end/models/issues_manager/CorsIssue.ts +3 -3
  92. package/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.ts +2 -2
  93. package/front_end/models/issues_manager/DeprecationIssue.ts +3 -3
  94. package/front_end/models/issues_manager/EmailVerificationRequestIssue.ts +1 -1
  95. package/front_end/models/issues_manager/FederatedAuthRequestIssue.ts +1 -1
  96. package/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.ts +1 -1
  97. package/front_end/models/issues_manager/GenericIssue.ts +7 -7
  98. package/front_end/models/issues_manager/HeavyAdIssue.ts +3 -3
  99. package/front_end/models/issues_manager/Issue.ts +8 -8
  100. package/front_end/models/issues_manager/MixedContentIssue.ts +1 -1
  101. package/front_end/models/issues_manager/PartitioningBlobURLIssue.ts +3 -3
  102. package/front_end/models/issues_manager/QuirksModeIssue.ts +1 -1
  103. package/front_end/models/issues_manager/SRIMessageSignatureIssue.ts +2 -2
  104. package/front_end/models/issues_manager/SelectivePermissionsInterventionIssue.ts +2 -2
  105. package/front_end/models/issues_manager/SharedArrayBufferIssue.ts +2 -2
  106. package/front_end/models/issues_manager/SharedDictionaryIssue.ts +1 -1
  107. package/front_end/models/issues_manager/UnencodedDigestIssue.ts +3 -3
  108. package/front_end/models/javascript_metadata/NativeFunctions.js +5 -1
  109. package/front_end/models/stack_trace/StackTraceModel.ts +3 -3
  110. package/front_end/models/text_utils/ContentData.ts +27 -0
  111. package/front_end/models/trace/helpers/SamplesIntegrator.ts +21 -5
  112. package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +29 -14
  113. package/front_end/models/web_mcp/WebMCPModel.ts +24 -6
  114. package/front_end/models/workspace/IgnoreListManager.ts +6 -6
  115. package/front_end/models/workspace/UISourceCode.ts +3 -3
  116. package/front_end/models/workspace_diff/WorkspaceDiff.ts +23 -12
  117. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +25 -22
  118. package/front_end/panels/ai_assistance/ExportConversation.ts +3 -4
  119. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +3 -3
  120. package/front_end/panels/ai_assistance/components/ChatInput.ts +2 -2
  121. package/front_end/panels/ai_assistance/components/ChatMessage.ts +7 -0
  122. package/front_end/panels/ai_assistance/components/DisabledWidget.ts +2 -2
  123. package/front_end/panels/animation/AnimationTimeline.ts +17 -19
  124. package/front_end/panels/animation/AnimationUI.ts +5 -5
  125. package/front_end/panels/animation/animation-meta.ts +2 -2
  126. package/front_end/panels/application/ApplicationPanelSidebar.ts +13 -4
  127. package/front_end/panels/application/BackgroundServiceView.ts +2 -1
  128. package/front_end/panels/application/DeviceBoundSessionsView.ts +2 -6
  129. package/front_end/panels/application/IndexedDBViews.ts +245 -262
  130. package/front_end/panels/application/OpenedWindowDetailsView.ts +1 -1
  131. package/front_end/panels/application/ResourcesPanel.ts +9 -2
  132. package/front_end/panels/application/ServiceWorkersView.ts +252 -211
  133. package/front_end/panels/application/StorageView.ts +97 -33
  134. package/front_end/panels/application/WebMCPView.ts +15 -1
  135. package/front_end/panels/application/components/AdsView.ts +1 -1
  136. package/front_end/panels/application/indexedDBViews.css +38 -9
  137. package/front_end/panels/application/preloading/helper/PreloadingForward.ts +2 -1
  138. package/front_end/panels/application/resourcesSidebar.css +5 -0
  139. package/front_end/panels/application/storageView.css +26 -9
  140. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +5 -1
  141. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +8 -6
  142. package/front_end/panels/common/DOMLinkifier.ts +1 -1
  143. package/front_end/panels/common/ExtensionServer.ts +119 -14
  144. package/front_end/panels/console/ConsoleContextSelector.ts +4 -4
  145. package/front_end/panels/console/ConsolePinPane.ts +12 -12
  146. package/front_end/panels/console/ConsolePrompt.ts +6 -6
  147. package/front_end/panels/console/ConsoleSidebar.ts +7 -7
  148. package/front_end/panels/console/ConsoleView.ts +45 -44
  149. package/front_end/panels/console/ConsoleViewMessage.ts +40 -40
  150. package/front_end/panels/console/SymbolizedErrorWidget.ts +2 -1
  151. package/front_end/panels/console/console-meta.ts +34 -34
  152. package/front_end/panels/console_counters/WarningErrorCounter.ts +2 -2
  153. package/front_end/panels/coverage/CoverageListView.ts +28 -28
  154. package/front_end/panels/coverage/CoverageModel.ts +2 -1
  155. package/front_end/panels/coverage/CoverageView.ts +23 -23
  156. package/front_end/panels/coverage/coverage-meta.ts +5 -5
  157. package/front_end/panels/css_overview/CSSOverviewCompletedView.ts +36 -36
  158. package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +1 -1
  159. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +2 -2
  160. package/front_end/panels/css_overview/CSSOverviewStartView.ts +6 -6
  161. package/front_end/panels/css_overview/CSSOverviewUnusedDeclarations.ts +6 -6
  162. package/front_end/panels/css_overview/css_overview-meta.ts +2 -2
  163. package/front_end/panels/developer_resources/DeveloperResourcesListView.ts +20 -21
  164. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +6 -8
  165. package/front_end/panels/developer_resources/developer_resources-meta.ts +2 -2
  166. package/front_end/panels/elements/AccessibilityTreeUtils.ts +8 -102
  167. package/front_end/panels/elements/AccessibilityTreeView.ts +163 -70
  168. package/front_end/panels/elements/ElementsPanel.ts +17 -11
  169. package/front_end/panels/elements/ElementsTreeElement.ts +49 -2
  170. package/front_end/panels/elements/ElementsTreeOutline.ts +4 -4
  171. package/front_end/panels/elements/LayoutPane.ts +1 -1
  172. package/front_end/panels/elements/MetricsSidebarPane.ts +100 -34
  173. package/front_end/panels/elements/StylePropertiesSection.ts +2 -2
  174. package/front_end/panels/elements/StylePropertyTreeElement.ts +8 -2
  175. package/front_end/panels/elements/StylesSidebarPane.ts +1 -1
  176. package/front_end/panels/elements/components/AccessibilityTreeNode.ts +7 -18
  177. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +2 -2
  178. package/front_end/panels/elements/components/QueryContainer.ts +1 -1
  179. package/front_end/panels/issues/AffectedDirectivesView.ts +1 -1
  180. package/front_end/panels/issues/AffectedResourcesView.ts +2 -1
  181. package/front_end/panels/layer_viewer/LayerViewHost.ts +1 -1
  182. package/front_end/panels/media/EventDisplayTable.ts +2 -2
  183. package/front_end/panels/media/EventTimelineView.ts +4 -4
  184. package/front_end/panels/media/MainView.ts +4 -4
  185. package/front_end/panels/media/PlayerDetailView.ts +5 -5
  186. package/front_end/panels/media/PlayerListView.ts +1 -1
  187. package/front_end/panels/media/PlayerMessagesView.ts +12 -12
  188. package/front_end/panels/media/PlayerPropertiesView.ts +17 -17
  189. package/front_end/panels/network/NetworkDataGridNode.ts +124 -36
  190. package/front_end/panels/network/NetworkLogView.ts +11 -2
  191. package/front_end/panels/network/NetworkLogViewColumns.ts +18 -0
  192. package/front_end/panels/network/NetworkPanel.ts +2 -1
  193. package/front_end/panels/network/NetworkWaterfallColumn.ts +1 -3
  194. package/front_end/panels/network/RequestConditionsDrawer.ts +2 -2
  195. package/front_end/panels/network/RequestPayloadView.ts +53 -7
  196. package/front_end/panels/network/RequestPreviewView.ts +7 -1
  197. package/front_end/panels/network/components/ResponseHeaderSection.ts +1 -1
  198. package/front_end/panels/network/forward/UIFilter.ts +1 -0
  199. package/front_end/panels/network/networkPanel.css +1 -0
  200. package/front_end/panels/network/networkTimingTable.css +1 -1
  201. package/front_end/panels/network/requestPayloadView.css +10 -0
  202. package/front_end/panels/performance_monitor/PerformanceMonitor.ts +12 -12
  203. package/front_end/panels/performance_monitor/performance_monitor-meta.ts +7 -7
  204. package/front_end/panels/profiler/HeapDetachedElementsView.ts +2 -2
  205. package/front_end/panels/profiler/HeapProfileView.ts +563 -51
  206. package/front_end/panels/profiler/HeapSnapshotView.ts +15 -9
  207. package/front_end/panels/profiler/ProfilesPanel.ts +13 -7
  208. package/front_end/panels/profiler/WritableProfileHeader.ts +152 -0
  209. package/front_end/panels/profiler/profiler.ts +2 -2
  210. package/front_end/panels/protocol_monitor/JSONEditor.ts +10 -10
  211. package/front_end/panels/protocol_monitor/ProtocolMonitor.ts +28 -32
  212. package/front_end/panels/protocol_monitor/protocol_monitor-meta.ts +1 -1
  213. package/front_end/panels/recorder/RecorderController.ts +15 -15
  214. package/front_end/panels/recorder/RecorderEvents.ts +8 -0
  215. package/front_end/panels/recorder/components/CreateRecordingView.ts +11 -11
  216. package/front_end/panels/recorder/components/ExtensionView.ts +74 -83
  217. package/front_end/panels/recorder/components/RecordingListView.ts +3 -3
  218. package/front_end/panels/recorder/components/RecordingView.ts +13 -10
  219. package/front_end/panels/recorder/components/ReplaySection.ts +9 -9
  220. package/front_end/panels/recorder/components/StepEditor.ts +352 -321
  221. package/front_end/panels/recorder/components/StepView.ts +36 -37
  222. package/front_end/panels/recorder/components/recordingView.css +1 -1
  223. package/front_end/panels/recorder/models/RecorderSettings.ts +2 -2
  224. package/front_end/panels/recorder/recorder-meta.ts +7 -7
  225. package/front_end/panels/screencast/ScreencastApp.ts +1 -1
  226. package/front_end/panels/screencast/ScreencastView.ts +12 -12
  227. package/front_end/panels/search/SearchResultsPane.ts +4 -4
  228. package/front_end/panels/search/SearchView.ts +20 -20
  229. package/front_end/panels/security/SecurityModel.ts +7 -7
  230. package/front_end/panels/security/SecurityPanel.ts +99 -107
  231. package/front_end/panels/security/SecurityPanelSidebar.ts +7 -7
  232. package/front_end/panels/security/security-meta.ts +2 -2
  233. package/front_end/panels/sensors/LocationsSettingsTab.ts +19 -19
  234. package/front_end/panels/sensors/SensorsView.ts +27 -27
  235. package/front_end/panels/sensors/sensors-meta.ts +13 -167
  236. package/front_end/panels/settings/AISettingsTab.ts +98 -56
  237. package/front_end/panels/settings/EditFileSystemView.ts +2 -2
  238. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +20 -20
  239. package/front_end/panels/settings/KeybindsSettingsTab.ts +20 -21
  240. package/front_end/panels/settings/SettingsScreen.ts +11 -11
  241. package/front_end/panels/settings/WorkspaceSettingsTab.ts +5 -5
  242. package/front_end/panels/settings/components/SyncSection.ts +12 -12
  243. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +13 -13
  244. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +31 -31
  245. package/front_end/panels/settings/emulation/emulation-meta.ts +1 -1
  246. package/front_end/panels/settings/settings-meta.ts +14 -14
  247. package/front_end/panels/sources/NavigatorView.ts +7 -6
  248. package/front_end/panels/sources/ScopeChainSidebarPane.ts +83 -37
  249. package/front_end/panels/sources/SourcesNavigator.ts +20 -18
  250. package/front_end/panels/sources/SourcesView.ts +10 -1
  251. package/front_end/panels/sources/scopeChainSidebarPane.css +12 -4
  252. package/front_end/panels/sources/sources-meta.ts +4 -4
  253. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +5 -2
  254. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +2 -1
  255. package/front_end/panels/timeline/TimelineFlameChartNetworkDataProvider.ts +2 -1
  256. package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -1
  257. package/front_end/panels/timeline/TimelinePanel.ts +2 -1
  258. package/front_end/panels/timeline/TimelineUIUtils.ts +5 -2
  259. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +4 -2
  260. package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +4 -2
  261. package/front_end/panels/timeline/components/insights/ImageRef.ts +2 -1
  262. package/front_end/panels/utils/utils.ts +7 -3
  263. package/front_end/panels/web_audio/WebAudioView.ts +17 -18
  264. package/front_end/panels/web_audio/web_audio-meta.ts +3 -3
  265. package/front_end/panels/webauthn/WebauthnPane.ts +10 -10
  266. package/front_end/panels/whats_new/ReleaseNoteView.ts +1 -1
  267. package/front_end/panels/whats_new/whats_new-meta.ts +11 -11
  268. package/front_end/third_party/chromium/README.chromium +1 -1
  269. package/front_end/third_party/lit/lib/async-directive.d.ts +2 -1
  270. package/front_end/third_party/lit/lib/async-directive.js +1 -1
  271. package/front_end/third_party/lit/lib/async-directive.js.map +1 -1
  272. package/front_end/third_party/lit/lib/decorators.d.ts +2 -1
  273. package/front_end/third_party/lit/lib/decorators.js.map +1 -1
  274. package/front_end/third_party/lit/lib/directive.d.ts +2 -1
  275. package/front_end/third_party/lit/lib/directive.js.map +1 -1
  276. package/front_end/third_party/lit/lib/directives.d.ts +2 -1
  277. package/front_end/third_party/lit/lib/directives.js +8 -8
  278. package/front_end/third_party/lit/lib/directives.js.map +1 -1
  279. package/front_end/third_party/lit/lib/lit.d.ts +2 -1
  280. package/front_end/third_party/lit/lib/lit.js +1 -1
  281. package/front_end/third_party/lit/lib/lit.js.map +1 -1
  282. package/front_end/third_party/lit/lib/static-html.d.ts +2 -1
  283. package/front_end/third_party/lit/lib/static-html.js +1 -1
  284. package/front_end/third_party/lit/lib/static-html.js.map +1 -1
  285. package/front_end/third_party/lit/package.json +2 -2
  286. package/front_end/third_party/lit/rebuild.sh +1 -1
  287. package/front_end/third_party/lit/src/async-directive.ts +5 -0
  288. package/front_end/ui/components/dialogs/Dialog.ts +1 -1
  289. package/front_end/ui/components/dialogs/ShortcutDialog.ts +1 -1
  290. package/front_end/ui/components/dialogs/shortcutDialog.css +15 -12
  291. package/front_end/ui/components/diff_view/DiffView.ts +2 -2
  292. package/front_end/ui/components/issue_counter/IssueCounter.ts +3 -3
  293. package/front_end/ui/components/issue_counter/IssueLinkIcon.ts +5 -5
  294. package/front_end/ui/components/lists/List.ts +2 -2
  295. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
  296. package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +5 -5
  297. package/front_end/ui/components/settings/SettingCheckbox.ts +1 -1
  298. package/front_end/ui/components/snackbars/Snackbar.ts +1 -1
  299. package/front_end/ui/components/survey_link/SurveyLink.ts +3 -3
  300. package/front_end/ui/components/text_editor/config.ts +2 -2
  301. package/front_end/ui/components/tree_outline/TreeOutline.ts +34 -1
  302. package/front_end/ui/legacy/ReportView.ts +5 -0
  303. package/front_end/ui/legacy/Treeoutline.ts +18 -0
  304. package/front_end/ui/legacy/View.ts +1 -1
  305. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +2 -0
  306. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -3
  307. package/front_end/ui/legacy/components/data_grid/data_grid.ts +1 -0
  308. package/front_end/ui/legacy/components/object_ui/ObjectPopoverHelper.ts +1 -1
  309. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +100 -36
  310. package/front_end/ui/legacy/components/source_frame/ResourceSourceFrame.ts +7 -1
  311. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +5 -0
  312. package/front_end/ui/legacy/components/utils/ImagePreview.ts +4 -2
  313. package/front_end/ui/legacy/inspectorCommon.css +5 -0
  314. package/front_end/ui/visual_logging/KnownContextValues.ts +4 -0
  315. package/mcp/mcp.ts +2 -0
  316. package/package.json +4 -4
  317. package/front_end/panels/profiler/ProfileView.ts +0 -610
@@ -131,7 +131,7 @@ async function maybeCreateLinkToElementsPanel(
131
131
  }
132
132
  });
133
133
  linkElement.addEventListener('mouseleave', () => {
134
- SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight();
134
+ SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
135
135
  });
136
136
  return linkElement;
137
137
  }
@@ -9,6 +9,7 @@ import * as Platform from '../../core/platform/platform.js';
9
9
  import * as SDK from '../../core/sdk/sdk.js';
10
10
  import * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
11
11
  import * as UI from '../../ui/legacy/legacy.js';
12
+ import {render} from '../../ui/lit/lit.js';
12
13
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
13
14
 
14
15
  import {ApplicationPanelSidebar, StorageCategoryView} from './ApplicationPanelSidebar.js';
@@ -135,8 +136,14 @@ export class ResourcesPanel extends UI.Panel.PanelWithSidebar {
135
136
  this.storageViewToolbar.classList.toggle('hidden', true);
136
137
  if (view instanceof UI.View.SimpleView) {
137
138
  void view.toolbarItems().then(items => {
138
- items.map(item => this.storageViewToolbar.appendToolbarItem(item));
139
- this.storageViewToolbar.classList.toggle('hidden', !items.length);
139
+ if (Array.isArray(items)) {
140
+ items.map(item => this.storageViewToolbar.appendToolbarItem(item));
141
+ this.storageViewToolbar.classList.toggle('hidden', !items.length);
142
+ } else {
143
+ // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
144
+ render(items, this.storageViewToolbar);
145
+ this.storageViewToolbar.classList.toggle('hidden', false);
146
+ }
140
147
  });
141
148
  }
142
149
  }
@@ -3,6 +3,9 @@
3
3
  // found in the LICENSE file.
4
4
  /* eslint-disable @devtools/no-imperative-dom-api */
5
5
 
6
+ import '../../ui/components/report_view/report_view.js';
7
+ import '../../ui/kit/kit.js';
8
+
6
9
  import * as Common from '../../core/common/common.js';
7
10
  import * as Host from '../../core/host/host.js';
8
11
  import * as i18n from '../../core/i18n/i18n.js';
@@ -10,10 +13,9 @@ import * as SDK from '../../core/sdk/sdk.js';
10
13
  import type * as Protocol from '../../generated/protocol.js';
11
14
  import * as NetworkForward from '../../panels/network/forward/forward.js';
12
15
  import * as Buttons from '../../ui/components/buttons/buttons.js';
13
- import {Link} from '../../ui/kit/kit.js';
14
16
  import * as Components from '../../ui/legacy/components/utils/utils.js';
15
17
  import * as UI from '../../ui/legacy/legacy.js';
16
- import {html, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
18
+ import {Directives, html, type LitTemplate, nothing, render} from '../../ui/lit/lit.js';
17
19
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
18
20
  import * as MobileThrottling from '../mobile_throttling/mobile_throttling.js';
19
21
 
@@ -180,6 +182,10 @@ const UIStrings = {
180
182
  } as const;
181
183
  const str_ = i18n.i18n.registerUIStrings('panels/application/ServiceWorkersView.ts', UIStrings);
182
184
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
185
+ const {until} = Directives;
186
+ const {widget} = UI.Widget;
187
+ const {bindToSetting} = UI.UIUtils;
188
+
183
189
  let throttleDisabledForDebugging = false;
184
190
  export const setThrottleDisabledForDebugging = (enable: boolean): void => {
185
191
  throttleDisabledForDebugging = enable;
@@ -188,7 +194,6 @@ export const setThrottleDisabledForDebugging = (enable: boolean): void => {
188
194
  export class ServiceWorkersView extends UI.Widget.VBox implements
189
195
  SDK.TargetManager.SDKModelObserver<SDK.ServiceWorkerManager.ServiceWorkerManager> {
190
196
  currentWorkersView: UI.ReportView.ReportView;
191
- private readonly toolbar: UI.Toolbar.Toolbar;
192
197
  private readonly sections: Map<SDK.ServiceWorkerManager.ServiceWorkerRegistration, Section>;
193
198
  private manager: SDK.ServiceWorkerManager.ServiceWorkerManager|null;
194
199
  private securityOriginManager: SDK.SecurityOriginManager.SecurityOriginManager|null;
@@ -212,8 +217,6 @@ export class ServiceWorkersView extends UI.Widget.VBox implements
212
217
  this.currentWorkersView.element.classList.add('service-workers-this-origin');
213
218
  this.currentWorkersView.element.setAttribute('jslog', `${VisualLogging.section('this-origin')}`);
214
219
 
215
- this.toolbar = this.currentWorkersView.createToolbar();
216
-
217
220
  this.sections = new Map();
218
221
 
219
222
  this.manager = null;
@@ -230,34 +233,44 @@ export class ServiceWorkersView extends UI.Widget.VBox implements
230
233
  }
231
234
 
232
235
  private createOthersOriginView(): void {
233
- const othersDiv = this.contentElement.createChild('div', 'service-workers-other-origin');
234
- othersDiv.setAttribute('jslog', `${VisualLogging.section('other-origin')}`);
235
- // TODO(crbug.com/1156978): Replace UI.ReportView.ReportView with ReportView.ts web component.
236
- const othersView = new UI.ReportView.ReportView();
237
- othersView.setHeaderVisible(false);
238
- othersView.show(othersDiv);
239
- const othersSection = othersView.appendSection(i18nString(UIStrings.serviceWorkersFromOtherOrigins));
240
- const othersSectionRow = othersSection.appendRow();
241
- const seeOthers = Link.create('chrome://serviceworker-internals', i18nString(UIStrings.seeAllRegistrations),
242
- undefined, 'view-all', 0, /* allowPrivileged=*/ true);
243
- othersSectionRow.appendChild(seeOthers);
236
+ // clang-format off
237
+ // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
238
+ render(html`<div class="service-workers-other-origin"
239
+ jslog=${VisualLogging.section('other-origin')}>
240
+ <devtools-report>
241
+ <devtools-report-section-header>
242
+ ${i18nString(UIStrings.serviceWorkersFromOtherOrigins)}
243
+ </devtools-report-section-header>
244
+ <devtools-report-section>
245
+ <devtools-link href="chrome://serviceworker-internals"
246
+ jslogcontext="view-all"
247
+ .allowPrivileged=${true}>
248
+ ${i18nString(UIStrings.seeAllRegistrations)}
249
+ </devtools-link>
250
+ </devtools-report-section>
251
+ </devtools-report>
252
+ </div>`, this.contentElement);
253
+ // clang-format on
244
254
  }
245
-
246
255
  private setupToolbar(): void {
247
- this.toolbar.appendToolbarItem(
248
- MobileThrottling.ThrottlingManager.throttlingManager().createOfflineToolbarCheckbox());
249
256
  const updateOnReloadSetting =
250
257
  Common.Settings.Settings.instance().createSetting('service-worker-update-on-reload', false);
251
- updateOnReloadSetting.setTitle(i18nString(UIStrings.updateOnReload));
252
- const forceUpdate =
253
- new UI.Toolbar.ToolbarSettingCheckbox(updateOnReloadSetting, i18nString(UIStrings.onPageReloadForceTheService));
254
- this.toolbar.appendToolbarItem(forceUpdate);
255
258
  const bypassServiceWorkerSetting =
256
259
  Common.Settings.Settings.instance().createSetting('bypass-service-worker', false);
257
- bypassServiceWorkerSetting.setTitle(i18nString(UIStrings.bypassForNetwork));
258
- const fallbackToNetwork = new UI.Toolbar.ToolbarSettingCheckbox(
259
- bypassServiceWorkerSetting, i18nString(UIStrings.bypassTheServiceWorkerAndLoad));
260
- this.toolbar.appendToolbarItem(fallbackToNetwork);
260
+ // clang-format off
261
+ // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
262
+ render(html`<devtools-toolbar class="service-worker-toolbar">
263
+ ${MobileThrottling.ThrottlingManager.throttlingManager().createOfflineToolbarCheckbox().element}
264
+ <devtools-checkbox title=${i18nString(UIStrings.onPageReloadForceTheService)}
265
+ ${bindToSetting(updateOnReloadSetting)}>
266
+ ${i18nString(UIStrings.updateOnReload)}
267
+ </devtools-checkbox>
268
+ <devtools-checkbox title=${i18nString(UIStrings.bypassTheServiceWorkerAndLoad)}
269
+ ${bindToSetting(bypassServiceWorkerSetting)}>
270
+ ${i18nString(UIStrings.bypassForNetwork)}
271
+ </devtools-checkbox>
272
+ </devtools-toolbar>`, this.currentWorkersView.getHeaderElement() as HTMLElement);
273
+ // clang-format on
261
274
  }
262
275
 
263
276
  modelAdded(serviceWorkerManager: SDK.ServiceWorkerManager.ServiceWorkerManager): void {
@@ -451,7 +464,7 @@ export class ServiceWorkersView extends UI.Widget.VBox implements
451
464
  }
452
465
  }
453
466
 
454
- export class Section {
467
+ export class Section extends UI.Widget.VBox {
455
468
  private manager: SDK.ServiceWorkerManager.ServiceWorkerManager;
456
469
  section: UI.ReportView.Section;
457
470
  registration: SDK.ServiceWorkerManager.ServiceWorkerRegistration;
@@ -460,20 +473,12 @@ export class Section {
460
473
  private readonly syncTagNameSetting: Common.Settings.Setting<string>;
461
474
  private readonly periodicSyncTagNameSetting: Common.Settings.Setting<string>;
462
475
  private readonly updateCycleView: ServiceWorkerUpdateCycleView;
463
- private readonly routerView: ApplicationComponents.ServiceWorkerRouterView.ServiceWorkerRouterView;
464
- private readonly networkRequests: Buttons.Button.Button;
465
- private readonly updateButton: Buttons.Button.Button;
466
- private readonly deleteButton: Buttons.Button.Button;
467
- private sourceField: HTMLElement;
468
- private readonly statusField: HTMLElement;
469
- private readonly clientsField: HTMLElement;
470
476
  private readonly clientInfoCache: Map<string, Protocol.Target.TargetInfo>;
471
477
  private readonly throttler: Common.Throttler.Throttler;
472
- private updateCycleField?: HTMLElement;
473
- private routerField?: HTMLElement;
474
478
 
475
479
  constructor(manager: SDK.ServiceWorkerManager.ServiceWorkerManager, section: UI.ReportView.Section,
476
480
  registration: SDK.ServiceWorkerManager.ServiceWorkerRegistration) {
481
+ super();
477
482
  this.manager = manager;
478
483
  this.section = section;
479
484
  this.registration = registration;
@@ -486,76 +491,76 @@ export class Section {
486
491
  Common.Settings.Settings.instance().createLocalSetting('periodic-sync-tag-name', 'test-tag-from-devtools');
487
492
 
488
493
  this.updateCycleView = new ServiceWorkerUpdateCycleView(registration);
489
- this.routerView = new ApplicationComponents.ServiceWorkerRouterView.ServiceWorkerRouterView();
490
- this.networkRequests = new Buttons.Button.Button();
491
- this.networkRequests.data = {
492
- variant: Buttons.Button.Variant.TEXT,
493
- title: i18nString(UIStrings.networkRequests),
494
- jslogContext: 'show-network-requests',
495
- };
496
- this.networkRequests.textContent = i18nString(UIStrings.networkRequests);
497
- this.networkRequests.addEventListener('click', this.networkRequestsClicked.bind(this));
498
- this.section.appendButtonToHeader(this.networkRequests);
499
- this.updateButton = UI.UIUtils.createTextButton(
500
- i18nString(UIStrings.update), this.updateButtonClicked.bind(this),
501
- {variant: Buttons.Button.Variant.TEXT, title: i18nString(UIStrings.update), jslogContext: 'update'});
502
- this.section.appendButtonToHeader(this.updateButton);
503
- this.deleteButton =
504
- UI.UIUtils.createTextButton(i18nString(UIStrings.unregister), this.unregisterButtonClicked.bind(this), {
505
- variant: Buttons.Button.Variant.TEXT,
506
- title: i18nString(UIStrings.unregisterServiceWorker),
507
- jslogContext: 'unregister',
508
- });
509
- this.section.appendButtonToHeader(this.deleteButton);
510
-
511
- // Preserve the order.
512
- this.sourceField = this.section.appendField(i18nString(UIStrings.source));
513
- this.statusField = this.section.appendField(i18nString(UIStrings.status));
514
- this.clientsField = this.section.appendField(i18nString(UIStrings.clients));
515
-
516
- UI.DOMUtilities.appendStyle(this.section.getFieldElement(), serviceWorkersViewStyles,
517
- serviceWorkerUpdateCycleViewStyles);
518
- this.createSyncNotificationField(i18nString(UIStrings.pushString), this.pushNotificationDataSetting.get(),
519
- i18nString(UIStrings.pushData), this.push.bind(this), 'push-message');
520
- this.createSyncNotificationField(i18nString(UIStrings.syncString), this.syncTagNameSetting.get(),
521
- i18nString(UIStrings.syncTag), this.sync.bind(this), 'sync-tag');
522
- this.createSyncNotificationField(i18nString(UIStrings.periodicSync), this.periodicSyncTagNameSetting.get(),
523
- i18nString(UIStrings.periodicSyncTag), tag => this.periodicSync(tag),
524
- 'periodic-sync-tag');
525
- this.createUpdateCycleField();
526
- this.maybeCreateRouterField();
494
+
495
+ this.registerRequiredCSS(serviceWorkersViewStyles, serviceWorkerUpdateCycleViewStyles);
496
+ this.show(this.section.getFieldElement());
527
497
 
528
498
  this.clientInfoCache = new Map();
529
499
  this.throttler = new Common.Throttler.Throttler(500);
530
500
  }
531
501
 
532
- private createSyncNotificationField(label: string, initialValue: string, placeholder: string,
533
- callback: (arg0: string) => void, jslogContext: string): void {
534
- const fieldElement = this.section.appendField(label);
502
+ private renderHeaderButtons(): LitTemplate {
503
+ // clang-format off
535
504
 
505
+ return html`
506
+ <devtools-button .data=${{
507
+ variant: Buttons.Button.Variant.TEXT,
508
+ title: i18nString(UIStrings.networkRequests),
509
+ jslogContext: 'show-network-requests'
510
+ } as Buttons.Button.ButtonData}
511
+ .disabled=${this.registration.isDeleted}
512
+ @click=${this.networkRequestsClicked.bind(this)}>
513
+ ${i18nString(UIStrings.networkRequests)}
514
+ </devtools-button>
515
+ <devtools-button .data=${{
516
+ variant: Buttons.Button.Variant.TEXT,
517
+ title: i18nString(UIStrings.update),
518
+ jslogContext: 'update'
519
+ } as Buttons.Button.ButtonData}
520
+ .disabled=${this.registration.isDeleted}
521
+ @click=${this.updateButtonClicked.bind(this)}>
522
+ ${i18nString(UIStrings.update)}
523
+ </devtools-button>
524
+ <devtools-button .data=${{
525
+ variant: Buttons.Button.Variant.TEXT,
526
+ title: i18nString(UIStrings.unregisterServiceWorker),
527
+ jslogContext: 'unregister'
528
+ } as Buttons.Button.ButtonData}
529
+ .disabled=${this.registration.isDeleted}
530
+ @click=${this.unregisterButtonClicked.bind(this)}>
531
+ ${i18nString(UIStrings.unregister)}
532
+ </devtools-button>`;
533
+ // clang-format on
534
+ }
535
+
536
+ private renderSyncNotificationField(label: string, initialValue: string, placeholder: string,
537
+ callback: (arg0: string) => void, jslogContext: string): LitTemplate {
536
538
  // clang-format off
537
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
538
- render(html`
539
- <form class="service-worker-editor-with-button" @submit=${(e: Event) => {
540
- const {editor} = e.target as HTMLFormElement;
541
- callback(editor.value || '');
542
- e.consume(true);
543
- }}>
544
- <input name="editor" class="source-code service-worker-notification-editor harmony-input" type="text"
545
- .value=${initialValue}
546
- placeholder=${placeholder}
547
- aria-label=${label}
548
- .spellcheck=${false}
549
- jslog=${VisualLogging.textField().track({change: true}).context(jslogContext)}
550
- >
551
- <devtools-button .data=${{
552
- type: 'submit',
553
- variant: Buttons.Button.Variant.OUTLINED,
554
- jslogContext} as Buttons.Button.ButtonData}>
555
- ${label}
556
- </devtools-button>
557
- </form>
558
- `, fieldElement);
539
+ return html`
540
+ <div class="report-field">
541
+ <div class="report-field-name">${label}</div>
542
+ <div class="report-field-value">
543
+ <form class="service-worker-editor-with-button" @submit=${(e: Event) => {
544
+ const {editor} = e.target as HTMLFormElement;
545
+ callback(editor.value || '');
546
+ e.consume(true);
547
+ }}>
548
+ <input name="editor" class="source-code service-worker-notification-editor harmony-input" type="text"
549
+ .value=${initialValue}
550
+ placeholder=${placeholder}
551
+ aria-label=${label}
552
+ .spellcheck=${false}
553
+ jslog=${VisualLogging.textField().track({change: true}).context(jslogContext)}
554
+ >
555
+ <devtools-button .data=${{
556
+ type: 'submit',
557
+ variant: Buttons.Button.Variant.OUTLINED,
558
+ jslogContext} as Buttons.Button.ButtonData}>
559
+ ${label}
560
+ </devtools-button>
561
+ </form>
562
+ </div>
563
+ </div>`;
559
564
  // clang-format on
560
565
  }
561
566
 
@@ -564,7 +569,10 @@ export class Section {
564
569
  void this.performUpdate();
565
570
  return;
566
571
  }
567
- void this.throttler.schedule(this.performUpdate.bind(this));
572
+ void this.throttler.schedule(() => {
573
+ this.requestUpdate();
574
+ return this.updateComplete;
575
+ });
568
576
  }
569
577
 
570
578
  private renderVersion(icon: string, label: string, content: LitTemplate = nothing): LitTemplate {
@@ -580,32 +588,43 @@ export class Section {
580
588
  // clang-format on
581
589
  }
582
590
 
583
- private updateClientsField(version: SDK.ServiceWorkerManager.ServiceWorkerVersion): void {
584
- this.clientsField.removeChildren();
585
- this.section.setFieldVisible(i18nString(UIStrings.clients), Boolean(version.controlledClients.length));
586
- for (const client of version.controlledClients) {
587
- const clientLabelText = this.clientsField.createChild('div', 'service-worker-client') as HTMLElement;
588
- const info = this.clientInfoCache.get(client);
589
- if (info) {
590
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
591
- render(this.renderClientInfo(info), clientLabelText);
592
- }
593
- void this.manager.target()
594
- .targetAgent()
595
- .invoke_getTargetInfo({targetId: client})
596
- .then(this.onClientInfo.bind(this, clientLabelText));
591
+ private renderClientsField(version?: SDK.ServiceWorkerManager.ServiceWorkerVersion): LitTemplate {
592
+ if (!version?.controlledClients?.length) {
593
+ return html`<div class="report-field">
594
+ <div class="report-field-name">${i18nString(UIStrings.clients)}</div>
595
+ <div class="report-field-value"></div>
596
+ </div>`;
597
597
  }
598
+ // clang-format off
599
+ return html`<div class="report-field">
600
+ <div class="report-field-name">${i18nString(UIStrings.clients)}</div>
601
+ <div class="report-field-value">
602
+ ${version.controlledClients.map(client => html`
603
+ <div class="service-worker-client">
604
+ ${until(this.renderClientInfo(client))}
605
+ </div>`)}
606
+ </div>
607
+ </div>`;
608
+ // clang-format on
598
609
  }
599
610
 
600
- private updateSourceField(version: SDK.ServiceWorkerManager.ServiceWorkerVersion): void {
611
+ private renderSourceField(version?: SDK.ServiceWorkerManager.ServiceWorkerVersion): LitTemplate {
612
+ if (!version) {
613
+ return html`<div class="report-field">
614
+ <div class="report-field-name">${i18nString(UIStrings.source)}</div>
615
+ <div class="report-field-value"></div>
616
+ </div>`;
617
+ }
601
618
  const fileName = Common.ParsedURL.ParsedURL.extractName(version.scriptURL);
602
619
  // clang-format off
603
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
604
- render(html`
605
- <div class="report-field-value-filename">
606
- ${Components.Linkifier.Linkifier.renderLinkifiedUrl(version.scriptURL, {
607
- text: fileName, tabStop: true, jslogContext: 'source-location'})}
608
- ${this.registration.errors.length ? html`
620
+
621
+ return html`<div class="report-field">
622
+ <div class="report-field-name">${i18nString(UIStrings.source)}</div>
623
+ <div class="report-field-value">
624
+ <div class="report-field-value-filename">
625
+ ${Components.Linkifier.Linkifier.renderLinkifiedUrl(version.scriptURL, {
626
+ text: fileName, tabStop: true, jslogContext: 'source-location'})}
627
+ ${this.registration.errors.length ? html`
609
628
  <button
610
629
  class="devtools-link link"
611
630
  tabindex="0"
@@ -615,24 +634,88 @@ export class Section {
615
634
  </devtools-icon>
616
635
  ${this.registration.errors.length}
617
636
  </button>` : nothing}
637
+ </div>
638
+ ${version.scriptResponseTime !== undefined ? html`
639
+ <div class="report-field-value-subtitle">
640
+ ${i18nString(UIStrings.receivedS, {PH1: new Date(version.scriptResponseTime * 1000).toLocaleString()})}
641
+ </div>
642
+ ` : nothing}
618
643
  </div>
619
- ${version.scriptResponseTime !== undefined ? html`
620
- <div class="report-field-value-subtitle">
621
- ${i18nString(UIStrings.receivedS, {PH1: new Date(version.scriptResponseTime * 1000).toLocaleString()})}
644
+ </div>`;
645
+ // clang-format on
646
+ }
647
+
648
+ private renderStatusField(active?: SDK.ServiceWorkerManager.ServiceWorkerVersion,
649
+ waiting?: SDK.ServiceWorkerManager.ServiceWorkerVersion,
650
+ installing?: SDK.ServiceWorkerManager.ServiceWorkerVersion,
651
+ redundant?: SDK.ServiceWorkerManager.ServiceWorkerVersion): LitTemplate {
652
+ // clang-format off
653
+
654
+ return html`<div class="report-field">
655
+ <div class="report-field-name">${i18nString(UIStrings.status)}</div>
656
+ <div class="report-field-value">
657
+ <div class="service-worker-version-stack">
658
+ <div class="service-worker-version-stack-bar"></div>
659
+ ${active ? this.renderVersion(
660
+ 'service-worker-active-circle',
661
+ i18nString(UIStrings.sActivatedAndIsS, {
662
+ PH1: active.id,
663
+ PH2: SDK.ServiceWorkerManager.ServiceWorkerVersion.RunningStatus[active.currentState.runningStatus](),
664
+ }),
665
+ active.isRunning() || active.isStarting() ? html`
666
+ <devtools-button .data=${{jslogContext: 'stop', variant: Buttons.Button.Variant.OUTLINED} as Buttons.Button.ButtonData}
667
+ @click=${this.stopButtonClicked.bind(this, active.id)}>
668
+ ${i18nString(UIStrings.stopString)}
669
+ </devtools-button>`
670
+ : active.isStartable() ? html`
671
+ <devtools-button .data=${{jslogContext: 'start', variant: Buttons.Button.Variant.OUTLINED} as Buttons.Button.ButtonData}
672
+ @click=${this.startButtonClicked.bind(this)}>
673
+ ${i18nString(UIStrings.startString)}
674
+ </devtools-button>`
675
+ : nothing)
676
+ : redundant ? this.renderVersion(
677
+ 'service-worker-redundant-circle',
678
+ i18nString(UIStrings.sIsRedundant, {PH1: redundant.id}))
679
+ : nothing}
680
+ ${waiting ? this.renderVersion(
681
+ 'service-worker-waiting-circle',
682
+ i18nString(UIStrings.sWaitingToActivate, {PH1: waiting.id}), html`
683
+ <devtools-button .data=${{
684
+ jslogContext: 'skip-waiting',
685
+ title: i18n.i18n.lockedString('skipWaiting'),
686
+ variant: Buttons.Button.Variant.OUTLINED} as Buttons.Button.ButtonData}
687
+ @click=${this.skipButtonClicked.bind(this)}>
688
+ ${i18n.i18n.lockedString('skipWaiting')}
689
+ </devtools-button>
690
+ ${waiting.scriptResponseTime !== undefined ? html`
691
+ <div class="service-worker-subtitle">
692
+ ${i18nString(UIStrings.receivedS, {PH1: new Date(waiting.scriptResponseTime * 1000).toLocaleString()})}
693
+ </div>
694
+ ` : nothing}
695
+ `,
696
+ ) : nothing}
697
+ ${installing ? this.renderVersion(
698
+ 'service-worker-installing-circle',
699
+ i18nString(UIStrings.sTryingToInstall, {PH1: installing.id}),
700
+ installing.scriptResponseTime !== undefined ? html`
701
+ <div class="service-worker-subtitle">
702
+ ${i18nString(UIStrings.receivedS, {PH1: new Date(installing.scriptResponseTime * 1000).toLocaleString()})}
703
+ </div>` : nothing) : nothing}
622
704
  </div>
623
- ` : nothing}
624
- `, this.sourceField);
705
+ </div>
706
+ </div>`;
625
707
  // clang-format on
626
708
  }
627
709
 
628
- private performUpdate(): Promise<void> {
710
+ override performUpdate(): Promise<void> {
629
711
  const fingerprint = this.registration.fingerprint();
630
712
  if (fingerprint === this.fingerprint) {
631
713
  return Promise.resolve();
632
714
  }
633
715
  this.fingerprint = fingerprint;
634
716
 
635
- this.section.setHeaderButtonsState(this.registration.isDeleted);
717
+ // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
718
+ render(this.renderHeaderButtons(), this.section.getHeaderElement());
636
719
 
637
720
  const versions = this.registration.versionsByMode();
638
721
  const scopeURL = this.registration.scopeURL;
@@ -647,66 +730,20 @@ export class Section {
647
730
  // clang-format off
648
731
  // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
649
732
  render(html`
650
- <div class="service-worker-version-stack">
651
- <div class="service-worker-version-stack-bar"></div>
652
- ${active ? this.renderVersion(
653
- 'service-worker-active-circle',
654
- i18nString(UIStrings.sActivatedAndIsS, {
655
- PH1: active.id,
656
- PH2: SDK.ServiceWorkerManager.ServiceWorkerVersion.RunningStatus[active.currentState.runningStatus](),
657
- }),
658
- active.isRunning() || active.isStarting() ? html`
659
- <devtools-button .data=${{jslogContext: 'stop', variant: Buttons.Button.Variant.OUTLINED} as Buttons.Button.ButtonData}
660
- @click=${this.stopButtonClicked.bind(this, active.id)}>
661
- ${i18nString(UIStrings.stopString)}
662
- </devtools-button>`
663
- : active.isStartable() ? html`
664
- <devtools-button .data=${{jslogContext: 'start', variant: Buttons.Button.Variant.OUTLINED} as Buttons.Button.ButtonData}
665
- @click=${this.startButtonClicked.bind(this)}>
666
- ${i18nString(UIStrings.startString)}
667
- </devtools-button>`
668
- : nothing)
669
- : redundant ? this.renderVersion(
670
- 'service-worker-redundant-circle',
671
- i18nString(UIStrings.sIsRedundant, {PH1: redundant.id}))
672
- : nothing}
673
- ${waiting ? this.renderVersion(
674
- 'service-worker-waiting-circle',
675
- i18nString(UIStrings.sWaitingToActivate, {PH1: waiting.id}), html`
676
- <devtools-button .data=${{
677
- jslogContext: 'skip-waiting',
678
- title: i18n.i18n.lockedString('skipWaiting'),
679
- variant: Buttons.Button.Variant.OUTLINED} as Buttons.Button.ButtonData}
680
- @click=${this.skipButtonClicked.bind(this)}>
681
- ${i18n.i18n.lockedString('skipWaiting')}
682
- </devtools-button>
683
- ${waiting.scriptResponseTime !== undefined ? html`
684
- <div class="service-worker-subtitle">
685
- ${i18nString(UIStrings.receivedS, {PH1: new Date(waiting.scriptResponseTime * 1000).toLocaleString()})}
686
- </div>
687
- ` : nothing}
688
- `,
689
- ) : nothing}
690
- ${installing ? this.renderVersion(
691
- 'service-worker-installing-circle',
692
- i18nString(UIStrings.sTryingToInstall, {PH1: installing.id}),
693
- installing.scriptResponseTime !== undefined ? html`
694
- <div class="service-worker-subtitle">
695
- ${i18nString(UIStrings.receivedS, {PH1: new Date(installing.scriptResponseTime * 1000).toLocaleString()})}
696
- </div>` : nothing) : nothing}
697
- </div>
698
- `, this.statusField);
733
+ ${this.renderSourceField(active ?? redundant)}
734
+ ${this.renderStatusField(active, waiting, installing, redundant)}
735
+ ${this.renderClientsField(active ?? redundant)}
736
+ ${this.renderSyncNotificationField(i18nString(UIStrings.pushString), this.pushNotificationDataSetting.get(),
737
+ i18nString(UIStrings.pushData), this.push.bind(this), 'push-message')}
738
+ ${this.renderSyncNotificationField(i18nString(UIStrings.syncString), this.syncTagNameSetting.get(),
739
+ i18nString(UIStrings.syncTag), this.sync.bind(this), 'sync-tag')}
740
+ ${this.renderSyncNotificationField(i18nString(UIStrings.periodicSync), this.periodicSyncTagNameSetting.get(),
741
+ i18nString(UIStrings.periodicSyncTag), tag => this.periodicSync(tag),
742
+ 'periodic-sync-tag')}
743
+ ${this.renderUpdateCycleField()}
744
+ ${this.renderRouterField()}
745
+ `, this.contentElement);
699
746
  // clang-format on
700
-
701
- if (active) {
702
- this.updateSourceField(active);
703
- this.updateClientsField(active);
704
- this.maybeCreateRouterField();
705
- } else if (redundant) {
706
- this.updateSourceField(redundant);
707
- this.updateClientsField(redundant);
708
- }
709
-
710
747
  this.updateCycleView.refresh();
711
748
 
712
749
  return Promise.resolve();
@@ -716,29 +753,33 @@ export class Section {
716
753
  this.manager.deleteRegistration(this.registration.id);
717
754
  }
718
755
 
719
- private createUpdateCycleField(): void {
720
- this.updateCycleField = this.section.appendField(i18nString(UIStrings.updateCycle));
721
- this.updateCycleField.appendChild(this.updateCycleView.tableElement);
756
+ private renderUpdateCycleField(): LitTemplate {
757
+ return html`
758
+ <div class="report-field">
759
+ <div class="report-field-name">${i18nString(UIStrings.updateCycle)}</div>
760
+ <div class="report-field-value">
761
+ ${this.updateCycleView.tableElement}
762
+ </div>
763
+ </div>`;
722
764
  }
723
765
 
724
- private maybeCreateRouterField(): void {
766
+ private renderRouterField(): LitTemplate {
725
767
  const versions = this.registration.versionsByMode();
726
768
  const active = versions.get(SDK.ServiceWorkerManager.ServiceWorkerVersion.Modes.ACTIVE);
727
769
  const title = i18nString(UIStrings.routers);
728
770
  if (active?.routerRules && active.routerRules.length > 0) {
729
771
  // If there is at least one registered rule in the active version, append the router filed.
730
- if (!this.routerField) {
731
- this.routerField = this.section.appendField(title);
732
- }
733
- if (!this.routerField.lastElementChild) {
734
- this.routerView.show(this.routerField);
735
- }
736
- this.routerView.rules = active.routerRules;
737
- } else {
738
- // If no active worker or no registered rules, remove the field.
739
- this.section.removeField(title);
740
- this.routerField = undefined;
772
+ // clang-format off
773
+ return html`
774
+ <div class="report-field">
775
+ <div class="report-field-name">${title}</div>
776
+ <div class="report-field-value">
777
+ ${widget(ApplicationComponents.ServiceWorkerRouterView.ServiceWorkerRouterView, { rules: active.routerRules })}
778
+ </div>
779
+ </div>`;
780
+ // clang-format on
741
781
  }
782
+ return nothing;
742
783
  }
743
784
 
744
785
  private updateButtonClicked(): void {
@@ -771,17 +812,17 @@ export class Section {
771
812
  void this.manager.dispatchPeriodicSyncEvent(this.registration.id, tag);
772
813
  }
773
814
 
774
- private onClientInfo(element: HTMLElement, targetInfoResponse: Protocol.Target.GetTargetInfoResponse): void {
775
- const targetInfo = targetInfoResponse.targetInfo;
815
+ private async renderClientInfo(clientId: Protocol.Target.TargetID): Promise<LitTemplate|typeof nothing> {
816
+ let targetInfo = this.clientInfoCache.get(clientId);
776
817
  if (!targetInfo) {
777
- return;
818
+ const response = await this.manager.target().targetAgent().invoke_getTargetInfo({targetId: clientId});
819
+ if (!response.targetInfo) {
820
+ return nothing;
821
+ }
822
+ targetInfo = response.targetInfo;
823
+ this.clientInfoCache.set(clientId, targetInfo);
778
824
  }
779
- this.clientInfoCache.set(targetInfo.targetId, targetInfo);
780
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
781
- render(this.renderClientInfo(targetInfo), element);
782
- }
783
825
 
784
- private renderClientInfo(targetInfo: Protocol.Target.TargetInfo): LitTemplate {
785
826
  if (targetInfo.type !== 'page' && targetInfo.type !== 'iframe') {
786
827
  // clang-format off
787
828
  return html`<span class="service-worker-client-string">