chrome-devtools-frontend 1.0.1721762 → 1.0.1726686

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 (273) hide show
  1. package/.agents/skills/review-ui-widgets/SKILL.md +7 -7
  2. package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +12 -0
  3. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +3 -3
  4. package/.agents/skills/ui-widgets/SKILL.md +2 -1
  5. package/docs/cookbook/dependencies.md +57 -11
  6. package/docs/get_the_code.md +15 -0
  7. package/front_end/core/i18n/collect-ui-strings.js +58 -12
  8. package/front_end/core/i18n/i18nImpl.ts +1 -1
  9. package/front_end/core/root/Runtime.ts +1 -1
  10. package/front_end/core/sdk/ResourceTreeModel.ts +16 -0
  11. package/front_end/core/sdk/WebAuthnModel.ts +17 -10
  12. package/front_end/entrypoints/js_app/js_app.ts +2 -5
  13. package/front_end/entrypoints/node_app/node_app.ts +2 -3
  14. package/front_end/generated/InspectorBackendCommands.ts +3 -3
  15. package/front_end/generated/protocol.ts +17 -0
  16. package/front_end/models/ai_assistance/skills/lighthouse.md +2 -1
  17. package/front_end/models/ai_assistance/skills/network.md +1 -0
  18. package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +26 -2
  19. package/front_end/models/ai_assistance/tools/GetLighthouseAudits.ts +1 -1
  20. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +2 -7
  21. package/front_end/models/ai_assistance/tools/RunLighthouse.ts +2 -2
  22. package/front_end/models/comment_manager/CD4ABridge.ts +4 -0
  23. package/front_end/models/comment_manager/CommentManager.ts +0 -6
  24. package/front_end/models/comment_manager/CommentThread.ts +39 -19
  25. package/front_end/models/elements/StyleChanges.ts +66 -0
  26. package/front_end/models/trace/EventsSerializer.ts +2 -7
  27. package/front_end/models/trace/ModelImpl.ts +0 -2
  28. package/front_end/models/trace/handlers/FlowsHandler.ts +37 -29
  29. package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +13 -6
  30. package/front_end/models/trace/helpers/SyntheticEvents.ts +10 -37
  31. package/front_end/models/trace/insights/RenderBlocking.ts +3 -1
  32. package/front_end/models/trace/lantern/simulation/Simulator.ts +4 -0
  33. package/front_end/models/trace/lantern/types/Lantern.ts +1 -0
  34. package/front_end/panels/accessibility/AccessibilityAnnouncementRecordingView.ts +92 -0
  35. package/front_end/panels/accessibility/SourceOrderView.ts +1 -1
  36. package/front_end/panels/accessibility/accessibilityAnnouncementRecordingListView.css +3 -1
  37. package/front_end/panels/accessibility/accessibilityAnnouncementRecordingView.css +12 -1
  38. package/front_end/panels/application/ApplicationPanelSidebar.ts +90 -0
  39. package/front_end/panels/application/StorageView.ts +348 -254
  40. package/front_end/panels/application/SubAppsView.ts +159 -0
  41. package/front_end/panels/application/application.ts +2 -0
  42. package/front_end/panels/application/preloading/PreloadingView.ts +360 -336
  43. package/front_end/panels/application/preloading/components/PreloadingDisabledInfobar.ts +3 -3
  44. package/front_end/panels/application/preloading/components/PreloadingGrid.ts +6 -3
  45. package/front_end/panels/application/preloading/components/RuleSetGrid.ts +17 -17
  46. package/front_end/panels/application/preloading/components/UsedPreloadingView.ts +2 -2
  47. package/front_end/panels/application/preloading/preloadingView.css +12 -4
  48. package/front_end/panels/application/preloading/preloadingViewDropDown.css +1 -1
  49. package/front_end/panels/application/storageView.css +16 -21
  50. package/front_end/panels/application/subAppsView.css +21 -0
  51. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +2 -2
  52. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +6 -8
  53. package/front_end/panels/comments/CommentsPane.ts +26 -9
  54. package/front_end/panels/comments/commentsPane.css +25 -6
  55. package/front_end/panels/common/CommentThreadWidget.ts +2 -2
  56. package/front_end/panels/common/CommentsOverlayWidget.ts +94 -35
  57. package/front_end/panels/common/commentThreadWidget.css +17 -0
  58. package/front_end/panels/common/commentsOverlay.css +5 -10
  59. package/front_end/panels/common/common-meta.ts +11 -1
  60. package/front_end/panels/elements/ClassesPaneWidget.ts +133 -89
  61. package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +7 -33
  62. package/front_end/panels/elements/DOMTreeElementWidget.ts +3 -1
  63. package/front_end/panels/elements/DOMTreeWidget.ts +19 -3
  64. package/front_end/panels/elements/ElementStatePaneWidget.ts +11 -1
  65. package/front_end/panels/elements/PropertyRenderer.ts +3 -2
  66. package/front_end/panels/elements/StyleEditorWidget.ts +87 -39
  67. package/front_end/panels/elements/StylePropertiesSection.ts +32 -5
  68. package/front_end/panels/elements/StylePropertyTreeElement.ts +227 -162
  69. package/front_end/panels/elements/StylesSidebarPane.ts +1 -0
  70. package/front_end/panels/event_listeners/EventListenersView.ts +11 -8
  71. package/front_end/panels/layer_viewer/Layers3DView.ts +21 -37
  72. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
  73. package/front_end/panels/network/NetworkConfigView.ts +12 -10
  74. package/front_end/panels/network/NetworkDataGridNode.ts +3 -1
  75. package/front_end/panels/network/RequestConditionsDrawer.ts +1 -1
  76. package/front_end/panels/network/RequestPayloadView.ts +12 -5
  77. package/front_end/panels/network/networkConfigView.css +8 -8
  78. package/front_end/panels/profiler/HeapProfileView.ts +28 -6
  79. package/front_end/panels/profiler/HeapSnapshotDataGrids.ts +7 -3
  80. package/front_end/panels/protocol_monitor/JSONEditor.ts +0 -1
  81. package/front_end/panels/recorder/RecorderPanel.ts +2 -2
  82. package/front_end/panels/screencast/ScreencastView.ts +3 -6
  83. package/front_end/panels/security/SecurityPanelSidebar.ts +0 -31
  84. package/front_end/panels/settings/SettingsScreen.ts +1 -1
  85. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +9 -16
  86. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +358 -345
  87. package/front_end/panels/settings/emulation/components/userAgentClientHintsForm.css +136 -121
  88. package/front_end/panels/sources/NavigatorView.ts +105 -45
  89. package/front_end/panels/sources/ScopeChainSidebarPane.ts +8 -5
  90. package/front_end/panels/sources/SourcesNavigator.ts +421 -213
  91. package/front_end/panels/sources/SourcesPanel.ts +9 -5
  92. package/front_end/panels/sources/TabbedEditorContainer.ts +41 -18
  93. package/front_end/panels/sources/UISourceCodeFrame.ts +1 -1
  94. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +10 -5
  95. package/front_end/panels/sources/sources-meta.ts +4 -15
  96. package/front_end/panels/sources/sourcesNavigator.css +5 -0
  97. package/front_end/panels/timeline/ModificationsManager.ts +0 -2
  98. package/front_end/panels/timeline/README.md +2 -0
  99. package/front_end/panels/timeline/TimelineCommentContext.ts +171 -0
  100. package/front_end/panels/timeline/TimelineCommentController.ts +168 -30
  101. package/front_end/panels/timeline/TimelinePanel.ts +4 -0
  102. package/front_end/panels/timeline/components/IgnoreListSetting.ts +1 -1
  103. package/front_end/panels/timeline/timeline.ts +2 -0
  104. package/front_end/panels/timeline/utils/Treemap.ts +8 -0
  105. package/front_end/panels/webauthn/WebauthnPane.ts +15 -13
  106. package/front_end/third_party/chromium/README.chromium +1 -1
  107. package/front_end/third_party/puppeteer/README.chromium +2 -2
  108. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +113 -3
  109. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +21311 -20981
  110. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +36 -0
  111. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +22 -0
  113. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +20 -18
  116. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.d.ts +20 -1
  118. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.d.ts.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js +2 -2
  120. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +40 -1
  122. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +3 -1
  124. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.d.ts +2 -0
  126. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.d.ts.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js +41 -5
  128. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js.map +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.d.ts +2 -1
  130. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.js +23 -2
  132. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPRequest.js.map +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Input.js +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +3 -2
  135. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
  136. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +13 -1
  137. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
  138. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Request.d.ts +1 -0
  139. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Request.d.ts.map +1 -1
  140. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Request.js +18 -11
  141. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/Request.js.map +1 -1
  142. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.d.ts +2 -1
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js +8 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js.map +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +2 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +24 -12
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.d.ts +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.d.ts.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.js +13 -7
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.js.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.d.ts.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js +5 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js.map +1 -1
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.d.ts +22 -1
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.d.ts.map +1 -1
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js +75 -9
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js.map +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkEventManager.d.ts +18 -4
  162. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkEventManager.d.ts.map +1 -1
  163. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkEventManager.js +8 -4
  164. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkEventManager.js.map +1 -1
  165. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js +65 -26
  167. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +3 -2
  169. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js +19 -0
  171. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.d.ts.map +1 -1
  173. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js +4 -3
  174. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ScreenRecording.js.map +1 -1
  175. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.d.ts +1 -0
  176. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.d.ts.map +1 -1
  177. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js +4 -0
  178. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js.map +1 -1
  179. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.d.ts +2 -0
  180. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  181. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js +95 -8
  182. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js.map +1 -1
  183. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.d.ts +0 -8
  184. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.d.ts.map +1 -1
  185. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js +8 -24
  186. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js.map +1 -1
  187. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts +1 -0
  188. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.d.ts.map +1 -1
  189. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js +5 -4
  190. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js.map +1 -1
  191. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +9 -0
  192. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  193. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/WaitTask.d.ts.map +1 -1
  194. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/WaitTask.js +10 -0
  195. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/WaitTask.js.map +1 -1
  196. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.d.ts +10 -0
  197. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.d.ts.map +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.js +30 -5
  199. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.js.map +1 -1
  200. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  201. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  202. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  203. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  204. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/Poller.d.ts +2 -0
  205. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/Poller.d.ts.map +1 -1
  206. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/Poller.js +33 -3
  207. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/Poller.js.map +1 -1
  208. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  209. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +1 -2
  210. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  211. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts +4 -0
  212. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.d.ts.map +1 -1
  213. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js +1 -0
  214. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js.map +1 -1
  215. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  216. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  217. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js.map +1 -1
  218. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/encoding.d.ts +2 -2
  219. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/encoding.d.ts.map +1 -1
  220. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  221. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  222. package/front_end/third_party/puppeteer/package/lib/types.d.ts +113 -3
  223. package/front_end/third_party/puppeteer/package/package.json +4 -4
  224. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +42 -0
  225. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +25 -22
  226. package/front_end/third_party/puppeteer/package/src/api/HTTPRequest.ts +22 -2
  227. package/front_end/third_party/puppeteer/package/src/api/Page.ts +45 -2
  228. package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +79 -32
  229. package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +32 -12
  230. package/front_end/third_party/puppeteer/package/src/bidi/Input.ts +1 -1
  231. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +18 -2
  232. package/front_end/third_party/puppeteer/package/src/bidi/core/Request.ts +21 -13
  233. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +12 -2
  234. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +37 -16
  235. package/front_end/third_party/puppeteer/package/src/cdp/EmulationManager.ts +14 -11
  236. package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +7 -1
  237. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +101 -14
  238. package/front_end/third_party/puppeteer/package/src/cdp/NetworkEventManager.ts +26 -6
  239. package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +111 -29
  240. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +37 -1
  241. package/front_end/third_party/puppeteer/package/src/cdp/ScreenRecording.ts +5 -4
  242. package/front_end/third_party/puppeteer/package/src/cdp/Target.ts +5 -0
  243. package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +122 -7
  244. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +13 -33
  245. package/front_end/third_party/puppeteer/package/src/common/BrowserWebSocketTransport.ts +10 -5
  246. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +10 -0
  247. package/front_end/third_party/puppeteer/package/src/common/WaitTask.ts +12 -0
  248. package/front_end/third_party/puppeteer/package/src/common/util.ts +39 -5
  249. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  250. package/front_end/third_party/puppeteer/package/src/injected/Poller.ts +35 -3
  251. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +4 -2
  252. package/front_end/third_party/puppeteer/package/src/node/NodeWebSocketTransport.ts +5 -0
  253. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  254. package/front_end/third_party/puppeteer/package/src/util/encoding.ts +2 -2
  255. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  256. package/front_end/ui/comments/CommentAnchorResolver.ts +3 -0
  257. package/front_end/ui/comments/CommentOverlayManager.ts +2 -4
  258. package/front_end/ui/components/lists/List.ts +14 -1
  259. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +1 -1
  260. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +23 -14
  261. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +3 -0
  262. package/front_end/ui/helpers/OpenInNewTab.ts +8 -0
  263. package/front_end/ui/legacy/LinkContextMenuProvider.ts +1 -1
  264. package/front_end/ui/legacy/ListWidget.ts +14 -18
  265. package/front_end/ui/legacy/TabbedPane.ts +46 -3
  266. package/front_end/ui/legacy/Toolbar.ts +0 -1
  267. package/front_end/ui/legacy/Treeoutline.ts +10 -3
  268. package/front_end/ui/legacy/UIUtils.ts +5 -2
  269. package/front_end/ui/legacy/components/inline_editor/Swatches.ts +19 -6
  270. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +20 -11
  271. package/front_end/ui/legacy/components/source_frame/XMLView.ts +27 -7
  272. package/front_end/ui/visual_logging/KnownContextValues.ts +5 -0
  273. package/package.json +1 -1
@@ -1834,6 +1834,7 @@ export class StylesSidebarPane extends StylesSidebarPaneBase implements StylesCo
1834
1834
  }
1835
1835
 
1836
1836
  #cleanupAiCodeCompletion(): void {
1837
+ this.#aiCodeCompletionSummaryToolbar?.detach();
1837
1838
  this.#aiCodeCompletionSummaryToolbarContainer?.remove();
1838
1839
  this.#aiCodeCompletionSummaryToolbarContainer = undefined;
1839
1840
  this.#aiCodeCompletionSummaryToolbar = undefined;
@@ -64,7 +64,6 @@ interface ViewInput {
64
64
  togglePassiveListener(listener: SDK.DOMDebuggerModel.EventListener): void;
65
65
  removeListener(listener: SDK.DOMDebuggerModel.EventListener): boolean;
66
66
  reveal(object: SDK.RemoteObject.RemoteObject): void;
67
- linkifier: Components.Linkifier.Linkifier;
68
67
  listeners: Map<string, ListenerEntry[]>;
69
68
  filter?: {showFramework: boolean, showPassive: boolean, showBlocking: boolean};
70
69
  }
@@ -167,7 +166,7 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
167
166
  ?hidden=${shouldHide(listener)}>
168
167
  <span class=event-listener-details>
169
168
  ${ObjectUI.ObjectPropertiesSection.renderPropertyValue(
170
- object, /* wasThrown */ false, /* showPreview */ false, input.linkifier)}
169
+ object, /* wasThrown */ false, /* showPreview */ false)}
171
170
  <devtools-button
172
171
  .iconName=${'bin'}
173
172
  .variant=${Buttons.Button.Variant.ICON}
@@ -184,9 +183,16 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
184
183
  ${i18nString(UIStrings.togglePassive)}
185
184
  </button>` : Lit.nothing}
186
185
  <span class=event-listener-tree-subtitle>
187
- ${input.linkifier.linkifyRawLocation(
188
- listener.location(), listener.sourceURL(), /* FIXME template version */
189
- undefined, {tabStop: true})}
186
+ ${widget(Components.Linkifier.ScriptLocationLink, {
187
+ target: listener.location().debuggerModel.target(),
188
+ scriptId: listener.location().scriptId,
189
+ sourceURL: listener.sourceURL(),
190
+ lineNumber: listener.location().lineNumber,
191
+ options: {
192
+ columnNumber: listener.location().columnNumber,
193
+ tabStop: true,
194
+ },
195
+ })}
190
196
  </span>
191
197
  </span>
192
198
  <ul role=group ${widget(ObjectUI.ObjectPropertiesSection.ObjectTreeWidget, {objectTree})} ${
@@ -205,7 +211,6 @@ export class EventListenersView extends UI.Widget.VBox {
205
211
  #filter: {showFramework: boolean, showPassive: boolean, showBlocking: boolean}|undefined;
206
212
  #view: View;
207
213
  #listeners?: Map<string, ListenerEntry[]>;
208
- #linkifier = new Components.Linkifier.Linkifier();
209
214
  constructor(element?: HTMLElement, view: View = DEFAULT_VIEW) {
210
215
  super(element);
211
216
  this.#view = view;
@@ -278,9 +283,7 @@ export class EventListenersView extends UI.Widget.VBox {
278
283
  void Common.Revealer.reveal(object);
279
284
  }
280
285
  },
281
- linkifier: this.#linkifier,
282
286
  };
283
- this.#linkifier.reset();
284
287
  this.#view(input, {}, this.contentElement);
285
288
  this.eventListenersArrivedForTest();
286
289
  }
@@ -168,11 +168,11 @@ export class Layers3DView extends Layers3DViewBase
168
168
  private whiteTexture?: WebGLTexture|null;
169
169
  private gl?: WebGLRenderingContext|null;
170
170
  private dimensionsForAutoscale?: {width: number, height: number};
171
- private needsUpdate?: boolean;
172
171
  private updateScheduled?: boolean;
173
172
  private panelToolbar: UI.Toolbar.Toolbar;
174
- private showSlowScrollRectsSetting?: Common.Settings.Setting<boolean>;
175
- private showPaintsSetting?: Common.Settings.Setting<boolean>;
173
+ private readonly showSlowScrollRectsSetting: Common.Settings.Setting<boolean>;
174
+ private readonly showPaintsSetting: Common.Settings.Setting<boolean>;
175
+ readonly #chromeWindowSetting: Common.Settings.Setting<boolean>;
176
176
  private mouseDownX?: number;
177
177
  private mouseDownY?: number;
178
178
 
@@ -197,10 +197,8 @@ export class Layers3DView extends Layers3DViewBase
197
197
  SettingsUI.LayerViewerSettings.showPaintsSettingDescriptor, this.panelToolbar);
198
198
  this.showSlowScrollRectsSetting = this.createVisibilitySetting(
199
199
  SettingsUI.LayerViewerSettings.showSlowScrollRectsSettingDescriptor, this.panelToolbar);
200
- this.showPaintsSetting.addChangeListener(this.updatePaints, this);
201
- Common.Settings.Settings.instance()
202
- .resolve(SettingsUI.LayerViewerSettings.chromeWindowSettingDescriptor)
203
- .addChangeListener(this.updateData, this);
200
+ this.#chromeWindowSetting =
201
+ Common.Settings.Settings.instance().resolve(SettingsUI.LayerViewerSettings.chromeWindowSettingDescriptor);
204
202
 
205
203
  this.performUpdate();
206
204
 
@@ -216,8 +214,6 @@ export class Layers3DView extends Layers3DViewBase
216
214
 
217
215
  this.snapshotLayers = new Map();
218
216
  this.layerViewHost.setLayerSnapshotMap(this.snapshotLayers);
219
-
220
- this.layerViewHost.showInternalLayersSetting().addChangeListener(this.updateData, this);
221
217
  }
222
218
 
223
219
  override performUpdate(): void {
@@ -242,7 +238,7 @@ export class Layers3DView extends Layers3DViewBase
242
238
  this.layerTree = layerTree;
243
239
  this.layerTexture = null;
244
240
  delete this.oldTextureScale;
245
- if (this.showPaints()) {
241
+ if (this.showPaintsSetting.get()) {
246
242
  this.textureManager.setLayerTree(layerTree);
247
243
  }
248
244
  this.updateData();
@@ -268,19 +264,24 @@ export class Layers3DView extends Layers3DViewBase
268
264
  }
269
265
 
270
266
  override willHide(): void {
271
- super.willHide();
267
+ this.showPaintsSetting.removeChangeListener(this.updatePaints, this);
268
+ this.showSlowScrollRectsSetting.removeChangeListener(this.updateData, this);
269
+ this.#chromeWindowSetting.removeChangeListener(this.updateData, this);
270
+ this.layerViewHost.showInternalLayersSetting().removeChangeListener(this.updateData, this);
272
271
  this.textureManager.suspend();
272
+ super.willHide();
273
273
  }
274
274
 
275
275
  override wasShown(): void {
276
276
  super.wasShown();
277
+ this.showPaintsSetting.addChangeListener(this.updatePaints, this);
278
+ this.showSlowScrollRectsSetting.addChangeListener(this.updateData, this);
279
+ this.#chromeWindowSetting.addChangeListener(this.updateData, this);
280
+ this.layerViewHost.showInternalLayersSetting().addChangeListener(this.updateData, this);
277
281
  this.textureManager.resume();
278
- if (!this.needsUpdate) {
279
- return;
280
- }
281
282
  this.performUpdate();
282
283
  this.resizeCanvas();
283
- this.updateData();
284
+ this.updatePaints();
284
285
  }
285
286
 
286
287
  updateLayerSnapshot(layer: SDK.LayerTreeBase.Layer): void {
@@ -632,7 +633,7 @@ export class Layers3DView extends Layers3DViewBase
632
633
  this.layerTree.forEachLayer(this.calculateLayerRect.bind(this));
633
634
  }
634
635
 
635
- if (this.showSlowScrollRectsSetting && this.showSlowScrollRectsSetting.get() && this.layerTree) {
636
+ if (this.showSlowScrollRectsSetting.get() && this.layerTree) {
636
637
  this.layerTree.forEachLayer(this.calculateLayerScrollRects.bind(this));
637
638
  }
638
639
 
@@ -643,7 +644,7 @@ export class Layers3DView extends Layers3DViewBase
643
644
  rect.setVertices(layer.quad(), this.depthForLayer(layer));
644
645
  rect.texture = this.layerTexture.texture;
645
646
  this.appendRect(rect);
646
- } else if (this.showPaints() && this.layerTree) {
647
+ } else if (this.showPaintsSetting.get() && this.layerTree) {
647
648
  this.layerTree.forEachLayer(this.calculateLayerTileRects.bind(this));
648
649
  }
649
650
  }
@@ -731,9 +732,8 @@ export class Layers3DView extends Layers3DViewBase
731
732
  return;
732
733
  }
733
734
 
734
- const drawChrome =
735
- Common.Settings.Settings.instance().resolve(SettingsUI.LayerViewerSettings.chromeWindowSettingDescriptor).get() &&
736
- this.chromeTextures.length >= 3 && this.chromeTextures.indexOf(undefined) < 0;
735
+ const drawChrome = this.#chromeWindowSetting.get() && this.chromeTextures.length >= 3 &&
736
+ this.chromeTextures.indexOf(undefined) < 0;
737
737
  const z = (this.maxDepth + 1) * LayerSpacing;
738
738
  const borderWidth = Math.ceil(ViewportBorderWidth * this.scale);
739
739
  let vertices: number[] = [viewport.width, 0, z, viewport.width, viewport.height, z, 0, viewport.height, z, 0, 0, z];
@@ -803,7 +803,6 @@ export class Layers3DView extends Layers3DViewBase
803
803
 
804
804
  updateData(): void {
805
805
  if (!this.isShowing()) {
806
- this.needsUpdate = true;
807
806
  return;
808
807
  }
809
808
  // Debounce into the next frame (double rAF).
@@ -878,7 +877,6 @@ export class Layers3DView extends Layers3DViewBase
878
877
  descriptor: Common.Settings.SettingDescriptor<boolean>,
879
878
  toolbar: UI.Toolbar.Toolbar): Common.Settings.Setting<boolean> {
880
879
  const setting = Common.Settings.Settings.instance().resolve(descriptor);
881
- setting.addChangeListener(this.updateData, this);
882
880
  toolbar.appendToolbarItem(new UI.Toolbar.ToolbarSettingCheckbox(setting));
883
881
  return setting;
884
882
  }
@@ -935,18 +933,13 @@ export class Layers3DView extends Layers3DViewBase
935
933
  }
936
934
 
937
935
  private updatePaints(): void {
938
- if (this.showPaints()) {
936
+ if (this.showPaintsSetting.get()) {
939
937
  this.textureManager.setLayerTree(this.layerTree);
940
- this.textureManager.forceUpdate();
941
938
  } else {
942
939
  this.textureManager.reset();
943
940
  }
944
941
  this.updateData();
945
942
  }
946
-
947
- private showPaints(): boolean {
948
- return this.showPaintsSetting ? this.showPaintsSetting.get() : false;
949
- }
950
943
  }
951
944
 
952
945
  export enum OutlineType {
@@ -1088,9 +1081,6 @@ export class LayerTextureManager {
1088
1081
  }
1089
1082
  });
1090
1083
  }
1091
- if (!oldLayers.length) {
1092
- this.forceUpdate();
1093
- }
1094
1084
  for (const layer of oldLayers) {
1095
1085
  if (newLayers.has(layer)) {
1096
1086
  continue;
@@ -1149,12 +1139,6 @@ export class LayerTextureManager {
1149
1139
  }
1150
1140
  }
1151
1141
 
1152
- forceUpdate(): void {
1153
- this.queue.forEach(layer => this.updateLayer(layer));
1154
- this.queue = [];
1155
- void this.update();
1156
- }
1157
-
1158
1142
  private update(): Promise<void> {
1159
1143
  const layer = this.queue.shift();
1160
1144
  if (!layer) {
@@ -65,7 +65,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: undefined, target: HTMLE
65
65
  return html`
66
66
  <devtools-checkbox
67
67
  title=${valueTypeToLocalizedString(type)}
68
- ?checked=${input.valueTypes.has(type)}
68
+ .checked=${input.valueTypes.has(type)}
69
69
  @change=${(e: Event) => {
70
70
  const checkbox = e.target as HTMLInputElement;
71
71
  input.onToggle(type, checkbox.checked);
@@ -2,8 +2,6 @@
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
4
 
5
- import '../settings/emulation/components/components.js';
6
-
7
5
  import * as Common from '../../core/common/common.js';
8
6
  import * as i18n from '../../core/i18n/i18n.js';
9
7
  import * as Platform from '../../core/platform/platform.js';
@@ -14,7 +12,7 @@ import * as UI from '../../ui/legacy/legacy.js';
14
12
  import {Directives, html, type LitTemplate, render} from '../../ui/lit/lit.js';
15
13
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
16
14
  import * as MobileThrottling from '../mobile_throttling/mobile_throttling.js';
17
- import type * as EmulationComponents from '../settings/emulation/components/components.js';
15
+ import * as EmulationComponents from '../settings/emulation/components/components.js';
18
16
 
19
17
  import networkConfigViewStyles from './networkConfigView.css.js';
20
18
 
@@ -195,13 +193,17 @@ function renderUserAgentSection(input: NetworkConfigViewInput, output: NetworkCo
195
193
  </devtools-checkbox>
196
194
  <div class=${Directives.classMap({'network-config-ua-custom': true, checked: input.useCustomUA})}>
197
195
  ${renderUserAgentSelectAndInput(input, output, title)}
198
- <devtools-user-agent-client-hints-form
199
- .value=${input.clientHintsValue}
200
- .disabled=${!input.useCustomUA}
201
- @clienthintschange=${(e: Event) => input.onClientHintsChange(
202
- (e.target as EmulationComponents.UserAgentClientHintsForm.UserAgentClientHintsForm).value.metaData)}
203
- @clienthintssubmit=${(e: Event) => input.onClientHintsSubmit((e as CustomEvent).detail.value)}>
204
- </devtools-user-agent-client-hints-form>
196
+ <devtools-widget
197
+ class="user-agent-client-hints-form"
198
+ @clienthintschange=${(e: CustomEvent<Protocol.Emulation.UserAgentMetadata>) =>
199
+ input.onClientHintsChange(e.detail)}
200
+ @clienthintssubmit=${(e: CustomEvent<Protocol.Emulation.UserAgentMetadata>) =>
201
+ input.onClientHintsSubmit(e.detail)}
202
+ ${UI.Widget.widget(EmulationComponents.UserAgentClientHintsForm.UserAgentClientHintsForm, {
203
+ value: input.clientHintsValue,
204
+ disabled: !input.useCustomUA,
205
+ })}>
206
+ </devtools-widget>
205
207
  </div>
206
208
  <span class="status-text">${input.clientHintsStatusText}</span>
207
209
  `);
@@ -1367,7 +1367,9 @@ export class NetworkRequestNode extends NetworkNode {
1367
1367
  }
1368
1368
 
1369
1369
  private openInNewTab(): void {
1370
- if (Common.ParsedURL.isPrivilegedScheme(this.requestInternal.url())) {
1370
+ // Only open URLs with web-safe schemes. Do not open privileged or other non-web-safe
1371
+ // schemes (such as `chrome:`, `devtools:`, `file:`, or `blob:devtools:`).
1372
+ if (!Common.ParsedURL.hasWebSafeScheme(this.requestInternal.url())) {
1371
1373
  return;
1372
1374
  }
1373
1375
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(this.requestInternal.url());
@@ -150,7 +150,7 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
150
150
  <style>${requestConditionsDrawerStyles}</style>
151
151
  <devtools-toolbar jslog=${VisualLogging.toolbar()}>
152
152
  <devtools-checkbox
153
- ?checked=${input.enabled}
153
+ .checked=${input.enabled}
154
154
  @click=${input.toggleEnabled}
155
155
  .jslogContext=${'network.enable-request-blocking'}>
156
156
  ${i18nString(UIStrings.enableBlockingAndThrottling)}
@@ -125,7 +125,7 @@ export interface ViewInput {
125
125
  queryParameters: SDK.NetworkRequest.NameValue[]|null;
126
126
  objectTree: ObjectUI.ObjectPropertiesSection.ObjectTree|null;
127
127
  onPayloadContextMenu(contextMenu: UI.ContextMenu.ContextMenu): void;
128
- onPayloadToggle(expanded: boolean): void;
128
+ onPayloadToggle(expanded: boolean, recursively?: boolean): void;
129
129
 
130
130
  /** Raw binary content data for the request body (when base64-encoded by backend). */
131
131
  binaryPayloadContentData: TextUtils.ContentData.ContentData|null;
@@ -204,7 +204,9 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
204
204
  <li role=treeitem class="source-code object-properties-section-root-element object-properties-section"
205
205
  toggle-on-click
206
206
  ?open=${objectTree.expanded}
207
- @expand=${(e: UI.TreeOutline.TreeViewElement.ExpandEvent) => input.onPayloadToggle(e.detail.expanded)}
207
+ @expand=${
208
+ (e: UI.TreeOutline.TreeViewElement.ExpandEvent) =>
209
+ input.onPayloadToggle(e.detail.expanded, e.detail.recursively)}
208
210
  @contextmenu=${onPayloadContextMenu}>
209
211
  ${objectTree.object.description}
210
212
  ${objectTree.object.hasChildren ? ObjectUI.ObjectPropertiesSection.renderObjectTree(objectTree) : nothing}
@@ -500,10 +502,15 @@ export class RequestPayloadView extends UI.Widget.VBox {
500
502
  },
501
503
  );
502
504
  },
503
- onPayloadToggle: (expanded: boolean): void => {
504
- if (this.#objectTree) {
505
- this.#objectTree.expanded = expanded;
505
+ onPayloadToggle: (expanded: boolean, recursively = false): void => {
506
+ if (!this.#objectTree) {
507
+ return;
508
+ }
509
+ if (expanded && recursively) {
510
+ void this.#objectTree.expandRecursively();
511
+ return;
506
512
  }
513
+ this.#objectTree.expanded = expanded;
507
514
  },
508
515
  binaryPayloadContentData: this.#binaryPayloadContentData,
509
516
  requestUrl: this.request?.url() ?? Platform.DevToolsPath.EmptyUrlString,
@@ -26,7 +26,7 @@
26
26
  flex: 2 0 200px;
27
27
  }
28
28
 
29
- .network-config-fields span:first-of-type {
29
+ .network-config-fields > span:first-of-type {
30
30
  padding: 3px 0;
31
31
  }
32
32
 
@@ -74,12 +74,12 @@
74
74
  line-height: var(--sys-size-9);
75
75
  }
76
76
 
77
- .network-config-ua input {
77
+ .network-config-ua-custom > input {
78
78
  display: block;
79
79
  width: calc(100% - var(--sys-size-9));
80
80
  }
81
81
 
82
- .network-config-ua input[type="text"],
82
+ .network-config-ua-custom > input[type="text"],
83
83
  .network-config-ua select {
84
84
  margin-top: var(--sys-size-5);
85
85
  }
@@ -92,20 +92,20 @@
92
92
  .network-config-ua-custom {
93
93
  padding-bottom: var(--sys-size-5);
94
94
 
95
- input,
96
- devtools-user-agent-client-hints-form {
95
+ > input,
96
+ > .user-agent-client-hints-form {
97
97
  opacity: 38%;
98
98
  pointer-events: none;
99
99
  }
100
100
 
101
- &.checked input,
102
- &.checked devtools-user-agent-client-hints-form {
101
+ &.checked > input,
102
+ &.checked > .user-agent-client-hints-form {
103
103
  opacity: revert;
104
104
  pointer-events: revert;
105
105
  }
106
106
  }
107
107
 
108
- devtools-user-agent-client-hints-form {
108
+ .user-agent-client-hints-form {
109
109
  display: block;
110
110
  margin-top: var(--sys-size-7);
111
111
  width: min(100%, 400px);
@@ -409,19 +409,41 @@ export class HeapProfileView extends UI.View.SimpleView implements UI.Searchable
409
409
  }
410
410
 
411
411
  #setupTimelineOverview(): void {
412
- if (this.profileType.hasTemporaryView()) {
412
+ // Only the profile that is being recorded receives stats updates. Profiles
413
+ // loaded from a file are also marked as being recorded while they load.
414
+ if (this.profileType.hasTemporaryView() && !this.profileHeader.fromFile() &&
415
+ this.profileType.profileBeingRecorded() === this.profileHeader) {
413
416
  this.timelineOverview.addEventListener(Events.IDS_RANGE_CHANGED, this.onIdsRangeChanged.bind(this));
414
417
  this.timelineOverview.start();
415
418
 
416
419
  this.profileType.addEventListener(SamplingHeapProfileType.Events.STATS_UPDATE, this.onStatsUpdate, this);
417
- void this.profileType.once(ProfileEvents.PROFILE_COMPLETE).then(() => {
418
- this.profileType.removeEventListener(SamplingHeapProfileType.Events.STATS_UPDATE, this.onStatsUpdate, this);
419
- this.timelineOverview.stop();
420
- this.timelineOverview.updateGrid();
421
- });
420
+ this.profileType.addEventListener(ProfileEvents.PROFILE_COMPLETE, this.#onProfileComplete, this);
421
+ this.profileType.addEventListener(ProfileEvents.REMOVE_PROFILE_HEADER, this.#onProfileRemoved, this);
422
422
  }
423
423
  }
424
424
 
425
+ #onProfileComplete({data: profile}: Common.EventTarget.EventTargetEvent<ProfileHeader>): void {
426
+ if (profile !== this.profileHeader) {
427
+ return;
428
+ }
429
+ this.#stopTimelineTracking();
430
+ this.timelineOverview.updateGrid();
431
+ }
432
+
433
+ #onProfileRemoved({data: profile}: Common.EventTarget.EventTargetEvent<ProfileHeader>): void {
434
+ // A profile that is removed while it is being recorded never completes.
435
+ if (profile === this.profileHeader) {
436
+ this.#stopTimelineTracking();
437
+ }
438
+ }
439
+
440
+ #stopTimelineTracking(): void {
441
+ this.profileType.removeEventListener(SamplingHeapProfileType.Events.STATS_UPDATE, this.onStatsUpdate, this);
442
+ this.profileType.removeEventListener(ProfileEvents.PROFILE_COMPLETE, this.#onProfileComplete, this);
443
+ this.profileType.removeEventListener(ProfileEvents.REMOVE_PROFILE_HEADER, this.#onProfileRemoved, this);
444
+ this.timelineOverview.stop();
445
+ }
446
+
425
447
  override async toolbarItems(): Promise<TemplateResult> {
426
448
  const currentViewType = this.viewType.get();
427
449
  const isFlame = currentViewType === ViewTypes.FLAME;
@@ -533,14 +533,18 @@ export class HeapSnapshotViewportDataGrid extends HeapSnapshotSortableDataGrid {
533
533
  const scrollBottom = scrollTop + this.scrollContainer.offsetHeight;
534
534
  if (height >= scrollTop && height < scrollBottom) {
535
535
  if (!node.dataGrid) {
536
- this.updateVisibleNodes(false);
536
+ this.updateVisibleNodes(true);
537
537
  }
538
538
  return Promise.resolve(node);
539
539
  }
540
540
 
541
541
  const scrollGap = 40;
542
542
  this.scrollContainer.scrollTop = Math.max(0, height - scrollGap);
543
- this.updateVisibleNodes(false);
543
+ this.updateVisibleNodes(true);
544
+ if (!node.dataGrid) {
545
+ this.scrollContainer.scrollTop = Math.max(0, height - scrollGap);
546
+ this.updateVisibleNodes(true);
547
+ }
544
548
  return new Promise(resolve => {
545
549
  if (this.scrollToResolveCallback) {
546
550
  this.scrollToResolveCallback();
@@ -551,7 +555,7 @@ export class HeapSnapshotViewportDataGrid extends HeapSnapshotSortableDataGrid {
551
555
  if (!this.scrollToResolveCallback) {
552
556
  return;
553
557
  }
554
- this.updateVisibleNodes(false);
558
+ this.updateVisibleNodes(!node.dataGrid);
555
559
  this.scrollToResolveCallback();
556
560
  this.scrollToResolveCallback = null;
557
561
  });
@@ -3,7 +3,6 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import '../../ui/kit/kit.js';
6
- import '../../ui/components/menus/menus.js';
7
6
 
8
7
  import * as Common from '../../core/common/common.js';
9
8
  import * as Host from '../../core/host/host.js';
@@ -241,7 +241,7 @@ export interface ViewInput {
241
241
  onRemoveBreakpoint: (index: number) => void;
242
242
  onExtensionViewClosed: () => void;
243
243
  onExportMenuClosed: () => void;
244
- onExportOptionSelected: (event: Menus.SelectMenu.SelectMenuItemSelectedEvent) => void;
244
+ onExportOptionSelected: (event: Menus.Menu.MenuItemSelectedEvent) => void;
245
245
  onRecordingFinished: () => void;
246
246
  handleAddAssertionEvent: () => void;
247
247
  onSetRecording: (event: Event) => void;
@@ -1594,7 +1594,7 @@ export class RecorderPanel extends UI.Widget.VBox<DocumentFragment> {
1594
1594
  }
1595
1595
  }
1596
1596
 
1597
- async #onExportOptionSelected(event: Menus.SelectMenu.SelectMenuItemSelectedEvent): Promise<void> {
1597
+ async #onExportOptionSelected(event: Menus.Menu.MenuItemSelectedEvent): Promise<void> {
1598
1598
  if (typeof event.itemValue !== 'string') {
1599
1599
  throw new Error('Invalid export option value');
1600
1600
  }
@@ -455,9 +455,8 @@ export class ScreencastView extends UI.Widget.Widget implements SDK.OverlayModel
455
455
  this.resourceTreeModel = screenCaptureModel.target().model(SDK.ResourceTreeModel.ResourceTreeModel);
456
456
  this.networkManager = screenCaptureModel.target().model(SDK.NetworkManager.NetworkManager);
457
457
  this.inputModel = screenCaptureModel.target().model(InputModel);
458
- this.createNavigationBar();
459
- this.updateGlasspane();
460
458
  if (this.isShowing()) {
459
+ this.createNavigationBar();
461
460
  this.#scheduleCasting();
462
461
  }
463
462
  } else {
@@ -494,6 +493,7 @@ export class ScreencastView extends UI.Widget.Widget implements SDK.OverlayModel
494
493
  super.wasShown();
495
494
  SDK.TargetManager.TargetManager.instance().addEventListener(SDK.TargetManager.Events.SUSPEND_STATE_CHANGED,
496
495
  this.onSuspendStateChange, this);
496
+ this.createNavigationBar();
497
497
  this.updateGlasspane();
498
498
  this.#scheduleCasting();
499
499
  this.requestUpdate();
@@ -539,14 +539,11 @@ export class ScreencastView extends UI.Widget.Widget implements SDK.OverlayModel
539
539
  delete this.deferredCasting;
540
540
  }
541
541
  this.stopCasting();
542
+ this.#cleanup();
542
543
  SDK.TargetManager.TargetManager.instance().removeEventListener(SDK.TargetManager.Events.SUSPEND_STATE_CHANGED,
543
544
  this.onSuspendStateChange, this);
544
545
  }
545
546
 
546
- override onDetach(): void {
547
- this.#cleanup();
548
- }
549
-
550
547
  private async startCasting(): Promise<void> {
551
548
  if (!this.#screenCaptureModel) {
552
549
  return;
@@ -272,37 +272,6 @@ export class SecurityPanelSidebar extends UI.Widget.VBox {
272
272
  this.requestUpdate();
273
273
  }
274
274
 
275
- // Used in web tests
276
- elementsByOrigin(): Map<string, {
277
- select: (omitFocus?: boolean, selectedByUser?: boolean) => void,
278
- showElement: () => void,
279
- origin: () => string,
280
- securityState: () => Protocol.Security.SecurityState | undefined,
281
- }> {
282
- const map = new Map<string, {
283
- select: (omitFocus?: boolean, selectedByUser?: boolean) => void,
284
- showElement: () => void,
285
- origin: () => string,
286
- securityState: () => Protocol.Security.SecurityState | undefined,
287
- }>();
288
- for (const [origin, state] of this.#origins.entries()) {
289
- const element = {
290
- select: () => {
291
- this.#selectedElementId = origin;
292
- this.requestUpdate();
293
- this.#onShowOrigin?.(origin);
294
- },
295
- showElement: () => {
296
- this.#onShowOrigin?.(origin);
297
- },
298
- origin: () => origin,
299
- securityState: () => state,
300
- };
301
- map.set(origin, element);
302
- }
303
- return map;
304
- }
305
-
306
275
  set selectedOrigin(origin: Platform.DevToolsPath.UrlString|null) {
307
276
  this.#selectedElementId = origin ?? 'overview';
308
277
  this.requestUpdate();
@@ -442,7 +442,7 @@ export const EXPERIMENTS_SETTINGS_TAB_DEFAULT_VIEW: ExperimentsSettingsTabView =
442
442
  class="experiment-label"
443
443
  name=${experiment.name}
444
444
  title=${experiment.title}
445
- ?checked=${experiment.isEnabled()}
445
+ .checked=${experiment.isEnabled()}
446
446
  .jslogContext=${experiment.name}
447
447
  @click=${(e: Event) => {
448
448
  const checkbox = e.currentTarget as UI.UIUtils.CheckboxLabel;
@@ -260,6 +260,7 @@ export class DevicesSettingsTab extends UI.Widget.VBox implements
260
260
  private muteUpdate: boolean;
261
261
  private emulatedDevicesList: EmulationModel.EmulatedDevices.EmulatedDevicesList;
262
262
  private editor?: UI.ListWidget.Editor<EmulationModel.EmulatedDevices.EmulatedDevice>;
263
+ readonly #userAgentClientHintsForm = new EmulationComponents.UserAgentClientHintsForm.UserAgentClientHintsForm();
263
264
 
264
265
  constructor() {
265
266
  super({jslog: `${VisualLogging.pane('devices')}`});
@@ -471,10 +472,7 @@ export class DevicesSettingsTab extends UI.Widget.VBox implements
471
472
  uaType === EmulationModel.DeviceModeModel.UA.DESKTOP_TOUCH) {
472
473
  device.capabilities.push(EmulationModel.EmulatedDevices.Capability.TOUCH);
473
474
  }
474
- const userAgentControlValue =
475
- (editor.control('ua-metadata') as
476
- UI.ListWidget.CustomEditorControl<EmulationComponents.UserAgentClientHintsForm.UserAgentClientHintsFormData>)
477
- .value.metaData;
475
+ const userAgentControlValue = this.#userAgentClientHintsForm.value.metaData;
478
476
  const hasUserAgentOverride = device.userAgent.trim().length > 0;
479
477
  device.userAgentMetadata = null;
480
478
  if (hasUserAgentOverride && userAgentControlValue) {
@@ -517,9 +515,7 @@ export class DevicesSettingsTab extends UI.Widget.VBox implements
517
515
  device.touch() ? EmulationModel.DeviceModeModel.UA.DESKTOP_TOUCH : EmulationModel.DeviceModeModel.UA.DESKTOP;
518
516
  }
519
517
  editor.control('ua-type').value = uaType;
520
- (editor.control('ua-metadata') as
521
- UI.ListWidget.CustomEditorControl<EmulationComponents.UserAgentClientHintsForm.UserAgentClientHintsFormData>)
522
- .value = {metaData: device.userAgentMetadata || undefined};
518
+ this.#userAgentClientHintsForm.value = {metaData: device.userAgentMetadata || undefined};
523
519
  return editor;
524
520
  }
525
521
 
@@ -693,19 +689,16 @@ export class DevicesSettingsTab extends UI.Widget.VBox implements
693
689
  uaType.classList.add('device-edit-fixed');
694
690
  ua.appendChild(uaType);
695
691
 
696
- const uaMetadata = editor.createCustomControl(
697
- 'ua-metadata', EmulationComponents.UserAgentClientHintsForm.UserAgentClientHintsForm,
698
- userAgentMetadataValidator);
692
+ const uaMetadata = this.#userAgentClientHintsForm;
699
693
  uaMetadata.value = {};
700
- uaMetadata.addEventListener('clienthintschange', () => editor.requestValidation(), false);
701
- content.appendChild(uaMetadata);
694
+ uaMetadata.addEventListener(EmulationComponents.UserAgentClientHintsForm.Events.CLIENT_HINTS_CHANGE,
695
+ () => editor.requestValidation());
696
+ // The editor content is not in the DOM yet, so show the form as a root widget.
697
+ uaMetadata.show(content, undefined, /* suppressOrphanWidgetError= */ true);
698
+ editor.addCustomControl(uaMetadata.element, () => uaMetadata.validate());
702
699
 
703
700
  return editor;
704
701
 
705
- function userAgentMetadataValidator(): UI.ListWidget.ValidatorResult {
706
- return uaMetadata.validate();
707
- }
708
-
709
702
  function userAgentValidator(
710
703
  _item: EmulationModel.EmulatedDevices.EmulatedDevice, _index: number,
711
704
  input: UI.ListWidget.EditorControl): UI.ListWidget.ValidatorResult {