chrome-devtools-frontend 1.0.1536371 → 1.0.1537860

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 (231) hide show
  1. package/.env.template +9 -0
  2. package/docs/get_the_code.md +27 -0
  3. package/front_end/core/common/SettingRegistration.ts +10 -7
  4. package/front_end/core/common/Settings.ts +3 -0
  5. package/front_end/core/host/AidaClient.ts +64 -5
  6. package/front_end/core/host/DispatchHttpRequestClient.ts +62 -0
  7. package/front_end/core/host/GdpClient.ts +8 -57
  8. package/front_end/core/host/host.ts +2 -0
  9. package/front_end/core/protocol_client/CDPConnection.ts +10 -8
  10. package/front_end/core/protocol_client/InspectorBackend.ts +36 -42
  11. package/front_end/core/sdk/EnhancedTracesParser.ts +20 -5
  12. package/front_end/core/sdk/RehydratingConnection.ts +112 -4
  13. package/front_end/core/sdk/RehydratingObject.ts +8 -0
  14. package/front_end/core/sdk/TraceObject.ts +5 -1
  15. package/front_end/core/sdk/sdk-meta.ts +8 -2
  16. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +4 -3
  17. package/front_end/generated/SupportedCSSProperties.js +1 -0
  18. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +23 -7
  19. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +110 -5
  20. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +50 -45
  21. package/front_end/models/cpu_profile/ProfileTreeModel.ts +7 -7
  22. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  23. package/front_end/models/trace/types/File.ts +9 -0
  24. package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +1 -1
  25. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -9
  26. package/front_end/panels/ai_assistance/components/ChatView.ts +58 -70
  27. package/front_end/panels/application/BackForwardCacheTreeElement.ts +2 -6
  28. package/front_end/panels/application/StorageView.ts +3 -2
  29. package/front_end/panels/application/components/BackForwardCacheView.ts +96 -108
  30. package/front_end/panels/application/components/FrameDetailsView.ts +8 -11
  31. package/front_end/panels/application/components/OriginTrialTreeView.ts +136 -137
  32. package/front_end/panels/application/components/backForwardCacheView.css +8 -0
  33. package/front_end/panels/application/components/badge.css +9 -1
  34. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +2 -2
  35. package/front_end/panels/application/preloading/components/PreloadingString.ts +27 -0
  36. package/front_end/panels/autofill/AutofillView.ts +1 -1
  37. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +44 -53
  38. package/front_end/panels/console/ConsoleView.ts +11 -9
  39. package/front_end/panels/coverage/CoverageView.ts +1 -2
  40. package/front_end/panels/css_overview/CSSOverviewSidebarPanel.ts +1 -1
  41. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +1 -1
  42. package/front_end/panels/elements/ElementStatePaneWidget.ts +1 -1
  43. package/front_end/panels/elements/EventListenersWidget.ts +1 -2
  44. package/front_end/panels/elements/PropertiesWidget.ts +1 -1
  45. package/front_end/panels/network/NetworkConfigView.ts +2 -1
  46. package/front_end/panels/network/NetworkPanel.ts +5 -4
  47. package/front_end/panels/network/RequestCookiesView.ts +2 -1
  48. package/front_end/panels/profiler/HeapSnapshotView.ts +3 -2
  49. package/front_end/panels/recorder/RecorderController.ts +1 -2
  50. package/front_end/panels/recorder/components/CreateRecordingView.ts +153 -129
  51. package/front_end/panels/sensors/SensorsView.ts +4 -3
  52. package/front_end/panels/settings/AISettingsTab.ts +162 -171
  53. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +8 -6
  54. package/front_end/panels/settings/KeybindsSettingsTab.ts +3 -2
  55. package/front_end/panels/settings/SettingsScreen.ts +5 -8
  56. package/front_end/panels/settings/WorkspaceSettingsTab.ts +1 -1
  57. package/front_end/panels/settings/aiSettingsTab.css +151 -148
  58. package/front_end/panels/settings/settings-meta.ts +1 -2
  59. package/front_end/panels/sources/AddSourceMapURLDialog.ts +23 -26
  60. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +2 -1
  61. package/front_end/panels/sources/SourcesPanel.ts +2 -1
  62. package/front_end/panels/sources/sources-meta.ts +8 -1
  63. package/front_end/panels/timeline/TimelinePanel.ts +64 -14
  64. package/front_end/panels/timeline/TimelineUIUtils.ts +4 -20
  65. package/front_end/panels/timeline/components/ExportTraceOptions.ts +33 -34
  66. package/front_end/panels/timeline/components/LiveMetricsView.ts +1 -0
  67. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +2 -0
  68. package/front_end/third_party/chromium/README.chromium +2 -2
  69. package/front_end/third_party/puppeteer/README.chromium +2 -2
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +9 -1
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts +2 -2
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.js.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +13 -1
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts +2 -2
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js +5 -2
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js.map +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +2 -2
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +3 -1
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Realm.d.ts +1 -12
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts +6 -0
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  91. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js +1 -0
  92. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js.map +1 -1
  93. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +2 -2
  94. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +6 -1
  96. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts +2 -1
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js +2 -2
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js.map +1 -1
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +2 -2
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +3 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.d.ts +2 -2
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.d.ts.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.js +3 -1
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.js.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.d.ts +1 -0
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.d.ts.map +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.js +1 -0
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.js.map +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +28 -3
  121. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +21 -10
  122. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +9 -1
  123. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts +2 -2
  126. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +13 -1
  131. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts +2 -2
  134. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js +5 -2
  136. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +2 -2
  138. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +3 -1
  140. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Realm.d.ts +1 -12
  142. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts +6 -0
  144. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js +1 -0
  146. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +2 -2
  148. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +6 -1
  150. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts +2 -1
  152. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  153. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js +2 -2
  154. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +2 -2
  156. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  157. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +3 -1
  158. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  159. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  160. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  161. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.d.ts +2 -2
  163. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.d.ts.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.js +2 -2
  165. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.js.map +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.d.ts +1 -0
  167. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.d.ts.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.js +1 -0
  169. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.js.map +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  171. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/types.d.ts +28 -3
  173. package/front_end/third_party/puppeteer/package/package.json +2 -2
  174. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +13 -1
  175. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +7 -2
  176. package/front_end/third_party/puppeteer/package/src/api/Page.ts +14 -1
  177. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +8 -5
  178. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +5 -2
  179. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +8 -0
  180. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +11 -2
  181. package/front_end/third_party/puppeteer/package/src/cdp/BrowserContext.ts +3 -2
  182. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +5 -5
  183. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  184. package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
  185. package/front_end/third_party/puppeteer/package/src/util/util.ts +1 -0
  186. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  187. package/front_end/ui/components/adorners/Adorner.ts +2 -1
  188. package/front_end/ui/components/buttons/Button.docs.ts +195 -0
  189. package/front_end/ui/components/settings/SettingCheckbox.ts +49 -14
  190. package/front_end/ui/components/settings/settingCheckbox.css +6 -1
  191. package/front_end/ui/components/spinners/Spinners.docs.ts +13 -0
  192. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +280 -0
  193. package/front_end/ui/components/text_editor/text_editor.ts +1 -0
  194. package/front_end/ui/components/tooltips/Tooltip.docs.ts +76 -0
  195. package/front_end/ui/components/tooltips/Tooltip.ts +1 -1
  196. package/front_end/ui/legacy/Dialog.ts +0 -1
  197. package/front_end/ui/legacy/FilterBar.ts +1 -2
  198. package/front_end/ui/legacy/RadioButton.docs.ts +41 -0
  199. package/front_end/ui/legacy/SelectMenu.docs.ts +98 -0
  200. package/front_end/ui/legacy/Toolbar.ts +4 -6
  201. package/front_end/ui/legacy/UIUtils.ts +114 -1
  202. package/front_end/ui/legacy/Widget.ts +62 -34
  203. package/front_end/ui/legacy/XLink.ts +0 -3
  204. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +9 -0
  205. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +125 -0
  206. package/front_end/ui/legacy/components/settings_ui/settings_ui.ts +8 -0
  207. package/front_end/ui/legacy/components/utils/Linkifier.ts +9 -3
  208. package/front_end/ui/legacy/legacy.ts +0 -2
  209. package/front_end/ui/visual_logging/KnownContextValues.ts +4 -1
  210. package/mcp/mcp.ts +5 -0
  211. package/package.json +1 -1
  212. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatterBounds.snapshot.txt +0 -4
  213. package/front_end/models/trace/lantern/testing/MetricTestUtils.ts +0 -62
  214. package/front_end/models/trace/lantern/testing/testing.ts +0 -5
  215. package/front_end/ui/components/docs/breadcrumbs_perf/initial-breadcrumb-perf.html +0 -20
  216. package/front_end/ui/components/docs/breadcrumbs_perf/initial-breadcrumb-perf.ts +0 -25
  217. package/front_end/ui/components/docs/breadcrumbs_perf/nested-breadcrumbs-perf.html +0 -20
  218. package/front_end/ui/components/docs/breadcrumbs_perf/nested-breadcrumbs-perf.ts +0 -36
  219. package/front_end/ui/components/docs/button/basic.html +0 -44
  220. package/front_end/ui/components/docs/button/basic.ts +0 -175
  221. package/front_end/ui/components/docs/radio_button/basic.html +0 -23
  222. package/front_end/ui/components/docs/radio_button/basic.ts +0 -50
  223. package/front_end/ui/components/docs/select_menu/basic.html +0 -19
  224. package/front_end/ui/components/docs/select_menu/basic.ts +0 -95
  225. package/front_end/ui/components/docs/select_menu/wide-option.html +0 -38
  226. package/front_end/ui/components/docs/select_menu/wide-option.ts +0 -43
  227. package/front_end/ui/components/docs/spinners/basic.html +0 -17
  228. package/front_end/ui/components/docs/spinners/basic.ts +0 -22
  229. package/front_end/ui/components/docs/tooltip/basic.html +0 -20
  230. package/front_end/ui/components/docs/tooltip/basic.ts +0 -82
  231. package/front_end/ui/legacy/SettingsUI.ts +0 -254
@@ -1,12 +1,11 @@
1
1
  // Copyright 2021 The Chromium Authors
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 @devtools/no-lit-render-outside-of-view */
5
4
 
6
5
  import '../../../ui/components/chrome_link/chrome_link.js';
7
6
  import '../../../ui/components/expandable_list/expandable_list.js';
8
7
  import '../../../ui/components/report_view/report_view.js';
9
- import '../../../ui/components/tree_outline/tree_outline.js';
8
+ import '../../../ui/legacy/legacy.js';
10
9
 
11
10
  import * as Common from '../../../core/common/common.js';
12
11
  import * as i18n from '../../../core/i18n/i18n.js';
@@ -15,19 +14,15 @@ import * as SDK from '../../../core/sdk/sdk.js';
15
14
  import * as Protocol from '../../../generated/protocol.js';
16
15
  import * as Buttons from '../../../ui/components/buttons/buttons.js';
17
16
  import type * as ExpandableList from '../../../ui/components/expandable_list/expandable_list.js';
18
- import * as LegacyWrapper from '../../../ui/components/legacy_wrapper/legacy_wrapper.js';
19
- import * as RenderCoordinator from '../../../ui/components/render_coordinator/render_coordinator.js';
20
17
  import type * as ReportView from '../../../ui/components/report_view/report_view.js';
21
- import type * as TreeOutline from '../../../ui/components/tree_outline/tree_outline.js';
22
18
  import * as Components from '../../../ui/legacy/components/utils/utils.js';
23
- import * as Lit from '../../../ui/lit/lit.js';
19
+ import * as UI from '../../../ui/legacy/legacy.js';
20
+ import {html, type LitTemplate, nothing, render, type TemplateResult} from '../../../ui/lit/lit.js';
24
21
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
25
22
 
26
23
  import {NotRestoredReasonDescription} from './BackForwardCacheStrings.js';
27
24
  import backForwardCacheViewStyles from './backForwardCacheView.css.js';
28
25
 
29
- const {html} = Lit;
30
-
31
26
  const UIStrings = {
32
27
  /**
33
28
  * @description Title text in back/forward cache view of the Application panel
@@ -66,6 +61,10 @@ const UIStrings = {
66
61
  * page eligible for back/forward cache.
67
62
  */
68
63
  pageSupportNeeded: 'Actionable',
64
+ /**
65
+ * @description Label for the completion of the back/forward cache test
66
+ */
67
+ testCompleted: 'Back/forward cache test completed.',
69
68
  /**
70
69
  * @description Explanation for actionable items which prevent the page from being eligible
71
70
  * for back/forward cache.
@@ -158,7 +157,7 @@ function renderMainFrameInformation(
158
157
  frame: SDK.ResourceTreeModel.ResourceTreeFrame|null,
159
158
  frameTreeData: {node: FrameTreeNodeData, frameCount: number, issueCount: number}|undefined,
160
159
  reasonToFramesMap: Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>, screenStatus: ScreenStatusType,
161
- navigateAwayAndBack: () => Promise<void>): Lit.TemplateResult {
160
+ navigateAwayAndBack: () => Promise<void>): TemplateResult {
162
161
  if (!frame) {
163
162
  // clang-format of
164
163
  return html`
@@ -208,27 +207,28 @@ function renderMainFrameInformation(
208
207
  }
209
208
 
210
209
  function maybeRenderFrameTree(
211
- frameTreeData: {node: FrameTreeNodeData, frameCount: number, issueCount: number}|undefined): Lit.LitTemplate {
210
+ frameTreeData: {node: FrameTreeNodeData, frameCount: number, issueCount: number}|undefined): LitTemplate {
212
211
  if (!frameTreeData || (frameTreeData.frameCount === 0 && frameTreeData.issueCount === 0)) {
213
- return Lit.nothing;
212
+ return nothing;
214
213
  }
215
214
 
216
- function treeNodeRenderer(node: TreeOutline.TreeOutlineUtils.TreeNode<FrameTreeNodeData>): Lit.TemplateResult {
215
+ function renderFrameTreeNode(node: FrameTreeNodeData): TemplateResult {
217
216
  // clang-format off
218
217
  return html`
219
- <div class="text-ellipsis">
220
- ${node.treeNodeData.iconName ? html`
221
- <devtools-icon class="inline-icon extra-large" .name=${node.treeNodeData.iconName} style="margin-bottom: -3px;">
218
+ <li role="treeitem" class="text-ellipsis">
219
+ ${node.iconName ? html`
220
+ <devtools-icon class="inline-icon extra-large" .name=${node.iconName} style="margin-bottom: -3px;">
222
221
  </devtools-icon>
223
- ` : Lit.nothing}
224
- ${node.treeNodeData.text}
225
- </div>`;
222
+ ` : nothing}
223
+ ${node.text}
224
+ ${node.children?.length ? html`
225
+ <ul role="group" hidden>
226
+ ${node.children.map(child => renderFrameTreeNode(child))}
227
+ </ul>` : nothing}
228
+ </li>`;
226
229
  // clang-format on
227
230
  }
228
231
 
229
- const frameTreeNode = buildFrameTree(frameTreeData.node);
230
- // Override the icon for the outermost frame.
231
- frameTreeNode.treeNodeData.iconName = 'frame';
232
232
  let title = '';
233
233
  // The translation pipeline does not support nested plurals. We avoid this
234
234
  // here by pulling out the logic for one of the plurals into code instead.
@@ -237,49 +237,31 @@ function maybeRenderFrameTree(
237
237
  } else {
238
238
  title = i18nString(UIStrings.issuesInMultipleFrames, {n: frameTreeData.issueCount, m: frameTreeData.frameCount});
239
239
  }
240
- const root: TreeOutline.TreeOutlineUtils.TreeNode<FrameTreeNodeData> = {
241
- treeNodeData: {
242
- text: title,
243
- },
244
- id: 'root',
245
- children: () => Promise.resolve([frameTreeNode]),
246
- };
247
-
248
240
  // clang-format off
249
241
  return html`
250
242
  <devtools-report-key jslog=${VisualLogging.section('frames')}>${i18nString(UIStrings.framesTitle)}</devtools-report-key>
251
243
  <devtools-report-value>
252
- <devtools-tree-outline .data=${{
253
- tree: [root],
254
- defaultRenderer: treeNodeRenderer,
255
- compact: true,
256
- } as TreeOutline.TreeOutline.TreeOutlineData<FrameTreeNodeData>}>
257
- </devtools-tree-outline>
244
+ <devtools-tree .template=${html`
245
+ <ul role="tree">
246
+ <li role="treeitem" class="text-ellipsis">
247
+ ${title}
248
+ <ul role="group">
249
+ ${renderFrameTreeNode(frameTreeData.node)}
250
+ </ul>
251
+ </li>
252
+ </ul>
253
+ `}>
254
+ </devtools-tree>
258
255
  </devtools-report-value>`;
259
256
  // clang-format on
260
257
  }
261
258
 
262
- let nextNodeId = 0;
263
-
264
- function buildFrameTree(data: FrameTreeNodeData): TreeOutline.TreeOutlineUtils.TreeNode<FrameTreeNodeData> {
265
- const children = data.children;
266
- const node = {
267
- treeNodeData: {
268
- text: data.text,
269
- ...(data.iconName ? {iconName: data.iconName} : {}),
270
- },
271
- ...(children?.length ? {children: () => Promise.resolve(children.map(child => buildFrameTree(child)))} : {}),
272
- id: String(nextNodeId++),
273
- };
274
- return node;
275
- }
276
-
277
- function renderBackForwardCacheStatus(status: boolean|undefined): Lit.TemplateResult {
259
+ function renderBackForwardCacheStatus(status: boolean|undefined): TemplateResult {
278
260
  switch (status) {
279
261
  case true:
280
262
  // clang-format off
281
263
  return html`
282
- <devtools-report-section>
264
+ <devtools-report-section autofocus tabindex="-1">
283
265
  <div class="status extra-large">
284
266
  <devtools-icon class="inline-icon extra-large" name="check-circle" style="color: var(--icon-checkmark-green);">
285
267
  </devtools-icon>
@@ -290,7 +272,7 @@ function renderBackForwardCacheStatus(status: boolean|undefined): Lit.TemplateRe
290
272
  case false:
291
273
  // clang-format off
292
274
  return html`
293
- <devtools-report-section>
275
+ <devtools-report-section autofocus tabindex="-1">
294
276
  <div class="status">
295
277
  <devtools-icon class="inline-icon extra-large" name="clear">
296
278
  </devtools-icon>
@@ -301,7 +283,7 @@ function renderBackForwardCacheStatus(status: boolean|undefined): Lit.TemplateRe
301
283
  }
302
284
  // clang-format off
303
285
  return html`
304
- <devtools-report-section>
286
+ <devtools-report-section autofocus tabindex="-1">
305
287
  ${i18nString(UIStrings.unknown)}
306
288
  </devtools-report-section>`;
307
289
  // clang-format on
@@ -310,9 +292,9 @@ function renderBackForwardCacheStatus(status: boolean|undefined): Lit.TemplateRe
310
292
  function maybeRenderExplanations(
311
293
  explanations: Protocol.Page.BackForwardCacheNotRestoredExplanation[],
312
294
  explanationTree: Protocol.Page.BackForwardCacheNotRestoredExplanationTree|undefined,
313
- reasonToFramesMap: Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>): Lit.LitTemplate {
295
+ reasonToFramesMap: Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>): LitTemplate {
314
296
  if (explanations.length === 0) {
315
- return Lit.nothing;
297
+ return nothing;
316
298
  }
317
299
 
318
300
  const pageSupportNeeded = explanations.filter(
@@ -334,7 +316,7 @@ function maybeRenderExplanations(
334
316
  function renderExplanations(
335
317
  category: Platform.UIString.LocalizedString, explainerText: Platform.UIString.LocalizedString,
336
318
  explanations: Protocol.Page.BackForwardCacheNotRestoredExplanation[],
337
- reasonToFramesMap: Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>): Lit.TemplateResult {
319
+ reasonToFramesMap: Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>): TemplateResult {
338
320
  // Disabled until https://crbug.com/1079231 is fixed.
339
321
  // clang-format off
340
322
  return html`
@@ -347,11 +329,11 @@ function renderExplanations(
347
329
  </div>
348
330
  </devtools-report-section-header>
349
331
  ${explanations.map(explanation => renderReason(explanation, reasonToFramesMap.get(explanation.reason)))}
350
- ` : Lit.nothing}`;
332
+ ` : nothing}`;
351
333
  // clang-format on
352
334
  }
353
335
 
354
- function maybeRenderReasonContext(explanation: Protocol.Page.BackForwardCacheNotRestoredExplanation): Lit.LitTemplate {
336
+ function maybeRenderReasonContext(explanation: Protocol.Page.BackForwardCacheNotRestoredExplanation): LitTemplate {
355
337
  if (explanation.reason ===
356
338
  Protocol.Page.BackForwardCacheNotRestoredReason.EmbedderExtensionSentMessageToCachedFrame &&
357
339
  explanation.context) {
@@ -361,12 +343,12 @@ function maybeRenderReasonContext(explanation: Protocol.Page.BackForwardCacheNot
361
343
  <devtools-chrome-link .href=${link}>${explanation.context}</devtools-chrome-link>`;
362
344
  // clang-format on
363
345
  }
364
- return Lit.nothing;
346
+ return nothing;
365
347
  }
366
348
 
367
- function renderFramesPerReason(frames: string[]|undefined): Lit.LitTemplate {
349
+ function renderFramesPerReason(frames: string[]|undefined): LitTemplate {
368
350
  if (frames === undefined || frames.length === 0) {
369
- return Lit.nothing;
351
+ return nothing;
370
352
  }
371
353
  const rows = [html`<div>${i18nString(UIStrings.framesPerIssue, {n: frames.length})}</div>`];
372
354
  rows.push(...frames.map(url => html`<div class="text-ellipsis" title=${url}
@@ -383,8 +365,7 @@ function renderFramesPerReason(frames: string[]|undefined): Lit.LitTemplate {
383
365
  `;
384
366
  }
385
367
 
386
- function maybeRenderDeepLinkToUnload(explanation: Protocol.Page.BackForwardCacheNotRestoredExplanation):
387
- Lit.LitTemplate {
368
+ function maybeRenderDeepLinkToUnload(explanation: Protocol.Page.BackForwardCacheNotRestoredExplanation): LitTemplate {
388
369
  if (explanation.reason === Protocol.Page.BackForwardCacheNotRestoredReason.UnloadHandlerExistsInMainFrame ||
389
370
  explanation.reason === Protocol.Page.BackForwardCacheNotRestoredReason.UnloadHandlerExistsInSubFrame) {
390
371
  return html`
@@ -395,13 +376,12 @@ function maybeRenderDeepLinkToUnload(explanation: Protocol.Page.BackForwardCache
395
376
  ${i18nString(UIStrings.neverUseUnload)}
396
377
  </x-link>`;
397
378
  }
398
- return Lit.nothing;
379
+ return nothing;
399
380
  }
400
381
 
401
- function maybeRenderJavaScriptDetails(details: Protocol.Page.BackForwardCacheBlockingDetails[]|undefined):
402
- Lit.LitTemplate {
382
+ function maybeRenderJavaScriptDetails(details: Protocol.Page.BackForwardCacheBlockingDetails[]|undefined): LitTemplate {
403
383
  if (details === undefined || details.length === 0) {
404
- return Lit.nothing;
384
+ return nothing;
405
385
  }
406
386
  const maxLengthForDisplayedURLs = 50;
407
387
  const linkifier = new Components.Linkifier.Linkifier(maxLengthForDisplayedURLs);
@@ -423,7 +403,7 @@ function maybeRenderJavaScriptDetails(details: Protocol.Page.BackForwardCacheBlo
423
403
  }
424
404
 
425
405
  function renderReason(
426
- explanation: Protocol.Page.BackForwardCacheNotRestoredExplanation, frames: string[]|undefined): Lit.TemplateResult {
406
+ explanation: Protocol.Page.BackForwardCacheNotRestoredExplanation, frames: string[]|undefined): TemplateResult {
427
407
  // clang-format off
428
408
  return html`
429
409
  <devtools-report-section>
@@ -438,7 +418,7 @@ function renderReason(
438
418
  ${maybeRenderDeepLinkToUnload(explanation)}
439
419
  ${maybeRenderReasonContext(explanation)}
440
420
  </div>` :
441
- Lit.nothing}
421
+ nothing}
442
422
  </devtools-report-section>
443
423
  <div class="gray-text">
444
424
  ${explanation.reason}
@@ -448,36 +428,44 @@ function renderReason(
448
428
  // clang-format on
449
429
  }
450
430
 
451
- function renderBackForwardCacheView(
452
- frame: SDK.ResourceTreeModel.ResourceTreeFrame|null,
453
- frameTreeData: {node: FrameTreeNodeData, frameCount: number, issueCount: number}|undefined,
454
- reasonToFramesMap: Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>, screenStatus: ScreenStatusType,
455
- navigateAwayAndBack: () => Promise<void>, target: ShadowRoot): void {
431
+ interface ViewInput {
432
+ frame: SDK.ResourceTreeModel.ResourceTreeFrame|null;
433
+ frameTreeData: {node: FrameTreeNodeData, frameCount: number, issueCount: number}|undefined;
434
+ reasonToFramesMap: Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>;
435
+ screenStatus: ScreenStatusType;
436
+ navigateAwayAndBack: () => Promise<void>;
437
+ }
438
+
439
+ type View = (input: ViewInput, output: undefined, target: HTMLElement) => void;
440
+
441
+ const DEFAULT_VIEW: View = (input, output, target) => {
456
442
  // Disabled until https://crbug.com/1079231 is fixed.
457
443
  // clang-format off
458
- Lit.render(html`
444
+ render(html`
459
445
  <style>${backForwardCacheViewStyles}</style>
460
446
  <devtools-report .data=${
461
447
  {reportTitle: i18nString(UIStrings.backForwardCacheTitle)} as ReportView.ReportView.ReportData
462
448
  } jslog=${VisualLogging.pane('back-forward-cache')}>
463
449
 
464
- ${renderMainFrameInformation(frame, frameTreeData, reasonToFramesMap, screenStatus, navigateAwayAndBack)}
450
+ ${renderMainFrameInformation(input.frame, input.frameTreeData, input.reasonToFramesMap, input.screenStatus, input.navigateAwayAndBack)}
465
451
  </devtools-report>
466
452
  `, target);
467
453
  // clang-format on
468
- }
454
+ };
469
455
 
470
- export class BackForwardCacheView extends LegacyWrapper.LegacyWrapper.WrappableComponent {
471
- readonly #shadow = this.attachShadow({mode: 'open'});
456
+ export class BackForwardCacheView extends UI.Widget.Widget {
472
457
  #screenStatus = ScreenStatusType.RESULT;
473
458
  #historyIndex = 0;
459
+ #view: View;
474
460
 
475
- constructor() {
476
- super();
461
+ constructor(view = DEFAULT_VIEW) {
462
+ super({useShadowDom: true, delegatesFocus: true});
463
+ this.#view = view;
477
464
  this.#getMainResourceTreeModel()?.addEventListener(
478
- SDK.ResourceTreeModel.Events.PrimaryPageChanged, this.render, this);
465
+ SDK.ResourceTreeModel.Events.PrimaryPageChanged, this.requestUpdate, this);
479
466
  this.#getMainResourceTreeModel()?.addEventListener(
480
- SDK.ResourceTreeModel.Events.BackForwardCacheDetailsUpdated, this.render, this);
467
+ SDK.ResourceTreeModel.Events.BackForwardCacheDetailsUpdated, this.requestUpdate, this);
468
+ this.requestUpdate();
481
469
  }
482
470
 
483
471
  #getMainResourceTreeModel(): SDK.ResourceTreeModel.ResourceTreeModel|null {
@@ -488,21 +476,25 @@ export class BackForwardCacheView extends LegacyWrapper.LegacyWrapper.WrappableC
488
476
  #getMainFrame(): SDK.ResourceTreeModel.ResourceTreeFrame|null {
489
477
  return this.#getMainResourceTreeModel()?.mainFrame || null;
490
478
  }
491
- connectedCallback(): void {
492
- this.parentElement?.classList.add('overflow-auto');
493
- }
494
479
 
495
- override async render(): Promise<void> {
496
- await RenderCoordinator.write('BackForwardCacheView render', () => {
497
- const reasonToFramesMap = new Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>();
498
- const explanationTree = this.#getMainFrame()?.backForwardCacheDetails?.explanationsTree;
499
- if (explanationTree) {
500
- this.#buildReasonToFramesMap(explanationTree, {blankCount: 1}, reasonToFramesMap);
501
- }
502
- renderBackForwardCacheView(
503
- this.#getMainFrame(), this.#buildFrameTreeDataRecursive(explanationTree, {blankCount: 1}), reasonToFramesMap,
504
- this.#screenStatus, this.#navigateAwayAndBack.bind(this), this.#shadow);
505
- });
480
+ override async performUpdate(): Promise<void> {
481
+ const reasonToFramesMap = new Map<Protocol.Page.BackForwardCacheNotRestoredReason, string[]>();
482
+ const frame = this.#getMainFrame();
483
+ const explanationTree = frame?.backForwardCacheDetails?.explanationsTree;
484
+ if (explanationTree) {
485
+ this.#buildReasonToFramesMap(explanationTree, {blankCount: 1}, reasonToFramesMap);
486
+ }
487
+ const frameTreeData = this.#buildFrameTreeDataRecursive(explanationTree, {blankCount: 1});
488
+ // Override the icon for the outermost frame.
489
+ frameTreeData.node.iconName = 'frame';
490
+ const viewInput: ViewInput = {
491
+ frame,
492
+ frameTreeData,
493
+ reasonToFramesMap,
494
+ screenStatus: this.#screenStatus,
495
+ navigateAwayAndBack: this.#navigateAwayAndBack.bind(this),
496
+ };
497
+ this.#view(viewInput, undefined, this.contentElement);
506
498
  }
507
499
 
508
500
  #renderBackForwardCacheTestResult(): void {
@@ -510,7 +502,11 @@ export class BackForwardCacheView extends LegacyWrapper.LegacyWrapper.WrappableC
510
502
  SDK.ResourceTreeModel.ResourceTreeModel, SDK.ResourceTreeModel.Events.FrameNavigated,
511
503
  this.#renderBackForwardCacheTestResult, this);
512
504
  this.#screenStatus = ScreenStatusType.RESULT;
513
- void this.render();
505
+ this.requestUpdate();
506
+ void this.updateComplete.then(() => {
507
+ UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.testCompleted));
508
+ this.contentElement.focus();
509
+ });
514
510
  }
515
511
 
516
512
  async #onNavigatedAway(): Promise<void> {
@@ -552,7 +548,7 @@ export class BackForwardCacheView extends LegacyWrapper.LegacyWrapper.WrappableC
552
548
  }
553
549
  this.#historyIndex = historyResults.currentIndex;
554
550
  this.#screenStatus = ScreenStatusType.RUNNING;
555
- void this.render();
551
+ this.requestUpdate();
556
552
 
557
553
  // This event listener is removed inside of onNavigatedAway().
558
554
  SDK.TargetManager.TargetManager.instance().addModelListener(
@@ -643,11 +639,3 @@ interface FrameTreeNodeData {
643
639
  iconName?: string;
644
640
  children?: FrameTreeNodeData[];
645
641
  }
646
-
647
- customElements.define('devtools-resources-back-forward-cache-view', BackForwardCacheView);
648
-
649
- declare global {
650
- interface HTMLElementTagNameMap {
651
- 'devtools-resources-back-forward-cache-view': BackForwardCacheView;
652
- }
653
- }
@@ -23,6 +23,7 @@ import * as LegacyWrapper from '../../../ui/components/legacy_wrapper/legacy_wra
23
23
  import * as RenderCoordinator from '../../../ui/components/render_coordinator/render_coordinator.js';
24
24
  import type * as ReportView from '../../../ui/components/report_view/report_view.js';
25
25
  import * as Components from '../../../ui/legacy/components/utils/utils.js';
26
+ import * as UI from '../../../ui/legacy/legacy.js';
26
27
  import * as Lit from '../../../ui/lit/lit.js';
27
28
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
28
29
 
@@ -35,6 +36,7 @@ import {
35
36
  import type {StackTraceData} from './StackTrace.js';
36
37
 
37
38
  const {html} = Lit;
39
+ const {widgetConfig} = UI.Widget;
38
40
 
39
41
  const UIStrings = {
40
42
  /**
@@ -283,7 +285,6 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
283
285
  #protocolMonitorExperimentEnabled = false;
284
286
  #permissionsPolicies: Promise<Protocol.Page.PermissionsPolicyFeatureState[]|null>|null = null;
285
287
  #permissionsPolicySectionData: PermissionsPolicySectionData = {policies: [], showDetails: false};
286
- #originTrialTreeView: OriginTrialTreeView = new OriginTrialTreeView();
287
288
  #linkifier = new Components.Linkifier.Linkifier();
288
289
  #adScriptAncestry: Protocol.Page.AdScriptAncestry|null = null;
289
290
 
@@ -317,7 +318,7 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
317
318
  if (!this.#permissionsPolicies && this.#frame) {
318
319
  this.#permissionsPolicies = this.#frame.getPermissionsPolicyState();
319
320
  }
320
- await RenderCoordinator.write('FrameDetailsView render', () => {
321
+ await RenderCoordinator.write('FrameDetailsView render', async () => {
321
322
  if (!this.#frame) {
322
323
  return;
323
324
  }
@@ -331,7 +332,7 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
331
332
  ${this.#renderDocumentSection()}
332
333
  ${this.#renderIsolationSection()}
333
334
  ${this.#renderApiAvailabilitySection()}
334
- ${this.#renderOriginTrial()}
335
+ ${await this.#renderOriginTrial()}
335
336
  ${Lit.Directives.until(this.#permissionsPolicies?.then(policies => {
336
337
  this.#permissionsPolicySectionData.policies = policies || [];
337
338
  return html`
@@ -348,17 +349,12 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
348
349
  });
349
350
  }
350
351
 
351
- #renderOriginTrial(): Lit.LitTemplate {
352
+ async #renderOriginTrial(): Promise<Lit.LitTemplate> {
352
353
  if (!this.#frame) {
353
354
  return Lit.nothing;
354
355
  }
355
356
 
356
- this.#originTrialTreeView.classList.add('span-cols');
357
-
358
- void this.#frame.getOriginTrials().then(trials => {
359
- this.#originTrialTreeView.data = {trials};
360
- });
361
-
357
+ const data = {trials: await this.#frame.getOriginTrials()};
362
358
  // clang-format off
363
359
  return html`
364
360
  <devtools-report-section-header>
@@ -373,7 +369,8 @@ export class FrameDetailsReportView extends LegacyWrapper.LegacyWrapper.Wrappabl
373
369
  </x-link>
374
370
  </span>
375
371
  </devtools-report-section>
376
- ${this.#originTrialTreeView}
372
+ <devtools-widget class="span-cols" .widgetConfig=${widgetConfig(OriginTrialTreeView, {data})}>
373
+ </devtools-widget>
377
374
  <devtools-report-divider></devtools-report-divider>`;
378
375
  // clang-format on
379
376
  }