patchright-core 1.57.0 → 1.59.0

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 (307) hide show
  1. package/ThirdPartyNotices.txt +2688 -297
  2. package/browsers.json +23 -22
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +48 -413
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -0
  10. package/lib/client/browser.js +11 -5
  11. package/lib/client/browserContext.js +20 -23
  12. package/lib/client/browserType.js +23 -54
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/clientHelper.js +2 -1
  16. package/lib/client/clock.js +0 -1
  17. package/lib/client/{webSocket.js → connect.js} +57 -7
  18. package/lib/client/connection.js +8 -0
  19. package/lib/client/consoleMessage.js +3 -0
  20. package/lib/client/debugger.js +57 -0
  21. package/lib/client/dialog.js +8 -1
  22. package/lib/client/disposable.js +76 -0
  23. package/lib/client/electron.js +1 -0
  24. package/lib/client/elementHandle.js +1 -1
  25. package/lib/client/events.js +3 -0
  26. package/lib/client/fetch.js +2 -4
  27. package/lib/client/frame.js +9 -13
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -36
  31. package/lib/client/network.js +14 -11
  32. package/lib/client/page.js +44 -50
  33. package/lib/client/screencast.js +88 -0
  34. package/lib/client/selectors.js +3 -1
  35. package/lib/client/tracing.js +11 -5
  36. package/lib/client/video.js +13 -20
  37. package/lib/client/worker.js +6 -6
  38. package/lib/generated/bindingsControllerSource.js +1 -1
  39. package/lib/generated/clockSource.js +1 -1
  40. package/lib/generated/injectedScriptSource.js +1 -1
  41. package/lib/generated/pollingRecorderSource.js +1 -1
  42. package/lib/generated/storageScriptSource.js +1 -1
  43. package/lib/generated/utilityScriptSource.js +1 -1
  44. package/lib/mcpBundle.js +78 -0
  45. package/lib/mcpBundleImpl.js +91 -0
  46. package/lib/protocol/serializers.js +5 -0
  47. package/lib/protocol/validator.js +228 -58
  48. package/lib/protocol/validatorPrimitives.js +1 -1
  49. package/lib/remote/playwrightConnection.js +10 -8
  50. package/lib/remote/playwrightPipeServer.js +100 -0
  51. package/lib/remote/playwrightServer.js +14 -10
  52. package/lib/remote/playwrightWebSocketServer.js +73 -0
  53. package/lib/remote/serverTransport.js +96 -0
  54. package/lib/server/android/android.js +2 -2
  55. package/lib/server/artifact.js +1 -1
  56. package/lib/server/bidi/bidiBrowser.js +80 -14
  57. package/lib/server/bidi/bidiChromium.js +23 -14
  58. package/lib/server/bidi/bidiConnection.js +1 -0
  59. package/lib/server/bidi/bidiDeserializer.js +116 -0
  60. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  61. package/lib/server/bidi/bidiFirefox.js +6 -8
  62. package/lib/server/bidi/bidiNetworkManager.js +40 -12
  63. package/lib/server/bidi/bidiPage.js +67 -40
  64. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  65. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  66. package/lib/server/browser.js +84 -21
  67. package/lib/server/browserContext.js +137 -77
  68. package/lib/server/browserType.js +26 -16
  69. package/lib/server/chromium/chromium.js +28 -31
  70. package/lib/server/chromium/chromiumSwitches.js +16 -4
  71. package/lib/server/chromium/crBrowser.js +40 -27
  72. package/lib/server/chromium/crConnection.js +0 -5
  73. package/lib/server/chromium/crDevTools.js +1 -2
  74. package/lib/server/chromium/crNetworkManager.js +54 -229
  75. package/lib/server/chromium/crPage.js +74 -260
  76. package/lib/server/chromium/crServiceWorker.js +7 -14
  77. package/lib/server/clock.js +33 -41
  78. package/lib/server/codegen/javascript.js +6 -29
  79. package/lib/server/console.js +5 -1
  80. package/lib/server/debugController.js +12 -6
  81. package/lib/server/debugger.js +40 -47
  82. package/lib/server/deviceDescriptorsSource.json +137 -137
  83. package/lib/server/dispatchers/browserContextDispatcher.js +30 -30
  84. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  85. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  86. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  87. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  88. package/lib/server/dispatchers/dispatcher.js +7 -14
  89. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  90. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  91. package/lib/server/dispatchers/frameDispatcher.js +7 -7
  92. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  93. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  94. package/lib/server/dispatchers/pageDispatcher.js +101 -34
  95. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  96. package/lib/server/disposable.js +41 -0
  97. package/lib/server/dom.js +56 -29
  98. package/lib/server/download.js +3 -2
  99. package/lib/server/electron/electron.js +17 -9
  100. package/lib/server/firefox/ffBrowser.js +9 -29
  101. package/lib/server/firefox/ffConnection.js +0 -5
  102. package/lib/server/firefox/ffInput.js +21 -5
  103. package/lib/server/firefox/ffNetworkManager.js +4 -4
  104. package/lib/server/firefox/ffPage.js +27 -33
  105. package/lib/server/firefox/firefox.js +6 -8
  106. package/lib/server/frameSelectors.js +14 -169
  107. package/lib/server/frames.js +263 -551
  108. package/lib/server/har/harRecorder.js +2 -2
  109. package/lib/server/har/harTracer.js +5 -4
  110. package/lib/server/input.js +49 -4
  111. package/lib/server/instrumentation.js +8 -0
  112. package/lib/server/javascript.js +6 -22
  113. package/lib/server/launchApp.js +0 -1
  114. package/lib/server/localUtils.js +6 -6
  115. package/lib/server/network.js +59 -20
  116. package/lib/server/overlay.js +138 -0
  117. package/lib/server/page.js +179 -157
  118. package/lib/server/progress.js +32 -6
  119. package/lib/server/recorder/recorderApp.js +84 -104
  120. package/lib/server/recorder.js +76 -40
  121. package/lib/server/registry/browserFetcher.js +6 -4
  122. package/lib/server/registry/index.js +222 -226
  123. package/lib/server/registry/nativeDeps.js +1 -0
  124. package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
  125. package/lib/server/screencast.js +137 -0
  126. package/lib/server/trace/recorder/snapshotter.js +2 -2
  127. package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
  128. package/lib/server/trace/recorder/tracing.js +98 -47
  129. package/lib/server/trace/viewer/traceViewer.js +24 -21
  130. package/lib/server/usKeyboardLayout.js +7 -0
  131. package/lib/server/utils/comparators.js +1 -1
  132. package/lib/server/utils/disposable.js +32 -0
  133. package/lib/server/utils/eventsHelper.js +3 -1
  134. package/lib/server/utils/expectUtils.js +87 -2
  135. package/lib/server/utils/fileUtils.js +16 -2
  136. package/lib/server/utils/happyEyeballs.js +15 -12
  137. package/lib/server/utils/httpServer.js +10 -23
  138. package/lib/server/utils/network.js +39 -29
  139. package/lib/server/utils/processLauncher.js +8 -6
  140. package/lib/server/utils/zipFile.js +2 -2
  141. package/lib/server/videoRecorder.js +194 -0
  142. package/lib/server/webkit/webkit.js +4 -6
  143. package/lib/server/webkit/wkBrowser.js +1 -10
  144. package/lib/server/webkit/wkConnection.js +1 -6
  145. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  146. package/lib/server/webkit/wkPage.js +88 -57
  147. package/lib/server/webkit/wkWorkers.js +2 -1
  148. package/lib/serverRegistry.js +156 -0
  149. package/lib/tools/backend/browserBackend.js +79 -0
  150. package/lib/tools/backend/common.js +63 -0
  151. package/lib/tools/backend/config.js +41 -0
  152. package/lib/tools/backend/console.js +66 -0
  153. package/lib/tools/backend/context.js +296 -0
  154. package/lib/tools/backend/cookies.js +152 -0
  155. package/lib/tools/backend/devtools.js +69 -0
  156. package/lib/tools/backend/dialogs.js +59 -0
  157. package/lib/tools/backend/evaluate.js +64 -0
  158. package/lib/tools/backend/files.js +60 -0
  159. package/lib/tools/backend/form.js +64 -0
  160. package/lib/tools/backend/keyboard.js +155 -0
  161. package/lib/tools/backend/logFile.js +95 -0
  162. package/lib/tools/backend/mouse.js +168 -0
  163. package/lib/tools/backend/navigate.js +106 -0
  164. package/lib/tools/backend/network.js +135 -0
  165. package/lib/tools/backend/pdf.js +48 -0
  166. package/lib/tools/backend/response.js +305 -0
  167. package/lib/tools/backend/route.js +140 -0
  168. package/lib/tools/backend/runCode.js +77 -0
  169. package/lib/tools/backend/screenshot.js +88 -0
  170. package/lib/tools/backend/sessionLog.js +74 -0
  171. package/lib/tools/backend/snapshot.js +208 -0
  172. package/lib/tools/backend/storage.js +68 -0
  173. package/lib/tools/backend/tab.js +445 -0
  174. package/lib/tools/backend/tabs.js +67 -0
  175. package/lib/tools/backend/tool.js +47 -0
  176. package/lib/tools/backend/tools.js +102 -0
  177. package/lib/tools/backend/tracing.js +78 -0
  178. package/lib/tools/backend/utils.js +83 -0
  179. package/lib/tools/backend/verify.js +151 -0
  180. package/lib/tools/backend/video.js +98 -0
  181. package/lib/tools/backend/wait.js +63 -0
  182. package/lib/tools/backend/webstorage.js +223 -0
  183. package/lib/tools/cli-client/cli.js +6 -0
  184. package/lib/tools/cli-client/help.json +399 -0
  185. package/lib/tools/cli-client/minimist.js +128 -0
  186. package/lib/tools/cli-client/program.js +350 -0
  187. package/lib/tools/cli-client/registry.js +176 -0
  188. package/lib/tools/cli-client/session.js +289 -0
  189. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  190. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  191. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  192. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  193. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  194. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  195. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  196. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  197. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  198. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  199. package/lib/tools/cli-daemon/command.js +73 -0
  200. package/lib/tools/cli-daemon/commands.js +956 -0
  201. package/lib/tools/cli-daemon/daemon.js +157 -0
  202. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  203. package/lib/tools/cli-daemon/program.js +129 -0
  204. package/lib/tools/dashboard/appIcon.png +0 -0
  205. package/lib/tools/dashboard/dashboardApp.js +284 -0
  206. package/lib/tools/dashboard/dashboardController.js +296 -0
  207. package/lib/tools/exports.js +60 -0
  208. package/lib/tools/mcp/browserFactory.js +233 -0
  209. package/lib/tools/mcp/cdpRelay.js +352 -0
  210. package/lib/tools/mcp/cli-stub.js +7 -0
  211. package/lib/tools/mcp/config.d.js +16 -0
  212. package/lib/tools/mcp/config.js +446 -0
  213. package/lib/tools/mcp/configIni.js +189 -0
  214. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  215. package/lib/tools/mcp/index.js +62 -0
  216. package/lib/tools/mcp/log.js +35 -0
  217. package/lib/tools/mcp/program.js +107 -0
  218. package/lib/tools/mcp/protocol.js +28 -0
  219. package/lib/tools/mcp/watchdog.js +44 -0
  220. package/lib/tools/trace/SKILL.md +171 -0
  221. package/lib/tools/trace/installSkill.js +48 -0
  222. package/lib/tools/trace/traceActions.js +142 -0
  223. package/lib/tools/trace/traceAttachments.js +69 -0
  224. package/lib/tools/trace/traceCli.js +87 -0
  225. package/lib/tools/trace/traceConsole.js +97 -0
  226. package/lib/tools/trace/traceErrors.js +55 -0
  227. package/lib/tools/trace/traceOpen.js +69 -0
  228. package/lib/tools/trace/traceParser.js +96 -0
  229. package/lib/tools/trace/traceRequests.js +182 -0
  230. package/lib/tools/trace/traceScreenshot.js +68 -0
  231. package/lib/tools/trace/traceSnapshot.js +149 -0
  232. package/lib/tools/trace/traceUtils.js +153 -0
  233. package/lib/tools/utils/connect.js +32 -0
  234. package/lib/tools/utils/mcp/http.js +152 -0
  235. package/lib/tools/utils/mcp/server.js +230 -0
  236. package/lib/tools/utils/mcp/tool.js +47 -0
  237. package/lib/tools/utils/socketConnection.js +108 -0
  238. package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
  239. package/lib/utils/isomorphic/formatUtils.js +64 -0
  240. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  241. package/lib/utils/isomorphic/lruCache.js +51 -0
  242. package/lib/utils/isomorphic/mimeType.js +7 -2
  243. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  244. package/lib/utils/isomorphic/protocolMetainfo.js +127 -98
  245. package/lib/utils/isomorphic/stringUtils.js +49 -0
  246. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  247. package/lib/utils/isomorphic/trace/entries.js +16 -0
  248. package/lib/utils/isomorphic/trace/snapshotRenderer.js +492 -0
  249. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  250. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  251. package/lib/utils/isomorphic/trace/traceLoader.js +132 -0
  252. package/lib/utils/isomorphic/trace/traceModel.js +366 -0
  253. package/lib/utils/isomorphic/trace/traceModernizer.js +401 -0
  254. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  255. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  256. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  257. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  258. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  259. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  260. package/lib/utils/isomorphic/urlMatch.js +54 -1
  261. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  262. package/lib/utils/isomorphic/yaml.js +84 -0
  263. package/lib/utils.js +8 -2
  264. package/lib/utilsBundle.js +5 -26
  265. package/lib/utilsBundleImpl/index.js +172 -173
  266. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  267. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  268. package/lib/vite/dashboard/index.html +28 -0
  269. package/lib/vite/htmlReport/index.html +2 -70
  270. package/lib/vite/htmlReport/report.css +1 -0
  271. package/lib/vite/htmlReport/report.js +72 -0
  272. package/lib/vite/recorder/assets/codeMirrorModule-C8KMvO9L.js +32 -0
  273. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  274. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  275. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  276. package/lib/vite/recorder/index.html +2 -2
  277. package/lib/vite/traceViewer/assets/codeMirrorModule-DS0FLvoc.js +32 -0
  278. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  279. package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
  280. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  281. package/lib/vite/traceViewer/index.CzXZzn5A.css +1 -0
  282. package/lib/vite/traceViewer/index.Dtstcb7U.js +2 -0
  283. package/lib/vite/traceViewer/index.html +4 -4
  284. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  285. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  286. package/lib/vite/traceViewer/uiMode.html +3 -3
  287. package/lib/zipBundleImpl.js +2 -2
  288. package/lib/zodBundle.js +39 -0
  289. package/lib/zodBundleImpl.js +40 -0
  290. package/package.json +7 -1
  291. package/types/protocol.d.ts +1696 -221
  292. package/types/types.d.ts +879 -112
  293. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
  294. package/lib/server/chromium/videoRecorder.js +0 -115
  295. package/lib/server/pageBinding.js +0 -87
  296. package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
  297. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  298. package/lib/vite/recorder/assets/codeMirrorModule-CBbSe-ZI.js +0 -25
  299. package/lib/vite/recorder/assets/index-CpZVd2nA.js +0 -193
  300. package/lib/vite/traceViewer/assets/codeMirrorModule-DHz0wP2C.js +0 -25
  301. package/lib/vite/traceViewer/assets/defaultSettingsView-WsZP88O6.js +0 -266
  302. package/lib/vite/traceViewer/defaultSettingsView.ConWv5KN.css +0 -1
  303. package/lib/vite/traceViewer/index.C4Y3Aw8n.css +0 -1
  304. package/lib/vite/traceViewer/index.C8xAeo93.js +0 -2
  305. package/lib/vite/traceViewer/uiMode.BltraIJB.js +0 -5
  306. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  307. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -31,11 +31,13 @@ __export(page_exports, {
31
31
  InitScript: () => InitScript,
32
32
  Page: () => Page,
33
33
  PageBinding: () => PageBinding,
34
- Worker: () => Worker
34
+ Worker: () => Worker,
35
+ WorkerEvent: () => WorkerEvent,
36
+ ariaSnapshotForFrame: () => ariaSnapshotForFrame
35
37
  });
36
38
  module.exports = __toCommonJS(page_exports);
37
- var import_pageBinding = require("./pageBinding");
38
39
  var import_browserContext = require("./browserContext");
40
+ var import_disposable = require("./disposable");
39
41
  var import_console = require("./console");
40
42
  var import_errors = require("./errors");
41
43
  var import_fileChooser = require("./fileChooser");
@@ -53,11 +55,29 @@ var import_selectorParser = require("../utils/isomorphic/selectorParser");
53
55
  var import_manualPromise = require("../utils/isomorphic/manualPromise");
54
56
  var import_utilityScriptSerializers = require("../utils/isomorphic/utilityScriptSerializers");
55
57
  var import_callLog = require("./callLog");
58
+ var rawBindingsControllerSource = __toESM(require("../generated/bindingsControllerSource"));
59
+ var import_overlay = require("./overlay");
60
+ var import_dom = require("./dom");
61
+ var import_screencast = require("./screencast");
62
+ const PageEvent = {
63
+ Close: "close",
64
+ Crash: "crash",
65
+ Download: "download",
66
+ EmulatedSizeChanged: "emulatedsizechanged",
67
+ FileChooser: "filechooser",
68
+ FrameAttached: "frameattached",
69
+ FrameDetached: "framedetached",
70
+ InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument",
71
+ LocatorHandlerTriggered: "locatorhandlertriggered",
72
+ WebSocket: "websocket",
73
+ Worker: "worker"
74
+ };
75
+ const navigationMarkSymbol = Symbol("navigationMark");
56
76
  class Page extends import_instrumentation.SdkObject {
57
77
  constructor(delegate, browserContext) {
58
78
  super(browserContext, "page");
59
79
  this._closedState = "open";
60
- this._closedPromise = new import_manualPromise.ManualPromise();
80
+ this.closedPromise = new import_manualPromise.ManualPromise();
61
81
  this._initializedPromise = new import_manualPromise.ManualPromise();
62
82
  this._consoleMessages = [];
63
83
  this._pageErrors = [];
@@ -69,14 +89,10 @@ class Page extends import_instrumentation.SdkObject {
69
89
  this.initScripts = [];
70
90
  this._workers = /* @__PURE__ */ new Map();
71
91
  this.requestInterceptors = [];
72
- this.video = null;
73
92
  this._locatorHandlers = /* @__PURE__ */ new Map();
74
93
  this._lastLocatorHandlerUid = 0;
75
94
  this._locatorHandlerRunningCounter = 0;
76
95
  this._networkRequests = [];
77
- // Aiming at 25 fps by default - each frame is 40ms, but we give some slack with 35ms.
78
- // When throttling for tracing, 200ms between frames, except for 10 frames around the action.
79
- this._frameThrottler = new FrameThrottler(10, 35, 200);
80
96
  this.attribution.page = this;
81
97
  this.delegate = delegate;
82
98
  this.browserContext = browserContext;
@@ -85,27 +101,15 @@ class Page extends import_instrumentation.SdkObject {
85
101
  this.touchscreen = new input.Touchscreen(delegate.rawTouchscreen, this);
86
102
  this.screenshotter = new import_screenshotter.Screenshotter(this);
87
103
  this.frameManager = new frames.FrameManager(this);
104
+ this.overlay = new import_overlay.Overlay(this);
105
+ this.screencast = new import_screencast.Screencast(this);
88
106
  if (delegate.pdf)
89
107
  this.pdf = delegate.pdf.bind(delegate);
90
108
  this.coverage = delegate.coverage ? delegate.coverage() : null;
91
109
  this.isStorageStatePage = browserContext.isCreatingStorageStatePage();
92
110
  }
93
111
  static {
94
- this.Events = {
95
- Close: "close",
96
- Crash: "crash",
97
- Download: "download",
98
- EmulatedSizeChanged: "emulatedsizechanged",
99
- FileChooser: "filechooser",
100
- FrameAttached: "frameattached",
101
- FrameDetached: "framedetached",
102
- InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument",
103
- LocatorHandlerTriggered: "locatorhandlertriggered",
104
- ScreencastFrame: "screencastframe",
105
- Video: "video",
106
- WebSocket: "websocket",
107
- Worker: "worker"
108
- };
112
+ this.Events = PageEvent;
109
113
  }
110
114
  async reportAsNew(opener, error) {
111
115
  if (opener) {
@@ -158,17 +162,20 @@ class Page extends import_instrumentation.SdkObject {
158
162
  }
159
163
  _didClose() {
160
164
  this.frameManager.dispose();
161
- this._frameThrottler.dispose();
165
+ this.screencast.dispose();
166
+ this.overlay.dispose();
162
167
  (0, import_utils.assert)(this._closedState !== "closed", "Page closed twice");
163
168
  this._closedState = "closed";
164
169
  this.emit(Page.Events.Close);
165
- this._closedPromise.resolve();
170
+ this.browserContext.emit(import_browserContext.BrowserContext.Events.PageClosed, this);
171
+ this.closedPromise.resolve();
166
172
  this.instrumentation.onPageClose(this);
167
- this.openScope.close(new import_errors.TargetClosedError());
173
+ this.openScope.close(new import_errors.TargetClosedError(this.closeReason()));
168
174
  }
169
175
  _didCrash() {
170
176
  this.frameManager.dispose();
171
- this._frameThrottler.dispose();
177
+ this.screencast.dispose();
178
+ this.overlay.dispose();
172
179
  this.emit(Page.Events.Crash);
173
180
  this._crashed = true;
174
181
  this.instrumentation.onPageClose(this);
@@ -202,16 +209,25 @@ class Page extends import_instrumentation.SdkObject {
202
209
  throw new Error(`Function "${name}" has been already registered`);
203
210
  if (this.browserContext._pageBindings.has(name))
204
211
  throw new Error(`Function "${name}" has been already registered in the browser context`);
205
- const binding = new PageBinding(name, playwrightBinding, needsHandle);
212
+ await progress.race(this.browserContext.exposePlaywrightBindingIfNeeded());
213
+ const binding = new PageBinding(this, name, playwrightBinding, needsHandle);
206
214
  this._pageBindings.set(name, binding);
207
- await this.delegate.exposeBinding(binding);
208
- }
209
- async removeExposedBindings(bindings) {
210
- for (const key of this._pageBindings.keys()) {
211
- if (!key.startsWith("__pw"))
212
- this._pageBindings.delete(key);
215
+ try {
216
+ await progress.race(this.delegate.addInitScript(binding.initScript));
217
+ await progress.race(this.safeNonStallingEvaluateInAllFrames(binding.initScript.source, "main"));
218
+ return binding;
219
+ } catch (error) {
220
+ this._pageBindings.delete(name);
221
+ throw error;
213
222
  }
214
- await this.delegate.removeExposedBindings();
223
+ }
224
+ async removeExposedBinding(binding) {
225
+ if (this._pageBindings.get(binding.name) !== binding)
226
+ return;
227
+ this._pageBindings.delete(binding.name);
228
+ await this.delegate.removeInitScripts([binding.initScript]);
229
+ const cleanup = `{ ${binding.cleanupScript} };`;
230
+ await this.safeNonStallingEvaluateInAllFrames(cleanup, "main");
215
231
  }
216
232
  async setExtraHTTPHeaders(progress, headers) {
217
233
  const oldHeaders = this._extraHTTPHeaders;
@@ -240,8 +256,8 @@ class Page extends import_instrumentation.SdkObject {
240
256
  return;
241
257
  await PageBinding.dispatch(this, payload, context);
242
258
  }
243
- addConsoleMessage(worker, type, args, location, text) {
244
- const message = new import_console.ConsoleMessage(this, worker, type, text, args, location);
259
+ addConsoleMessage(worker, type, args, location, text, timestamp) {
260
+ const message = new import_console.ConsoleMessage(this, worker, type, text, args, location, timestamp);
245
261
  const intercepted = this.frameManager.interceptConsoleMessage(message);
246
262
  if (intercepted) {
247
263
  args.forEach((arg) => arg.dispose());
@@ -252,8 +268,14 @@ class Page extends import_instrumentation.SdkObject {
252
268
  if (this._initialized)
253
269
  this.emitOnContext(import_browserContext.BrowserContext.Events.Console, message);
254
270
  }
255
- consoleMessages() {
256
- return this._consoleMessages;
271
+ clearConsoleMessages() {
272
+ this._consoleMessages.length = 0;
273
+ }
274
+ consoleMessages(filter) {
275
+ if (filter === "all")
276
+ return this._consoleMessages;
277
+ const marked = this._consoleMessages.findLastIndex((m) => m[navigationMarkSymbol]);
278
+ return marked === -1 ? this._consoleMessages : this._consoleMessages.slice(marked + 1);
257
279
  }
258
280
  addPageError(pageError) {
259
281
  this._pageErrors.push(pageError);
@@ -261,8 +283,14 @@ class Page extends import_instrumentation.SdkObject {
261
283
  if (this._initialized)
262
284
  this.emitOnContext(import_browserContext.BrowserContext.Events.PageError, pageError, this);
263
285
  }
264
- pageErrors() {
265
- return this._pageErrors;
286
+ clearPageErrors() {
287
+ this._pageErrors.length = 0;
288
+ }
289
+ pageErrors(filter) {
290
+ if (filter === "all")
291
+ return this._pageErrors;
292
+ const marked = this._pageErrors.findLastIndex((e) => e[navigationMarkSymbol]);
293
+ return marked === -1 ? this._pageErrors : this._pageErrors.slice(marked + 1);
266
294
  }
267
295
  async reload(progress, options) {
268
296
  return this.mainFrame().raceNavigationAction(progress, async () => {
@@ -439,21 +467,21 @@ class Page extends import_instrumentation.SdkObject {
439
467
  async bringToFront() {
440
468
  await this.delegate.bringToFront();
441
469
  }
442
- async addInitScript(progress, source) {
443
- const initScript = new InitScript(source);
470
+ async addInitScript(source) {
471
+ const initScript = new InitScript(this, source);
444
472
  this.initScripts.push(initScript);
445
473
  try {
446
- await progress.race(this.delegate.addInitScript(initScript));
474
+ await this.delegate.addInitScript(initScript);
447
475
  } catch (error) {
448
- this.removeInitScripts([initScript]).catch(() => {
476
+ initScript.dispose().catch(() => {
449
477
  });
450
478
  throw error;
451
479
  }
452
480
  return initScript;
453
481
  }
454
- async removeInitScripts(initScripts) {
455
- this.initScripts.splice(0, this.initScripts.length);
456
- await this.delegate.removeInitScripts();
482
+ async removeInitScript(initScript) {
483
+ this.initScripts = this.initScripts.filter((script) => initScript !== script);
484
+ await this.delegate.removeInitScripts([initScript]);
457
485
  }
458
486
  needsRequestInterception() {
459
487
  return this.requestInterceptors.length > 0 || this.browserContext.requestInterceptors.length > 0;
@@ -567,15 +595,17 @@ class Page extends import_instrumentation.SdkObject {
567
595
  if (this._closedState === "closed")
568
596
  return;
569
597
  if (options.reason)
570
- this.closeReason = options.reason;
598
+ this._closeReason = options.reason;
571
599
  const runBeforeUnload = !!options.runBeforeUnload;
600
+ if (!runBeforeUnload)
601
+ await this.screencast.handlePageOrContextClose();
572
602
  if (this._closedState !== "closing") {
573
603
  if (!runBeforeUnload)
574
604
  this._closedState = "closing";
575
605
  await this.delegate.closePage(runBeforeUnload).catch((e) => import_debugLogger.debugLogger.log("error", e));
576
606
  }
577
607
  if (!runBeforeUnload)
578
- await this._closedPromise;
608
+ await this.closedPromise;
579
609
  }
580
610
  isClosed() {
581
611
  return this._closedState === "closed";
@@ -617,23 +647,26 @@ class Page extends import_instrumentation.SdkObject {
617
647
  }
618
648
  frameNavigatedToNewDocument(frame) {
619
649
  this.emit(Page.Events.InternalFrameNavigatedToNewDocument, frame);
650
+ this.browserContext.emit(import_browserContext.BrowserContext.Events.InternalFrameNavigatedToNewDocument, frame, this);
620
651
  const origin = frame.origin();
621
652
  if (origin)
622
653
  this.browserContext.addVisitedOrigin(origin);
654
+ if (frame === this.mainFrame()) {
655
+ if (this._consoleMessages.length > 0)
656
+ this._consoleMessages[this._consoleMessages.length - 1][navigationMarkSymbol] = true;
657
+ if (this._pageErrors.length > 0)
658
+ this._pageErrors[this._pageErrors.length - 1][navigationMarkSymbol] = true;
659
+ }
660
+ }
661
+ allInitScripts() {
662
+ const bindings = [...this.browserContext._pageBindings.values(), ...this._pageBindings.values()].map((binding) => binding.initScript);
663
+ if (this.browserContext.bindingsInitScript)
664
+ bindings.unshift(this.browserContext.bindingsInitScript);
665
+ return [...bindings, ...this.browserContext.initScripts, ...this.initScripts];
623
666
  }
624
667
  getBinding(name) {
625
668
  return this._pageBindings.get(name) || this.browserContext._pageBindings.get(name);
626
669
  }
627
- setScreencastOptions(options) {
628
- this.delegate.setScreencastOptions(options).catch((e) => import_debugLogger.debugLogger.log("error", e));
629
- this._frameThrottler.setThrottlingEnabled(!!options);
630
- }
631
- throttleScreencastFrameAck(ack) {
632
- this._frameThrottler.ack(ack);
633
- }
634
- temporarilyDisableTracingScreencastThrottling() {
635
- this._frameThrottler.recharge();
636
- }
637
670
  async safeNonStallingEvaluateInAllFrames(expression, world, options = {}) {
638
671
  await Promise.all(this.frames().map(async (frame) => {
639
672
  try {
@@ -648,14 +681,13 @@ class Page extends import_instrumentation.SdkObject {
648
681
  await Promise.all(this.frames().map((frame) => frame.hideHighlight().catch(() => {
649
682
  })));
650
683
  }
651
- async snapshotForAI(progress, options) {
652
- const snapshot = await snapshotFrameForAI(progress, this.mainFrame(), options);
653
- return { full: snapshot.full.join("\n"), incremental: snapshot.incremental?.join("\n") };
654
- }
655
- allBindings() {
656
- return [...this.browserContext._pageBindings.values(), ...this._pageBindings.values()];
684
+ async setDockTile(image) {
685
+ await this.delegate.setDockTile(image);
657
686
  }
658
687
  }
688
+ const WorkerEvent = {
689
+ Close: "close"
690
+ };
659
691
  class Worker extends import_instrumentation.SdkObject {
660
692
  constructor(parent, url) {
661
693
  super(parent, "worker");
@@ -666,9 +698,7 @@ class Worker extends import_instrumentation.SdkObject {
666
698
  this.url = url;
667
699
  }
668
700
  static {
669
- this.Events = {
670
- Close: "close"
671
- };
701
+ this.Events = WorkerEvent;
672
702
  }
673
703
  createExecutionContext(delegate) {
674
704
  this.existingExecutionContext = new js.ExecutionContext(this, delegate, "worker");
@@ -681,41 +711,51 @@ class Worker extends import_instrumentation.SdkObject {
681
711
  if (this.existingExecutionContext)
682
712
  this._executionContextPromise.resolve(this.existingExecutionContext);
683
713
  }
714
+ _prepareContextForRestart() {
715
+ if (this.existingExecutionContext)
716
+ this.existingExecutionContext.contextDestroyed("Service worker restarted");
717
+ this.existingExecutionContext = null;
718
+ this._workerScriptLoaded = false;
719
+ this._executionContextPromise = new import_manualPromise.ManualPromise();
720
+ }
684
721
  didClose() {
685
722
  if (this.existingExecutionContext)
686
723
  this.existingExecutionContext.contextDestroyed("Worker was closed");
687
724
  this.emit(Worker.Events.Close, this);
688
725
  this.openScope.close(new Error("Worker closed"));
689
726
  }
690
- async evaluateExpression(expression, isFunction, arg, isolatedContext) {
691
- let context = await this._executionContextPromise;
692
- if (context.constructor.name === "FrameExecutionContext") {
693
- const frame = context.frame;
694
- if (frame) {
695
- if (isolatedContext) context = await frame._utilityContext();
696
- else if (!isolatedContext) context = await frame._mainContext();
697
- }
698
- }
699
- return js.evaluateExpression(context, expression, { returnByValue: true, isFunction }, arg);
700
- }
701
- async evaluateExpressionHandle(expression, isFunction, arg, isolatedContext) {
702
- let context = await this._executionContextPromise;
703
- if (context.constructor.name === "FrameExecutionContext") {
704
- const frame = this._context.frame;
705
- if (frame) {
706
- if (isolatedContext) context = await frame._utilityContext();
707
- else if (!isolatedContext) context = await frame._mainContext();
708
- }
709
- }
710
- return js.evaluateExpression(context, expression, { returnByValue: false, isFunction }, arg);
727
+ async evaluateExpression(expression, isFunction, arg) {
728
+ return js.evaluateExpression(await this._executionContextPromise, expression, { returnByValue: true, isFunction }, arg);
729
+ }
730
+ async evaluateExpressionHandle(expression, isFunction, arg) {
731
+ return js.evaluateExpression(await this._executionContextPromise, expression, { returnByValue: false, isFunction }, arg);
711
732
  }
712
733
  }
713
- class PageBinding {
714
- constructor(name, playwrightFunction, needsHandle) {
734
+ class PageBinding extends import_disposable.DisposableObject {
735
+ static {
736
+ this.kController = "__playwright__binding__controller__";
737
+ }
738
+ static {
739
+ this.kBindingName = "__playwright__binding__";
740
+ }
741
+ static createInitScript(browserContext) {
742
+ return new InitScript(browserContext, `
743
+ (() => {
744
+ const module = {};
745
+ ${rawBindingsControllerSource.source}
746
+ const property = '${PageBinding.kController}';
747
+ if (!globalThis[property])
748
+ globalThis[property] = new (module.exports.BindingsController())(globalThis, '${PageBinding.kBindingName}');
749
+ })();
750
+ `);
751
+ }
752
+ constructor(parent, name, playwrightFunction, needsHandle) {
753
+ super(parent);
715
754
  this.name = name;
716
755
  this.playwrightFunction = playwrightFunction;
717
- this.source = (0, import_pageBinding.createPageBindingScript)(name, needsHandle);
756
+ this.initScript = new InitScript(parent, `globalThis['${PageBinding.kController}'].addBinding(${JSON.stringify(name)}, ${needsHandle})`);
718
757
  this.needsHandle = needsHandle;
758
+ this.cleanupScript = `globalThis['${PageBinding.kController}'].removeBinding(${JSON.stringify(name)})`;
719
759
  }
720
760
  static async dispatch(page, payload, context) {
721
761
  const { name, seq, serializedArgs } = JSON.parse(payload);
@@ -726,87 +766,62 @@ class PageBinding {
726
766
  throw new Error(`Function "${name}" is not exposed`);
727
767
  let result;
728
768
  if (binding.needsHandle) {
729
- const handle = await context.evaluateHandle(import_pageBinding.takeBindingHandle, { name, seq }).catch((e) => null);
730
- result = await binding.playwrightFunction({ frame: context.frame, page, context: page._browserContext }, handle);
769
+ const handle = await context.evaluateExpressionHandle(`arg => globalThis['${PageBinding.kController}'].takeBindingHandle(arg)`, { isFunction: true }, { name, seq }).catch((e) => null);
770
+ result = await binding.playwrightFunction({ frame: context.frame, page, context: page.browserContext }, handle);
731
771
  } else {
732
772
  if (!Array.isArray(serializedArgs))
733
773
  throw new Error(`serializedArgs is not an array. This can happen when Array.prototype.toJSON is defined incorrectly`);
734
774
  const args = serializedArgs.map((a) => (0, import_utilityScriptSerializers.parseEvaluationResultValue)(a));
735
- result = await binding.playwrightFunction({ frame: context.frame, page, context: page._browserContext }, ...args);
775
+ result = await binding.playwrightFunction({ frame: context.frame, page, context: page.browserContext }, ...args);
736
776
  }
737
- context.evaluate(import_pageBinding.deliverBindingResult, { name, seq, result }).catch((e) => import_debugLogger.debugLogger.log("error", e));
777
+ context.evaluateExpressionHandle(`arg => globalThis['${PageBinding.kController}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, result }).catch((e) => import_debugLogger.debugLogger.log("error", e));
738
778
  } catch (error) {
739
- context.evaluate(import_pageBinding.deliverBindingResult, { name, seq, error }).catch((e) => import_debugLogger.debugLogger.log("error", e));
779
+ context.evaluateExpressionHandle(`arg => globalThis['${PageBinding.kController}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, error }).catch((e) => import_debugLogger.debugLogger.log("error", e));
740
780
  }
741
781
  }
742
- }
743
- class InitScript {
744
- constructor(source) {
745
- this.source = `(() => { ${source} })();`;
782
+ async dispose() {
783
+ await this.parent.removeExposedBinding(this);
746
784
  }
747
785
  }
748
- class FrameThrottler {
749
- constructor(nonThrottledFrames, defaultInterval, throttlingInterval) {
750
- this._acks = [];
751
- this._throttlingEnabled = false;
752
- this._nonThrottledFrames = nonThrottledFrames;
753
- this._budget = nonThrottledFrames;
754
- this._defaultInterval = defaultInterval;
755
- this._throttlingInterval = throttlingInterval;
756
- this._tick();
757
- }
758
- dispose() {
759
- if (this._timeoutId) {
760
- clearTimeout(this._timeoutId);
761
- this._timeoutId = void 0;
762
- }
763
- }
764
- setThrottlingEnabled(enabled) {
765
- this._throttlingEnabled = enabled;
766
- }
767
- recharge() {
768
- for (const ack of this._acks)
769
- ack();
770
- this._acks = [];
771
- this._budget = this._nonThrottledFrames;
772
- if (this._timeoutId) {
773
- clearTimeout(this._timeoutId);
774
- this._tick();
775
- }
776
- }
777
- ack(ack) {
778
- if (!this._timeoutId) {
779
- ack();
780
- return;
781
- }
782
- this._acks.push(ack);
786
+ class InitScript extends import_disposable.DisposableObject {
787
+ constructor(owner, source) {
788
+ super(owner);
789
+ this.source = `(() => {
790
+ ${source}
791
+ })();`;
783
792
  }
784
- _tick() {
785
- const ack = this._acks.shift();
786
- if (ack) {
787
- --this._budget;
788
- ack();
789
- }
790
- if (this._throttlingEnabled && this._budget <= 0) {
791
- this._timeoutId = setTimeout(() => this._tick(), this._throttlingInterval);
792
- } else {
793
- this._timeoutId = setTimeout(() => this._tick(), this._defaultInterval);
794
- }
793
+ async dispose() {
794
+ await this.parent.removeInitScript(this);
795
795
  }
796
796
  }
797
- async function snapshotFrameForAI(progress, frame, options) {
797
+ async function ariaSnapshotForFrame(progress, frame, options = {}) {
798
798
  const snapshot = await frame.retryWithProgressAndTimeouts(progress, [1e3, 2e3, 4e3, 8e3], async (continuePolling) => {
799
799
  try {
800
800
  const context = await progress.race(frame._utilityContext());
801
801
  const injectedScript = await progress.race(context.injectedScript());
802
802
  const snapshotOrRetry = await progress.race(injectedScript.evaluate((injected, options2) => {
803
+ if (options2.info) {
804
+ const element = injected.querySelector(options2.info.parsed, injected.document, options2.info.strict);
805
+ if (!element)
806
+ return false;
807
+ return injected.incrementalAriaSnapshot(element, options2);
808
+ }
803
809
  const node = injected.document.body;
804
810
  if (!node)
805
811
  return true;
806
- return injected.incrementalAriaSnapshot(node, { mode: "ai", ...options2 });
807
- }, { refPrefix: frame.seq ? "f" + frame.seq : "", track: options.track }));
812
+ return injected.incrementalAriaSnapshot(node, options2);
813
+ }, {
814
+ mode: options.mode ?? "default",
815
+ refPrefix: frame.seq ? "f" + frame.seq : "",
816
+ track: options.track,
817
+ doNotRenderActive: options.doNotRenderActive,
818
+ info: options.info,
819
+ depth: options.depth
820
+ }));
808
821
  if (snapshotOrRetry === true)
809
822
  return continuePolling;
823
+ if (snapshotOrRetry === false)
824
+ throw new import_dom.NonRecoverableDOMError(`Selector "${(0, import_selectorParser.stringifySelector)(options.info.parsed)}" does not match any element`);
810
825
  return snapshotOrRetry;
811
826
  } catch (e) {
812
827
  if (frame.isNonRetriableError(e))
@@ -814,18 +829,23 @@ async function snapshotFrameForAI(progress, frame, options) {
814
829
  return continuePolling;
815
830
  }
816
831
  });
817
- const childSnapshotPromises = snapshot.iframeRefs.map((ref) => snapshotFrameRefForAI(progress, frame, ref, options));
832
+ const renderedIframeRefs = snapshot.iframeRefs.filter((ref) => ref in snapshot.iframeDepths);
833
+ const childSnapshotPromises = renderedIframeRefs.map((ref) => {
834
+ const iframeDepth = snapshot.iframeDepths[ref];
835
+ const childDepth = options.depth ? options.depth - iframeDepth - 1 : void 0;
836
+ return ariaSnapshotFrameRef(progress, frame, ref, { ...options, depth: childDepth });
837
+ });
818
838
  const childSnapshots = await Promise.all(childSnapshotPromises);
819
839
  const full = [];
820
840
  let incremental;
821
841
  if (snapshot.incremental !== void 0) {
822
842
  incremental = snapshot.incremental.split("\n");
823
- for (let i = 0; i < snapshot.iframeRefs.length; i++) {
843
+ for (let i = 0; i < renderedIframeRefs.length; i++) {
824
844
  const childSnapshot = childSnapshots[i];
825
845
  if (childSnapshot.incremental)
826
846
  incremental.push(...childSnapshot.incremental);
827
847
  else if (childSnapshot.full.length)
828
- incremental.push("- <changed> iframe [ref=" + snapshot.iframeRefs[i] + "]:", ...childSnapshot.full.map((l) => " " + l));
848
+ incremental.push("- <changed> iframe [ref=" + renderedIframeRefs[i] + "]:", ...childSnapshot.full.map((l) => " " + l));
829
849
  }
830
850
  }
831
851
  for (const line of snapshot.full.split("\n")) {
@@ -836,20 +856,20 @@ async function snapshotFrameForAI(progress, frame, options) {
836
856
  }
837
857
  const leadingSpace = match[1];
838
858
  const ref = match[2];
839
- const childSnapshot = childSnapshots[snapshot.iframeRefs.indexOf(ref)] ?? { full: [] };
859
+ const childSnapshot = childSnapshots[renderedIframeRefs.indexOf(ref)] ?? { full: [] };
840
860
  full.push(childSnapshot.full.length ? line + ":" : line);
841
861
  full.push(...childSnapshot.full.map((l) => leadingSpace + " " + l));
842
862
  }
843
863
  return { full, incremental };
844
864
  }
845
- async function snapshotFrameRefForAI(progress, parentFrame, frameRef, options) {
865
+ async function ariaSnapshotFrameRef(progress, parentFrame, frameRef, options) {
846
866
  const frameSelector = `aria-ref=${frameRef} >> internal:control=enter-frame`;
847
867
  const frameBodySelector = `${frameSelector} >> body`;
848
868
  const child = await progress.race(parentFrame.selectors.resolveFrameForSelector(frameBodySelector, { strict: true }));
849
869
  if (!child)
850
870
  return { full: [] };
851
871
  try {
852
- return await snapshotFrameForAI(progress, child.frame, options);
872
+ return await ariaSnapshotForFrame(progress, child.frame, { ...options, info: void 0 });
853
873
  } catch {
854
874
  return { full: [] };
855
875
  }
@@ -864,5 +884,7 @@ function ensureArrayLimit(array, limit) {
864
884
  InitScript,
865
885
  Page,
866
886
  PageBinding,
867
- Worker
887
+ Worker,
888
+ WorkerEvent,
889
+ ariaSnapshotForFrame
868
890
  });
@@ -34,19 +34,41 @@ class ProgressController {
34
34
  this.metadata = metadata || { id: "", startTime: 0, endTime: 0, type: "Internal", method: "", params: {}, log: [], internal: true };
35
35
  this._onCallLog = onCallLog;
36
36
  this._forceAbortPromise.catch((e) => null);
37
+ this._controller = new AbortController();
38
+ }
39
+ static createForSdkObject(sdkObject, callMetadata) {
40
+ const logName = sdkObject.logName || "api";
41
+ return new ProgressController(callMetadata, (message) => {
42
+ if (logName === "api" && sdkObject.attribution.playwright?.options.isInternalPlaywright)
43
+ return;
44
+ import_utils.debugLogger.log(logName, message);
45
+ sdkObject.instrumentation.onCallLog(sdkObject, callMetadata, logName, message);
46
+ });
47
+ }
48
+ static runInternalTask(task, timeout) {
49
+ const progress = new ProgressController();
50
+ return progress.run(task, timeout);
37
51
  }
38
52
  async abort(error) {
39
53
  if (this._state === "running") {
40
54
  error[kAbortErrorSymbol] = true;
41
55
  this._state = { error };
42
56
  this._forceAbortPromise.reject(error);
57
+ this._controller.abort(error);
43
58
  }
44
59
  await this._donePromise;
45
60
  }
46
61
  async run(task, timeout) {
62
+ const deadline = timeout ? (0, import_utils.monotonicTime)() + timeout : 0;
47
63
  (0, import_utils.assert)(this._state === "before");
48
64
  this._state = "running";
65
+ let timer;
49
66
  const progress = {
67
+ timeout: timeout ?? 0,
68
+ deadline,
69
+ disableTimeout: () => {
70
+ clearTimeout(timer);
71
+ },
50
72
  log: (message) => {
51
73
  if (this._state === "running")
52
74
  this.metadata.log.push(message);
@@ -55,24 +77,28 @@ class ProgressController {
55
77
  metadata: this.metadata,
56
78
  race: (promise) => {
57
79
  const promises = Array.isArray(promise) ? promise : [promise];
80
+ if (!promises.length)
81
+ return Promise.resolve();
58
82
  return Promise.race([...promises, this._forceAbortPromise]);
59
83
  },
60
84
  wait: async (timeout2) => {
61
85
  let timer2;
62
86
  const promise = new Promise((f) => timer2 = setTimeout(f, timeout2));
63
87
  return progress.race(promise).finally(() => clearTimeout(timer2));
64
- }
88
+ },
89
+ signal: this._controller.signal
65
90
  };
66
- let timer;
67
- if (timeout) {
91
+ if (deadline) {
68
92
  const timeoutError = new import_errors.TimeoutError(`Timeout ${timeout}ms exceeded.`);
69
93
  timer = setTimeout(() => {
94
+ if (this.metadata.pauseStartTime && !this.metadata.pauseEndTime)
95
+ return;
70
96
  if (this._state === "running") {
71
- timeoutError[kAbortErrorSymbol] = true;
72
97
  this._state = { error: timeoutError };
73
98
  this._forceAbortPromise.reject(timeoutError);
99
+ this._controller.abort(timeoutError);
74
100
  }
75
- }, timeout);
101
+ }, deadline - (0, import_utils.monotonicTime)());
76
102
  }
77
103
  try {
78
104
  const result = await task(progress);
@@ -89,7 +115,7 @@ class ProgressController {
89
115
  }
90
116
  const kAbortErrorSymbol = Symbol("kAbortError");
91
117
  function isAbortError(error) {
92
- return !!error[kAbortErrorSymbol];
118
+ return error instanceof import_errors.TimeoutError || !!error[kAbortErrorSymbol];
93
119
  }
94
120
  async function raceUncancellableOperationWithCleanup(progress, run, cleanup) {
95
121
  let aborted = false;