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
@@ -8,10 +8,12 @@ import type {Protocol} from 'devtools-protocol';
8
8
 
9
9
  import {URLPattern} from '../../third_party/urlpattern-polyfill/urlpattern-polyfill.js';
10
10
  import type {TargetFilterCallback} from '../api/Browser.js';
11
+ import type {NetworkRestrictions} from '../api/Browser.js';
11
12
  import type {CDPSession} from '../api/CDPSession.js';
12
13
  import {CDPSessionEvent} from '../api/CDPSession.js';
13
14
  import {DEBUG_PREFIXES, type Logger} from '../common/Debug.js';
14
15
  import {EventEmitter} from '../common/EventEmitter.js';
16
+ import {assertSupportedUrlRestrictions} from '../common/util.js';
15
17
  import {assert} from '../util/assert.js';
16
18
  import {Deferred} from '../util/Deferred.js';
17
19
  import {DisposableStack} from '../util/disposable.js';
@@ -107,6 +109,16 @@ export class TargetManager
107
109
  #initialAttachDone = false;
108
110
  #blocklist: Array<{pattern: URLPattern; rule: string}> = [];
109
111
  #allowlist: Array<{pattern: URLPattern; rule: string}> = [];
112
+ /**
113
+ * All live sessions that network conditions are applied to, including
114
+ * sessions that are not exposed via a target's `_session()` (e.g. workers,
115
+ * manually attached targets and kept service worker sessions). Used to
116
+ * re-apply network conditions at runtime.
117
+ */
118
+ #networkConditionsSessions = new Map<
119
+ CDPSession,
120
+ Protocol.Target.TargetInfo
121
+ >();
110
122
  #logger?: Logger;
111
123
 
112
124
  constructor(
@@ -119,7 +131,7 @@ export class TargetManager
119
131
  logger?: Logger,
120
132
  ) {
121
133
  super(undefined, logger);
122
- if (blocklist && allowlist) {
134
+ if (blocklist?.length && allowlist?.length) {
123
135
  throw new Error('Cannot specify both blockList and allowList');
124
136
  }
125
137
 
@@ -241,6 +253,7 @@ export class TargetManager
241
253
 
242
254
  #onSessionDetached = (session: CDPSession) => {
243
255
  this.#removeAttachmentListeners(session);
256
+ this.#networkConditionsSessions.delete(session);
244
257
  };
245
258
 
246
259
  #onTargetCreated = async (event: Protocol.Target.TargetCreatedEvent) => {
@@ -334,6 +347,7 @@ export class TargetManager
334
347
  }
335
348
 
336
349
  if (!this.#connection.isAutoAttached(targetInfo.targetId)) {
350
+ this.#networkConditionsSessions.set(session, targetInfo);
337
351
  await this.#maybeSetupNetworkConditions(session, targetInfo);
338
352
  return;
339
353
  }
@@ -358,10 +372,12 @@ export class TargetManager
358
372
  // service worker instead: network conditions are reset when the session
359
373
  // that set them detaches, so staying attached is what keeps the rules
360
374
  // enforced for requests the worker issues, including the ones it forwards
361
- // on behalf of controlled pages. As a consequence, the browser never
362
- // idle-terminates service workers while rules are configured.
375
+ // on behalf of controlled pages. Kept sessions are not released when rules
376
+ // are cleared, so the browser never idle-terminates these service workers
377
+ // once rules have been configured.
363
378
  if (targetInfo.type === 'service_worker') {
364
379
  if (this.#hasNetworkRules()) {
380
+ this.#networkConditionsSessions.set(session, targetInfo);
365
381
  // The rules are applied before the worker is resumed so that requests
366
382
  // made during `install` are covered as well:
367
383
  // #maybeSetupNetworkConditions dispatches its commands synchronously,
@@ -376,8 +392,12 @@ export class TargetManager
376
392
  this.#logger?.(DEBUG_PREFIXES.error)?.(error);
377
393
  });
378
394
  await networkConditionsSetUp;
395
+ // An already exposed WorkerTarget (created on the silent-detach path)
396
+ // proceeds to #attachServiceWorkerTarget() even when its script URL is
397
+ // now disallowed, so the target receives the kept session.
379
398
  if (
380
- !this.isUrlAllowed(targetInfo.url) ||
399
+ (!this.isUrlAllowed(targetInfo.url) &&
400
+ !this.#attachedTargetsByTargetId.has(targetInfo.targetId)) ||
381
401
  this.#ignoredTargets.has(targetInfo.targetId) ||
382
402
  !this.#discoveredTargetsByTargetId.has(targetInfo.targetId)
383
403
  ) {
@@ -453,6 +473,8 @@ export class TargetManager
453
473
  this.#finishInitializationIfReady(parentTarget._targetId);
454
474
  }
455
475
 
476
+ this.#networkConditionsSessions.set(session, targetInfo);
477
+
456
478
  // The browser might be shutting down here, so we
457
479
  // ignore potential errors.
458
480
  await Promise.all([
@@ -493,7 +515,7 @@ export class TargetManager
493
515
  this.#setupAttachmentListeners(session);
494
516
 
495
517
  if (isExistingTarget) {
496
- session.setTarget(target);
518
+ target._setSession(session);
497
519
  } else {
498
520
  target._initialize();
499
521
  this.#attachedTargetsByTargetId.set(targetInfo.targetId, target);
@@ -573,6 +595,86 @@ export class TargetManager
573
595
  return true;
574
596
  };
575
597
 
598
+ async setNetworkConditions(
599
+ conditions?: NetworkRestrictions | null,
600
+ ): Promise<void> {
601
+ const blocklist = conditions?.blocklist ?? [];
602
+ const allowlist = conditions?.allowlist ?? [];
603
+
604
+ assertSupportedUrlRestrictions({
605
+ blocklist: conditions?.blocklist,
606
+ allowlist: conditions?.allowlist,
607
+ });
608
+
609
+ const wasActive = this.#hasNetworkRules();
610
+
611
+ // Map both lists before assigning so that an invalid pattern does not
612
+ // leave the manager in a partially updated state.
613
+ const newBlocklist = this.#mapPatterns(blocklist);
614
+ const newAllowlist = this.#mapPatterns(allowlist);
615
+ this.#blocklist = newBlocklist;
616
+ this.#allowlist = newAllowlist;
617
+
618
+ const isActive = this.#hasNetworkRules();
619
+
620
+ if (isActive && !wasActive) {
621
+ await this.#attachToServiceWorkers();
622
+ }
623
+
624
+ if (isActive || wasActive) {
625
+ await this.#reapplyNetworkConditions(wasActive && !isActive);
626
+ }
627
+ }
628
+
629
+ async #reapplyNetworkConditions(forceClear?: boolean): Promise<void> {
630
+ const promises: Array<Promise<unknown>> = [];
631
+ // Iterate over all tracked sessions rather than `target._session()`, as
632
+ // the latter is undefined for workers and targets that were not
633
+ // auto-attached.
634
+ for (const [session, targetInfo] of this.#networkConditionsSessions) {
635
+ if (session.detached) {
636
+ this.#networkConditionsSessions.delete(session);
637
+ continue;
638
+ }
639
+ promises.push(
640
+ this.#maybeSetupNetworkConditions(
641
+ session,
642
+ targetInfo,
643
+ forceClear,
644
+ ).catch(error => {
645
+ this.#logger?.(DEBUG_PREFIXES.error)?.(error);
646
+ }),
647
+ );
648
+ }
649
+ await Promise.all(promises);
650
+ }
651
+
652
+ async #attachToServiceWorkers(): Promise<void> {
653
+ const trackedTargetIds = new Set<string>();
654
+ for (const [session, targetInfo] of this.#networkConditionsSessions) {
655
+ if (!session.detached) {
656
+ trackedTargetIds.add(targetInfo.targetId);
657
+ }
658
+ }
659
+
660
+ const promises: Array<Promise<unknown>> = [];
661
+ for (const targetInfo of this.#discoveredTargetsByTargetId.values()) {
662
+ if (
663
+ targetInfo.type !== 'service_worker' ||
664
+ trackedTargetIds.has(targetInfo.targetId) ||
665
+ this.#ignoredTargets.has(targetInfo.targetId)
666
+ ) {
667
+ continue;
668
+ }
669
+ promises.push(
670
+ this.#connection._createSession(targetInfo, true).catch(error => {
671
+ this.#logger?.(DEBUG_PREFIXES.error)?.(error);
672
+ }),
673
+ );
674
+ }
675
+ await Promise.all(promises);
676
+ }
677
+
576
678
  #mapPatterns(rules?: string[]): Array<{pattern: URLPattern; rule: string}> {
577
679
  const result: Array<{pattern: URLPattern; rule: string}> = [];
578
680
  for (const rule of rules ?? []) {
@@ -592,8 +694,9 @@ export class TargetManager
592
694
  #maybeSetupNetworkConditions = (
593
695
  session: CDPSession,
594
696
  targetInfo: Protocol.Target.TargetInfo,
697
+ forceClear?: boolean,
595
698
  ): Promise<unknown> => {
596
- if (!this.#hasNetworkRules()) {
699
+ if (!this.#hasNetworkRules() && !forceClear) {
597
700
  return Promise.resolve();
598
701
  }
599
702
 
@@ -636,9 +739,21 @@ export class TargetManager
636
739
  if (needsNetwork) {
637
740
  promises.push(session.send('Network.enable'));
638
741
  }
742
+ // When clearing network conditions (lists are empty), we must explicitly pass
743
+ // `offline: false` to force CDP to clear any previously set global offline state.
744
+ // When an allowlist is active, we must pass `undefined` to prevent globally
745
+ // overriding the allowlist's catch-all offline rule. When a blocklist is
746
+ // active, we pass `true`.
747
+ let offline: boolean | undefined = undefined;
748
+ if (this.#blocklist.length === 0 && this.#allowlist.length === 0) {
749
+ offline = false;
750
+ } else if (this.#blocklist.length > 0) {
751
+ offline = true;
752
+ }
753
+
639
754
  promises.push(
640
755
  session.send('Network.emulateNetworkConditionsByRule', {
641
- offline: this.#blocklist.length > 0 ? true : undefined,
756
+ offline,
642
757
  matchedNetworkConditions,
643
758
  }),
644
759
  );
@@ -4,17 +4,17 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import {URLPattern} from '../../third_party/urlpattern-polyfill/urlpattern-polyfill.js';
8
7
  import type {Browser} from '../api/Browser.js';
9
8
  import {_connectToBiDiBrowser} from '../bidi/BrowserConnector.js';
10
9
  import {_connectToCdpBrowser} from '../cdp/BrowserConnector.js';
11
10
  import {environment, isNode} from '../environment.js';
12
11
  import {assert} from '../util/assert.js';
13
- import {isErrorLike} from '../util/ErrorLike.js';
12
+ import {isErrnoException, isErrorLike} from '../util/ErrorLike.js';
14
13
 
15
14
  import type {ConnectionTransport} from './ConnectionTransport.js';
16
15
  import type {ConnectOptions} from './ConnectOptions.js';
17
16
  import type {Logger} from './Debug.js';
17
+ import {assertSupportedUrlRestrictions} from './util.js';
18
18
 
19
19
  const getWebSocketTransportClass = async () => {
20
20
  return isNode
@@ -29,37 +29,6 @@ const getWebSocketTransportClass = async () => {
29
29
  *
30
30
  * @internal
31
31
  */
32
- export function assertSupportedUrlRestrictions(options: {
33
- allowlist?: string[];
34
- blocklist?: string[];
35
- protocol?: string;
36
- }): void {
37
- if (options.blocklist && options.allowlist) {
38
- throw new Error('Cannot specify both blocklist and allowlist');
39
- }
40
- if (
41
- options.protocol === 'webDriverBiDi' &&
42
- (options.blocklist || options.allowlist)
43
- ) {
44
- throw new Error(
45
- 'blocklist and allowlist are only supported with the CDP protocol',
46
- );
47
- }
48
- if (options.blocklist) {
49
- for (const rule of options.blocklist) {
50
- new URLPattern(rule);
51
- }
52
- }
53
- if (options.allowlist) {
54
- for (const rule of options.allowlist) {
55
- new URLPattern(rule);
56
- }
57
- }
58
- }
59
-
60
- /**
61
- * @internal
62
- */
63
32
  export async function _connectToBrowser(
64
33
  options: ConnectOptions & {logger: Logger},
65
34
  ): Promise<Browser> {
@@ -183,6 +152,17 @@ async function getConnectionTransport(
183
152
  endpointUrl: browserWSEndpoint,
184
153
  };
185
154
  } catch (error) {
155
+ if (
156
+ isErrnoException(error) &&
157
+ (error.code === 'EPERM' || error.code === 'EACCES')
158
+ ) {
159
+ throw new Error(
160
+ `Could not read DevToolsActivePort for ${options.channel} at ${portPath}: permission denied`,
161
+ {
162
+ cause: error,
163
+ },
164
+ );
165
+ }
186
166
  throw new Error(
187
167
  `Could not find DevToolsActivePort for ${options.channel} at ${portPath}`,
188
168
  {
@@ -15,9 +15,14 @@ export class BrowserWebSocketTransport implements ConnectionTransport {
15
15
  _headers: Record<string, string> | undefined,
16
16
  logger: Logger,
17
17
  // Accepted so this stays call-compatible with NodeWebSocketTransport, which
18
- // BrowserConnector picks between at runtime. The keep-alive options are
19
- // Node-only: the browser WebSocket API exposes no ping frame.
20
- _options?: {keepAlive?: boolean; keepAliveIntervalMs?: number},
18
+ // BrowserConnector picks between at runtime. The keep-alive and handshake
19
+ // timeout options are Node-only: the browser WebSocket API exposes neither
20
+ // ping frames nor a handshake timeout.
21
+ _options?: {
22
+ keepAlive?: boolean;
23
+ keepAliveIntervalMs?: number;
24
+ handshakeTimeout?: number;
25
+ },
21
26
  ): Promise<BrowserWebSocketTransport> {
22
27
  return new Promise((resolve, reject) => {
23
28
  const ws = new WebSocket(url);
@@ -48,8 +53,8 @@ export class BrowserWebSocketTransport implements ConnectionTransport {
48
53
  }
49
54
  });
50
55
  // Silently log all errors - we don't know what to do with them.
51
- this.#ws.addEventListener('error', () => {
52
- this.#logger?.(DEBUG_PREFIXES.error);
56
+ this.#ws.addEventListener('error', err => {
57
+ this.#logger?.(DEBUG_PREFIXES.error)?.(err);
53
58
  });
54
59
  }
55
60
 
@@ -85,6 +85,16 @@ export interface WsOptions {
85
85
  * @defaultValue `256 * 1024 * 1024`
86
86
  */
87
87
  maxPayload?: number;
88
+
89
+ /**
90
+ * Time in milliseconds to wait for the WebSocket opening handshake before
91
+ * failing. Without it, connecting to a host that accepts the TCP connection
92
+ * but never answers the upgrade request waits until the operating system
93
+ * gives up. Node.js only.
94
+ *
95
+ * @defaultValue no timeout
96
+ */
97
+ handshakeTimeout?: number;
88
98
  }
89
99
 
90
100
  /**
@@ -147,10 +147,22 @@ export class WaitTask<T = unknown> {
147
147
  break;
148
148
  }
149
149
 
150
+ // Avoid starting a poller created after the task has already terminated.
151
+ if (this.#result.finished()) {
152
+ await this.terminate();
153
+ return;
154
+ }
155
+
150
156
  await this.#poller.evaluate(poller => {
151
157
  void poller.start();
152
158
  });
153
159
 
160
+ // Termination already stops the poller; only skip the result round trip.
161
+ if (this.#result.finished()) {
162
+ await this.terminate();
163
+ return;
164
+ }
165
+
154
166
  const result = await this.#poller.evaluateHandle(poller => {
155
167
  return poller.result();
156
168
  });
@@ -15,6 +15,7 @@ import {
15
15
  Observable,
16
16
  timer,
17
17
  } from '../../third_party/rxjs/rxjs.js';
18
+ import {URLPattern} from '../../third_party/urlpattern-polyfill/urlpattern-polyfill.js';
18
19
  import type {CDPSession} from '../api/CDPSession.js';
19
20
  import {environment} from '../environment.js';
20
21
  import {assert} from '../util/assert.js';
@@ -333,11 +334,11 @@ export function parsePDFOptions(
333
334
  waitForFonts: true,
334
335
  };
335
336
 
336
- let width = 8.5;
337
- let height = 11;
337
+ let width = paperFormats.letter[lengthUnit].width;
338
+ let height = paperFormats.letter[lengthUnit].height;
338
339
  if (options.format) {
339
340
  const format =
340
- paperFormats[options.format.toLowerCase() as LowerCasePaperFormat][
341
+ paperFormats[options.format.toLowerCase() as LowerCasePaperFormat]?.[
341
342
  lengthUnit
342
343
  ];
343
344
  assert(format, 'Unknown paper format: ' + options.format);
@@ -378,8 +379,10 @@ export function parsePDFOptions(
378
379
  export const unitToPixels = {
379
380
  px: 1,
380
381
  in: 96,
381
- cm: 37.8,
382
- mm: 3.78,
382
+ cm: 96 / 2.54,
383
+ mm: 96 / 25.4,
384
+ pt: 96 / 72,
385
+ pc: 16,
383
386
  };
384
387
 
385
388
  function convertPrintParameterToInches(
@@ -472,3 +475,34 @@ export function filterAsync<T>(
472
475
  );
473
476
  });
474
477
  }
478
+
479
+ /**
480
+ * @internal
481
+ */
482
+ export function assertSupportedUrlRestrictions(options: {
483
+ allowlist?: string[];
484
+ blocklist?: string[];
485
+ protocol?: string;
486
+ }): void {
487
+ if (options.blocklist?.length && options.allowlist?.length) {
488
+ throw new Error('Cannot specify both blocklist and allowlist');
489
+ }
490
+ if (
491
+ options.protocol === 'webDriverBiDi' &&
492
+ (options.blocklist || options.allowlist)
493
+ ) {
494
+ throw new Error(
495
+ 'blocklist and allowlist are only supported with the CDP protocol',
496
+ );
497
+ }
498
+ if (options.blocklist) {
499
+ for (const rule of options.blocklist) {
500
+ new URLPattern(rule);
501
+ }
502
+ }
503
+ if (options.allowlist) {
504
+ for (const rule of options.allowlist) {
505
+ new URLPattern(rule);
506
+ }
507
+ }
508
+ }
@@ -5,4 +5,4 @@
5
5
  *
6
6
  * @internal
7
7
  */
8
- export const source = "\"use strict\";var g=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)g(t,r,{get:e[r],enumerable:!0})},J=(t,e,r,o)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of Y(e))!G.call(t,n)&&n!==r&&g(t,n,{get:()=>e[n],enumerable:!(o=X(e,n))||o.enumerable});return t};var z=t=>J(g({},\"__esModule\",{value:!0}),t);var Se={};l(Se,{default:()=>Te});module.exports=z(Se);var b=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}},p=class extends b{};var c=class t{static create(e){return new t(e)}static async race(e){let r=new Set;try{let o=e.map(n=>n instanceof t?(n.#s&&r.add(n),n.valueOrThrow()):n);return await Promise.race(o)}finally{for(let o of r)o.reject(new Error(\"Timeout cleared\"))}}#e=!1;#r=!1;#t;#o;#n=new Promise(e=>{this.#o=e});#s;#l;constructor(e){e&&e.timeout>0&&(this.#l=new p(e.message),this.#s=setTimeout(()=>{this.reject(this.#l)},e.timeout))}#i(e){clearTimeout(this.#s),this.#t=e,this.#o()}resolve(e){this.#r||this.#e||(this.#e=!0,this.#i(e))}reject(e){this.#r||this.#e||(this.#r=!0,this.#i(e))}resolved(){return this.#e}finished(){return this.#e||this.#r}value(){return this.#t}#a;valueOrThrow(){return this.#a||(this.#a=(async()=>{if(await this.#n,this.#r)throw this.#t;return this.#t})()),this.#a}};var W=new Map,F=t=>{let e=W.get(t);return e||(e=new Function(`return ${t}`)(),W.set(t,e),e)};var E={};l(E,{ariaQuerySelector:()=>K,ariaQuerySelectorAll:()=>x});var K=(t,e)=>globalThis.__ariaQuerySelector(t,e),x=async function*(t,e){yield*await globalThis.__ariaQuerySelectorAll(t,e)};var v={};l(v,{cssQuerySelector:()=>Z,cssQuerySelectorAll:()=>ee});var Z=(t,e)=>t.querySelector(e),ee=function(t,e){return t.querySelectorAll(e)};var A={};l(A,{CustomQuerySelectorRegistry:()=>y,customQuerySelectors:()=>P});var y=class{#e=new Map;register(e,r){if(!r.queryOne&&r.queryAll){let o=r.queryAll;r.queryOne=(n,i)=>{for(let s of o(n,i))return s;return null}}else if(r.queryOne&&!r.queryAll){let o=r.queryOne;r.queryAll=(n,i)=>{let s=o(n,i);return s?[s]:[]}}else if(!r.queryOne||!r.queryAll)throw new Error(\"At least one query method must be defined.\");this.#e.set(e,{querySelector:r.queryOne,querySelectorAll:r.queryAll})}unregister(e){this.#e.delete(e)}get(e){return this.#e.get(e)}clear(){this.#e.clear()}},P=new y;var R={};l(R,{pierceQuerySelector:()=>te,pierceQuerySelectorAll:()=>re});var te=(t,e)=>{let r=null,o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&!r&&s.matches(e)&&(r=s)}while(!r&&i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r},re=(t,e)=>{let r=[],o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&s.matches(e)&&r.push(s)}while(i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r};var u=(t,e)=>{if(!t)throw new Error(e)};var oe={childList:!0,subtree:!0,attributes:!0};function ne(t){return t.nodeType===Node.ELEMENT_NODE||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function se(t){return t.parentNode??t.host??null}function ie(t,e){let r=t,o;for(;o=se(r);){if(e.has(o))return!0;r=o}return!1}var w=class{#e;#r;#t;#o=new WeakSet;#n;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#n=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=new WeakSet,this.#t=new MutationObserver(async o=>{this.#l(o);let n=await this.#e();n&&(e.resolve(n),await this.stop())}),this.#s(this.#r)}#s(e){!this.#t||this.#o.has(e)||(this.#o.add(e),this.#t.observe(e,oe),this.#i(e))}#l(e){let r=new Set;for(let o of e)for(let n of o.addedNodes)ne(n)&&r.add(n);for(let o of r)ie(o,r)||this.#i(o)}#i(e){let r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);do{let{shadowRoot:o}=r.currentNode;o&&this.#s(o)}while(r.nextNode())}async stop(){u(this.#n,\"Polling never started.\"),this.#n.finished()||this.#n.reject(new Error(\"Polling stopped\")),this.#t&&(this.#t.disconnect(),this.#t=void 0)}result(){return u(this.#n,\"Polling never started.\"),this.#n.valueOrThrow()}},N=class{#e;#r;constructor(e){this.#e=e}async start(){let e=this.#r=c.create(),r=await this.#e();if(r){e.resolve(r);return}let o=async()=>{if(e.finished())return;let n=await this.#e();if(!n){window.requestAnimationFrame(o);return}e.resolve(n),await this.stop()};window.requestAnimationFrame(o)}async stop(){u(this.#r,\"Polling never started.\"),this.#r.finished()||this.#r.reject(new Error(\"Polling stopped\"))}result(){return u(this.#r,\"Polling never started.\"),this.#r.valueOrThrow()}},T=class{#e;#r;#t;#o;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#o=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#t=setInterval(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())},this.#r)}async stop(){u(this.#o,\"Polling never started.\"),this.#o.finished()||this.#o.reject(new Error(\"Polling stopped\")),this.#t&&(clearInterval(this.#t),this.#t=void 0)}result(){return u(this.#o,\"Polling never started.\"),this.#o.valueOrThrow()}};var L={};l(L,{PCombinator:()=>V,pQuerySelector:()=>we,pQuerySelectorAll:()=>B});var a=class{static async*map(e,r){for await(let o of e)yield await r(o)}static async*flatMap(e,r){for await(let o of e)yield*r(o)}static async collect(e){let r=[];for await(let o of e)r.push(o);return r}static async first(e){for await(let r of e)return r}};var C={};l(C,{textQuerySelectorAll:()=>m});var le=new Set([\"checkbox\",\"image\",\"radio\"]),ae=t=>t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement||t instanceof HTMLInputElement&&!le.has(t.type),ce=new Set([\"SCRIPT\",\"STYLE\"]),f=t=>!ce.has(t.nodeName)&&!document.head?.contains(t),O=new WeakMap,H=t=>{for(;t;)O.delete(t),t instanceof ShadowRoot?t=t.host:t=t.parentNode},j=new WeakSet,I,ue=()=>{let t=globalThis.MutationObserver;if(!t)throw new Error(\"MutationObserver is not available in this environment.\");return I||(I=new t(e=>{for(let r of e)H(r.target)})),I},d=t=>{let e=O.get(t);if(e||(e={full:\"\",immediate:[]},!f(t)))return e;let r=\"\";if(ae(t))e.full=t.value,e.immediate.push(t.value),t.addEventListener(\"input\",o=>{H(o.target)},{once:!0,capture:!0});else{for(let o=t.firstChild;o;o=o.nextSibling){if(o.nodeType===Node.TEXT_NODE){e.full+=o.nodeValue??\"\",r+=o.nodeValue??\"\";continue}r&&e.immediate.push(r),r=\"\",o.nodeType===Node.ELEMENT_NODE&&(e.full+=d(o).full)}r&&e.immediate.push(r),t instanceof Element&&t.shadowRoot&&(e.full+=d(t.shadowRoot).full),j.has(t)||(ue().observe(t,{childList:!0,characterData:!0,subtree:!0}),j.add(t))}return O.set(t,e),e};var m=function*(t,e){let r=!1;for(let o of t.childNodes)if(o instanceof Element&&f(o)){let n;o.shadowRoot?n=m(o.shadowRoot,e):n=m(o,e);for(let i of n)yield i,r=!0}r||t instanceof Element&&f(t)&&d(t).full.includes(e)&&(yield t)};var k={};l(k,{checkVisibility:()=>fe,pierce:()=>S,pierceAll:()=>M});var de=[\"hidden\",\"collapse\"],fe=(t,e)=>{if(!t)return e===!1;if(e===void 0)return t;let r=t.nodeType===Node.TEXT_NODE?t.parentElement??t.parentNode?.host:t;if(!r)return e===!1;let o=window.getComputedStyle(r),n=o&&!de.includes(o.visibility)&&!me(r);return e===n?t:!1};function me(t){let e=t.getBoundingClientRect();return e.width===0||e.height===0}var he=t=>\"shadowRoot\"in t&&t.shadowRoot instanceof ShadowRoot;function*S(t){he(t)?yield t.shadowRoot:yield t}function*M(t){t=S(t).next().value,yield t;let e=[document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT)];for(let r of e){let o;for(;o=r.nextNode();)o.shadowRoot&&(yield o.shadowRoot,e.push(document.createTreeWalker(o.shadowRoot,NodeFilter.SHOW_ELEMENT)))}}var _={};l(_,{xpathQuerySelectorAll:()=>D});var D=function*(t,e,r=-1){let n=(t.ownerDocument||document).evaluate(e,t,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE),i=[],s;for(;(s=n.iterateNext())&&(i.push(s),!(r&&i.length===r)););for(let h=0;h<i.length;h++)s=i[h],yield s,i[h]=null};var pe=/[-\\w\\P{ASCII}*]/u,V=(r=>(r.Descendent=\">>>\",r.Child=\">>>>\",r))(V||{}),U=t=>\"querySelectorAll\"in t,q=class{#e;#r=[];#t=void 0;elements;constructor(e,r){this.elements=[e],this.#e=r,this.#o()}async run(){for(typeof this.#t==\"string\"&&this.#t.trimStart()===\":scope\"&&this.#o();this.#t!==void 0;this.#o()){let e=this.#t;typeof e==\"string\"?e[0]&&pe.test(e[0])?this.elements=a.flatMap(this.elements,async function*(r){U(r)&&(yield*r.querySelectorAll(e))}):this.elements=a.flatMap(this.elements,async function*(r){if(!r.parentElement){if(!U(r))return;yield*r.querySelectorAll(e);return}let o=0;for(let n of r.parentElement.children)if(++o,n===r)break;yield*r.parentElement.querySelectorAll(`:scope>:nth-child(${o})${e}`)}):this.elements=a.flatMap(this.elements,async function*(r){switch(e.name){case\"text\":yield*m(r,e.value);break;case\"xpath\":yield*D(r,e.value);break;case\"aria\":yield*x(r,e.value);break;default:let o=P.get(e.name);if(!o)throw new Error(`Unknown selector type: ${e.name}`);yield*o.querySelectorAll(r,e.value)}})}}#o(){if(this.#r.length!==0){this.#t=this.#r.shift();return}if(this.#e.length===0){this.#t=void 0;return}let e=this.#e.shift();switch(e){case\">>>>\":{this.elements=a.flatMap(this.elements,S),this.#o();break}case\">>>\":{this.elements=a.flatMap(this.elements,M),this.#o();break}default:this.#r=e,this.#o();break}}},Q=class{#e=new WeakMap;calculate(e,r=[]){if(e===null)return r;e instanceof ShadowRoot&&(e=e.host);let o=this.#e.get(e);if(o)return[...o,...r];let n=0;for(let s=e.previousSibling;s;s=s.previousSibling)++n;let i=this.calculate(e.parentNode,[n]);return this.#e.set(e,i),[...i,...r]}},$=(t,e)=>{if(t.length+e.length===0)return 0;let[r=-1,...o]=t,[n=-1,...i]=e;return r===n?$(o,i):r<n?-1:1},ye=async function*(t){let e=new Set;for await(let o of t)e.add(o);let r=new Q;yield*[...e.values()].map(o=>[o,r.calculate(o)]).sort(([,o],[,n])=>$(o,n)).map(([o])=>o)},B=function(t,e){let r=JSON.parse(e);if(r.some(o=>{let n=0;return o.some(i=>(typeof i==\"string\"?++n:n=0,n>1))}))throw new Error(\"Multiple deep combinators found in sequence.\");return ye(a.flatMap(r,o=>{let n=new q(t,o);return n.run(),n.elements}))},we=async function(t,e){for await(let r of B(t,e))return r;return null};var Ne=Object.freeze({...E,...A,...R,...L,...C,...k,..._,...v,Deferred:c,createFunction:F,createTextContent:d,IntervalPoller:T,isSuitableNodeForTextMatching:f,MutationPoller:w,RAFPoller:N}),Te=Ne;\n";
8
+ export const source = "\"use strict\";var b=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)b(t,r,{get:e[r],enumerable:!0})},J=(t,e,r,o)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of Y(e))!G.call(t,n)&&n!==r&&b(t,n,{get:()=>e[n],enumerable:!(o=X(e,n))||o.enumerable});return t};var z=t=>J(b({},\"__esModule\",{value:!0}),t);var Se={};l(Se,{default:()=>Te});module.exports=z(Se);var g=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}},h=class extends g{};var c=class t{static create(e){return new t(e)}static async race(e){let r=new Set;try{let o=e.map(n=>n instanceof t?(n.#s&&r.add(n),n.valueOrThrow()):n);return await Promise.race(o)}finally{for(let o of r)o.reject(new Error(\"Timeout cleared\"))}}#e=!1;#r=!1;#t;#o;#n=new Promise(e=>{this.#o=e});#s;#l;constructor(e){e&&e.timeout>0&&(this.#l=new h(e.message),this.#s=setTimeout(()=>{this.reject(this.#l)},e.timeout))}#a(e){clearTimeout(this.#s),this.#t=e,this.#o()}resolve(e){this.#r||this.#e||(this.#e=!0,this.#a(e))}reject(e){this.#r||this.#e||(this.#r=!0,this.#a(e))}resolved(){return this.#e}finished(){return this.#e||this.#r}value(){return this.#t}#i;valueOrThrow(){return this.#i||(this.#i=(async()=>{if(await this.#n,this.#r)throw this.#t;return this.#t})()),this.#i}};var W=new Map,F=t=>{let e=W.get(t);return e||(e=new Function(`return ${t}`)(),W.set(t,e),e)};var E={};l(E,{ariaQuerySelector:()=>K,ariaQuerySelectorAll:()=>x});var K=(t,e)=>globalThis.__ariaQuerySelector(t,e),x=async function*(t,e){yield*await globalThis.__ariaQuerySelectorAll(t,e)};var v={};l(v,{cssQuerySelector:()=>Z,cssQuerySelectorAll:()=>ee});var Z=(t,e)=>t.querySelector(e),ee=function(t,e){return t.querySelectorAll(e)};var P={};l(P,{CustomQuerySelectorRegistry:()=>p,customQuerySelectors:()=>A});var p=class{#e=new Map;register(e,r){if(!r.queryOne&&r.queryAll){let o=r.queryAll;r.queryOne=(n,i)=>{for(let s of o(n,i))return s;return null}}else if(r.queryOne&&!r.queryAll){let o=r.queryOne;r.queryAll=(n,i)=>{let s=o(n,i);return s?[s]:[]}}else if(!r.queryOne||!r.queryAll)throw new Error(\"At least one query method must be defined.\");this.#e.set(e,{querySelector:r.queryOne,querySelectorAll:r.queryAll})}unregister(e){this.#e.delete(e)}get(e){return this.#e.get(e)}clear(){this.#e.clear()}},A=new p;var R={};l(R,{pierceQuerySelector:()=>te,pierceQuerySelectorAll:()=>re});var te=(t,e)=>{let r=null,o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&!r&&s.matches(e)&&(r=s)}while(!r&&i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r},re=(t,e)=>{let r=[],o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&s.matches(e)&&r.push(s)}while(i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r};var y=(t,e)=>{if(!t)throw new Error(e)};var oe={childList:!0,subtree:!0,attributes:!0};function ne(t){return t.nodeType===Node.ELEMENT_NODE||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function se(t){return t.parentNode??t.host??null}function ie(t,e){let r=t,o;for(;o=se(r);){if(e.has(o))return!0;r=o}return!1}var w=class{#e;#r;#t;#o=new WeakSet;#n;#s=!1;constructor(e,r){this.#e=e,this.#r=r}async start(){if(this.#s)return;let e=this.#n=c.create(),r=await this.#e();if(!this.#s){if(r){e.resolve(r);return}this.#o=new WeakSet,this.#t=new MutationObserver(async o=>{this.#a(o);let n=await this.#e();n&&(e.resolve(n),await this.stop())}),this.#l(this.#r)}}#l(e){!this.#t||this.#o.has(e)||(this.#o.add(e),this.#t.observe(e,oe),this.#i(e))}#a(e){let r=new Set;for(let o of e)for(let n of o.addedNodes)ne(n)&&r.add(n);for(let o of r)ie(o,r)||this.#i(o)}#i(e){let r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);do{let{shadowRoot:o}=r.currentNode;o&&this.#l(o)}while(r.nextNode())}async stop(){this.#s=!0,this.#n&&(this.#n.finished()||this.#n.reject(new Error(\"Polling stopped\")),this.#t&&(this.#t.disconnect(),this.#t=void 0))}result(){return y(this.#n,\"Polling never started.\"),this.#n.valueOrThrow()}},N=class{#e;#r;#t=!1;constructor(e){this.#e=e}async start(){if(this.#t)return;let e=this.#r=c.create(),r=await this.#e();if(this.#t)return;if(r){e.resolve(r);return}let o=async()=>{if(e.finished())return;let n=await this.#e();if(!n){window.requestAnimationFrame(o);return}e.resolve(n),await this.stop()};window.requestAnimationFrame(o)}async stop(){this.#t=!0,this.#r&&(this.#r.finished()||this.#r.reject(new Error(\"Polling stopped\")))}result(){return y(this.#r,\"Polling never started.\"),this.#r.valueOrThrow()}},T=class{#e;#r;#t;#o;#n=!1;constructor(e,r){this.#e=e,this.#r=r}async start(){if(this.#n)return;let e=this.#o=c.create(),r=await this.#e();if(!this.#n){if(r){e.resolve(r);return}this.#t=setInterval(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())},this.#r)}}async stop(){this.#n=!0,this.#o&&(this.#o.finished()||this.#o.reject(new Error(\"Polling stopped\")),this.#t&&(clearInterval(this.#t),this.#t=void 0))}result(){return y(this.#o,\"Polling never started.\"),this.#o.valueOrThrow()}};var L={};l(L,{PCombinator:()=>V,pQuerySelector:()=>we,pQuerySelectorAll:()=>B});var a=class{static async*map(e,r){for await(let o of e)yield await r(o)}static async*flatMap(e,r){for await(let o of e)yield*r(o)}static async collect(e){let r=[];for await(let o of e)r.push(o);return r}static async first(e){for await(let r of e)return r}};var C={};l(C,{textQuerySelectorAll:()=>f});var le=new Set([\"checkbox\",\"image\",\"radio\"]),ae=t=>t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement||t instanceof HTMLInputElement&&!le.has(t.type),ce=new Set([\"SCRIPT\",\"STYLE\"]),d=t=>!ce.has(t.nodeName)&&!document.head?.contains(t),O=new WeakMap,H=t=>{for(;t;)O.delete(t),t instanceof ShadowRoot?t=t.host:t=t.parentNode},j=new WeakSet,I,ue=()=>{let t=globalThis.MutationObserver;if(!t)throw new Error(\"MutationObserver is not available in this environment.\");return I||(I=new t(e=>{for(let r of e)H(r.target)})),I},u=t=>{let e=O.get(t);if(e||(e={full:\"\",immediate:[]},!d(t)))return e;let r=\"\";if(ae(t))e.full=t.value,e.immediate.push(t.value),t.addEventListener(\"input\",o=>{H(o.target)},{once:!0,capture:!0});else{for(let o=t.firstChild;o;o=o.nextSibling){if(o.nodeType===Node.TEXT_NODE){e.full+=o.nodeValue??\"\",r+=o.nodeValue??\"\";continue}r&&e.immediate.push(r),r=\"\",o.nodeType===Node.ELEMENT_NODE&&(e.full+=u(o).full)}r&&e.immediate.push(r),t instanceof Element&&t.shadowRoot&&(e.full+=u(t.shadowRoot).full),j.has(t)||(ue().observe(t,{childList:!0,characterData:!0,subtree:!0}),j.add(t))}return O.set(t,e),e};var f=function*(t,e){let r=!1;for(let o of t.childNodes)if(o instanceof Element&&d(o)){let n;o.shadowRoot?n=f(o.shadowRoot,e):n=f(o,e);for(let i of n)yield i,r=!0}r||t instanceof Element&&d(t)&&u(t).full.includes(e)&&(yield t)};var k={};l(k,{checkVisibility:()=>fe,pierce:()=>S,pierceAll:()=>M});var de=[\"hidden\",\"collapse\"],fe=(t,e)=>{if(!t)return e===!1;if(e===void 0)return t;let r=t.nodeType===Node.TEXT_NODE?t.parentElement??t.parentNode?.host:t;if(!r)return e===!1;let o=window.getComputedStyle(r),n=o&&!de.includes(o.visibility)&&!me(r);return e===n?t:!1};function me(t){let e=t.getBoundingClientRect();return e.width===0||e.height===0}var he=t=>\"shadowRoot\"in t&&t.shadowRoot instanceof ShadowRoot;function*S(t){he(t)?yield t.shadowRoot:yield t}function*M(t){t=S(t).next().value,yield t;let e=[document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT)];for(let r of e){let o;for(;o=r.nextNode();)o.shadowRoot&&(yield o.shadowRoot,e.push(document.createTreeWalker(o.shadowRoot,NodeFilter.SHOW_ELEMENT)))}}var _={};l(_,{xpathQuerySelectorAll:()=>D});var D=function*(t,e,r=-1){let n=(t.ownerDocument||document).evaluate(e,t,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE),i=[],s;for(;(s=n.iterateNext())&&(i.push(s),!(r&&i.length===r)););for(let m=0;m<i.length;m++)s=i[m],yield s,i[m]=null};var pe=/[-\\w\\P{ASCII}*]/u,V=(r=>(r.Descendent=\">>>\",r.Child=\">>>>\",r))(V||{}),U=t=>\"querySelectorAll\"in t,q=class{#e;#r=[];#t=void 0;elements;constructor(e,r){this.elements=[e],this.#e=r,this.#o()}async run(){for(typeof this.#t==\"string\"&&this.#t.trimStart()===\":scope\"&&this.#o();this.#t!==void 0;this.#o()){let e=this.#t;typeof e==\"string\"?e[0]&&pe.test(e[0])?this.elements=a.flatMap(this.elements,async function*(r){U(r)&&(yield*r.querySelectorAll(e))}):this.elements=a.flatMap(this.elements,async function*(r){if(!r.parentElement){if(!U(r))return;yield*r.querySelectorAll(e);return}let o=0;for(let n of r.parentElement.children)if(++o,n===r)break;yield*r.parentElement.querySelectorAll(`:scope>:nth-child(${o})${e}`)}):this.elements=a.flatMap(this.elements,async function*(r){switch(e.name){case\"text\":yield*f(r,e.value);break;case\"xpath\":yield*D(r,e.value);break;case\"aria\":yield*x(r,e.value);break;default:let o=A.get(e.name);if(!o)throw new Error(`Unknown selector type: ${e.name}`);yield*o.querySelectorAll(r,e.value)}})}}#o(){if(this.#r.length!==0){this.#t=this.#r.shift();return}if(this.#e.length===0){this.#t=void 0;return}let e=this.#e.shift();switch(e){case\">>>>\":{this.elements=a.flatMap(this.elements,S),this.#o();break}case\">>>\":{this.elements=a.flatMap(this.elements,M),this.#o();break}default:this.#r=e,this.#o();break}}},Q=class{#e=new WeakMap;calculate(e,r=[]){if(e===null)return r;e instanceof ShadowRoot&&(e=e.host);let o=this.#e.get(e);if(o)return[...o,...r];let n=0;for(let s=e.previousSibling;s;s=s.previousSibling)++n;let i=this.calculate(e.parentNode,[n]);return this.#e.set(e,i),[...i,...r]}},$=(t,e)=>{if(t.length+e.length===0)return 0;let[r=-1,...o]=t,[n=-1,...i]=e;return r===n?$(o,i):r<n?-1:1},ye=async function*(t){let e=new Set;for await(let o of t)e.add(o);let r=new Q;yield*[...e.values()].map(o=>[o,r.calculate(o)]).sort(([,o],[,n])=>$(o,n)).map(([o])=>o)},B=function(t,e){let r=JSON.parse(e);if(r.some(o=>{let n=0;return o.some(i=>(typeof i==\"string\"?++n:n=0,n>1))}))throw new Error(\"Multiple deep combinators found in sequence.\");return ye(a.flatMap(r,o=>{let n=new q(t,o);return n.run(),n.elements}))},we=async function(t,e){for await(let r of B(t,e))return r;return null};var Ne=Object.freeze({...E,...P,...R,...L,...C,...k,..._,...v,Deferred:c,createFunction:F,createTextContent:u,IntervalPoller:T,isSuitableNodeForTextMatching:d,MutationPoller:w,RAFPoller:N}),Te=Ne;\n";
@@ -8,6 +8,8 @@ import {assert} from '../util/assert.js';
8
8
  import {Deferred} from '../util/Deferred.js';
9
9
 
10
10
  /**
11
+ * A stopped poller is single-use and does not restart.
12
+ *
11
13
  * @internal
12
14
  */
13
15
  export interface Poller<T> {
@@ -60,14 +62,21 @@ export class MutationPoller<T> implements Poller<T> {
60
62
  #observer?: MutationObserver;
61
63
  #observedRoots = new WeakSet<Node>();
62
64
  #deferred?: Deferred<T>;
65
+ #stopped = false;
63
66
  constructor(fn: () => Promise<T>, root: Node) {
64
67
  this.#fn = fn;
65
68
  this.#root = root;
66
69
  }
67
70
 
68
71
  async start(): Promise<void> {
72
+ if (this.#stopped) {
73
+ return;
74
+ }
69
75
  const deferred = (this.#deferred = Deferred.create<T>());
70
76
  const result = await this.#fn();
77
+ if (this.#stopped) {
78
+ return;
79
+ }
71
80
  if (result) {
72
81
  deferred.resolve(result);
73
82
  return;
@@ -135,7 +144,10 @@ export class MutationPoller<T> implements Poller<T> {
135
144
  }
136
145
 
137
146
  async stop(): Promise<void> {
138
- assert(this.#deferred, 'Polling never started.');
147
+ this.#stopped = true;
148
+ if (!this.#deferred) {
149
+ return;
150
+ }
139
151
  if (!this.#deferred.finished()) {
140
152
  this.#deferred.reject(new Error('Polling stopped'));
141
153
  }
@@ -157,13 +169,20 @@ export class MutationPoller<T> implements Poller<T> {
157
169
  export class RAFPoller<T> implements Poller<T> {
158
170
  #fn: () => Promise<T>;
159
171
  #deferred?: Deferred<T>;
172
+ #stopped = false;
160
173
  constructor(fn: () => Promise<T>) {
161
174
  this.#fn = fn;
162
175
  }
163
176
 
164
177
  async start(): Promise<void> {
178
+ if (this.#stopped) {
179
+ return;
180
+ }
165
181
  const deferred = (this.#deferred = Deferred.create<T>());
166
182
  const result = await this.#fn();
183
+ if (this.#stopped) {
184
+ return;
185
+ }
167
186
  if (result) {
168
187
  deferred.resolve(result);
169
188
  return;
@@ -185,7 +204,10 @@ export class RAFPoller<T> implements Poller<T> {
185
204
  }
186
205
 
187
206
  async stop(): Promise<void> {
188
- assert(this.#deferred, 'Polling never started.');
207
+ this.#stopped = true;
208
+ if (!this.#deferred) {
209
+ return;
210
+ }
189
211
  if (!this.#deferred.finished()) {
190
212
  this.#deferred.reject(new Error('Polling stopped'));
191
213
  }
@@ -207,14 +229,21 @@ export class IntervalPoller<T> implements Poller<T> {
207
229
 
208
230
  #interval?: NodeJS.Timeout;
209
231
  #deferred?: Deferred<T>;
232
+ #stopped = false;
210
233
  constructor(fn: () => Promise<T>, ms: number) {
211
234
  this.#fn = fn;
212
235
  this.#ms = ms;
213
236
  }
214
237
 
215
238
  async start(): Promise<void> {
239
+ if (this.#stopped) {
240
+ return;
241
+ }
216
242
  const deferred = (this.#deferred = Deferred.create<T>());
217
243
  const result = await this.#fn();
244
+ if (this.#stopped) {
245
+ return;
246
+ }
218
247
  if (result) {
219
248
  deferred.resolve(result);
220
249
  return;
@@ -231,7 +260,10 @@ export class IntervalPoller<T> implements Poller<T> {
231
260
  }
232
261
 
233
262
  async stop(): Promise<void> {
234
- assert(this.#deferred, 'Polling never started.');
263
+ this.#stopped = true;
264
+ if (!this.#deferred) {
265
+ return;
266
+ }
235
267
  if (!this.#deferred.finished()) {
236
268
  this.#deferred.reject(new Error('Polling stopped'));
237
269
  }
@@ -26,12 +26,14 @@ import {
26
26
  import type {Browser, BrowserCloseCallback} from '../api/Browser.js';
27
27
  import {CdpBrowser} from '../cdp/Browser.js';
28
28
  import {Connection} from '../cdp/Connection.js';
29
- import {assertSupportedUrlRestrictions} from '../common/BrowserConnector.js';
30
29
  import type {WsOptions} from '../common/ConnectOptions.js';
31
30
  import {DEBUG_PREFIXES, type Logger} from '../common/Debug.js';
32
31
  import {TimeoutError} from '../common/Errors.js';
33
32
  import type {SupportedBrowser} from '../common/SupportedBrowser.js';
34
- import {DEFAULT_VIEWPORT} from '../common/util.js';
33
+ import {
34
+ assertSupportedUrlRestrictions,
35
+ DEFAULT_VIEWPORT,
36
+ } from '../common/util.js';
35
37
  import type {Viewport} from '../common/Viewport.js';
36
38
  import {
37
39
  createIncrementalIdGenerator,
@@ -41,6 +41,10 @@ export interface NodeWebSocketTransportOptions {
41
41
  * Maximum allowed message size in bytes.
42
42
  */
43
43
  maxPayload?: number;
44
+ /**
45
+ * Time in milliseconds to wait for the opening handshake.
46
+ */
47
+ handshakeTimeout?: number;
44
48
  }
45
49
 
46
50
  /**
@@ -59,6 +63,7 @@ export class NodeWebSocketTransport implements ConnectionTransport {
59
63
  perMessageDeflate: false,
60
64
  allowSynchronousEvents: false,
61
65
  maxPayload: options.maxPayload ?? DEFAULT_MAX_PAYLOAD_BYTES,
66
+ handshakeTimeout: options.handshakeTimeout,
62
67
  headers: {
63
68
  'User-Agent': `Puppeteer ${packageVersion}`,
64
69
  ...headers,
@@ -8,7 +8,7 @@
8
8
  * @internal
9
9
  */
10
10
  export const PUPPETEER_REVISIONS = Object.freeze({
11
- chrome: '155.0.8059.79',
12
- 'chrome-headless-shell': '155.0.8059.79',
13
- firefox: 'stable_158.0',
11
+ chrome: '156.0.8078.47',
12
+ 'chrome-headless-shell': '156.0.8078.47',
13
+ firefox: 'stable_158.0.1',
14
14
  });
@@ -10,7 +10,7 @@
10
10
  export function stringToTypedArray(
11
11
  string: string,
12
12
  base64Encoded = false,
13
- ): Uint8Array {
13
+ ): Uint8Array<ArrayBuffer> {
14
14
  if (base64Encoded) {
15
15
  if ('fromBase64' in Uint8Array) {
16
16
  // @ts-expect-error fromBase64 is newer than the types we use.
@@ -55,7 +55,7 @@ export function typedArrayToBase64(typedArray: Uint8Array): string {
55
55
  /**
56
56
  * @internal
57
57
  */
58
- export function mergeUint8Arrays(items: Uint8Array[]): Uint8Array {
58
+ export function mergeUint8Arrays(items: Uint8Array[]): Uint8Array<ArrayBuffer> {
59
59
  let length = 0;
60
60
  for (const item of items) {
61
61
  length += item.length;
@@ -6,5 +6,5 @@
6
6
 
7
7
  // If moved update release-please config
8
8
  // x-release-please-start-version
9
- export const packageVersion = '25.14.0';
9
+ export const packageVersion = '25.16.0';
10
10
  // x-release-please-end