chrome-devtools-frontend 1.0.1650232 → 1.0.1651641

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 (282) hide show
  1. package/.agents/skills/version-control/SKILL.md +5 -1
  2. package/config/typescript/tsconfig.base.json +1 -0
  3. package/front_end/core/host/InspectorFrontendHostAPI.ts +0 -1
  4. package/front_end/core/host/UserMetrics.ts +0 -11
  5. package/front_end/core/sdk/CSSMatchedStyles.ts +20 -4
  6. package/front_end/devtools_compatibility.js +1 -2
  7. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +94 -0
  8. package/front_end/foundation/Universe.ts +7 -0
  9. package/front_end/generated/InspectorBackendCommands.ts +4 -1
  10. package/front_end/generated/SupportedCSSProperties.js +284 -0
  11. package/front_end/generated/protocol-mapping.d.ts +7 -0
  12. package/front_end/generated/protocol-proxy-api.d.ts +5 -0
  13. package/front_end/generated/protocol.ts +60 -0
  14. package/front_end/models/ai_assistance/AiAgent2.ts +11 -1
  15. package/front_end/models/ai_assistance/README.md +4 -0
  16. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +2 -0
  17. package/front_end/models/ai_assistance/agents/AiAgent.ts +3 -0
  18. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -0
  19. package/front_end/models/ai_assistance/ai_assistance.ts +4 -0
  20. package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
  21. package/front_end/models/ai_assistance/skills/SkillRegistry.ts +2 -0
  22. package/front_end/models/ai_assistance/skills/accessibility.md +13 -0
  23. package/front_end/models/ai_assistance/tools/GetLighthouseAudits.ts +54 -0
  24. package/front_end/models/ai_assistance/tools/ResolveLighthousePath.ts +124 -0
  25. package/front_end/models/ai_assistance/tools/Tool.ts +12 -2
  26. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +4 -0
  27. package/front_end/models/heap_snapshot/HeapSnapshotModel.ts +14 -0
  28. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +4 -0
  29. package/front_end/models/javascript_metadata/NativeFunctions.js +4 -0
  30. package/front_end/models/persistence/NetworkPersistenceManager.ts +9 -1
  31. package/front_end/panels/ai_assistance/components/ChatMessage.ts +3 -11
  32. package/front_end/panels/common/ExtensionServer.ts +70 -50
  33. package/front_end/panels/elements/CSSSpecificityBreakdown.ts +106 -0
  34. package/front_end/panels/elements/ElementsPanel.ts +1 -1
  35. package/front_end/panels/elements/StylePropertiesSection.ts +40 -13
  36. package/front_end/panels/elements/StylePropertyTreeElement.ts +6 -5
  37. package/front_end/panels/elements/components/CSSQuery.ts +119 -4
  38. package/front_end/panels/elements/elements.ts +3 -0
  39. package/front_end/panels/elements/stylesSidebarPane.css +34 -0
  40. package/front_end/panels/js_timeline/js_timeline-meta.ts +1 -2
  41. package/front_end/panels/layer_viewer/PaintProfilerView.ts +0 -3
  42. package/front_end/panels/network/RequestHeadersView.ts +2 -2
  43. package/front_end/panels/network/components/RequestHeadersView.css +1 -0
  44. package/front_end/panels/network/components/ResponseHeaderSection.css +5 -1
  45. package/front_end/panels/recorder/testing/RecorderHelpers.ts +2 -0
  46. package/front_end/panels/timeline/timeline-meta.ts +1 -1
  47. package/front_end/third_party/chromium/README.chromium +1 -1
  48. package/front_end/third_party/puppeteer/README.chromium +2 -2
  49. package/front_end/third_party/puppeteer/package/README.md +14 -0
  50. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +60 -24
  51. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +271 -164
  52. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +2 -6
  53. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  54. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +2 -2
  55. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  56. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +2 -2
  57. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  58. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js +11 -7
  59. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js.map +1 -1
  60. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts.map +1 -1
  61. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js +3 -10
  62. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js.map +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +9 -4
  64. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  65. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +4 -4
  66. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  67. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.d.ts +13 -0
  68. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.d.ts.map +1 -1
  69. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.js +14 -0
  70. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.js.map +1 -1
  71. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js +5 -5
  72. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js +2 -2
  74. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js +3 -3
  76. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js.map +1 -1
  77. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserConnector.js +5 -3
  78. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserConnector.js.map +1 -1
  79. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserContext.js +6 -6
  80. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserContext.js.map +1 -1
  81. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.d.ts +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.d.ts.map +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.js +3 -3
  84. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.js.map +1 -1
  85. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Deserializer.js +2 -2
  86. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Deserializer.js.map +1 -1
  87. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ExposedFunction.js +6 -6
  88. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ExposedFunction.js.map +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Frame.js +1 -1
  90. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Frame.js.map +1 -1
  91. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +1 -0
  92. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
  93. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +3 -0
  94. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Realm.js +1 -1
  96. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Realm.js.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts +1 -0
  98. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js +11 -0
  100. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  101. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js +4 -4
  103. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Binding.js +3 -3
  105. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Binding.js.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +13 -2
  108. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/BrowserConnector.js +2 -2
  110. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/BrowserConnector.js.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Connection.js +2 -2
  112. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Connection.js.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Coverage.js +2 -2
  114. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Coverage.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ElementHandle.js +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ElementHandle.js.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.d.ts +1 -0
  118. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.d.ts.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.js +25 -4
  120. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.js.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ExecutionContext.js +3 -3
  122. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ExecutionContext.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Extension.d.ts.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Extension.js +9 -11
  125. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Extension.js.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js +3 -3
  127. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.d.ts.map +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js +7 -7
  130. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js.map +1 -1
  133. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/JSHandle.js +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/JSHandle.js.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts +3 -1
  136. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js +18 -10
  138. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +1 -0
  140. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js +17 -11
  142. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js +3 -3
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js +28 -10
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js.map +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js +10 -6
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.d.ts +3 -0
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.js +20 -5
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.js.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.d.ts.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js +11 -0
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js.map +1 -1
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js +2 -2
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js.map +1 -1
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/CallbackRegistry.js +2 -2
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/CallbackRegistry.js.map +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Configuration.d.ts +4 -2
  163. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Configuration.d.ts.map +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +26 -13
  165. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts +1 -6
  167. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js +24 -33
  169. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js.map +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js +2 -2
  171. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js.map +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.d.ts +8 -1
  173. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.d.ts.map +1 -1
  174. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.js +8 -1
  175. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.js.map +1 -1
  176. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.d.ts +2 -0
  177. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.d.ts.map +1 -1
  178. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.js +4 -2
  179. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.js.map +1 -1
  180. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  181. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  182. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  183. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  184. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/TextContent.d.ts.map +1 -1
  185. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/TextContent.js +15 -5
  186. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/TextContent.js.map +1 -1
  187. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts +5 -1
  188. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  189. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +17 -16
  190. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  191. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  192. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ChromeLauncher.js +14 -9
  193. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ChromeLauncher.js.map +1 -1
  194. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/FirefoxLauncher.js +2 -2
  195. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/FirefoxLauncher.js.map +1 -1
  196. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js +2 -2
  197. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js.map +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/PipeTransport.js +3 -3
  199. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/PipeTransport.js.map +1 -1
  200. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts +20 -0
  201. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts.map +1 -1
  202. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js +38 -9
  203. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js.map +1 -1
  204. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.d.ts +7 -0
  205. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.d.ts.map +1 -0
  206. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.js +16 -0
  207. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.js.map +1 -0
  208. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.d.ts +1 -0
  209. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.d.ts.map +1 -1
  210. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.js +3 -8
  211. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.js.map +1 -1
  212. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  213. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  214. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js.map +1 -1
  215. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  216. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  217. package/front_end/third_party/puppeteer/package/lib/types.d.ts +60 -24
  218. package/front_end/third_party/puppeteer/package/package.json +4 -4
  219. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +4 -8
  220. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +2 -2
  221. package/front_end/third_party/puppeteer/package/src/api/HTTPRequest.ts +10 -10
  222. package/front_end/third_party/puppeteer/package/src/api/JSHandle.ts +3 -10
  223. package/front_end/third_party/puppeteer/package/src/api/Page.ts +14 -8
  224. package/front_end/third_party/puppeteer/package/src/api/WebWorker.ts +30 -0
  225. package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +5 -5
  226. package/front_end/third_party/puppeteer/package/src/bidi/BidiOverCdp.ts +2 -2
  227. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +3 -3
  228. package/front_end/third_party/puppeteer/package/src/bidi/BrowserConnector.ts +5 -3
  229. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +6 -6
  230. package/front_end/third_party/puppeteer/package/src/bidi/Connection.ts +4 -4
  231. package/front_end/third_party/puppeteer/package/src/bidi/Deserializer.ts +2 -2
  232. package/front_end/third_party/puppeteer/package/src/bidi/ExposedFunction.ts +6 -6
  233. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -1
  234. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +4 -0
  235. package/front_end/third_party/puppeteer/package/src/bidi/Realm.ts +1 -1
  236. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +11 -0
  237. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +6 -4
  238. package/front_end/third_party/puppeteer/package/src/cdp/Binding.ts +3 -3
  239. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +14 -2
  240. package/front_end/third_party/puppeteer/package/src/cdp/BrowserConnector.ts +2 -2
  241. package/front_end/third_party/puppeteer/package/src/cdp/Connection.ts +2 -2
  242. package/front_end/third_party/puppeteer/package/src/cdp/Coverage.ts +2 -2
  243. package/front_end/third_party/puppeteer/package/src/cdp/ElementHandle.ts +1 -1
  244. package/front_end/third_party/puppeteer/package/src/cdp/EmulationManager.ts +36 -4
  245. package/front_end/third_party/puppeteer/package/src/cdp/ExecutionContext.ts +3 -3
  246. package/front_end/third_party/puppeteer/package/src/cdp/Extension.ts +16 -17
  247. package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +3 -3
  248. package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +12 -7
  249. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +1 -1
  250. package/front_end/third_party/puppeteer/package/src/cdp/JSHandle.ts +1 -1
  251. package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +22 -11
  252. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +18 -10
  253. package/front_end/third_party/puppeteer/package/src/cdp/Target.ts +3 -3
  254. package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +37 -12
  255. package/front_end/third_party/puppeteer/package/src/cdp/WebMCP.ts +11 -9
  256. package/front_end/third_party/puppeteer/package/src/cdp/WebWorker.ts +33 -5
  257. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +11 -0
  258. package/front_end/third_party/puppeteer/package/src/common/BrowserWebSocketTransport.ts +2 -2
  259. package/front_end/third_party/puppeteer/package/src/common/CallbackRegistry.ts +2 -2
  260. package/front_end/third_party/puppeteer/package/src/common/Configuration.ts +4 -2
  261. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +26 -13
  262. package/front_end/third_party/puppeteer/package/src/common/Debug.ts +30 -40
  263. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +2 -2
  264. package/front_end/third_party/puppeteer/package/src/common/util.ts +9 -1
  265. package/front_end/third_party/puppeteer/package/src/environment.ts +7 -3
  266. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  267. package/front_end/third_party/puppeteer/package/src/injected/TextContent.ts +15 -5
  268. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +23 -23
  269. package/front_end/third_party/puppeteer/package/src/node/ChromeLauncher.ts +19 -13
  270. package/front_end/third_party/puppeteer/package/src/node/FirefoxLauncher.ts +2 -2
  271. package/front_end/third_party/puppeteer/package/src/node/NodeWebSocketTransport.ts +2 -2
  272. package/front_end/third_party/puppeteer/package/src/node/PipeTransport.ts +3 -3
  273. package/front_end/third_party/puppeteer/package/src/node/ScreenRecorder.ts +44 -9
  274. package/front_end/third_party/puppeteer/package/src/node-env-setup.ts +18 -0
  275. package/front_end/third_party/puppeteer/package/src/puppeteer-core.ts +5 -9
  276. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  277. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  278. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +1 -0
  279. package/front_end/tsconfig.json +1 -2
  280. package/inspector_overlay/tsconfig.json +3 -10
  281. package/mcp/tsconfig.json +1 -5
  282. package/package.json +1 -2
@@ -7,7 +7,7 @@
7
7
  import type Protocol from 'devtools-protocol';
8
8
 
9
9
  import type {EvaluateFuncWith, HandleFor, HandleOr} from '../common/types.js';
10
- import {debugError, withSourcePuppeteerURLIfNone} from '../common/util.js';
10
+ import {withSourcePuppeteerURLIfNone, debugCatchError} from '../common/util.js';
11
11
  import {moveable, throwIfDisposed} from '../util/decorators.js';
12
12
  import {disposeSymbol, asyncDisposeSymbol} from '../util/disposable.js';
13
13
 
@@ -135,14 +135,7 @@ export abstract class JSHandle<T = unknown> {
135
135
  @throwIfDisposed()
136
136
  async getProperties(): Promise<Map<string, JSHandle>> {
137
137
  const propertyNames = await this.evaluate(object => {
138
- const enumerableProperties = [];
139
- const descriptors = Object.getOwnPropertyDescriptors(object);
140
- for (const propertyName in descriptors) {
141
- if (descriptors[propertyName]?.enumerable) {
142
- enumerableProperties.push(propertyName);
143
- }
144
- }
145
- return enumerableProperties;
138
+ return Object.keys(object ?? {});
146
139
  });
147
140
  const map = new Map<string, JSHandle>();
148
141
  const results = await Promise.all(
@@ -202,7 +195,7 @@ export abstract class JSHandle<T = unknown> {
202
195
 
203
196
  /** @internal */
204
197
  [disposeSymbol](): void {
205
- return void this[asyncDisposeSymbol]().catch(debugError);
198
+ return void this[asyncDisposeSymbol]().catch(debugCatchError);
206
199
  }
207
200
 
208
201
  /** @internal */
@@ -61,7 +61,6 @@ import type {
61
61
  NodeFor,
62
62
  } from '../common/types.js';
63
63
  import {
64
- debugError,
65
64
  fromEmitterEvent,
66
65
  filterAsync,
67
66
  isString,
@@ -69,6 +68,7 @@ import {
69
68
  timeout,
70
69
  withSourcePuppeteerURLIfNone,
71
70
  fromAbortSignal,
71
+ debugCatchError,
72
72
  } from '../common/util.js';
73
73
  import type {Viewport} from '../common/Viewport.js';
74
74
  import {environment} from '../environment.js';
@@ -910,7 +910,8 @@ export abstract class Page extends EventEmitter<PageEvents> {
910
910
  /**
911
911
  * A target this page was created from.
912
912
  *
913
- * @deprecated Use {@link Page.createCDPSession} directly.
913
+ * @deprecated To create CDP session use {@link Page.createCDPSession} directly. To
914
+ * identify pages spawned by this one, use {@link PageEvent.Popup} event instead.
914
915
  */
915
916
  abstract target(): Target;
916
917
 
@@ -955,9 +956,8 @@ export abstract class Page extends EventEmitter<PageEvents> {
955
956
  abstract get tracing(): Tracing;
956
957
 
957
958
  /**
958
- * Experimental API for {@link https://github.com/webmachinelearning/webmcp
959
- * | WebMCP}. Requires Chrome 149+ with the
960
- * `--enable-features=WebMCPTesting,DevToolsWebMCPSupport` flags enabled.
959
+ * Experimental API for {@link https://github.com/webmachinelearning/webmcp| WebMCP}.
960
+ * Requires Chrome 150+ with the `--enable-features=WebMCP` flag enabled.
961
961
  *
962
962
  * @experimental
963
963
  */
@@ -2220,6 +2220,12 @@ export abstract class Page extends EventEmitter<PageEvents> {
2220
2220
  */
2221
2221
  abstract emulateMediaFeatures(features?: MediaFeature[]): Promise<void>;
2222
2222
 
2223
+ /**
2224
+ * @param locale - Locale to emulate on the page. Passing no locale disables
2225
+ * locale emulation.
2226
+ */
2227
+ abstract emulateLocale(locale?: string): Promise<void>;
2228
+
2223
2229
  /**
2224
2230
  * @param timezoneId - Changes the timezone of the page. See
2225
2231
  * {@link https://source.chromium.org/chromium/chromium/deps/icu.git/+/faee8bc70570192d82d2978a71e2a615788597d1:source/data/misc/metaZones.txt | ICU’s metaZones.txt}
@@ -2614,7 +2620,7 @@ export abstract class Page extends EventEmitter<PageEvents> {
2614
2620
  if (viewport && viewport.deviceScaleFactor !== 0) {
2615
2621
  await this.setViewport({...viewport, deviceScaleFactor: 0});
2616
2622
  stack.defer(() => {
2617
- void this.setViewport(viewport).catch(debugError);
2623
+ void this.setViewport(viewport).catch(debugCatchError);
2618
2624
  });
2619
2625
  }
2620
2626
  return await this.mainFrame()
@@ -2738,7 +2744,7 @@ export abstract class Page extends EventEmitter<PageEvents> {
2738
2744
  ...scrollDimensions,
2739
2745
  });
2740
2746
  stack.defer(async () => {
2741
- await this.setViewport(viewport).catch(debugError);
2747
+ await this.setViewport(viewport).catch(debugCatchError);
2742
2748
  });
2743
2749
  }
2744
2750
  } else {
@@ -3228,7 +3234,7 @@ export abstract class Page extends EventEmitter<PageEvents> {
3228
3234
 
3229
3235
  /** @internal */
3230
3236
  override [disposeSymbol](): void {
3231
- return void this[asyncDisposeSymbol]().catch(debugError);
3237
+ return void this[asyncDisposeSymbol]().catch(debugCatchError);
3232
3238
  }
3233
3239
 
3234
3240
  /** @internal */
@@ -155,6 +155,36 @@ export abstract class WebWorker extends EventEmitter<WebWorkerEvents> {
155
155
  return await this.mainRealm().evaluateHandle(func, ...args);
156
156
  }
157
157
 
158
+ /**
159
+ * Waits for the provided function, `workerFunction`, to return a truthy value when
160
+ * evaluated in the page's context.
161
+ *
162
+ * @param workerFunction - Function to be evaluated in browser context until it
163
+ * returns a truthy value.
164
+ * @param options - Options for configuring waiting behavior.
165
+ */
166
+ waitForFunction<
167
+ Params extends unknown[],
168
+ Func extends EvaluateFunc<Params> = EvaluateFunc<Params>,
169
+ >(
170
+ workerFunction: Func | string,
171
+ options: {
172
+ polling?: number;
173
+ timeout?: number;
174
+ signal?: AbortSignal;
175
+ } = {},
176
+ ...args: Params
177
+ ): Promise<HandleFor<Awaited<ReturnType<Func>>>> {
178
+ return this.mainRealm().waitForFunction(
179
+ workerFunction,
180
+ {
181
+ polling: 100,
182
+ ...options,
183
+ },
184
+ ...args,
185
+ );
186
+ }
187
+
158
188
  async close(): Promise<void> {
159
189
  throw new UnsupportedOperation('WebWorker.close() is not supported');
160
190
  }
@@ -33,7 +33,7 @@ import {
33
33
  import type {EventType} from '../../common/EventEmitter.js';
34
34
  import {EventEmitter} from '../../common/EventEmitter.js';
35
35
  import type {Awaitable, HandleFor, NodeFor} from '../../common/types.js';
36
- import {debugError, fromAbortSignal, timeout} from '../../common/util.js';
36
+ import {fromAbortSignal, timeout, debugCatchError} from '../../common/util.js';
37
37
  import type {
38
38
  BoundingBox,
39
39
  ClickOptions,
@@ -400,7 +400,7 @@ export abstract class Locator<T> extends EventEmitter<LocatorEvents> {
400
400
  mergeMap(handle => {
401
401
  return from(handle.click(options)).pipe(
402
402
  catchError(err => {
403
- void handle.dispose().catch(debugError);
403
+ void handle.dispose().catch(debugCatchError);
404
404
  throw err;
405
405
  }),
406
406
  );
@@ -595,7 +595,7 @@ export abstract class Locator<T> extends EventEmitter<LocatorEvents> {
595
595
  )
596
596
  .pipe(
597
597
  catchError(err => {
598
- void handle.dispose().catch(debugError);
598
+ void handle.dispose().catch(debugCatchError);
599
599
  throw err;
600
600
  }),
601
601
  );
@@ -624,7 +624,7 @@ export abstract class Locator<T> extends EventEmitter<LocatorEvents> {
624
624
  mergeMap(handle => {
625
625
  return from(handle.hover()).pipe(
626
626
  catchError(err => {
627
- void handle.dispose().catch(debugError);
627
+ void handle.dispose().catch(debugCatchError);
628
628
  throw err;
629
629
  }),
630
630
  );
@@ -666,7 +666,7 @@ export abstract class Locator<T> extends EventEmitter<LocatorEvents> {
666
666
  ),
667
667
  ).pipe(
668
668
  catchError(err => {
669
- void handle.dispose().catch(debugError);
669
+ void handle.dispose().catch(debugCatchError);
670
670
  throw err;
671
671
  }),
672
672
  );
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import * as BidiMapper from 'chromium-bidi/lib/bidiMapper/BidiMapper.js';
7
+ import {BidiMapper} from 'chromium-bidi';
8
8
  import type {ProtocolMapping} from 'devtools-protocol/types/protocol-mapping.js';
9
9
 
10
10
  import type {CDPEvents, CDPSession} from '../api/CDPSession.js';
@@ -16,7 +16,7 @@ import type {Handler} from '../common/EventEmitter.js';
16
16
  import {BidiConnection} from './Connection.js';
17
17
 
18
18
  const bidiServerLogger = (prefix: string, ...args: unknown[]): void => {
19
- debug(`bidi:${prefix}`)(args);
19
+ debug(`bidi:${prefix}`)?.(args);
20
20
  };
21
21
 
22
22
  /**
@@ -130,7 +130,7 @@ export class BidiBrowser extends Browser {
130
130
  });
131
131
  } catch (err) {
132
132
  if (err instanceof ProtocolError) {
133
- debugError(err);
133
+ debugError?.(err);
134
134
  } else {
135
135
  throw err;
136
136
  }
@@ -250,7 +250,7 @@ export class BidiBrowser extends Browser {
250
250
  await this.#closeCallback?.call(null);
251
251
  } catch (error) {
252
252
  // Fail silently.
253
- debugError(error);
253
+ debugError?.(error);
254
254
  } finally {
255
255
  this.connection.dispose();
256
256
  }
@@ -364,7 +364,7 @@ export class BidiBrowser extends Browser {
364
364
  await this.#browserCore.session.end();
365
365
  } catch (error) {
366
366
  // Fail silently.
367
- debugError(error);
367
+ debugError?.(error);
368
368
  } finally {
369
369
  this.connection.dispose();
370
370
  }
@@ -9,7 +9,7 @@ import {Connection} from '../cdp/Connection.js';
9
9
  import type {ConnectionTransport} from '../common/ConnectionTransport.js';
10
10
  import type {ConnectOptions} from '../common/ConnectOptions.js';
11
11
  import {ProtocolError, UnsupportedOperation} from '../common/Errors.js';
12
- import {debugError, DEFAULT_VIEWPORT} from '../common/util.js';
12
+ import {DEFAULT_VIEWPORT, debugCatchError} from '../common/util.js';
13
13
  import {createIncrementalIdGenerator} from '../util/incremental-id-generator.js';
14
14
 
15
15
  import type {BidiBrowser} from './Browser.js';
@@ -90,7 +90,9 @@ async function getBiDiConnection(
90
90
  return {
91
91
  bidiConnection: pureBidiConnection,
92
92
  closeCallback: async () => {
93
- await pureBidiConnection.send('browser.close', {}).catch(debugError);
93
+ await pureBidiConnection
94
+ .send('browser.close', {})
95
+ .catch(debugCatchError);
94
96
  },
95
97
  };
96
98
  }
@@ -126,7 +128,7 @@ async function getBiDiConnection(
126
128
  bidiConnection: bidiOverCdpConnection,
127
129
  closeCallback: async () => {
128
130
  // In case of BiDi over CDP, we need to close browser via CDP.
129
- await cdpConnection.send('Browser.close').catch(debugError);
131
+ await cdpConnection.send('Browser.close').catch(debugCatchError);
130
132
  },
131
133
  };
132
134
  }
@@ -20,7 +20,7 @@ import type {Target} from '../api/Target.js';
20
20
  import type {Cookie, CookieData} from '../common/Cookie.js';
21
21
  import {UnsupportedOperation} from '../common/Errors.js';
22
22
  import {EventEmitter} from '../common/EventEmitter.js';
23
- import {debugError} from '../common/util.js';
23
+ import {debugError, debugCatchError} from '../common/util.js';
24
24
  import type {Viewport} from '../common/Viewport.js';
25
25
  import {assert} from '../util/assert.js';
26
26
  import {bubble} from '../util/decorators.js';
@@ -214,7 +214,7 @@ export class BidiBrowserContext extends BrowserContext {
214
214
  await page.setViewport(this.#defaultViewport);
215
215
  } catch (error) {
216
216
  // Tolerate not supporting `browsingContext.setViewport`. Only log it.
217
- debugError(error);
217
+ debugError?.(error);
218
218
  }
219
219
  }
220
220
  if (options?.type === 'window' && options?.windowBounds !== undefined) {
@@ -225,7 +225,7 @@ export class BidiBrowserContext extends BrowserContext {
225
225
  );
226
226
  } catch (error) {
227
227
  // Tolerate not supporting `browser.setClientWindowState`. Only log it.
228
- debugError(error);
228
+ debugError?.(error);
229
229
  }
230
230
  }
231
231
 
@@ -241,7 +241,7 @@ export class BidiBrowserContext extends BrowserContext {
241
241
  try {
242
242
  await this.userContext.remove();
243
243
  } catch (error) {
244
- debugError(error);
244
+ debugError?.(error);
245
245
  }
246
246
 
247
247
  this.#targets.clear();
@@ -287,7 +287,7 @@ export class BidiBrowserContext extends BrowserContext {
287
287
  // TODO: some permissions are outdated and setting them to denied does
288
288
  // not work.
289
289
  if (!permissionsSet.has(permission)) {
290
- return result.catch(debugError);
290
+ return result.catch(debugCatchError);
291
291
  }
292
292
  return result;
293
293
  },
@@ -345,7 +345,7 @@ export class BidiBrowserContext extends BrowserContext {
345
345
  },
346
346
  Bidi.Permissions.PermissionState.Prompt,
347
347
  )
348
- .catch(debugError);
348
+ .catch(debugCatchError);
349
349
  });
350
350
  this.#overrides = [];
351
351
  await Promise.all(promises);
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import type * as ChromiumBidi from 'chromium-bidi/lib/protocol/protocol.js';
7
+ import type {Protocol as ChromiumBidi} from 'chromium-bidi';
8
8
  import type * as Bidi from 'webdriver-bidi-protocol';
9
9
 
10
10
  import {CallbackRegistry} from '../common/CallbackRegistry.js';
@@ -131,7 +131,7 @@ export class BidiConnection
131
131
  method,
132
132
  params,
133
133
  } as Bidi.Command);
134
- debugProtocolSend(stringifiedMessage);
134
+ debugProtocolSend?.(stringifiedMessage);
135
135
  this.#transport.send(stringifiedMessage);
136
136
  }) as Promise<{result: Commands[T]['returnType']}>;
137
137
  }
@@ -145,7 +145,7 @@ export class BidiConnection
145
145
  return setTimeout(f, this.#delay);
146
146
  });
147
147
  }
148
- debugProtocolReceive(message);
148
+ debugProtocolReceive?.(message);
149
149
  const object: Bidi.Message | CdpEvent = JSON.parse(message);
150
150
  if ('type' in object) {
151
151
  switch (object.type) {
@@ -183,7 +183,7 @@ export class BidiConnection
183
183
  object.message,
184
184
  );
185
185
  }
186
- debugError(object);
186
+ debugError?.(object);
187
187
  }
188
188
 
189
189
  /**
@@ -14,7 +14,7 @@ import {debugError} from '../common/util.js';
14
14
  export class BidiDeserializer {
15
15
  static deserialize(result: Bidi.Script.RemoteValue): any {
16
16
  if (!result) {
17
- debugError('Service did not produce a result.');
17
+ debugError?.('Service did not produce a result.');
18
18
  return undefined;
19
19
  }
20
20
 
@@ -58,7 +58,7 @@ export class BidiDeserializer {
58
58
  return result.value;
59
59
  }
60
60
 
61
- debugError(`Deserialization of type ${result.type} not supported.`);
61
+ debugError?.(`Deserialization of type ${result.type} not supported.`);
62
62
  return undefined;
63
63
  }
64
64
 
@@ -8,7 +8,7 @@ import * as Bidi from 'webdriver-bidi-protocol';
8
8
 
9
9
  import {EventEmitter} from '../common/EventEmitter.js';
10
10
  import type {Awaitable, FlattenHandle} from '../common/types.js';
11
- import {debugError} from '../common/util.js';
11
+ import {debugError, debugCatchError} from '../common/util.js';
12
12
  import {DisposableStack} from '../util/disposable.js';
13
13
  import {interpolateFunction, stringifyFunction} from '../util/Function.js';
14
14
 
@@ -119,7 +119,7 @@ export class ExposableFunction<Args extends unknown[], Ret> {
119
119
  } catch (error) {
120
120
  // If it errors, the frame probably doesn't support call function. We
121
121
  // fail gracefully.
122
- debugError(error);
122
+ debugError?.(error);
123
123
  }
124
124
  }),
125
125
  );
@@ -192,7 +192,7 @@ export class ExposableFunction<Args extends unknown[], Ret> {
192
192
  }, error);
193
193
  }
194
194
  } catch (error) {
195
- debugError(error);
195
+ debugError?.(error);
196
196
  }
197
197
  return;
198
198
  }
@@ -202,7 +202,7 @@ export class ExposableFunction<Args extends unknown[], Ret> {
202
202
  resolve(result);
203
203
  }, result);
204
204
  } catch (error) {
205
- debugError(error);
205
+ debugError?.(error);
206
206
  }
207
207
  };
208
208
 
@@ -227,7 +227,7 @@ export class ExposableFunction<Args extends unknown[], Ret> {
227
227
  }
228
228
 
229
229
  [Symbol.dispose](): void {
230
- void this[Symbol.asyncDispose]().catch(debugError);
230
+ void this[Symbol.asyncDispose]().catch(debugCatchError);
231
231
  }
232
232
 
233
233
  async [Symbol.asyncDispose](): Promise<void> {
@@ -248,7 +248,7 @@ export class ExposableFunction<Args extends unknown[], Ret> {
248
248
  frame.browsingContext.removePreloadScript(script),
249
249
  ]);
250
250
  } catch (error) {
251
- debugError(error);
251
+ debugError?.(error);
252
252
  }
253
253
  }),
254
254
  );
@@ -198,7 +198,7 @@ export class BidiFrame extends Frame {
198
198
  error.stack = [...messageLines, ...stackLines].join('\n');
199
199
  this.page().trustedEmitter.emit(PageEvent.PageError, error);
200
200
  } else {
201
- debugError(
201
+ debugError?.(
202
202
  `Unhandled LogEntry with type "${entry.type}", text "${entry.text}" and level "${entry.level}"`,
203
203
  );
204
204
  }
@@ -382,6 +382,10 @@ export class BidiPage extends Page {
382
382
  return await this.#frame.browsingContext.setTimezoneOverride(timezoneId);
383
383
  }
384
384
 
385
+ override async emulateLocale(locale?: string): Promise<void> {
386
+ return await this.#frame.browsingContext.setLocaleOverride(locale);
387
+ }
388
+
385
389
  override async emulateIdleState(overrides?: {
386
390
  isUserActive: boolean;
387
391
  isScreenUnlocked: boolean;
@@ -269,7 +269,7 @@ export abstract class BidiRealm extends Realm {
269
269
  await this.realm.disown(handleIds).catch(error => {
270
270
  // Exceptions might happen in case of a page been navigated or closed.
271
271
  // Swallow these since they are harmless and we don't leak anything in this case.
272
- debugError(error);
272
+ debugError?.(error);
273
273
  });
274
274
  }
275
275
 
@@ -606,6 +606,17 @@ export class BrowsingContext extends EventEmitter<{
606
606
  );
607
607
  }
608
608
 
609
+ @throwIfDisposed<BrowsingContext>(context => {
610
+ // SAFETY: Disposal implies this exists.
611
+ return context.#reason!;
612
+ })
613
+ async setLocaleOverride(locale?: string): Promise<void> {
614
+ await this.userContext.browser.session.send('emulation.setLocaleOverride', {
615
+ locale: locale ?? null,
616
+ contexts: [this.id],
617
+ });
618
+ }
619
+
609
620
  @throwIfDisposed<BrowsingContext>(context => {
610
621
  // SAFETY: Disposal implies this exists.
611
622
  return context.#reason!;
@@ -281,12 +281,14 @@ export class Accessibility {
281
281
  root.iframeSnapshot = iframeSnapshot ?? undefined;
282
282
  } catch (error) {
283
283
  // Frames can get detached at any time resulting in errors.
284
- debugError(error);
284
+ debugError?.(error);
285
285
  }
286
286
  }
287
- for (const child of root.children) {
288
- await populateIframes(child);
289
- }
287
+ await Promise.all(
288
+ root.children.map(child => {
289
+ return populateIframes(child);
290
+ }),
291
+ );
290
292
  };
291
293
 
292
294
  let needle: AXNode | null = defaultRoot;
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import {JSHandle} from '../api/JSHandle.js';
7
- import {debugError} from '../common/util.js';
7
+ import {debugCatchError} from '../common/util.js';
8
8
  import {DisposableStack} from '../util/disposable.js';
9
9
  import {isErrorLike} from '../util/ErrorLike.js';
10
10
 
@@ -112,7 +112,7 @@ export class Binding {
112
112
  error.message,
113
113
  error.stack,
114
114
  )
115
- .catch(debugError);
115
+ .catch(debugCatchError);
116
116
  } else {
117
117
  await context
118
118
  .evaluate(
@@ -126,7 +126,7 @@ export class Binding {
126
126
  id,
127
127
  error,
128
128
  )
129
- .catch(debugError);
129
+ .catch(debugCatchError);
130
130
  }
131
131
  }
132
132
  }
@@ -28,6 +28,7 @@ import type {Page} from '../api/Page.js';
28
28
  import type {Target} from '../api/Target.js';
29
29
  import type {DownloadBehavior} from '../common/DownloadBehavior.js';
30
30
  import type {Viewport} from '../common/Viewport.js';
31
+ import {Deferred} from '../util/Deferred.js';
31
32
 
32
33
  import {CdpBrowserContext} from './BrowserContext.js';
33
34
  import type {CdpCDPSession} from './CdpSession.js';
@@ -121,6 +122,7 @@ export class CdpBrowser extends BrowserBase {
121
122
  #targetManager: TargetManager;
122
123
  #handleDevToolsAsPage = false;
123
124
  #extensions = new Map<string, Extension>();
125
+ #version?: Deferred<Protocol.Browser.GetVersionResponse>;
124
126
 
125
127
  constructor(
126
128
  connection: Connection,
@@ -601,8 +603,18 @@ export class CdpBrowser extends BrowserBase {
601
603
  return !this.#connection._closed;
602
604
  }
603
605
 
604
- #getVersion(): Promise<Protocol.Browser.GetVersionResponse> {
605
- return this.#connection.send('Browser.getVersion');
606
+ async #getVersion(): Promise<Protocol.Browser.GetVersionResponse> {
607
+ if (!this.#version) {
608
+ this.#version = Deferred.create<Protocol.Browser.GetVersionResponse>();
609
+ try {
610
+ this.#version.resolve(
611
+ await this.#connection.send('Browser.getVersion'),
612
+ );
613
+ } catch (error) {
614
+ this.#version.reject(error as Error);
615
+ }
616
+ }
617
+ return await this.#version.valueOrThrow();
606
618
  }
607
619
 
608
620
  override get debugInfo(): DebugInfo {
@@ -6,7 +6,7 @@
6
6
 
7
7
  import type {ConnectionTransport} from '../common/ConnectionTransport.js';
8
8
  import type {ConnectOptions} from '../common/ConnectOptions.js';
9
- import {debugError, DEFAULT_VIEWPORT} from '../common/util.js';
9
+ import {DEFAULT_VIEWPORT, debugCatchError} from '../common/util.js';
10
10
  import {createIncrementalIdGenerator} from '../util/incremental-id-generator.js';
11
11
 
12
12
  import {CdpBrowser} from './Browser.js';
@@ -59,7 +59,7 @@ export async function _connectToCdpBrowser(
59
59
  downloadBehavior,
60
60
  undefined,
61
61
  () => {
62
- return connection.send('Browser.close').catch(debugError);
62
+ return connection.send('Browser.close').catch(debugCatchError);
63
63
  },
64
64
  targetFilter,
65
65
  isPageTarget,
@@ -176,7 +176,7 @@ export class Connection extends EventEmitter<CDPSessionEvents> {
176
176
  id,
177
177
  sessionId,
178
178
  });
179
- debugProtocolSend(stringifiedMessage);
179
+ debugProtocolSend?.(stringifiedMessage);
180
180
  this.#transport.send(stringifiedMessage);
181
181
  }) as Promise<ProtocolMapping.Commands[T]['returnType']>;
182
182
  }
@@ -197,7 +197,7 @@ export class Connection extends EventEmitter<CDPSessionEvents> {
197
197
  return setTimeout(r, this.#delay);
198
198
  });
199
199
  }
200
- debugProtocolReceive(message);
200
+ debugProtocolReceive?.(message);
201
201
  const object = JSON.parse(message);
202
202
  if (object.method === 'Target.attachedToTarget') {
203
203
  const sessionId = object.params.sessionId;
@@ -281,7 +281,7 @@ export class JSCoverage {
281
281
  this.#scriptSources.set(event.scriptId, response.scriptSource);
282
282
  } catch (error) {
283
283
  // This might happen if the page has already navigated away.
284
- debugError(error);
284
+ debugError?.(error);
285
285
  }
286
286
  }
287
287
 
@@ -393,7 +393,7 @@ export class CSSCoverage {
393
393
  this.#stylesheetSources.set(header.styleSheetId, response.text);
394
394
  } catch (error) {
395
395
  // This might happen if the page has already navigated away.
396
- debugError(error);
396
+ debugError?.(error);
397
397
  }
398
398
  }
399
399
 
@@ -92,7 +92,7 @@ export class CdpElementHandle<
92
92
  objectId: this.id,
93
93
  });
94
94
  } catch (error) {
95
- debugError(error);
95
+ debugError?.(error);
96
96
  // Fallback to Element.scrollIntoView if DOM.scrollIntoViewIfNeeded is not supported
97
97
  await super.scrollIntoView();
98
98
  }