chrome-devtools-frontend 1.0.1535712 → 1.0.1537268

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/docs/contributing/images/issues-nearestslo.png +0 -0
  2. package/docs/contributing/issues.md +17 -21
  3. package/front_end/core/common/Console.ts +1 -8
  4. package/front_end/core/common/ParsedURL.ts +10 -20
  5. package/front_end/core/common/SegmentedRange.ts +1 -2
  6. package/front_end/core/common/StringOutputStream.ts +1 -4
  7. package/front_end/core/host/AidaClient.ts +64 -5
  8. package/front_end/core/host/DispatchHttpRequestClient.ts +62 -0
  9. package/front_end/core/host/GdpClient.ts +8 -57
  10. package/front_end/core/host/host.ts +2 -0
  11. package/front_end/core/i18n/i18nImpl.ts +0 -24
  12. package/front_end/core/protocol_client/CDPConnection.ts +10 -8
  13. package/front_end/core/protocol_client/InspectorBackend.ts +36 -42
  14. package/front_end/core/sdk/AnimationModel.ts +1 -2
  15. package/front_end/core/sdk/CSSMatchedStyles.ts +2 -2
  16. package/front_end/core/sdk/CSSModel.ts +1 -1
  17. package/front_end/core/sdk/CSSProperty.ts +3 -6
  18. package/front_end/core/sdk/CSSStyleDeclaration.ts +4 -4
  19. package/front_end/core/sdk/DebuggerModel.ts +1 -2
  20. package/front_end/core/sdk/EnhancedTracesParser.ts +24 -5
  21. package/front_end/core/sdk/RehydratingConnection.ts +112 -4
  22. package/front_end/core/sdk/RehydratingObject.ts +8 -0
  23. package/front_end/core/sdk/SourceMap.ts +2 -3
  24. package/front_end/core/sdk/TraceObject.ts +5 -1
  25. package/front_end/entrypoints/node_app/NodeConnectionsPanel.ts +2 -1
  26. package/front_end/generated/InspectorBackendCommands.js +1 -2
  27. package/front_end/generated/SupportedCSSProperties.js +19 -0
  28. package/front_end/generated/protocol.ts +0 -27
  29. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  30. package/front_end/models/trace/types/File.ts +9 -0
  31. package/front_end/panels/accessibility/AccessibilityNodeView.ts +18 -17
  32. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +9 -12
  33. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +5 -9
  34. package/front_end/panels/ai_assistance/components/ChatView.ts +63 -74
  35. package/front_end/panels/application/AppManifestView.ts +7 -6
  36. package/front_end/panels/application/ApplicationPanelSidebar.ts +4 -4
  37. package/front_end/panels/application/BackForwardCacheTreeElement.ts +2 -6
  38. package/front_end/panels/application/OpenedWindowDetailsView.ts +6 -6
  39. package/front_end/panels/application/StorageView.ts +9 -8
  40. package/front_end/panels/application/components/BackForwardCacheView.ts +366 -342
  41. package/front_end/panels/application/components/FrameDetailsView.ts +8 -11
  42. package/front_end/panels/application/components/OriginTrialTreeView.ts +65 -69
  43. package/front_end/panels/application/components/ProtocolHandlersView.ts +3 -2
  44. package/front_end/panels/application/components/backForwardCacheView.css +4 -0
  45. package/front_end/panels/application/components/badge.css +1 -1
  46. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +2 -1
  47. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +44 -53
  48. package/front_end/panels/browser_debugger/ObjectEventListenersSidebarPane.ts +8 -8
  49. package/front_end/panels/common/BadgeNotification.ts +2 -1
  50. package/front_end/panels/common/GdpSignUpDialog.ts +2 -1
  51. package/front_end/panels/console/ConsoleInsightTeaser.ts +8 -2
  52. package/front_end/panels/console/ConsolePinPane.ts +12 -7
  53. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +9 -9
  54. package/front_end/panels/elements/ComputedStyleWidget.ts +7 -7
  55. package/front_end/panels/elements/EventListenersWidget.ts +9 -9
  56. package/front_end/panels/elements/NodeStackTraceWidget.ts +6 -6
  57. package/front_end/panels/elements/PlatformFontsWidget.ts +5 -5
  58. package/front_end/panels/elements/PropertiesWidget.ts +8 -8
  59. package/front_end/panels/layer_viewer/Layers3DView.ts +2 -1
  60. package/front_end/panels/layer_viewer/PaintProfilerView.ts +3 -3
  61. package/front_end/panels/network/RequestCookiesView.ts +2 -1
  62. package/front_end/panels/network/RequestTimingView.ts +2 -1
  63. package/front_end/panels/recorder/RecorderController.ts +33 -23
  64. package/front_end/panels/recorder/components/CreateRecordingView.ts +259 -226
  65. package/front_end/panels/security/CookieControlsView.ts +2 -1
  66. package/front_end/panels/security/CookieReportView.ts +3 -2
  67. package/front_end/panels/settings/AISettingsTab.ts +164 -172
  68. package/front_end/panels/settings/KeybindsSettingsTab.ts +6 -0
  69. package/front_end/panels/settings/SettingsScreen.ts +3 -7
  70. package/front_end/panels/settings/aiSettingsTab.css +151 -148
  71. package/front_end/panels/settings/components/SyncSection.ts +2 -1
  72. package/front_end/panels/settings/settings-meta.ts +1 -2
  73. package/front_end/panels/sources/AddSourceMapURLDialog.ts +23 -26
  74. package/front_end/panels/sources/DebuggerPausedMessage.ts +4 -3
  75. package/front_end/panels/sources/ResourceOriginPlugin.ts +3 -2
  76. package/front_end/panels/sources/SourcesNavigator.ts +2 -1
  77. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -2
  78. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +9 -9
  79. package/front_end/panels/timeline/TimelinePanel.ts +60 -11
  80. package/front_end/panels/timeline/TimelineUIUtils.ts +3 -2
  81. package/front_end/panels/timeline/components/DetailsView.ts +5 -4
  82. package/front_end/panels/timeline/components/ExportTraceOptions.ts +33 -34
  83. package/front_end/panels/timeline/components/FieldSettingsDialog.ts +2 -1
  84. package/front_end/panels/timeline/components/LiveMetricsView.ts +5 -4
  85. package/front_end/panels/timeline/components/MetricCompareStrings.ts +25 -24
  86. package/front_end/panels/timeline/components/insights/LCPDiscovery.ts +2 -1
  87. package/front_end/third_party/chromium/README.chromium +2 -2
  88. package/front_end/third_party/puppeteer/README.chromium +2 -2
  89. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts +9 -1
  90. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.d.ts.map +1 -1
  91. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Browser.js.map +1 -1
  92. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts +2 -2
  93. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.d.ts.map +1 -1
  94. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/BrowserContext.js.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +13 -1
  96. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts +2 -2
  99. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js +5 -2
  101. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/BrowserContext.js.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts +2 -2
  103. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.d.ts.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js +3 -1
  105. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/Page.js.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Realm.d.ts +1 -12
  107. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts +6 -0
  109. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js +1 -0
  111. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Accessibility.js.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts +2 -2
  113. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +6 -1
  115. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts +2 -1
  117. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js +2 -2
  119. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/BrowserContext.js.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts +2 -2
  121. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.d.ts.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js +3 -1
  123. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Page.js.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  126. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  127. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  129. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.d.ts +2 -2
  130. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.d.ts.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.js +3 -1
  132. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/disposable.js.map +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.d.ts +1 -0
  134. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.d.ts.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.js +1 -0
  136. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/util.js.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  138. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +28 -3
  140. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +21 -10
  141. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts +9 -1
  142. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.d.ts.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Browser.js.map +1 -1
  144. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts +2 -2
  145. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.d.ts.map +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/BrowserContext.js.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Input.d.ts.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +13 -1
  150. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts +2 -2
  153. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.d.ts.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js +5 -2
  155. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/BrowserContext.js.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts +2 -2
  157. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.d.ts.map +1 -1
  158. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js +3 -1
  159. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/Page.js.map +1 -1
  160. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Realm.d.ts +1 -12
  161. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Realm.d.ts.map +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts +6 -0
  163. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js +1 -0
  165. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Accessibility.js.map +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts +2 -2
  167. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +6 -1
  169. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts +2 -1
  171. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.d.ts.map +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js +2 -2
  173. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/BrowserContext.js.map +1 -1
  174. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts +2 -2
  175. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.d.ts.map +1 -1
  176. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js +3 -1
  177. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Page.js.map +1 -1
  178. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  179. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  180. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  181. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.d.ts +2 -2
  182. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.d.ts.map +1 -1
  183. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.js +2 -2
  184. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/disposable.js.map +1 -1
  185. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.d.ts +1 -0
  186. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.d.ts.map +1 -1
  187. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.js +1 -0
  188. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/util.js.map +1 -1
  189. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  190. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  191. package/front_end/third_party/puppeteer/package/lib/types.d.ts +28 -3
  192. package/front_end/third_party/puppeteer/package/package.json +2 -2
  193. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +13 -1
  194. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +7 -2
  195. package/front_end/third_party/puppeteer/package/src/api/Page.ts +14 -1
  196. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +8 -5
  197. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +5 -2
  198. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +8 -0
  199. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +11 -2
  200. package/front_end/third_party/puppeteer/package/src/cdp/BrowserContext.ts +3 -2
  201. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +5 -5
  202. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  203. package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
  204. package/front_end/third_party/puppeteer/package/src/util/util.ts +1 -0
  205. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  206. package/front_end/ui/components/docs/tooltip/basic.ts +1 -1
  207. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +280 -0
  208. package/front_end/ui/components/text_editor/text_editor.ts +1 -0
  209. package/front_end/ui/components/tooltips/Tooltip.ts +33 -18
  210. package/front_end/ui/i18n/i18n.ts +31 -0
  211. package/front_end/ui/legacy/Dialog.ts +0 -1
  212. package/front_end/ui/legacy/SettingsUI.ts +0 -14
  213. package/front_end/ui/legacy/SoftDropDown.ts +1 -12
  214. package/front_end/ui/legacy/ViewManager.ts +2 -4
  215. package/front_end/ui/legacy/Widget.ts +33 -17
  216. package/front_end/ui/legacy/XLink.ts +0 -3
  217. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +9 -0
  218. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +2 -1
  219. package/front_end/ui/legacy/components/utils/Linkifier.ts +9 -3
  220. package/front_end/ui/legacy/legacy.ts +0 -2
  221. package/front_end/ui/visual_logging/KnownContextValues.ts +4 -1
  222. package/mcp/mcp.ts +6 -0
  223. package/package.json +1 -1
  224. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatterBounds.snapshot.txt +0 -4
  225. package/front_end/ui/components/docs/breadcrumbs_perf/initial-breadcrumb-perf.html +0 -20
  226. package/front_end/ui/components/docs/breadcrumbs_perf/initial-breadcrumb-perf.ts +0 -25
  227. package/front_end/ui/components/docs/breadcrumbs_perf/nested-breadcrumbs-perf.html +0 -20
  228. package/front_end/ui/components/docs/breadcrumbs_perf/nested-breadcrumbs-perf.ts +0 -36
  229. package/front_end/ui/components/docs/recorder_create_recording_view/basic.html +0 -20
  230. package/front_end/ui/components/docs/recorder_create_recording_view/basic.ts +0 -27
  231. package/front_end/ui/legacy/ThrottledWidget.ts +0 -48
@@ -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
  }
@@ -11,6 +11,7 @@ import * as i18n from '../../../core/i18n/i18n.js';
11
11
  import * as Protocol from '../../../generated/protocol.js';
12
12
  import * as Adorners from '../../../ui/components/adorners/adorners.js';
13
13
  import type * as TreeOutline from '../../../ui/components/tree_outline/tree_outline.js';
14
+ import * as UI from '../../../ui/legacy/legacy.js';
14
15
  import * as Lit from '../../../ui/lit/lit.js';
15
16
 
16
17
  import badgeStyles from './badge.css.js';
@@ -79,34 +80,18 @@ export interface BadgeData {
79
80
  style: 'error'|'success'|'secondary';
80
81
  }
81
82
 
82
- export class Badge extends HTMLElement {
83
- readonly #shadow = this.attachShadow({mode: 'open'});
84
- #adorner = new Adorners.Adorner.Adorner();
85
-
86
- set data(data: BadgeData) {
87
- this.#render(data);
88
- }
89
-
90
- #render(data: BadgeData): void {
91
- const adornerContent = document.createElement('span');
92
- adornerContent.textContent = data.badgeContent;
93
- this.#adorner.data = {
94
- name: 'badge',
95
- content: adornerContent,
96
- };
97
- this.#adorner.classList.add(`badge-${data.style}`);
98
-
99
- Lit.render(
100
- html`
101
- <style>${badgeStyles}</style>
102
- ${this.#adorner}
103
- `,
104
- this.#shadow, {host: this});
105
- }
83
+ function createBadge(data: BadgeData): Adorners.Adorner.Adorner {
84
+ const adorner = new Adorners.Adorner.Adorner();
85
+ const adornerContent = document.createElement('span');
86
+ adornerContent.textContent = data.badgeContent;
87
+ adorner.data = {
88
+ name: 'badge',
89
+ content: adornerContent,
90
+ };
91
+ adorner.classList.add(`badge-${data.style}`);
92
+ return adorner;
106
93
  }
107
94
 
108
- customElements.define('devtools-resources-origin-trial-tree-view-badge', Badge);
109
-
110
95
  type TreeNode<DataType> = TreeOutline.TreeOutlineUtils.TreeNode<DataType>;
111
96
 
112
97
  /**
@@ -127,19 +112,18 @@ function constructOriginTrialTree(originTrial: Protocol.Page.OriginTrial): TreeN
127
112
  constructTokenDetailsNodes(originTrial.tokensWithStatus[0]),
128
113
  renderer: (node: TreeNode<OriginTrialTreeNodeData>) => {
129
114
  const trial = node.treeNodeData as Protocol.Page.OriginTrial;
130
- const tokenCountBadge = html`
131
- <devtools-resources-origin-trial-tree-view-badge .data=${{
115
+ const tokenCountBadge = createBadge({
132
116
  badgeContent: i18nString(UIStrings.tokens, {PH1: trial.tokensWithStatus.length}),
133
117
  style: 'secondary',
134
- } as BadgeData}></devtools-resources-origin-trial-tree-view-badge>
135
- `;
118
+ });
136
119
 
137
120
  return html`
138
121
  ${trial.trialName}
139
- <devtools-resources-origin-trial-tree-view-badge .data=${{
122
+ <style>${badgeStyles}</style>
123
+ ${createBadge({
140
124
  badgeContent: trial.status,
141
125
  style: trial.status === Protocol.Page.OriginTrialStatus.Enabled ? 'success' : 'error',
142
- } as BadgeData}></devtools-resources-origin-trial-tree-view-badge>
126
+ })}
143
127
  ${trial.tokensWithStatus.length > 1 ? tokenCountBadge : Lit.nothing}
144
128
  `;
145
129
  },
@@ -153,12 +137,10 @@ function constructTokenNode(token: Protocol.Page.OriginTrialTokenWithStatus): Tr
153
137
  children: async () => constructTokenDetailsNodes(token),
154
138
  renderer: (node: TreeNode<OriginTrialTreeNodeData>, state: {isExpanded: boolean}) => {
155
139
  const tokenStatus = node.treeNodeData as string;
156
- const statusBadge = html`
157
- <devtools-resources-origin-trial-tree-view-badge .data=${{
140
+ const statusBadge = createBadge({
158
141
  badgeContent: tokenStatus,
159
142
  style: tokenStatus === Protocol.Page.OriginTrialTokenStatus.Success ? 'success' : 'error',
160
- } as BadgeData}></devtools-resources-origin-trial-tree-view-badge>
161
- `;
143
+ });
162
144
  // Only display token status for convenience when the node is not expanded.
163
145
  return html`${i18nString(UIStrings.token)} ${state.isExpanded ? Lit.nothing : statusBadge}`;
164
146
  },
@@ -290,10 +272,11 @@ export class OriginTrialTokenRows extends HTMLElement {
290
272
  {
291
273
  name: i18nString(UIStrings.status),
292
274
  value: html`
293
- <devtools-resources-origin-trial-tree-view-badge .data=${{
275
+ <style>${badgeStyles}</style>
276
+ ${createBadge({
294
277
  badgeContent: this.#tokenWithStatus.status,
295
278
  style: this.#tokenWithStatus.status === Protocol.Page.OriginTrialTokenStatus.Success ? 'success' : 'error',
296
- } as BadgeData}></devtools-resources-origin-trial-tree-view-badge>`,
279
+ })}`,
297
280
  },
298
281
  ...this.#parsedTokenDetails,
299
282
  ];
@@ -307,7 +290,9 @@ export class OriginTrialTokenRows extends HTMLElement {
307
290
 
308
291
  Lit.render(
309
292
  html`
310
- <style>${originTrialTokenRowsStyles}</style>
293
+ <style>
294
+ ${originTrialTokenRowsStyles}
295
+ </style>
311
296
  <div class="content">
312
297
  ${tokenDetailRows}
313
298
  </div>
@@ -322,45 +307,56 @@ export interface OriginTrialTreeViewData {
322
307
  trials: Protocol.Page.OriginTrial[];
323
308
  }
324
309
 
325
- export class OriginTrialTreeView extends HTMLElement {
326
- readonly #shadow = this.attachShadow({mode: 'open'});
310
+ type View = (input: OriginTrialTreeViewData, output: undefined, target: HTMLElement) => void;
327
311
 
328
- set data(data: OriginTrialTreeViewData) {
329
- this.#render(data.trials);
312
+ const DEFAULT_VIEW: View = (input, _output, target) => {
313
+ if (!input.trials.length) {
314
+ // clang-format off
315
+ Lit.render(html`
316
+ <style>${originTrialTreeViewStyles}</style>
317
+ <span class="status-badge">
318
+ <devtools-icon class="medium" name="clear"></devtools-icon>
319
+ <span>${i18nString(UIStrings.noTrialTokens)}</span>
320
+ </span>`, target);
321
+ // clang-format on
322
+ return;
330
323
  }
331
324
 
332
- #render(trials: Protocol.Page.OriginTrial[]): void {
333
- if (!trials.length) {
334
- Lit.render(
335
- html`
336
- <style>${originTrialTreeViewStyles}</style>
337
- <span class="status-badge">
338
- <devtools-icon class="medium" name="clear"></devtools-icon>
339
- <span>${i18nString(UIStrings.noTrialTokens)}</span>
340
- </span>`,
341
- this.#shadow, {host: this});
342
- return;
343
- }
325
+ // clang-format off
326
+ Lit.render(html`
327
+ <style>
328
+ ${originTrialTreeViewStyles}
329
+ </style>
330
+ <devtools-tree-outline .data=${{
331
+ tree: input.trials.map(constructOriginTrialTree),
332
+ defaultRenderer,
333
+ } as TreeOutline.TreeOutline.TreeOutlineData < OriginTrialTreeNodeData >}>
334
+ </devtools-tree-outline>
335
+ `, target);
336
+ // clang-format on
337
+ };
338
+
339
+ export class OriginTrialTreeView extends UI.Widget.Widget {
340
+ #data: OriginTrialTreeViewData = {trials: []};
341
+ #view: View;
342
+
343
+ constructor(element?: HTMLElement, view: View = DEFAULT_VIEW) {
344
+ super(element, {useShadowDom: true});
345
+ this.#view = view;
346
+ }
344
347
 
345
- Lit.render(
346
- html`
347
- <style>${originTrialTreeViewStyles}</style>
348
- <devtools-tree-outline .data=${{
349
- tree: trials.map(constructOriginTrialTree),
350
- defaultRenderer,
351
- } as TreeOutline.TreeOutline.TreeOutlineData < OriginTrialTreeNodeData >}>
352
- </devtools-tree-outline>
353
- `,
354
- this.#shadow, {host: this});
348
+ set data(data: OriginTrialTreeViewData) {
349
+ this.#data = data;
350
+ this.requestUpdate();
355
351
  }
356
- }
357
352
 
358
- customElements.define('devtools-resources-origin-trial-tree-view', OriginTrialTreeView);
353
+ override performUpdate(): void {
354
+ this.#view(this.#data, undefined, this.contentElement);
355
+ }
356
+ }
359
357
 
360
358
  declare global {
361
359
  interface HTMLElementTagNameMap {
362
- 'devtools-resources-origin-trial-tree-view': OriginTrialTreeView;
363
360
  'devtools-resources-origin-trial-token-rows': OriginTrialTokenRows;
364
- 'devtools-resources-origin-trial-tree-view-badge': Badge;
365
361
  }
366
362
  }
@@ -10,6 +10,7 @@ import * as i18n from '../../../core/i18n/i18n.js';
10
10
  import * as Platform from '../../../core/platform/platform.js';
11
11
  import * as Buttons from '../../../ui/components/buttons/buttons.js';
12
12
  import * as Input from '../../../ui/components/input/input.js';
13
+ import * as uiI18n from '../../../ui/i18n/i18n.js';
13
14
  import * as UI from '../../../ui/legacy/legacy.js';
14
15
  import * as Lit from '../../../ui/lit/lit.js';
15
16
  import * as VisualLogging from '../../../ui/visual_logging/visual_logging.js';
@@ -116,7 +117,7 @@ export class ProtocolHandlersView extends HTMLElement {
116
117
  <devtools-icon class="inline-icon"
117
118
  name=${this.#protocolHandlers.length > 0 ? 'check-circle' : 'info'}>
118
119
  </devtools-icon>
119
- ${i18n.i18n.getFormatLocalizedString(str_, statusString, {
120
+ ${uiI18n.getFormatLocalizedString(str_, statusString, {
120
121
  PH1: manifestInTextLink,
121
122
  })}
122
123
  </div>
@@ -175,7 +176,7 @@ export class ProtocolHandlersView extends HTMLElement {
175
176
  <style>${Input.textInputStyles}</style>
176
177
  ${this.#renderStatusMessage()}
177
178
  <div class="protocol-handlers-row">
178
- ${i18n.i18n.getFormatLocalizedString(str_, UIStrings.needHelpReadOur, {PH1: protocolDocLink})}
179
+ ${uiI18n.getFormatLocalizedString(str_, UIStrings.needHelpReadOur, {PH1: protocolDocLink})}
179
180
  </div>
180
181
  ${this.#renderProtocolTest()}
181
182
  `, this.#shadow, {host: this});
@@ -73,6 +73,10 @@ devtools-report-value:has(devtools-tree-outline) {
73
73
  margin-left: var(--sys-size-7);
74
74
  }
75
75
 
76
+ .cache-status-section:focus-visible {
77
+ outline: 0;
78
+ }
79
+
76
80
  .tree-outline li .selection {
77
81
  margin-left: -5px;
78
82
  }
@@ -20,6 +20,6 @@
20
20
  }
21
21
 
22
22
  /* Use mono-space source code font to assist reading of adorner content */
23
- :host {
23
+ :host devtools-adorner {
24
24
  font-family: var(--source-code-font-family);
25
25
  }
@@ -13,6 +13,7 @@ import * as ChromeLink from '../../../../ui/components/chrome_link/chrome_link.j
13
13
  import * as Dialogs from '../../../../ui/components/dialogs/dialogs.js';
14
14
  import * as LegacyWrapper from '../../../../ui/components/legacy_wrapper/legacy_wrapper.js';
15
15
  import * as RenderCoordinator from '../../../../ui/components/render_coordinator/render_coordinator.js';
16
+ import * as uiI18n from '../../../../ui/i18n/i18n.js';
16
17
  import * as UI from '../../../../ui/legacy/legacy.js';
17
18
  import * as Lit from '../../../../ui/lit/lit.js';
18
19
  import * as VisualLogging from '../../../../ui/visual_logging/visual_logging.js';
@@ -214,7 +215,7 @@ export class PreloadingDisabledInfobar extends LegacyWrapper.LegacyWrapper.Wrapp
214
215
  const extensionsSettingLink = new ChromeLink.ChromeLink.ChromeLink();
215
216
  extensionsSettingLink.href = 'chrome://extensions' as Platform.DevToolsPath.UrlString;
216
217
  extensionsSettingLink.textContent = i18nString(UIStrings.extensionsSettings);
217
- const description = i18n.i18n.getFormatLocalizedString(
218
+ const description = uiI18n.getFormatLocalizedString(
218
219
  str_, UIStrings.descriptionDisabledByPreference, {PH1: preloadingSettingLink, PH2: extensionsSettingLink});
219
220
  return this.#maybeKeyValue(
220
221
  this.#data.disabledByPreference, i18nString(UIStrings.headerDisabledByPreference), description);
@@ -126,10 +126,9 @@ const str_ = i18n.i18n.registerUIStrings('panels/browser_debugger/CategorizedBre
126
126
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
127
127
  const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
128
128
 
129
- const {html, render, Directives: {ref}} = Lit;
129
+ const {html, render} = Lit;
130
130
 
131
131
  interface ViewOutput {
132
- defaultFocus: Element|undefined;
133
132
  userExpandedCategories: Set<SDK.CategorizedBreakpoint.Category>;
134
133
  }
135
134
  interface ViewInput {
@@ -211,53 +210,49 @@ export const DEFAULT_VIEW = (input: ViewInput, output: ViewOutput, target: HTMLE
211
210
  style="flex: 1;"
212
211
  ></devtools-toolbar-input>
213
212
  </devtools-toolbar>
214
- <devtools-tree
215
- ${ref(e => { output.defaultFocus = e; })}
216
- .template=${html`
217
- <ul role="tree">
218
- ${filteredCategories.map(([category, breakpoints]) => html`
219
- <li @expand=${(e: UI.TreeOutline.TreeViewElement.ExpandEvent) => onExpand(category, e)}
220
- role="treeitem"
221
- jslog-context=${category}
222
- aria-checked=${breakpoints.some(breakpoint => breakpoint.enabled())
223
- ? breakpoints.some(breakpoint => !breakpoint.enabled()) ? 'mixed' : true
224
- : false}>
225
- <style>${categorizedBreakpointsSidebarPaneStyles}</style>
226
- <devtools-checkbox
227
- class="small"
228
- tabIndex=-1
229
- title=${getLocalizedCategory(category)}
230
- ?indeterminate=${breakpoints.some(breakpoint => !breakpoint.enabled()) &&
231
- breakpoints.some(breakpoint => breakpoint.enabled())}
232
- ?checked=${!breakpoints.some(breakpoint => !breakpoint.enabled())}
233
- @change=${(e: Event) => onCheckboxClicked(e, category)}
234
- >${getLocalizedCategory(category)}</devtools-checkbox>
235
- <ul
236
- role="group"
237
- ?hidden=${!shouldExpandCategory(breakpoints) && !input.userExpandedCategories.has(category)}>
238
- ${breakpoints.map(breakpoint => html`
239
- <li
240
- role="treeitem"
241
- aria-checked=${breakpoint.enabled()}
242
- jslog-context=${Platform.StringUtilities.toKebabCase(breakpoint.name)}>
243
- <div ?hidden=${breakpoint !== input.highlightedItem} class="breakpoint-hit-marker"></div>
244
- <devtools-checkbox
245
- class=${classes(breakpoint)}
246
- tabIndex=-1
247
- title=${Sources.CategorizedBreakpointL10n.getLocalizedBreakpointName(breakpoint.name)}
248
- ?checked=${breakpoint.enabled()}
249
- aria-description=${breakpoint === input.highlightedItem ? i18nString(UIStrings.breakpointHit)
250
- : Lit.nothing}
251
- @change=${(e: Event) => onCheckboxClicked(e, breakpoint)}
252
- >${Sources.CategorizedBreakpointL10n.getLocalizedBreakpointName(breakpoint.name)}</devtools-checkbox>
253
- </li>`)}
254
- </ul>
255
- </li>`)}
256
- </ul>
257
- `}>
258
- </devtools-tree>`,
259
- // clang-format on
260
- target);
213
+ <devtools-tree autofocus .template=${html`
214
+ <ul role="tree">
215
+ ${filteredCategories.map(([category, breakpoints]) => html`
216
+ <li @expand=${(e: UI.TreeOutline.TreeViewElement.ExpandEvent) => onExpand(category, e)}
217
+ role="treeitem"
218
+ jslog-context=${category}
219
+ aria-checked=${breakpoints.some(breakpoint => breakpoint.enabled())
220
+ ? breakpoints.some(breakpoint => !breakpoint.enabled()) ? 'mixed' : true
221
+ : false}>
222
+ <style>${categorizedBreakpointsSidebarPaneStyles}</style>
223
+ <devtools-checkbox
224
+ class="small"
225
+ tabIndex=-1
226
+ title=${getLocalizedCategory(category)}
227
+ ?indeterminate=${breakpoints.some(breakpoint => !breakpoint.enabled()) &&
228
+ breakpoints.some(breakpoint => breakpoint.enabled())}
229
+ ?checked=${!breakpoints.some(breakpoint => !breakpoint.enabled())}
230
+ @change=${(e: Event) => onCheckboxClicked(e, category)}
231
+ >${getLocalizedCategory(category)}</devtools-checkbox>
232
+ <ul
233
+ role="group"
234
+ ?hidden=${!shouldExpandCategory(breakpoints) && !input.userExpandedCategories.has(category)}>
235
+ ${breakpoints.map(breakpoint => html`
236
+ <li
237
+ role="treeitem"
238
+ aria-checked=${breakpoint.enabled()}
239
+ jslog-context=${Platform.StringUtilities.toKebabCase(breakpoint.name)}>
240
+ <div ?hidden=${breakpoint !== input.highlightedItem} class="breakpoint-hit-marker"></div>
241
+ <devtools-checkbox
242
+ class=${classes(breakpoint)}
243
+ tabIndex=-1
244
+ title=${Sources.CategorizedBreakpointL10n.getLocalizedBreakpointName(breakpoint.name)}
245
+ ?checked=${breakpoint.enabled()}
246
+ aria-description=${breakpoint === input.highlightedItem ? i18nString(UIStrings.breakpointHit)
247
+ : Lit.nothing}
248
+ @change=${(e: Event) => onCheckboxClicked(e, breakpoint)}
249
+ >${Sources.CategorizedBreakpointL10n.getLocalizedBreakpointName(breakpoint.name)}</devtools-checkbox>
250
+ </li>`)}
251
+ </ul>
252
+ </li>`)}
253
+ </ul>`}>
254
+ </devtools-tree>`, target);
255
+ // clang-format on
261
256
  };
262
257
 
263
258
  export abstract class CategorizedBreakpointsSidebarPane extends UI.Widget.VBox {
@@ -341,11 +336,7 @@ export abstract class CategorizedBreakpointsSidebarPane extends UI.Widget.VBox {
341
336
  highlightedItem: this.#highlightedItem,
342
337
  userExpandedCategories: this.#userExpandedCategories,
343
338
  };
344
- const that = this;
345
339
  const output: ViewOutput = {
346
- set defaultFocus(e: Element|undefined) {
347
- that.setDefaultFocusedElement(e ?? null);
348
- },
349
340
  userExpandedCategories: this.#userExpandedCategories,
350
341
  };
351
342
  this.#view(input, output, this.contentElement);
@@ -9,8 +9,7 @@ import * as UI from '../../ui/legacy/legacy.js';
9
9
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
10
10
  import * as EventListeners from '../event_listeners/event_listeners.js';
11
11
 
12
- export class ObjectEventListenersSidebarPane extends UI.ThrottledWidget.ThrottledWidget implements
13
- UI.Toolbar.ItemsProvider {
12
+ export class ObjectEventListenersSidebarPane extends UI.Widget.VBox implements UI.Toolbar.ItemsProvider {
14
13
  #lastRequestedContext?: SDK.RuntimeModel.ExecutionContext;
15
14
 
16
15
  // TODO(bmeurer): This is only public for web tests.
@@ -21,11 +20,11 @@ export class ObjectEventListenersSidebarPane extends UI.ThrottledWidget.Throttle
21
20
  this.contentElement.setAttribute('jslog', `${VisualLogging.section('sources.global-listeners')}`);
22
21
 
23
22
  this.eventListenersView = new EventListeners.EventListenersView.EventListenersView();
24
- this.eventListenersView.changeCallback = this.update.bind(this);
23
+ this.eventListenersView.changeCallback = this.requestUpdate.bind(this);
25
24
  this.eventListenersView.enableDefaultTreeFocus = true;
26
25
  this.eventListenersView.show(this.element);
27
26
  this.setDefaultFocusedChild(this.eventListenersView);
28
- this.update();
27
+ this.requestUpdate();
29
28
  }
30
29
 
31
30
  toolbarItems(): UI.Toolbar.ToolbarItem[] {
@@ -34,7 +33,7 @@ export class ObjectEventListenersSidebarPane extends UI.ThrottledWidget.Throttle
34
33
  return [refreshButton];
35
34
  }
36
35
 
37
- protected override async doUpdate(): Promise<void> {
36
+ override async performUpdate(): Promise<void> {
38
37
  if (this.#lastRequestedContext) {
39
38
  this.#lastRequestedContext.runtimeModel.releaseObjectGroup(objectGroupName);
40
39
  this.#lastRequestedContext = undefined;
@@ -64,13 +63,14 @@ export class ObjectEventListenersSidebarPane extends UI.ThrottledWidget.Throttle
64
63
 
65
64
  override wasShown(): void {
66
65
  super.wasShown();
67
- UI.Context.Context.instance().addFlavorChangeListener(SDK.RuntimeModel.ExecutionContext, this.update, this);
66
+ UI.Context.Context.instance().addFlavorChangeListener(SDK.RuntimeModel.ExecutionContext, this.requestUpdate, this);
68
67
  UI.Context.Context.instance().setFlavor(ObjectEventListenersSidebarPane, this);
69
68
  }
70
69
 
71
70
  override willHide(): void {
72
71
  UI.Context.Context.instance().setFlavor(ObjectEventListenersSidebarPane, null);
73
- UI.Context.Context.instance().removeFlavorChangeListener(SDK.RuntimeModel.ExecutionContext, this.update, this);
72
+ UI.Context.Context.instance().removeFlavorChangeListener(
73
+ SDK.RuntimeModel.ExecutionContext, this.requestUpdate, this);
74
74
  super.willHide();
75
75
  if (this.#lastRequestedContext) {
76
76
  this.#lastRequestedContext.runtimeModel.releaseObjectGroup(objectGroupName);
@@ -85,7 +85,7 @@ export class ActionDelegate implements UI.ActionRegistration.ActionDelegate {
85
85
  case 'browser-debugger.refresh-global-event-listeners': {
86
86
  const eventListenersSidebarPane = context.flavor(ObjectEventListenersSidebarPane);
87
87
  if (eventListenersSidebarPane) {
88
- eventListenersSidebarPane.update();
88
+ eventListenersSidebarPane.requestUpdate();
89
89
  return true;
90
90
  }
91
91
  return false;
@@ -7,6 +7,7 @@ import * as Host from '../../core/host/host.js';
7
7
  import * as i18n from '../../core/i18n/i18n.js';
8
8
  import * as Badges from '../../models/badges/badges.js';
9
9
  import * as Buttons from '../../ui/components/buttons/buttons.js';
10
+ import * as uiI18n from '../../ui/i18n/i18n.js';
10
11
  import * as UI from '../../ui/legacy/legacy.js';
11
12
  import * as Lit from '../../ui/lit/lit.js';
12
13
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
@@ -63,7 +64,7 @@ const UIStrings = {
63
64
 
64
65
  const str_ = i18n.i18n.registerUIStrings('panels/common/BadgeNotification.ts', UIStrings);
65
66
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
66
- const i18nFormatString = i18n.i18n.getFormatLocalizedString.bind(undefined, str_);
67
+ const i18nFormatString = uiI18n.getFormatLocalizedString.bind(undefined, str_);
67
68
  const lockedString = i18n.i18n.lockedString;
68
69
 
69
70
  const LEFT_OFFSET = 5;
@@ -12,6 +12,7 @@ import * as Geometry from '../../models/geometry/geometry.js';
12
12
  import * as Buttons from '../../ui/components/buttons/buttons.js';
13
13
  import * as Snackbars from '../../ui/components/snackbars/snackbars.js';
14
14
  import type * as Switch from '../../ui/components/switch/switch.js';
15
+ import * as uiI18n from '../../ui/i18n/i18n.js';
15
16
  import * as UI from '../../ui/legacy/legacy.js';
16
17
  import {html, render} from '../../ui/lit/lit.js';
17
18
 
@@ -150,7 +151,7 @@ export const DEFAULT_VIEW: View = (input, _output, target): void => {
150
151
  <h2 class="section-title">${i18nString(UIStrings.tailorProfile)}</h2>
151
152
  <div class="section-text">
152
153
  <div>${i18nString(UIStrings.tailorProfileBody)}</div><br/>
153
- <div>${i18n.i18n.getFormatLocalizedString(str_, UIStrings.tailorProfileBodyDisclaimer, {
154
+ <div>${uiI18n.getFormatLocalizedString(str_, UIStrings.tailorProfileBodyDisclaimer, {
154
155
  PH1: UI.XLink.XLink.create(CONTENT_POLICY_URL, i18nString(UIStrings.contentPolicy), 'link', undefined, 'content-policy'),
155
156
  PH2: UI.XLink.XLink.create(TERMS_OF_SERVICE_URL, i18nString(UIStrings.termsOfService), 'link',
156
157
  undefined, 'terms-of-service'),
@@ -164,7 +164,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: undefined, target: HTMLE
164
164
  ${input.hasTellMeMoreButton ? html`
165
165
  <devtools-button
166
166
  title=${lockedString(UIStringsNotTranslate.tellMeMore)}
167
- .jslogContext=${'insights-teaser-tell-me-more'},
167
+ .jslogContext=${'insights-teaser-tell-me-more'}
168
168
  .variant=${Buttons.Button.Variant.PRIMARY}
169
169
  @click=${input.onTellMeMoreClick}
170
170
  >
@@ -178,7 +178,13 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: undefined, target: HTMLE
178
178
  aria-details=${'teaser-info-tooltip-' + input.uuid}
179
179
  .accessibleLabel=${lockedString(UIStringsNotTranslate.learnDataUsage)}
180
180
  ></devtools-button>
181
- <devtools-tooltip id=${'teaser-info-tooltip-' + input.uuid} variant="rich" jslogContext="teaser-info-tooltip">
181
+ <devtools-tooltip
182
+ id=${'teaser-info-tooltip-' + input.uuid}
183
+ variant="rich"
184
+ jslogContext="teaser-info-tooltip"
185
+ trigger="both"
186
+ hover-delay=500
187
+ >
182
188
  <div class="info-tooltip-text">${lockedString(UIStringsNotTranslate.infoTooltipText)}</div>
183
189
  <div class="learn-more">
184
190
  <x-link
@@ -58,11 +58,13 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
58
58
 
59
59
  const elementToConsolePin = new WeakMap<Element, ConsolePin>();
60
60
 
61
- export class ConsolePinPane extends UI.ThrottledWidget.ThrottledWidget {
61
+ export class ConsolePinPane extends UI.Widget.VBox {
62
62
  private pins: Set<ConsolePin>;
63
63
  private readonly pinsSetting: Common.Settings.Setting<string[]>;
64
+ private readonly throttler: Common.Throttler.Throttler;
64
65
  constructor(private readonly liveExpressionButton: UI.Toolbar.ToolbarButton, private readonly focusOut: () => void) {
65
- super(true, 250);
66
+ super({useShadowDom: true});
67
+ this.throttler = new Common.Throttler.Throttler(250);
66
68
  this.registerRequiredCSS(consolePinPaneStyles, objectValueStyles);
67
69
  this.contentElement.classList.add('console-pins', 'monospace');
68
70
  this.contentElement.addEventListener('contextmenu', this.contextMenuEventFired.bind(this), false);
@@ -134,7 +136,7 @@ export class ConsolePinPane extends UI.ThrottledWidget.ThrottledWidget {
134
136
  if (userGesture) {
135
137
  void pin.focus();
136
138
  }
137
- this.update();
139
+ this.requestUpdate();
138
140
  }
139
141
 
140
142
  private focusedPinAfterDeletion(deletedPin: ConsolePin): ConsolePin|null {
@@ -153,16 +155,19 @@ export class ConsolePinPane extends UI.ThrottledWidget.ThrottledWidget {
153
155
  return null;
154
156
  }
155
157
 
156
- override async doUpdate(): Promise<void> {
158
+ override wasShown(): void {
159
+ super.wasShown();
160
+ void this.throttler.schedule(this.requestUpdate.bind(this));
161
+ }
162
+
163
+ override async performUpdate(): Promise<void> {
157
164
  if (!this.pins.size || !this.isShowing()) {
158
165
  return;
159
166
  }
160
- if (this.isShowing()) {
161
- this.update();
162
- }
163
167
  const updatePromises = Array.from(this.pins, pin => pin.updatePreview());
164
168
  await Promise.all(updatePromises);
165
169
  this.updatedForTest();
170
+ void this.throttler.schedule(this.requestUpdate.bind(this));
166
171
  }
167
172
 
168
173
  private updatedForTest(): void {