chrome-devtools-frontend 1.0.1650232 → 1.0.1650677

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 (265) 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/devtools_compatibility.js +1 -2
  6. package/front_end/foundation/Universe.ts +7 -0
  7. package/front_end/models/ai_assistance/AiAgent2.ts +11 -1
  8. package/front_end/models/ai_assistance/README.md +4 -0
  9. package/front_end/models/ai_assistance/agents/AccessibilityAgent.ts +2 -0
  10. package/front_end/models/ai_assistance/agents/AiAgent.ts +3 -0
  11. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +2 -0
  12. package/front_end/models/ai_assistance/ai_assistance.ts +4 -0
  13. package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
  14. package/front_end/models/ai_assistance/skills/SkillRegistry.ts +2 -0
  15. package/front_end/models/ai_assistance/skills/accessibility.md +13 -0
  16. package/front_end/models/ai_assistance/tools/GetLighthouseAudits.ts +54 -0
  17. package/front_end/models/ai_assistance/tools/ResolveLighthousePath.ts +124 -0
  18. package/front_end/models/ai_assistance/tools/Tool.ts +12 -2
  19. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +4 -0
  20. package/front_end/models/persistence/NetworkPersistenceManager.ts +9 -1
  21. package/front_end/panels/ai_assistance/components/ChatMessage.ts +3 -11
  22. package/front_end/panels/common/ExtensionServer.ts +70 -50
  23. package/front_end/panels/elements/ElementsPanel.ts +1 -1
  24. package/front_end/panels/js_timeline/js_timeline-meta.ts +1 -2
  25. package/front_end/panels/network/RequestHeadersView.ts +2 -2
  26. package/front_end/panels/network/components/RequestHeadersView.css +1 -0
  27. package/front_end/panels/network/components/ResponseHeaderSection.css +5 -1
  28. package/front_end/panels/recorder/testing/RecorderHelpers.ts +2 -0
  29. package/front_end/panels/timeline/timeline-meta.ts +1 -1
  30. package/front_end/third_party/chromium/README.chromium +1 -1
  31. package/front_end/third_party/puppeteer/README.chromium +2 -2
  32. package/front_end/third_party/puppeteer/package/README.md +14 -0
  33. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +60 -24
  34. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +271 -164
  35. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +2 -6
  36. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  37. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +2 -2
  38. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  39. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +2 -2
  40. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  41. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js +11 -7
  42. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/HTTPRequest.js.map +1 -1
  43. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts.map +1 -1
  44. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js +3 -10
  45. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js.map +1 -1
  46. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +9 -4
  47. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  48. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +4 -4
  49. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  50. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.d.ts +13 -0
  51. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.d.ts.map +1 -1
  52. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.js +14 -0
  53. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/WebWorker.js.map +1 -1
  54. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js +5 -5
  55. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/locators/locators.js.map +1 -1
  56. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js +2 -2
  57. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js.map +1 -1
  58. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js +3 -3
  59. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js.map +1 -1
  60. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserConnector.js +5 -3
  61. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserConnector.js.map +1 -1
  62. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserContext.js +6 -6
  63. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BrowserContext.js.map +1 -1
  64. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.d.ts +1 -1
  65. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.d.ts.map +1 -1
  66. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.js +3 -3
  67. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Connection.js.map +1 -1
  68. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Deserializer.js +2 -2
  69. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Deserializer.js.map +1 -1
  70. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ExposedFunction.js +6 -6
  71. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/ExposedFunction.js.map +1 -1
  72. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Frame.js +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Frame.js.map +1 -1
  74. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts +1 -0
  75. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.d.ts.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js +3 -0
  77. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Page.js.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Realm.js +1 -1
  79. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Realm.js.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts +1 -0
  81. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.d.ts.map +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js +11 -0
  83. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/core/BrowsingContext.js.map +1 -1
  84. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.d.ts.map +1 -1
  85. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js +4 -4
  86. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Accessibility.js.map +1 -1
  87. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Binding.js +3 -3
  88. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Binding.js.map +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  90. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +13 -2
  91. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  92. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/BrowserConnector.js +2 -2
  93. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/BrowserConnector.js.map +1 -1
  94. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Connection.js +2 -2
  95. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Connection.js.map +1 -1
  96. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Coverage.js +2 -2
  97. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Coverage.js.map +1 -1
  98. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ElementHandle.js +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ElementHandle.js.map +1 -1
  100. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.d.ts +1 -0
  101. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.d.ts.map +1 -1
  102. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.js +25 -4
  103. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/EmulationManager.js.map +1 -1
  104. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ExecutionContext.js +3 -3
  105. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/ExecutionContext.js.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Extension.d.ts.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Extension.js +9 -11
  108. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Extension.js.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js +3 -3
  110. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Frame.js.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.d.ts.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js +7 -7
  113. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/FrameManager.js.map +1 -1
  114. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/HTTPRequest.js.map +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/JSHandle.js +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/JSHandle.js.map +1 -1
  118. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts +3 -1
  119. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.d.ts.map +1 -1
  120. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js +18 -10
  121. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/NetworkManager.js.map +1 -1
  122. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts +1 -0
  123. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.d.ts.map +1 -1
  124. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js +17 -11
  125. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Page.js.map +1 -1
  126. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js +3 -3
  127. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Target.js.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.d.ts.map +1 -1
  129. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js +28 -10
  130. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/TargetManager.js.map +1 -1
  131. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.d.ts.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js +10 -6
  133. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebMCP.js.map +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.d.ts +3 -0
  135. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.d.ts.map +1 -1
  136. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.js +20 -5
  137. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/WebWorker.js.map +1 -1
  138. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.d.ts.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js +11 -0
  140. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserConnector.js.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js +2 -2
  142. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/BrowserWebSocketTransport.js.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/CallbackRegistry.js +2 -2
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/CallbackRegistry.js.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Configuration.d.ts +4 -2
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Configuration.d.ts.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts +26 -13
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/ConnectOptions.d.ts.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts +1 -6
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.d.ts.map +1 -1
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js +24 -33
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/Debug.js.map +1 -1
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js +2 -2
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js.map +1 -1
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.d.ts +8 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.d.ts.map +1 -1
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.js +8 -1
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/util.js.map +1 -1
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.d.ts +2 -0
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.d.ts.map +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.js +4 -2
  162. package/front_end/third_party/puppeteer/package/lib/puppeteer/environment.js.map +1 -1
  163. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  164. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  165. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  166. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  167. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/TextContent.d.ts.map +1 -1
  168. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/TextContent.js +15 -5
  169. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/TextContent.js.map +1 -1
  170. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts +5 -1
  171. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.d.ts.map +1 -1
  172. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js +17 -16
  173. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/BrowserLauncher.js.map +1 -1
  174. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ChromeLauncher.d.ts.map +1 -1
  175. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ChromeLauncher.js +14 -9
  176. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ChromeLauncher.js.map +1 -1
  177. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/FirefoxLauncher.js +2 -2
  178. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/FirefoxLauncher.js.map +1 -1
  179. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js +2 -2
  180. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/NodeWebSocketTransport.js.map +1 -1
  181. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/PipeTransport.js +3 -3
  182. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/PipeTransport.js.map +1 -1
  183. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts +20 -0
  184. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts.map +1 -1
  185. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js +38 -9
  186. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js.map +1 -1
  187. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.d.ts +7 -0
  188. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.d.ts.map +1 -0
  189. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.js +16 -0
  190. package/front_end/third_party/puppeteer/package/lib/puppeteer/node-env-setup.js.map +1 -0
  191. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.d.ts +1 -0
  192. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.d.ts.map +1 -1
  193. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.js +3 -8
  194. package/front_end/third_party/puppeteer/package/lib/puppeteer/puppeteer-core.js.map +1 -1
  195. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  196. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  197. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js.map +1 -1
  198. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  199. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  200. package/front_end/third_party/puppeteer/package/lib/types.d.ts +60 -24
  201. package/front_end/third_party/puppeteer/package/package.json +4 -4
  202. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +4 -8
  203. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +2 -2
  204. package/front_end/third_party/puppeteer/package/src/api/HTTPRequest.ts +10 -10
  205. package/front_end/third_party/puppeteer/package/src/api/JSHandle.ts +3 -10
  206. package/front_end/third_party/puppeteer/package/src/api/Page.ts +14 -8
  207. package/front_end/third_party/puppeteer/package/src/api/WebWorker.ts +30 -0
  208. package/front_end/third_party/puppeteer/package/src/api/locators/locators.ts +5 -5
  209. package/front_end/third_party/puppeteer/package/src/bidi/BidiOverCdp.ts +2 -2
  210. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +3 -3
  211. package/front_end/third_party/puppeteer/package/src/bidi/BrowserConnector.ts +5 -3
  212. package/front_end/third_party/puppeteer/package/src/bidi/BrowserContext.ts +6 -6
  213. package/front_end/third_party/puppeteer/package/src/bidi/Connection.ts +4 -4
  214. package/front_end/third_party/puppeteer/package/src/bidi/Deserializer.ts +2 -2
  215. package/front_end/third_party/puppeteer/package/src/bidi/ExposedFunction.ts +6 -6
  216. package/front_end/third_party/puppeteer/package/src/bidi/Frame.ts +1 -1
  217. package/front_end/third_party/puppeteer/package/src/bidi/Page.ts +4 -0
  218. package/front_end/third_party/puppeteer/package/src/bidi/Realm.ts +1 -1
  219. package/front_end/third_party/puppeteer/package/src/bidi/core/BrowsingContext.ts +11 -0
  220. package/front_end/third_party/puppeteer/package/src/cdp/Accessibility.ts +6 -4
  221. package/front_end/third_party/puppeteer/package/src/cdp/Binding.ts +3 -3
  222. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +14 -2
  223. package/front_end/third_party/puppeteer/package/src/cdp/BrowserConnector.ts +2 -2
  224. package/front_end/third_party/puppeteer/package/src/cdp/Connection.ts +2 -2
  225. package/front_end/third_party/puppeteer/package/src/cdp/Coverage.ts +2 -2
  226. package/front_end/third_party/puppeteer/package/src/cdp/ElementHandle.ts +1 -1
  227. package/front_end/third_party/puppeteer/package/src/cdp/EmulationManager.ts +36 -4
  228. package/front_end/third_party/puppeteer/package/src/cdp/ExecutionContext.ts +3 -3
  229. package/front_end/third_party/puppeteer/package/src/cdp/Extension.ts +16 -17
  230. package/front_end/third_party/puppeteer/package/src/cdp/Frame.ts +3 -3
  231. package/front_end/third_party/puppeteer/package/src/cdp/FrameManager.ts +12 -7
  232. package/front_end/third_party/puppeteer/package/src/cdp/HTTPRequest.ts +1 -1
  233. package/front_end/third_party/puppeteer/package/src/cdp/JSHandle.ts +1 -1
  234. package/front_end/third_party/puppeteer/package/src/cdp/NetworkManager.ts +22 -11
  235. package/front_end/third_party/puppeteer/package/src/cdp/Page.ts +18 -10
  236. package/front_end/third_party/puppeteer/package/src/cdp/Target.ts +3 -3
  237. package/front_end/third_party/puppeteer/package/src/cdp/TargetManager.ts +37 -12
  238. package/front_end/third_party/puppeteer/package/src/cdp/WebMCP.ts +11 -9
  239. package/front_end/third_party/puppeteer/package/src/cdp/WebWorker.ts +33 -5
  240. package/front_end/third_party/puppeteer/package/src/common/BrowserConnector.ts +11 -0
  241. package/front_end/third_party/puppeteer/package/src/common/BrowserWebSocketTransport.ts +2 -2
  242. package/front_end/third_party/puppeteer/package/src/common/CallbackRegistry.ts +2 -2
  243. package/front_end/third_party/puppeteer/package/src/common/Configuration.ts +4 -2
  244. package/front_end/third_party/puppeteer/package/src/common/ConnectOptions.ts +26 -13
  245. package/front_end/third_party/puppeteer/package/src/common/Debug.ts +30 -40
  246. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +2 -2
  247. package/front_end/third_party/puppeteer/package/src/common/util.ts +9 -1
  248. package/front_end/third_party/puppeteer/package/src/environment.ts +7 -3
  249. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  250. package/front_end/third_party/puppeteer/package/src/injected/TextContent.ts +15 -5
  251. package/front_end/third_party/puppeteer/package/src/node/BrowserLauncher.ts +23 -23
  252. package/front_end/third_party/puppeteer/package/src/node/ChromeLauncher.ts +19 -13
  253. package/front_end/third_party/puppeteer/package/src/node/FirefoxLauncher.ts +2 -2
  254. package/front_end/third_party/puppeteer/package/src/node/NodeWebSocketTransport.ts +2 -2
  255. package/front_end/third_party/puppeteer/package/src/node/PipeTransport.ts +3 -3
  256. package/front_end/third_party/puppeteer/package/src/node/ScreenRecorder.ts +44 -9
  257. package/front_end/third_party/puppeteer/package/src/node-env-setup.ts +18 -0
  258. package/front_end/third_party/puppeteer/package/src/puppeteer-core.ts +5 -9
  259. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  260. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  261. package/front_end/third_party/puppeteer/puppeteer-tsconfig.json +1 -0
  262. package/front_end/tsconfig.json +1 -2
  263. package/inspector_overlay/tsconfig.json +3 -10
  264. package/mcp/tsconfig.json +1 -5
  265. package/package.json +1 -2
@@ -7,7 +7,7 @@ import type {Protocol} from 'devtools-protocol';
7
7
 
8
8
  import {type CDPSession, CDPSessionEvent} from '../api/CDPSession.js';
9
9
  import type {GeolocationOptions, MediaFeature} from '../api/Page.js';
10
- import {debugError} from '../common/util.js';
10
+ import {debugError, debugCatchError} from '../common/util.js';
11
11
  import type {Viewport} from '../common/Viewport.js';
12
12
  import {assert} from '../util/assert.js';
13
13
  import {invokeAtMostOnceForArguments} from '../util/decorators.js';
@@ -31,6 +31,11 @@ interface TimezoneState {
31
31
  active: boolean;
32
32
  }
33
33
 
34
+ interface LocaleState {
35
+ locale?: string;
36
+ active: boolean;
37
+ }
38
+
34
39
  interface VisionDeficiencyState {
35
40
  visionDeficiency?: Protocol.Emulation.SetEmulatedVisionDeficiencyRequest['type'];
36
41
  active: boolean;
@@ -148,6 +153,13 @@ export class EmulationManager implements ClientProvider {
148
153
  this,
149
154
  this.#emulateTimezone,
150
155
  );
156
+ #localeState = new EmulatedState<LocaleState>(
157
+ {
158
+ active: false,
159
+ },
160
+ this,
161
+ this.#emulateLocale,
162
+ );
151
163
  #visionDeficiencyState = new EmulatedState<VisionDeficiencyState>(
152
164
  {
153
165
  active: false,
@@ -235,7 +247,7 @@ export class EmulationManager implements ClientProvider {
235
247
  // the target is unpaused.
236
248
  void Promise.all(
237
249
  this.#states.map(s => {
238
- return s.sync().catch(debugError);
250
+ return s.sync().catch(debugCatchError);
239
251
  }),
240
252
  );
241
253
  }
@@ -281,7 +293,7 @@ export class EmulationManager implements ClientProvider {
281
293
  client.send('Emulation.setTouchEmulationEnabled', {
282
294
  enabled: false,
283
295
  }),
284
- ]).catch(debugError);
296
+ ]).catch(debugCatchError);
285
297
  return;
286
298
  }
287
299
  const {viewport} = viewportState;
@@ -308,7 +320,7 @@ export class EmulationManager implements ClientProvider {
308
320
  if (
309
321
  err.message.includes('Target does not support metrics override')
310
322
  ) {
311
- debugError(err);
323
+ debugError?.(err);
312
324
  return;
313
325
  }
314
326
  throw err;
@@ -374,6 +386,26 @@ export class EmulationManager implements ClientProvider {
374
386
  });
375
387
  }
376
388
 
389
+ @invokeAtMostOnceForArguments
390
+ async #emulateLocale(
391
+ client: CDPSession,
392
+ localeState: LocaleState,
393
+ ): Promise<void> {
394
+ if (!localeState.active) {
395
+ return;
396
+ }
397
+ await client.send('Emulation.setLocaleOverride', {
398
+ locale: localeState.locale,
399
+ });
400
+ }
401
+
402
+ async emulateLocale(locale?: string): Promise<void> {
403
+ await this.#localeState.setState({
404
+ locale,
405
+ active: true,
406
+ });
407
+ }
408
+
377
409
  @invokeAtMostOnceForArguments
378
410
  async #emulateVisionDeficiency(
379
411
  client: CDPSession,
@@ -159,7 +159,7 @@ export class ExecutionContext
159
159
  }
160
160
  }
161
161
 
162
- debugError(error);
162
+ debugError?.(error);
163
163
  }
164
164
  }
165
165
 
@@ -192,7 +192,7 @@ export class ExecutionContext
192
192
  const binding = this.#bindings.get(name);
193
193
  await binding?.run(this, seq, args, isTrivial);
194
194
  } catch (err) {
195
- debugError(err);
195
+ debugError?.(err);
196
196
  }
197
197
  }
198
198
 
@@ -239,7 +239,7 @@ export class ExecutionContext
239
239
  } catch (err) {
240
240
  // If the binding cannot be added, the context is broken. We cannot
241
241
  // recover so we ignore the error.
242
- debugError(err);
242
+ debugError?.(err);
243
243
  }
244
244
  }
245
245
 
@@ -41,24 +41,23 @@ export class CdpExtension extends Extension {
41
41
  );
42
42
  });
43
43
 
44
- const workers: WebWorker[] = [];
45
- for (const target of extensionWorkers) {
46
- try {
47
- const worker = await target.worker();
48
-
49
- if (worker) {
50
- workers.push(worker);
51
- }
52
- } catch (err) {
53
- if (this.#canIgnoreError(err)) {
54
- debugError(err);
55
- continue;
44
+ const workers = await Promise.all(
45
+ extensionWorkers.map(async target => {
46
+ try {
47
+ return await target.worker();
48
+ } catch (err) {
49
+ if (this.#canIgnoreError(err)) {
50
+ debugError?.(err);
51
+ return null;
52
+ }
53
+ throw err;
56
54
  }
57
- throw err;
58
- }
59
- }
55
+ }),
56
+ );
60
57
 
61
- return workers;
58
+ return workers.filter((worker): worker is WebWorker => {
59
+ return worker !== null;
60
+ });
62
61
  }
63
62
 
64
63
  async pages(): Promise<Page[]> {
@@ -78,7 +77,7 @@ export class CdpExtension extends Extension {
78
77
  return await target.asPage();
79
78
  } catch (err) {
80
79
  if (this.#canIgnoreError(err)) {
81
- debugError(err);
80
+ debugError?.(err);
82
81
  return null;
83
82
  }
84
83
  throw err;
@@ -14,7 +14,7 @@ import {Frame, FrameEvent, throwIfDetached} from '../api/Frame.js';
14
14
  import type {HTTPResponse} from '../api/HTTPResponse.js';
15
15
  import type {WaitTimeoutOptions} from '../api/Page.js';
16
16
  import {UnsupportedOperation} from '../common/Errors.js';
17
- import {debugError} from '../common/util.js';
17
+ import {debugCatchError} from '../common/util.js';
18
18
  import type {Realm} from '../puppeteer-core.js';
19
19
  import {Deferred} from '../util/Deferred.js';
20
20
  import {disposeSymbol} from '../util/disposable.js';
@@ -351,7 +351,7 @@ export class CdpFrame extends Frame {
351
351
  this.#client.send('Runtime.addBinding', {
352
352
  name: CDP_BINDING_PREFIX + binding.name,
353
353
  }),
354
- this.evaluate(binding.initSource).catch(debugError),
354
+ this.evaluate(binding.initSource).catch(debugCatchError),
355
355
  ]);
356
356
  }
357
357
 
@@ -370,7 +370,7 @@ export class CdpFrame extends Frame {
370
370
  // Removes the dangling Puppeteer binding wrapper.
371
371
  // @ts-expect-error: In a different context.
372
372
  globalThis[name] = undefined;
373
- }, binding.name).catch(debugError),
373
+ }, binding.name).catch(debugCatchError),
374
374
  ]);
375
375
  }
376
376
 
@@ -11,7 +11,12 @@ import {FrameEvent} from '../api/Frame.js';
11
11
  import {PageEvent, type NewDocumentScriptEvaluation} from '../api/Page.js';
12
12
  import {EventEmitter} from '../common/EventEmitter.js';
13
13
  import type {TimeoutSettings} from '../common/TimeoutSettings.js';
14
- import {debugError, PuppeteerURL, UTILITY_WORLD_NAME} from '../common/util.js';
14
+ import {
15
+ debugError,
16
+ PuppeteerURL,
17
+ UTILITY_WORLD_NAME,
18
+ debugCatchError,
19
+ } from '../common/util.js';
15
20
  import {assert} from '../util/assert.js';
16
21
  import {Deferred} from '../util/Deferred.js';
17
22
  import {disposeSymbol} from '../util/disposable.js';
@@ -93,7 +98,7 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
93
98
  this.#timeoutSettings = timeoutSettings;
94
99
  this.setupEventListeners(this.#client);
95
100
  client.once(CDPSessionEvent.Disconnected, () => {
96
- this.#onClientDisconnect().catch(debugError);
101
+ void this.#onClientDisconnect().catch(debugCatchError);
97
102
  });
98
103
  }
99
104
 
@@ -149,7 +154,7 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
149
154
  }
150
155
  this.setupEventListeners(client);
151
156
  client.once(CDPSessionEvent.Disconnected, () => {
152
- this.#onClientDisconnect().catch(debugError);
157
+ void this.#onClientDisconnect().catch(debugCatchError);
153
158
  });
154
159
  await this.initialize(client, frame);
155
160
  await this.#networkManager.addClient(client);
@@ -331,7 +336,7 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
331
336
  .send('Page.removeScriptToEvaluateOnNewDocument', {
332
337
  identifier,
333
338
  })
334
- .catch(debugError);
339
+ .catch(debugCatchError);
335
340
  }),
336
341
  );
337
342
  }
@@ -346,7 +351,7 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
346
351
  frame.updateClient(target._session()!);
347
352
  }
348
353
  this.setupEventListeners(target._session()!);
349
- void this.initialize(target._session()!, frame).catch(debugError);
354
+ void this.initialize(target._session()!, frame).catch(debugCatchError);
350
355
  }
351
356
 
352
357
  _deviceRequestPromptManager(
@@ -500,7 +505,7 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
500
505
  worldName: name,
501
506
  grantUniveralAccess: true,
502
507
  })
503
- .catch(debugError);
508
+ .catch(debugCatchError);
504
509
  }),
505
510
  );
506
511
 
@@ -583,7 +588,7 @@ export class FrameManager extends EventEmitter<FrameManagerEvents> {
583
588
  const extId = this.#extractExtensionId(origin);
584
589
 
585
590
  if (!extId) {
586
- debugError('Error while parsing extension id');
591
+ debugError?.('Error while parsing extension id');
587
592
  return;
588
593
  }
589
594
 
@@ -157,7 +157,7 @@ export class CdpHTTPRequest extends HTTPRequest {
157
157
  });
158
158
  return result.postData;
159
159
  } catch (err) {
160
- debugError(err);
160
+ debugError?.(err);
161
161
  return;
162
162
  }
163
163
  }
@@ -121,6 +121,6 @@ export async function releaseObject(
121
121
  .catch(error => {
122
122
  // Exceptions might happen in case of a page been navigated or closed.
123
123
  // Swallow these since they are harmless and we don't leak anything in this case.
124
- debugError(error);
124
+ debugError?.(error);
125
125
  });
126
126
  }
@@ -8,13 +8,13 @@ import type {Protocol} from 'devtools-protocol';
8
8
 
9
9
  import {CDPSessionEvent, type CDPSession} from '../api/CDPSession.js';
10
10
  import type {Frame} from '../api/Frame.js';
11
- import type {Credentials} from '../api/Page.js';
11
+ import type {Credentials, Page} from '../api/Page.js';
12
12
  import {EventEmitter} from '../common/EventEmitter.js';
13
13
  import {
14
14
  NetworkManagerEvent,
15
15
  type NetworkManagerEvents,
16
16
  } from '../common/NetworkManagerEvents.js';
17
- import {debugError, isString} from '../common/util.js';
17
+ import {debugError, isString, debugCatchError} from '../common/util.js';
18
18
  import {assert} from '../util/assert.js';
19
19
  import {DisposableStack} from '../util/disposable.js';
20
20
  import {isErrorLike} from '../util/ErrorLike.js';
@@ -65,6 +65,7 @@ export interface InternalNetworkConditions extends NetworkConditions {
65
65
  */
66
66
  export interface FrameProvider {
67
67
  frame(id: string): Frame | null;
68
+ page(): Page;
68
69
  }
69
70
 
70
71
  /**
@@ -83,6 +84,7 @@ export class NetworkManager extends EventEmitter<NetworkManagerEvents> {
83
84
  #userAgent?: string;
84
85
  #userAgentMetadata?: Protocol.Emulation.UserAgentMetadata;
85
86
  #platform?: string;
87
+ #acceptLanguage?: string;
86
88
 
87
89
  readonly #handlers = [
88
90
  ['Fetch.requestPaused', this.#onRequestPaused],
@@ -98,7 +100,7 @@ export class NetworkManager extends EventEmitter<NetworkManagerEvents> {
98
100
  ] as const;
99
101
 
100
102
  #clients = new Map<CDPSession, DisposableStack>();
101
- #networkEnabled = true;
103
+ #networkEnabled: boolean;
102
104
 
103
105
  constructor(frameManager: FrameProvider, networkEnabled?: boolean) {
104
106
  super();
@@ -277,13 +279,22 @@ export class NetworkManager extends EventEmitter<NetworkManagerEvents> {
277
279
  await this.#applyToAllClients(this.#applyUserAgent.bind(this));
278
280
  }
279
281
 
282
+ async setAcceptLanguage(acceptLanguage: string | undefined): Promise<void> {
283
+ this.#acceptLanguage = acceptLanguage;
284
+ await this.#applyToAllClients(this.#applyUserAgent.bind(this));
285
+ }
286
+
280
287
  async #applyUserAgent(client: CDPSession) {
281
- if (this.#userAgent === undefined) {
288
+ const userAgent =
289
+ this.#userAgent ??
290
+ (await this.#frameManager.page().browser().userAgent());
291
+ if (userAgent === undefined) {
282
292
  return;
283
293
  }
284
294
  try {
285
295
  await client.send('Network.setUserAgentOverride', {
286
- userAgent: this.#userAgent,
296
+ userAgent,
297
+ acceptLanguage: this.#acceptLanguage,
287
298
  userAgentMetadata: this.#userAgentMetadata,
288
299
  platform: this.#platform,
289
300
  });
@@ -403,12 +414,12 @@ export class NetworkManager extends EventEmitter<NetworkManagerEvents> {
403
414
  username: undefined,
404
415
  password: undefined,
405
416
  };
406
- client
417
+ void client
407
418
  .send('Fetch.continueWithAuth', {
408
419
  requestId: event.requestId,
409
420
  authChallengeResponse: {response, username, password},
410
421
  })
411
- .catch(debugError);
422
+ .catch(debugCatchError);
412
423
  }
413
424
 
414
425
  /**
@@ -426,11 +437,11 @@ export class NetworkManager extends EventEmitter<NetworkManagerEvents> {
426
437
  !this.#userRequestInterceptionEnabled &&
427
438
  this.#protocolRequestInterceptionEnabled
428
439
  ) {
429
- client
440
+ void client
430
441
  .send('Fetch.continueRequest', {
431
442
  requestId: event.requestId,
432
443
  })
433
- .catch(debugError);
444
+ .catch(debugCatchError);
434
445
  }
435
446
 
436
447
  const {networkId: networkRequestId, requestId: fetchRequestId} = event;
@@ -602,7 +613,7 @@ export class NetworkManager extends EventEmitter<NetworkManagerEvents> {
602
613
  request = this.#networkEventManager.getRequest(event.requestId);
603
614
  }
604
615
  if (!request) {
605
- debugError(
616
+ debugError?.(
606
617
  new Error(
607
618
  `Request ${event.requestId} was served from cache but we could not find the corresponding request object`,
608
619
  ),
@@ -646,7 +657,7 @@ export class NetworkManager extends EventEmitter<NetworkManagerEvents> {
646
657
  responseReceived.requestId,
647
658
  );
648
659
  if (extraInfos.length) {
649
- debugError(
660
+ debugError?.(
650
661
  new Error(
651
662
  'Unexpected extraInfo events for request ' +
652
663
  responseReceived.requestId,
@@ -56,6 +56,7 @@ import {
56
56
  parsePDFOptions,
57
57
  timeout,
58
58
  validateDialogType,
59
+ debugCatchError,
59
60
  } from '../common/util.js';
60
61
  import type {Viewport} from '../common/Viewport.js';
61
62
  import {environment} from '../environment.js';
@@ -126,7 +127,7 @@ export class CdpPage extends Page {
126
127
  await page.setViewport(defaultViewport);
127
128
  } catch (err) {
128
129
  if (isErrorLike(err) && isTargetClosedError(err)) {
129
- debugError(err);
130
+ debugError?.(err);
130
131
  } else {
131
132
  throw err;
132
133
  }
@@ -246,7 +247,7 @@ export class CdpPage extends Page {
246
247
  this.#onDetachedFromTarget,
247
248
  );
248
249
 
249
- this.#tabTarget._isClosedDeferred
250
+ void this.#tabTarget._isClosedDeferred
250
251
  .valueOrThrow()
251
252
  .then(() => {
252
253
  this.#targetManager.off(
@@ -257,7 +258,7 @@ export class CdpPage extends Page {
257
258
  this.emit(PageEvent.Close, undefined);
258
259
  this.#closed = true;
259
260
  })
260
- .catch(debugError);
261
+ .catch(debugCatchError);
261
262
 
262
263
  this.#setupPrimaryTargetListeners();
263
264
  this.#attachExistingTargets();
@@ -309,10 +310,12 @@ export class CdpPage extends Page {
309
310
  if (session.target()._subtype() !== 'prerender') {
310
311
  return;
311
312
  }
312
- this.#frameManager.registerSpeculativeSession(session).catch(debugError);
313
- this.#emulationManager
313
+ void this.#frameManager
314
314
  .registerSpeculativeSession(session)
315
- .catch(debugError);
315
+ .catch(debugCatchError);
316
+ void this.#emulationManager
317
+ .registerSpeculativeSession(session)
318
+ .catch(debugCatchError);
316
319
  }
317
320
 
318
321
  /**
@@ -378,7 +381,7 @@ export class CdpPage extends Page {
378
381
  // eslint-disable-next-line max-len -- The comment is long.
379
382
  // eslint-disable-next-line @puppeteer/use-using -- These are not owned by this function.
380
383
  for (const arg of message.args()) {
381
- void arg.dispose().catch(debugError);
384
+ void arg.dispose().catch(debugCatchError);
382
385
  }
383
386
  return;
384
387
  }
@@ -402,7 +405,7 @@ export class CdpPage extends Page {
402
405
  ]);
403
406
  } catch (err) {
404
407
  if (isErrorLike(err) && isTargetClosedError(err)) {
405
- debugError(err);
408
+ debugError?.(err);
406
409
  } else {
407
410
  throw err;
408
411
  }
@@ -950,7 +953,7 @@ export class CdpPage extends Page {
950
953
  // eslint-disable-next-line max-len -- The comment is long.
951
954
  // eslint-disable-next-line @puppeteer/use-using -- These are not owned by this function.
952
955
  for (const value of values) {
953
- void value.dispose().catch(debugError);
956
+ void value.dispose().catch(debugCatchError);
954
957
  }
955
958
  }
956
959
  return;
@@ -1085,6 +1088,11 @@ export class CdpPage extends Page {
1085
1088
  return await this.#emulationManager.emulateTimezone(timezoneId);
1086
1089
  }
1087
1090
 
1091
+ override async emulateLocale(locale?: string): Promise<void> {
1092
+ await this.#emulationManager.emulateLocale(locale);
1093
+ await this.#frameManager.networkManager.setAcceptLanguage(locale);
1094
+ }
1095
+
1088
1096
  override async emulateIdleState(overrides?: {
1089
1097
  isUserActive: boolean;
1090
1098
  isScreenUnlocked: boolean;
@@ -1152,7 +1160,7 @@ export class CdpPage extends Page {
1152
1160
  stack.defer(async () => {
1153
1161
  await this.#emulationManager
1154
1162
  .resetDefaultBackgroundColor()
1155
- .catch(debugError);
1163
+ .catch(debugCatchError);
1156
1164
  });
1157
1165
  }
1158
1166
 
@@ -10,7 +10,7 @@ import type {Browser} from '../api/Browser.js';
10
10
  import type {BrowserContext} from '../api/BrowserContext.js';
11
11
  import {PageEvent, type Page} from '../api/Page.js';
12
12
  import {Target, TargetType} from '../api/Target.js';
13
- import {debugError} from '../common/util.js';
13
+ import {debugCatchError} from '../common/util.js';
14
14
  import type {Viewport} from '../common/Viewport.js';
15
15
  import {Deferred} from '../util/Deferred.js';
16
16
 
@@ -233,7 +233,7 @@ export class PageTarget extends CdpTarget {
233
233
  }
234
234
 
235
235
  override _initialize(): void {
236
- this._initializedDeferred
236
+ void this._initializedDeferred
237
237
  .valueOrThrow()
238
238
  .then(async result => {
239
239
  if (result === InitializationStatus.ABORTED) {
@@ -254,7 +254,7 @@ export class PageTarget extends CdpTarget {
254
254
  openerPage.emit(PageEvent.Popup, popupPage);
255
255
  return true;
256
256
  })
257
- .catch(debugError);
257
+ .catch(debugCatchError);
258
258
  this._checkIfInitialized();
259
259
  }
260
260
 
@@ -11,7 +11,7 @@ import type {TargetFilterCallback} from '../api/Browser.js';
11
11
  import type {CDPSession} from '../api/CDPSession.js';
12
12
  import {CDPSessionEvent} from '../api/CDPSession.js';
13
13
  import {EventEmitter} from '../common/EventEmitter.js';
14
- import {debugError} from '../common/util.js';
14
+ import {debugCatchError} from '../common/util.js';
15
15
  import {assert} from '../util/assert.js';
16
16
  import {Deferred} from '../util/Deferred.js';
17
17
 
@@ -229,14 +229,16 @@ export class TargetManager
229
229
  session: CdpCDPSession,
230
230
  parentSession: Connection | CDPSession,
231
231
  ): Promise<void> => {
232
- await session.send('Runtime.runIfWaitingForDebugger').catch(debugError);
232
+ await session
233
+ .send('Runtime.runIfWaitingForDebugger')
234
+ .catch(debugCatchError);
233
235
  // We don't use `session.detach()` because that dispatches all commands on
234
236
  // the connection instead of the parent session.
235
237
  await parentSession
236
238
  .send('Target.detachFromTarget', {
237
239
  sessionId: session.id(),
238
240
  })
239
- .catch(debugError);
241
+ .catch(debugCatchError);
240
242
  };
241
243
 
242
244
  #getParentTarget = (
@@ -342,6 +344,7 @@ export class TargetManager
342
344
  }
343
345
 
344
346
  if (!this.#connection.isAutoAttached(targetInfo.targetId)) {
347
+ await this.#maybeSetupNetworkConditions(session, targetInfo);
345
348
  return;
346
349
  }
347
350
 
@@ -360,6 +363,13 @@ export class TargetManager
360
363
  // should determine if a target is auto-attached or not with the help of
361
364
  // CDP.
362
365
  if (targetInfo.type === 'service_worker') {
366
+ if (!this.isUrlAllowed(targetInfo.url)) {
367
+ await Promise.all([
368
+ this.#maybeSetupNetworkConditions(session, targetInfo),
369
+ session.send('Runtime.runIfWaitingForDebugger'),
370
+ ]).catch(debugCatchError);
371
+ return;
372
+ }
363
373
  await this.#silentDetach(session, parentSession);
364
374
  if (
365
375
  this.#attachedTargetsByTargetId.has(targetInfo.targetId) ||
@@ -427,8 +437,8 @@ export class TargetManager
427
437
  this.#finishInitializationIfReady(parentTarget._targetId);
428
438
  }
429
439
 
430
- // TODO: the browser might be shutting down here. What do we do with the
431
- // error?
440
+ // The browser might be shutting down here, so we
441
+ // ignore potential errors.
432
442
  await Promise.all([
433
443
  session.send('Target.setAutoAttach', {
434
444
  waitForDebuggerOnStart: true,
@@ -436,9 +446,9 @@ export class TargetManager
436
446
  autoAttach: true,
437
447
  filter: this.#discoveryFilter,
438
448
  }),
439
- this.#maybeSetupNetworkConditions(session),
449
+ this.#maybeSetupNetworkConditions(session, targetInfo),
440
450
  session.send('Runtime.runIfWaitingForDebugger'),
441
- ]).catch(debugError);
451
+ ]).catch(debugCatchError);
442
452
  };
443
453
 
444
454
  #finishInitializationIfReady(targetId?: string): void {
@@ -512,7 +522,10 @@ export class TargetManager
512
522
  return result;
513
523
  }
514
524
 
515
- #maybeSetupNetworkConditions = async (session: CDPSession): Promise<void> => {
525
+ #maybeSetupNetworkConditions = async (
526
+ session: CDPSession,
527
+ targetInfo: Protocol.Target.TargetInfo,
528
+ ): Promise<void> => {
516
529
  if (this.#blocklist.length === 0 && this.#allowlist.length === 0) {
517
530
  return;
518
531
  }
@@ -547,9 +560,21 @@ export class TargetManager
547
560
  });
548
561
  }
549
562
 
550
- await session.send('Network.emulateNetworkConditionsByRule', {
551
- offline: this.#blocklist.length > 0 ? true : undefined,
552
- matchedNetworkConditions,
553
- });
563
+ const needsNetwork =
564
+ targetInfo.type === 'worker' ||
565
+ targetInfo.type === 'service_worker' ||
566
+ targetInfo.type === 'shared_worker';
567
+
568
+ const promises = [];
569
+ if (needsNetwork) {
570
+ promises.push(session.send('Network.enable'));
571
+ }
572
+ promises.push(
573
+ session.send('Network.emulateNetworkConditionsByRule', {
574
+ offline: this.#blocklist.length > 0 ? true : undefined,
575
+ matchedNetworkConditions,
576
+ }),
577
+ );
578
+ await Promise.all(promises).catch(debugCatchError);
554
579
  };
555
580
  }