@checkly/playwright-core 1.51.17-beta.2 → 1.54.2-beta.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 (376) hide show
  1. package/ThirdPartyNotices.txt +65 -123
  2. package/browsers.json +16 -14
  3. package/index.js +1 -1
  4. package/lib/androidServerImpl.js +47 -50
  5. package/lib/browserServerImpl.js +89 -69
  6. package/lib/checkly/escapeRegExp.js +23 -27
  7. package/lib/checkly/fetch.js +64 -46
  8. package/lib/checkly/secretsFilter.js +49 -35
  9. package/lib/cli/driver.js +71 -69
  10. package/lib/cli/program.js +400 -359
  11. package/lib/cli/programWithTestStub.js +51 -45
  12. package/lib/client/accessibility.js +31 -32
  13. package/lib/client/android.js +151 -242
  14. package/lib/client/api.js +135 -283
  15. package/lib/client/artifact.js +39 -36
  16. package/lib/client/browser.js +96 -71
  17. package/lib/client/browserContext.js +314 -345
  18. package/lib/client/browserType.js +103 -127
  19. package/lib/client/cdpSession.js +29 -31
  20. package/lib/client/channelOwner.js +90 -113
  21. package/lib/client/clientHelper.js +48 -39
  22. package/lib/client/clientInstrumentation.js +40 -37
  23. package/lib/client/clientStackTrace.js +41 -37
  24. package/lib/client/clock.js +36 -36
  25. package/lib/client/connection.js +188 -214
  26. package/lib/client/consoleMessage.js +31 -28
  27. package/lib/client/coverage.js +25 -22
  28. package/lib/client/dialog.js +30 -31
  29. package/lib/client/download.js +25 -25
  30. package/lib/client/electron.js +80 -77
  31. package/lib/client/elementHandle.js +120 -159
  32. package/lib/client/errors.js +53 -53
  33. package/lib/client/eventEmitter.js +124 -121
  34. package/lib/client/events.js +72 -68
  35. package/lib/client/fetch.js +166 -190
  36. package/lib/client/fileChooser.js +25 -24
  37. package/lib/client/fileUtils.js +31 -28
  38. package/lib/client/frame.js +207 -306
  39. package/lib/client/harRouter.js +42 -52
  40. package/lib/client/input.js +42 -69
  41. package/lib/client/jsHandle.js +54 -69
  42. package/lib/client/jsonPipe.js +27 -23
  43. package/lib/client/localUtils.js +29 -29
  44. package/lib/client/locator.js +145 -237
  45. package/lib/client/network.js +282 -307
  46. package/lib/client/page.js +269 -318
  47. package/lib/client/platform.js +46 -43
  48. package/lib/client/playwright.js +51 -76
  49. package/lib/client/selectors.js +45 -63
  50. package/lib/client/stream.js +29 -25
  51. package/lib/client/timeoutSettings.js +55 -41
  52. package/lib/client/tracing.js +49 -96
  53. package/lib/client/types.js +26 -22
  54. package/lib/client/video.js +35 -27
  55. package/lib/client/waiter.js +69 -88
  56. package/lib/client/webError.js +25 -23
  57. package/lib/client/webSocket.js +43 -56
  58. package/lib/client/worker.js +48 -56
  59. package/lib/client/writableStream.js +27 -23
  60. package/lib/generated/bindingsControllerSource.js +28 -0
  61. package/lib/generated/clockSource.js +26 -6
  62. package/lib/generated/consoleApiSource.js +26 -6
  63. package/lib/generated/injectedScriptSource.js +26 -6
  64. package/lib/generated/pollingRecorderSource.js +26 -6
  65. package/lib/generated/storageScriptSource.js +28 -0
  66. package/lib/generated/utilityScriptSource.js +26 -6
  67. package/lib/generated/webSocketMockSource.js +333 -5
  68. package/lib/inProcessFactory.js +51 -53
  69. package/lib/inprocess.js +2 -19
  70. package/lib/outofprocess.js +51 -46
  71. package/lib/protocol/serializers.js +153 -134
  72. package/lib/protocol/validator.js +2807 -2739
  73. package/lib/protocol/validatorPrimitives.js +114 -73
  74. package/lib/remote/playwrightConnection.js +88 -242
  75. package/lib/remote/playwrightServer.js +305 -92
  76. package/lib/server/accessibility.js +44 -37
  77. package/lib/server/android/android.js +251 -241
  78. package/lib/server/android/backendAdb.js +87 -82
  79. package/lib/server/artifact.js +78 -55
  80. package/lib/server/bidi/bidiBrowser.js +297 -158
  81. package/lib/server/bidi/bidiChromium.js +119 -89
  82. package/lib/server/bidi/bidiConnection.js +66 -83
  83. package/lib/server/bidi/bidiExecutionContext.js +129 -113
  84. package/lib/server/bidi/bidiFirefox.js +86 -76
  85. package/lib/server/bidi/bidiInput.js +106 -117
  86. package/lib/server/bidi/bidiNetworkManager.js +142 -159
  87. package/lib/server/bidi/bidiOverCdp.js +57 -58
  88. package/lib/server/bidi/bidiPage.js +260 -260
  89. package/lib/server/bidi/bidiPdf.js +52 -86
  90. package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
  91. package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
  92. package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
  93. package/lib/server/bidi/third_party/bidiProtocol.js +22 -137
  94. package/lib/server/bidi/third_party/bidiProtocolCore.js +152 -0
  95. package/lib/server/bidi/third_party/bidiProtocolPermissions.js +42 -0
  96. package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
  97. package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
  98. package/lib/server/browser.js +93 -95
  99. package/lib/server/browserContext.js +419 -429
  100. package/lib/server/browserType.js +186 -216
  101. package/lib/server/callLog.js +47 -44
  102. package/lib/server/chromium/chromium.js +235 -203
  103. package/lib/server/chromium/chromiumSwitches.js +100 -67
  104. package/lib/server/chromium/crAccessibility.js +157 -131
  105. package/lib/server/chromium/crBrowser.js +310 -292
  106. package/lib/server/chromium/crConnection.js +95 -121
  107. package/lib/server/chromium/crCoverage.js +121 -131
  108. package/lib/server/chromium/crDevTools.js +60 -51
  109. package/lib/server/chromium/crDragDrop.js +68 -84
  110. package/lib/server/chromium/crExecutionContext.js +89 -83
  111. package/lib/server/chromium/crInput.js +118 -113
  112. package/lib/server/chromium/crNetworkManager.js +274 -375
  113. package/lib/server/chromium/crPage.js +536 -593
  114. package/lib/server/chromium/crPdf.js +54 -86
  115. package/lib/server/chromium/crProtocolHelper.js +92 -80
  116. package/lib/server/chromium/crServiceWorker.js +84 -73
  117. package/lib/server/chromium/defaultFontFamilies.js +152 -135
  118. package/lib/server/chromium/protocol.d.js +16 -0
  119. package/lib/server/chromium/videoRecorder.js +66 -99
  120. package/lib/server/clock.js +107 -83
  121. package/lib/server/codegen/csharp.js +192 -162
  122. package/lib/server/codegen/java.js +156 -129
  123. package/lib/server/codegen/javascript.js +163 -148
  124. package/lib/server/codegen/jsonl.js +32 -28
  125. package/lib/server/codegen/language.js +75 -52
  126. package/lib/server/codegen/languages.js +65 -27
  127. package/lib/server/codegen/python.js +141 -126
  128. package/lib/server/codegen/types.js +15 -4
  129. package/lib/server/console.js +28 -32
  130. package/lib/server/cookieStore.js +108 -86
  131. package/lib/server/debugController.js +147 -151
  132. package/lib/server/debugger.js +86 -78
  133. package/lib/server/deviceDescriptors.js +37 -24
  134. package/lib/server/deviceDescriptorsSource.json +238 -128
  135. package/lib/server/dialog.js +84 -39
  136. package/lib/server/dispatchers/androidDispatcher.js +257 -148
  137. package/lib/server/dispatchers/artifactDispatcher.js +79 -79
  138. package/lib/server/dispatchers/browserContextDispatcher.js +289 -259
  139. package/lib/server/dispatchers/browserDispatcher.js +96 -148
  140. package/lib/server/dispatchers/browserTypeDispatcher.js +50 -41
  141. package/lib/server/dispatchers/cdpSessionDispatcher.js +35 -39
  142. package/lib/server/dispatchers/debugControllerDispatcher.js +65 -83
  143. package/lib/server/dispatchers/dialogDispatcher.js +34 -31
  144. package/lib/server/dispatchers/dispatcher.js +208 -248
  145. package/lib/server/dispatchers/electronDispatcher.js +66 -70
  146. package/lib/server/dispatchers/elementHandlerDispatcher.js +164 -216
  147. package/lib/server/dispatchers/frameDispatcher.js +211 -272
  148. package/lib/server/dispatchers/jsHandleDispatcher.js +63 -75
  149. package/lib/server/dispatchers/jsonPipeDispatcher.js +37 -38
  150. package/lib/server/dispatchers/localUtilsDispatcher.js +121 -119
  151. package/lib/server/dispatchers/networkDispatchers.js +117 -128
  152. package/lib/server/dispatchers/pageDispatcher.js +256 -248
  153. package/lib/server/dispatchers/playwrightDispatcher.js +92 -87
  154. package/lib/server/dispatchers/streamDispatcher.js +52 -48
  155. package/lib/server/dispatchers/tracingDispatcher.js +47 -52
  156. package/lib/server/dispatchers/webSocketRouteDispatcher.js +126 -150
  157. package/lib/server/dispatchers/writableStreamDispatcher.js +65 -43
  158. package/lib/server/dom.js +485 -582
  159. package/lib/server/download.js +47 -37
  160. package/lib/server/electron/electron.js +216 -243
  161. package/lib/server/electron/loader.js +9 -37
  162. package/lib/server/errors.js +47 -46
  163. package/lib/server/fetch.js +317 -360
  164. package/lib/server/fileChooser.js +25 -24
  165. package/lib/server/fileUploadUtils.js +66 -60
  166. package/lib/server/firefox/ffAccessibility.js +153 -131
  167. package/lib/server/firefox/ffBrowser.js +268 -305
  168. package/lib/server/firefox/ffConnection.js +63 -84
  169. package/lib/server/firefox/ffExecutionContext.js +92 -73
  170. package/lib/server/firefox/ffInput.js +82 -84
  171. package/lib/server/firefox/ffNetworkManager.js +137 -114
  172. package/lib/server/firefox/ffPage.js +261 -293
  173. package/lib/server/firefox/firefox.js +80 -72
  174. package/lib/server/firefox/protocol.d.js +16 -0
  175. package/lib/server/formData.js +107 -35
  176. package/lib/server/frameSelectors.js +98 -114
  177. package/lib/server/frames.js +845 -1055
  178. package/lib/server/har/harRecorder.js +85 -77
  179. package/lib/server/har/harTracer.js +290 -223
  180. package/lib/server/harBackend.js +80 -80
  181. package/lib/server/helper.js +55 -59
  182. package/lib/server/index.js +59 -99
  183. package/lib/server/input.js +151 -189
  184. package/lib/server/instrumentation.js +57 -44
  185. package/lib/server/javascript.js +133 -134
  186. package/lib/server/launchApp.js +113 -75
  187. package/lib/server/localUtils.js +150 -142
  188. package/lib/server/macEditingCommands.js +141 -137
  189. package/lib/server/network.js +299 -303
  190. package/lib/server/page.js +513 -544
  191. package/lib/server/pipeTransport.js +49 -45
  192. package/lib/server/playwright.js +58 -67
  193. package/lib/server/progress.js +137 -68
  194. package/lib/server/protocolError.js +34 -31
  195. package/lib/server/recorder/chat.js +70 -86
  196. package/lib/server/recorder/recorderApp.js +341 -176
  197. package/lib/server/recorder/recorderInTraceViewer.js +65 -94
  198. package/lib/server/recorder/recorderRunner.js +93 -116
  199. package/lib/server/recorder/recorderSignalProcessor.js +83 -0
  200. package/lib/server/recorder/recorderUtils.js +104 -47
  201. package/lib/server/recorder/throttledFile.js +42 -30
  202. package/lib/server/recorder.js +395 -275
  203. package/lib/server/registry/browserFetcher.js +106 -101
  204. package/lib/server/registry/dependencies.js +245 -196
  205. package/lib/server/registry/index.js +930 -803
  206. package/lib/server/registry/nativeDeps.js +1073 -464
  207. package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
  208. package/lib/server/screenshotter.js +160 -191
  209. package/lib/server/selectors.js +90 -51
  210. package/lib/server/socksClientCertificatesInterceptor.js +171 -186
  211. package/lib/server/socksInterceptor.js +62 -70
  212. package/lib/server/trace/recorder/snapshotter.js +76 -102
  213. package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
  214. package/lib/server/trace/recorder/tracing.js +354 -362
  215. package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
  216. package/lib/server/trace/viewer/traceViewer.js +160 -147
  217. package/lib/server/transport.js +119 -134
  218. package/lib/server/types.js +26 -22
  219. package/lib/server/usKeyboardLayout.js +135 -545
  220. package/lib/server/utils/ascii.js +39 -26
  221. package/lib/server/utils/comparators.js +105 -103
  222. package/lib/server/utils/crypto.js +157 -112
  223. package/lib/server/utils/debug.js +36 -32
  224. package/lib/server/utils/debugLogger.js +77 -48
  225. package/lib/server/utils/env.js +52 -37
  226. package/lib/server/utils/eventsHelper.js +29 -28
  227. package/lib/server/utils/expectUtils.js +31 -26
  228. package/lib/server/utils/fileUtils.js +123 -136
  229. package/lib/server/utils/happyEyeballs.js +141 -126
  230. package/lib/server/utils/hostPlatform.js +84 -120
  231. package/lib/server/utils/httpServer.js +106 -121
  232. package/lib/server/utils/image_tools/colorUtils.js +42 -51
  233. package/lib/server/utils/image_tools/compare.js +44 -43
  234. package/lib/server/utils/image_tools/imageChannel.js +38 -30
  235. package/lib/server/utils/image_tools/stats.js +40 -40
  236. package/lib/server/utils/linuxUtils.js +50 -37
  237. package/lib/server/utils/network.js +152 -96
  238. package/lib/server/utils/nodePlatform.js +87 -79
  239. package/lib/server/utils/pipeTransport.js +44 -42
  240. package/lib/server/utils/processLauncher.js +111 -121
  241. package/lib/server/utils/profiler.js +52 -39
  242. package/lib/server/utils/socksProxy.js +280 -339
  243. package/lib/server/utils/spawnAsync.js +37 -41
  244. package/lib/server/utils/task.js +31 -38
  245. package/lib/server/utils/userAgent.js +73 -66
  246. package/lib/server/utils/wsServer.js +68 -75
  247. package/lib/server/utils/zipFile.js +36 -37
  248. package/lib/server/utils/zones.js +37 -34
  249. package/lib/server/webkit/protocol.d.js +16 -0
  250. package/lib/server/webkit/webkit.js +77 -61
  251. package/lib/server/webkit/wkAccessibility.js +161 -118
  252. package/lib/server/webkit/wkBrowser.js +193 -184
  253. package/lib/server/webkit/wkConnection.js +59 -83
  254. package/lib/server/webkit/wkExecutionContext.js +85 -70
  255. package/lib/server/webkit/wkInput.js +97 -95
  256. package/lib/server/webkit/wkInterceptableRequest.js +102 -95
  257. package/lib/server/webkit/wkPage.js +568 -667
  258. package/lib/server/webkit/wkProvisionalPage.js +45 -56
  259. package/lib/server/webkit/wkWorkers.js +79 -79
  260. package/lib/utils/expectUtils.js +31 -26
  261. package/lib/utils/isomorphic/ariaSnapshot.js +149 -152
  262. package/lib/utils/isomorphic/assert.js +28 -22
  263. package/lib/utils/isomorphic/colors.js +66 -59
  264. package/lib/utils/isomorphic/cssParser.js +120 -125
  265. package/lib/utils/isomorphic/cssTokenizer.js +436 -364
  266. package/lib/utils/isomorphic/headers.js +38 -37
  267. package/lib/utils/isomorphic/locatorGenerators.js +358 -357
  268. package/lib/utils/isomorphic/locatorParser.js +96 -105
  269. package/lib/utils/isomorphic/locatorUtils.js +63 -44
  270. package/lib/utils/isomorphic/manualPromise.js +46 -39
  271. package/lib/utils/isomorphic/mimeType.js +447 -25
  272. package/lib/utils/isomorphic/multimap.js +34 -27
  273. package/lib/utils/isomorphic/protocolFormatter.js +68 -0
  274. package/lib/utils/isomorphic/protocolMetainfo.js +321 -0
  275. package/lib/utils/isomorphic/recorderUtils.js +140 -181
  276. package/lib/utils/isomorphic/rtti.js +35 -33
  277. package/lib/utils/isomorphic/selectorParser.js +182 -193
  278. package/lib/utils/isomorphic/semaphore.js +27 -24
  279. package/lib/utils/isomorphic/stackTrace.js +87 -98
  280. package/lib/utils/isomorphic/stringUtils.js +98 -112
  281. package/lib/utils/isomorphic/time.js +46 -22
  282. package/lib/utils/isomorphic/timeoutRunner.js +53 -53
  283. package/lib/utils/isomorphic/traceUtils.js +37 -41
  284. package/lib/utils/isomorphic/types.js +15 -4
  285. package/lib/utils/isomorphic/urlMatch.js +113 -67
  286. package/lib/utils/isomorphic/utilityScriptSerializers.js +251 -0
  287. package/lib/utils.js +101 -443
  288. package/lib/utilsBundle.js +101 -52
  289. package/lib/utilsBundleImpl/index.js +160 -150
  290. package/lib/zipBundle.js +32 -23
  291. package/lib/zipBundleImpl.js +4 -4
  292. package/package.json +1 -1
  293. package/types/protocol.d.ts +1267 -1057
  294. package/types/types.d.ts +131 -29
  295. package/lib/common/socksProxy.js +0 -569
  296. package/lib/common/timeoutSettings.js +0 -73
  297. package/lib/common/types.js +0 -5
  298. package/lib/image_tools/colorUtils.js +0 -98
  299. package/lib/image_tools/compare.js +0 -108
  300. package/lib/image_tools/imageChannel.js +0 -70
  301. package/lib/image_tools/stats.js +0 -102
  302. package/lib/protocol/debug.js +0 -27
  303. package/lib/protocol/transport.js +0 -82
  304. package/lib/server/dispatchers/selectorsDispatcher.js +0 -36
  305. package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
  306. package/lib/server/recorder/contextRecorder.js +0 -290
  307. package/lib/server/recorder/recorderCollection.js +0 -104
  308. package/lib/server/recorder/recorderFrontend.js +0 -5
  309. package/lib/server/storageScript.js +0 -160
  310. package/lib/server/timeoutSettings.js +0 -74
  311. package/lib/third_party/diff_match_patch.js +0 -2222
  312. package/lib/utils/ascii.js +0 -31
  313. package/lib/utils/comparators.js +0 -171
  314. package/lib/utils/crypto.js +0 -174
  315. package/lib/utils/debug.js +0 -46
  316. package/lib/utils/debugLogger.js +0 -91
  317. package/lib/utils/env.js +0 -49
  318. package/lib/utils/eventsHelper.js +0 -38
  319. package/lib/utils/fileUtils.js +0 -205
  320. package/lib/utils/happy-eyeballs.js +0 -210
  321. package/lib/utils/headers.js +0 -52
  322. package/lib/utils/hostPlatform.js +0 -133
  323. package/lib/utils/httpServer.js +0 -237
  324. package/lib/utils/index.js +0 -368
  325. package/lib/utils/linuxUtils.js +0 -78
  326. package/lib/utils/manualPromise.js +0 -109
  327. package/lib/utils/multimap.js +0 -75
  328. package/lib/utils/network.js +0 -160
  329. package/lib/utils/processLauncher.js +0 -248
  330. package/lib/utils/profiler.js +0 -53
  331. package/lib/utils/rtti.js +0 -44
  332. package/lib/utils/semaphore.js +0 -51
  333. package/lib/utils/spawnAsync.js +0 -45
  334. package/lib/utils/stackTrace.js +0 -121
  335. package/lib/utils/task.js +0 -58
  336. package/lib/utils/time.js +0 -37
  337. package/lib/utils/timeoutRunner.js +0 -66
  338. package/lib/utils/traceUtils.js +0 -44
  339. package/lib/utils/userAgent.js +0 -105
  340. package/lib/utils/wsServer.js +0 -127
  341. package/lib/utils/zipFile.js +0 -75
  342. package/lib/utils/zones.js +0 -62
  343. package/lib/vite/htmlReport/index.html +0 -69
  344. package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +0 -24
  345. package/lib/vite/recorder/assets/codeMirrorModule-C3UTv-Ge.css +0 -1
  346. package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  347. package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
  348. package/lib/vite/recorder/assets/index-eHBmevrY.css +0 -1
  349. package/lib/vite/recorder/index.html +0 -29
  350. package/lib/vite/recorder/playwright-logo.svg +0 -9
  351. package/lib/vite/traceViewer/assets/codeMirrorModule-gU1OOCQO.js +0 -24
  352. package/lib/vite/traceViewer/assets/defaultSettingsView-B5n_FjMx.js +0 -1
  353. package/lib/vite/traceViewer/assets/inspectorTab-6Tru8Mn_.js +0 -235
  354. package/lib/vite/traceViewer/assets/workbench-B_Nj4NA2.js +0 -25
  355. package/lib/vite/traceViewer/assets/xtermModule-BoAIEibi.js +0 -9
  356. package/lib/vite/traceViewer/codeMirrorModule.C3UTv-Ge.css +0 -1
  357. package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  358. package/lib/vite/traceViewer/defaultSettingsView.CO3FR0CX.css +0 -1
  359. package/lib/vite/traceViewer/embedded.DpNPH6mk.js +0 -2
  360. package/lib/vite/traceViewer/embedded.html +0 -18
  361. package/lib/vite/traceViewer/embedded.mLhjB5IF.css +0 -1
  362. package/lib/vite/traceViewer/index.CFOW-Ezb.css +0 -1
  363. package/lib/vite/traceViewer/index.CuE3SYGw.js +0 -2
  364. package/lib/vite/traceViewer/index.html +0 -47
  365. package/lib/vite/traceViewer/inspectorTab.CXDulcFG.css +0 -1
  366. package/lib/vite/traceViewer/playwright-logo.svg +0 -9
  367. package/lib/vite/traceViewer/recorder.BD-uZJs7.js +0 -2
  368. package/lib/vite/traceViewer/recorder.html +0 -17
  369. package/lib/vite/traceViewer/recorder.tn0RQdqM.css +0 -0
  370. package/lib/vite/traceViewer/snapshot.html +0 -21
  371. package/lib/vite/traceViewer/sw.bundle.js +0 -3
  372. package/lib/vite/traceViewer/uiMode.BatfzHMG.css +0 -1
  373. package/lib/vite/traceViewer/uiMode.DHrNgddz.js +0 -5
  374. package/lib/vite/traceViewer/uiMode.html +0 -21
  375. package/lib/vite/traceViewer/workbench.B9vIAzH9.css +0 -1
  376. package/lib/vite/traceViewer/xtermModule.Beg8tuEN.css +0 -32
package/lib/server/dom.js CHANGED
@@ -1,121 +1,118 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var dom_exports = {};
30
+ __export(dom_exports, {
31
+ ElementHandle: () => ElementHandle,
32
+ FrameExecutionContext: () => FrameExecutionContext,
33
+ NonRecoverableDOMError: () => NonRecoverableDOMError,
34
+ assertDone: () => assertDone,
35
+ isNonRecoverableDOMError: () => isNonRecoverableDOMError,
36
+ kUnableToAdoptErrorMessage: () => kUnableToAdoptErrorMessage,
37
+ throwElementIsNotAttached: () => throwElementIsNotAttached,
38
+ throwRetargetableDOMError: () => throwRetargetableDOMError
5
39
  });
6
- exports.NonRecoverableDOMError = exports.FrameExecutionContext = exports.ElementHandle = void 0;
7
- exports.assertDone = assertDone;
8
- exports.isNonRecoverableDOMError = isNonRecoverableDOMError;
9
- exports.kUnableToAdoptErrorMessage = void 0;
10
- exports.throwElementIsNotAttached = throwElementIsNotAttached;
11
- exports.throwRetargetableDOMError = throwRetargetableDOMError;
12
- var _fs = _interopRequireDefault(require("fs"));
13
- var js = _interopRequireWildcard(require("./javascript"));
14
- var _progress = require("./progress");
15
- var _utils = require("../utils");
16
- var _fileUploadUtils = require("./fileUploadUtils");
17
- var _protocolError = require("./protocolError");
18
- var injectedScriptSource = _interopRequireWildcard(require("../generated/injectedScriptSource"));
19
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
20
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
21
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
- /**
23
- * Copyright (c) Microsoft Corporation.
24
- *
25
- * Licensed under the Apache License, Version 2.0 (the "License");
26
- * you may not use this file except in compliance with the License.
27
- * You may obtain a copy of the License at
28
- *
29
- * http://www.apache.org/licenses/LICENSE-2.0
30
- *
31
- * Unless required by applicable law or agreed to in writing, software
32
- * distributed under the License is distributed on an "AS IS" BASIS,
33
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
34
- * See the License for the specific language governing permissions and
35
- * limitations under the License.
36
- */
37
-
38
- class NonRecoverableDOMError extends Error {}
39
- exports.NonRecoverableDOMError = NonRecoverableDOMError;
40
+ module.exports = __toCommonJS(dom_exports);
41
+ var import_fs = __toESM(require("fs"));
42
+ var js = __toESM(require("./javascript"));
43
+ var import_utils = require("../utils");
44
+ var import_fileUploadUtils = require("./fileUploadUtils");
45
+ var rawInjectedScriptSource = __toESM(require("../generated/injectedScriptSource"));
46
+ class NonRecoverableDOMError extends Error {
47
+ }
40
48
  function isNonRecoverableDOMError(error) {
41
49
  return error instanceof NonRecoverableDOMError;
42
50
  }
43
51
  class FrameExecutionContext extends js.ExecutionContext {
44
52
  constructor(delegate, frame, world) {
45
- super(frame, delegate, world || 'content-script');
46
- this.frame = void 0;
47
- this._injectedScriptPromise = void 0;
48
- this.world = void 0;
53
+ super(frame, delegate, world || "content-script");
49
54
  this.frame = frame;
50
55
  this.world = world;
51
56
  }
52
57
  adoptIfNeeded(handle) {
53
- if (handle instanceof ElementHandle && handle._context !== this) return this.frame._page._delegate.adoptElementHandle(handle, this);
58
+ if (handle instanceof ElementHandle && handle._context !== this)
59
+ return this.frame._page.delegate.adoptElementHandle(handle, this);
54
60
  return null;
55
61
  }
56
62
  async evaluate(pageFunction, arg) {
57
- return js.evaluate(this, true /* returnByValue */, pageFunction, arg);
63
+ return js.evaluate(this, true, pageFunction, arg);
58
64
  }
59
65
  async evaluateHandle(pageFunction, arg) {
60
- return js.evaluate(this, false /* returnByValue */, pageFunction, arg);
66
+ return js.evaluate(this, false, pageFunction, arg);
61
67
  }
62
68
  async evaluateExpression(expression, options, arg) {
63
- return js.evaluateExpression(this, expression, {
64
- ...options,
65
- returnByValue: true
66
- }, arg);
69
+ return js.evaluateExpression(this, expression, { ...options, returnByValue: true }, arg);
67
70
  }
68
71
  async evaluateExpressionHandle(expression, options, arg) {
69
- return js.evaluateExpression(this, expression, {
70
- ...options,
71
- returnByValue: false
72
- }, arg);
72
+ return js.evaluateExpression(this, expression, { ...options, returnByValue: false }, arg);
73
73
  }
74
74
  injectedScript() {
75
75
  if (!this._injectedScriptPromise) {
76
- const custom = [];
77
- const selectorsRegistry = this.frame._page.context().selectors();
78
- for (const [name, {
79
- source
80
- }] of selectorsRegistry._engines) custom.push(`{ name: '${name}', engine: (${source}) }`);
81
- const sdkLanguage = this.frame.attribution.playwright.options.sdkLanguage;
76
+ const customEngines = [];
77
+ const selectorsRegistry = this.frame._page.browserContext.selectors();
78
+ for (const [name, { source: source2 }] of selectorsRegistry._engines)
79
+ customEngines.push({ name, source: `(${source2})` });
80
+ const sdkLanguage = this.frame._page.browserContext._browser.sdkLanguage();
81
+ const options = {
82
+ isUnderTest: (0, import_utils.isUnderTest)(),
83
+ sdkLanguage,
84
+ testIdAttributeName: selectorsRegistry.testIdAttributeName(),
85
+ stableRafCount: this.frame._page.delegate.rafCountForStablePosition(),
86
+ browserName: this.frame._page.browserContext._browser.options.name,
87
+ customEngines
88
+ };
82
89
  const source = `
83
90
  (() => {
84
91
  const module = {};
85
- ${injectedScriptSource.source}
86
- return new (module.exports.InjectedScript())(
87
- globalThis,
88
- ${(0, _utils.isUnderTest)()},
89
- "${sdkLanguage}",
90
- ${JSON.stringify(selectorsRegistry.testIdAttributeName())},
91
- ${this.frame._page._delegate.rafCountForStablePosition()},
92
- "${this.frame._page._browserContext._browser.options.name}",
93
- [${custom.join(',\n')}]
94
- );
92
+ ${rawInjectedScriptSource.source}
93
+ return new (module.exports.InjectedScript())(globalThis, ${JSON.stringify(options)});
95
94
  })();
96
95
  `;
97
- this._injectedScriptPromise = this.rawEvaluateHandle(source).then(handle => {
98
- handle._setPreview('InjectedScript');
96
+ this._injectedScriptPromise = this.rawEvaluateHandle(source).then((handle) => {
97
+ handle._setPreview("InjectedScript");
99
98
  return handle;
100
99
  });
101
100
  }
102
101
  return this._injectedScriptPromise;
103
102
  }
104
103
  }
105
- exports.FrameExecutionContext = FrameExecutionContext;
106
104
  class ElementHandle extends js.JSHandle {
107
105
  constructor(context, objectId) {
108
- super(context, 'node', undefined, objectId);
106
+ super(context, "node", void 0, objectId);
109
107
  this.__elementhandle = true;
110
- this._page = void 0;
111
- this._frame = void 0;
112
108
  this._page = context.frame._page;
113
109
  this._frame = context.frame;
114
- this._initializePreview().catch(e => {});
110
+ this._initializePreview().catch((e) => {
111
+ });
115
112
  }
116
113
  async _initializePreview() {
117
114
  const utility = await this._context.injectedScript();
118
- this._setPreview(await utility.evaluate((injected, e) => 'JSHandle@' + injected.previewNode(e), this));
115
+ this._setPreview(await utility.evaluate((injected, e) => "JSHandle@" + injected.previewNode(e), this));
119
116
  }
120
117
  asElement() {
121
118
  return this;
@@ -125,8 +122,9 @@ class ElementHandle extends js.JSHandle {
125
122
  const utility = await this._frame._utilityContext();
126
123
  return await utility.evaluate(pageFunction, [await utility.injectedScript(), this, arg]);
127
124
  } catch (e) {
128
- if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError.isSessionClosedError)(e)) throw e;
129
- return 'error:notconnected';
125
+ if (this._frame.isNonRetriableError(e))
126
+ throw e;
127
+ return "error:notconnected";
130
128
  }
131
129
  }
132
130
  async evaluateHandleInUtility(pageFunction, arg) {
@@ -134,86 +132,82 @@ class ElementHandle extends js.JSHandle {
134
132
  const utility = await this._frame._utilityContext();
135
133
  return await utility.evaluateHandle(pageFunction, [await utility.injectedScript(), this, arg]);
136
134
  } catch (e) {
137
- if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError.isSessionClosedError)(e)) throw e;
138
- return 'error:notconnected';
135
+ if (this._frame.isNonRetriableError(e))
136
+ throw e;
137
+ return "error:notconnected";
139
138
  }
140
139
  }
141
140
  async ownerFrame() {
142
- const frameId = await this._page._delegate.getOwnerFrame(this);
143
- if (!frameId) return null;
144
- const frame = this._page._frameManager.frame(frameId);
145
- if (frame) return frame;
146
- for (const page of this._page._browserContext.pages()) {
147
- const frame = page._frameManager.frame(frameId);
148
- if (frame) return frame;
141
+ const frameId = await this._page.delegate.getOwnerFrame(this);
142
+ if (!frameId)
143
+ return null;
144
+ const frame = this._page.frameManager.frame(frameId);
145
+ if (frame)
146
+ return frame;
147
+ for (const page of this._page.browserContext.pages()) {
148
+ const frame2 = page.frameManager.frame(frameId);
149
+ if (frame2)
150
+ return frame2;
149
151
  }
150
152
  return null;
151
153
  }
152
154
  async isIframeElement() {
153
- return this.evaluateInUtility(([injected, node]) => node && (node.nodeName === 'IFRAME' || node.nodeName === 'FRAME'), {});
155
+ return this.evaluateInUtility(([injected, node]) => node && (node.nodeName === "IFRAME" || node.nodeName === "FRAME"), {});
154
156
  }
155
157
  async contentFrame() {
156
158
  const isFrameElement = throwRetargetableDOMError(await this.isIframeElement());
157
- if (!isFrameElement) return null;
158
- return this._page._delegate.getContentFrame(this);
159
+ if (!isFrameElement)
160
+ return null;
161
+ return this._page.delegate.getContentFrame(this);
159
162
  }
160
- async generateLocatorString() {
161
- const selector = await this.evaluateInUtility(async ([injected, node]) => {
162
- return injected.generateSelectorSimple(node);
163
- }, {});
164
- if (selector === 'error:notconnected') return;
165
- return (0, _utils.asLocator)('javascript', selector);
166
- }
167
- async getAttribute(metadata, name) {
168
- return this._frame.getAttribute(metadata, ':scope', name, {}, this);
163
+ async getAttribute(progress, name) {
164
+ return this._frame.getAttribute(progress, ":scope", name, {}, this);
169
165
  }
170
- async inputValue(metadata) {
171
- return this._frame.inputValue(metadata, ':scope', {}, this);
166
+ async inputValue(progress) {
167
+ return this._frame.inputValue(progress, ":scope", {}, this);
172
168
  }
173
- async textContent(metadata) {
174
- return this._frame.textContent(metadata, ':scope', {}, this);
169
+ async textContent(progress) {
170
+ return this._frame.textContent(progress, ":scope", {}, this);
175
171
  }
176
- async innerText(metadata) {
177
- return this._frame.innerText(metadata, ':scope', {}, this);
172
+ async innerText(progress) {
173
+ return this._frame.innerText(progress, ":scope", {}, this);
178
174
  }
179
- async innerHTML(metadata) {
180
- return this._frame.innerHTML(metadata, ':scope', {}, this);
175
+ async innerHTML(progress) {
176
+ return this._frame.innerHTML(progress, ":scope", {}, this);
181
177
  }
182
- async dispatchEvent(metadata, type, eventInit = {}) {
183
- return this._frame.dispatchEvent(metadata, ':scope', type, eventInit, {}, this);
178
+ async dispatchEvent(progress, type, eventInit = {}) {
179
+ return this._frame.dispatchEvent(progress, ":scope", type, eventInit, {}, this);
184
180
  }
185
- async _scrollRectIntoViewIfNeeded(rect) {
186
- return await this._page._delegate.scrollRectIntoViewIfNeeded(this, rect);
181
+ async _scrollRectIntoViewIfNeeded(progress, rect) {
182
+ return await progress.race(this._page.delegate.scrollRectIntoViewIfNeeded(this, rect));
187
183
  }
188
184
  async _waitAndScrollIntoViewIfNeeded(progress, waitForVisible) {
189
- const result = await this._retryAction(progress, 'scroll into view', async () => {
185
+ const result = await this._retryAction(progress, "scroll into view", async () => {
190
186
  progress.log(` waiting for element to be stable`);
191
- const waitResult = await this.evaluateInUtility(async ([injected, node, {
192
- waitForVisible
193
- }]) => {
194
- return await injected.checkElementStates(node, waitForVisible ? ['visible', 'stable'] : ['stable']);
195
- }, {
196
- waitForVisible
197
- });
198
- if (waitResult) return waitResult;
199
- return await this._scrollRectIntoViewIfNeeded();
187
+ const waitResult = await progress.race(this.evaluateInUtility(async ([injected, node, { waitForVisible: waitForVisible2 }]) => {
188
+ return await injected.checkElementStates(node, waitForVisible2 ? ["visible", "stable"] : ["stable"]);
189
+ }, { waitForVisible }));
190
+ if (waitResult)
191
+ return waitResult;
192
+ return await this._scrollRectIntoViewIfNeeded(progress);
200
193
  }, {});
201
194
  assertDone(throwRetargetableDOMError(result));
202
195
  }
203
- async scrollIntoViewIfNeeded(metadata, options = {}) {
204
- const controller = new _progress.ProgressController(metadata, this);
205
- return controller.run(progress => this._waitAndScrollIntoViewIfNeeded(progress, false /* waitForVisible */), this._page._timeoutSettings.timeout(options));
196
+ async scrollIntoViewIfNeeded(progress) {
197
+ await this._waitAndScrollIntoViewIfNeeded(
198
+ progress,
199
+ false
200
+ /* waitForVisible */
201
+ );
206
202
  }
207
203
  async _clickablePoint() {
208
- const intersectQuadWithViewport = quad => {
209
- return quad.map(point => ({
204
+ const intersectQuadWithViewport = (quad) => {
205
+ return quad.map((point) => ({
210
206
  x: Math.min(Math.max(point.x, 0), metrics.width),
211
207
  y: Math.min(Math.max(point.y, 0), metrics.height)
212
208
  }));
213
209
  };
214
- const computeQuadArea = quad => {
215
- // Compute sum of all directed areas of adjacent triangles
216
- // https://en.wikipedia.org/wiki/Polygon#Simple_polygons
210
+ const computeQuadArea = (quad) => {
217
211
  let area = 0;
218
212
  for (let i = 0; i < quad.length; ++i) {
219
213
  const p1 = quad[i];
@@ -222,37 +216,36 @@ class ElementHandle extends js.JSHandle {
222
216
  }
223
217
  return Math.abs(area);
224
218
  };
225
- const [quads, metrics] = await Promise.all([this._page._delegate.getContentQuads(this), this._page.mainFrame()._utilityContext().then(utility => utility.evaluate(() => ({
226
- width: innerWidth,
227
- height: innerHeight
228
- })))]);
229
- if (quads === 'error:notconnected') return quads;
230
- if (!quads || !quads.length) return 'error:notvisible';
231
-
232
- // Allow 1x1 elements. Compensate for rounding errors by comparing with 0.99 instead.
233
- const filtered = quads.map(quad => intersectQuadWithViewport(quad)).filter(quad => computeQuadArea(quad) > 0.99);
234
- if (!filtered.length) return 'error:notinviewport';
235
- if (this._page._browserContext._browser.options.name === 'firefox') {
236
- // Firefox internally uses integer coordinates, so 8.x is converted to 8 or 9 when clicking.
237
- //
238
- // This does not work nicely for small elements. For example, 1x1 square with corners
239
- // (8;8) and (9;9) is targeted when clicking at (8;8) but not when clicking at (9;9).
240
- // So, clicking at (8.x;8.y) will sometimes click at (9;9) and miss the target.
241
- //
242
- // Therefore, we try to find an integer point within a quad to make sure we click inside the element.
219
+ const [quads, metrics] = await Promise.all([
220
+ this._page.delegate.getContentQuads(this),
221
+ this._page.mainFrame()._utilityContext().then((utility) => utility.evaluate(() => ({ width: innerWidth, height: innerHeight })))
222
+ ]);
223
+ if (quads === "error:notconnected")
224
+ return quads;
225
+ if (!quads || !quads.length)
226
+ return "error:notvisible";
227
+ const filtered = quads.map((quad) => intersectQuadWithViewport(quad)).filter((quad) => computeQuadArea(quad) > 0.99);
228
+ if (!filtered.length)
229
+ return "error:notinviewport";
230
+ if (this._page.browserContext._browser.options.name === "firefox") {
243
231
  for (const quad of filtered) {
244
232
  const integerPoint = findIntegerPointInsideQuad(quad);
245
- if (integerPoint) return integerPoint;
233
+ if (integerPoint)
234
+ return integerPoint;
246
235
  }
247
236
  }
248
- // Return the middle point of the first quad.
249
237
  return quadMiddlePoint(filtered[0]);
250
238
  }
251
239
  async _offsetPoint(offset) {
252
- const [box, border] = await Promise.all([this.boundingBox(), this.evaluateInUtility(([injected, node]) => injected.getElementBorderWidth(node), {}).catch(e => {})]);
253
- if (!box || !border) return 'error:notvisible';
254
- if (border === 'error:notconnected') return border;
255
- // Make point relative to the padding box to align with offsetX/offsetY.
240
+ const [box, border] = await Promise.all([
241
+ this.boundingBox(),
242
+ this.evaluateInUtility(([injected, node]) => injected.getElementBorderWidth(node), {}).catch((e) => {
243
+ })
244
+ ]);
245
+ if (!box || !border)
246
+ return "error:notvisible";
247
+ if (border === "error:notconnected")
248
+ return border;
256
249
  return {
257
250
  x: box.x + border.left + offset.x,
258
251
  y: box.y + border.top + offset.y
@@ -260,487 +253,411 @@ class ElementHandle extends js.JSHandle {
260
253
  }
261
254
  async _retryAction(progress, actionName, action, options) {
262
255
  let retry = 0;
263
- // We progressively wait longer between retries, up to 500ms.
264
256
  const waitTime = [0, 20, 100, 100, 500];
265
- while (progress.isRunning()) {
257
+ while (true) {
266
258
  if (retry) {
267
- progress.log(`retrying ${actionName} action${options.trial ? ' (trial run)' : ''}`);
259
+ progress.log(`retrying ${actionName} action${options.trial ? " (trial run)" : ""}`);
268
260
  const timeout = waitTime[Math.min(retry - 1, waitTime.length - 1)];
269
261
  if (timeout) {
270
262
  progress.log(` waiting ${timeout}ms`);
271
- const result = await this.evaluateInUtility(([injected, node, timeout]) => new Promise(f => setTimeout(f, timeout)), timeout);
272
- if (result === 'error:notconnected') return result;
263
+ const result2 = await progress.race(this.evaluateInUtility(([injected, node, timeout2]) => new Promise((f) => setTimeout(f, timeout2)), timeout));
264
+ if (result2 === "error:notconnected")
265
+ return result2;
273
266
  }
274
267
  } else {
275
- progress.log(`attempting ${actionName} action${options.trial ? ' (trial run)' : ''}`);
268
+ progress.log(`attempting ${actionName} action${options.trial ? " (trial run)" : ""}`);
276
269
  }
277
- if (!options.skipActionPreChecks && !options.force) await this._frame._page.performActionPreChecks(progress);
270
+ if (!options.skipActionPreChecks && !options.force)
271
+ await this._frame._page.performActionPreChecks(progress);
278
272
  const result = await action(retry);
279
273
  ++retry;
280
- if (result === 'error:notvisible') {
281
- if (options.force) throw new NonRecoverableDOMError('Element is not visible');
282
- progress.log(' element is not visible');
274
+ if (result === "error:notvisible") {
275
+ if (options.force)
276
+ throw new NonRecoverableDOMError("Element is not visible");
277
+ progress.log(" element is not visible");
283
278
  continue;
284
279
  }
285
- if (result === 'error:notinviewport') {
286
- if (options.force) throw new NonRecoverableDOMError('Element is outside of the viewport');
287
- progress.log(' element is outside of the viewport');
280
+ if (result === "error:notinviewport") {
281
+ if (options.force)
282
+ throw new NonRecoverableDOMError("Element is outside of the viewport");
283
+ progress.log(" element is outside of the viewport");
288
284
  continue;
289
285
  }
290
- if (result === 'error:optionsnotfound') {
291
- progress.log(' did not find some options');
286
+ if (result === "error:optionsnotfound") {
287
+ progress.log(" did not find some options");
292
288
  continue;
293
289
  }
294
- if (typeof result === 'object' && 'hitTargetDescription' in result) {
290
+ if (result === "error:optionnotenabled") {
291
+ progress.log(" option being selected is not enabled");
292
+ continue;
293
+ }
294
+ if (typeof result === "object" && "hitTargetDescription" in result) {
295
295
  progress.log(` ${result.hitTargetDescription} intercepts pointer events`);
296
296
  continue;
297
297
  }
298
- if (typeof result === 'object' && 'missingState' in result) {
298
+ if (typeof result === "object" && "missingState" in result) {
299
299
  progress.log(` element is not ${result.missingState}`);
300
300
  continue;
301
301
  }
302
302
  return result;
303
303
  }
304
- return 'done';
305
304
  }
306
305
  async _retryPointerAction(progress, actionName, waitForEnabled, action, options) {
307
- // Note: do not perform locator handlers checkpoint to avoid moving the mouse in the middle of a drag operation.
308
- const skipActionPreChecks = actionName === 'move and up';
309
- return await this._retryAction(progress, actionName, async retry => {
310
- // By default, we scroll with protocol method to reveal the action point.
311
- // However, that might not work to scroll from under position:sticky elements
312
- // that overlay the target element. To fight this, we cycle through different
313
- // scroll alignments. This works in most scenarios.
314
- const scrollOptions = [undefined, {
315
- block: 'end',
316
- inline: 'end'
317
- }, {
318
- block: 'center',
319
- inline: 'center'
320
- }, {
321
- block: 'start',
322
- inline: 'start'
323
- }];
306
+ const skipActionPreChecks = actionName === "move and up";
307
+ return await this._retryAction(progress, actionName, async (retry) => {
308
+ const scrollOptions = [
309
+ void 0,
310
+ { block: "end", inline: "end" },
311
+ { block: "center", inline: "center" },
312
+ { block: "start", inline: "start" }
313
+ ];
324
314
  const forceScrollOptions = scrollOptions[retry % scrollOptions.length];
325
315
  return await this._performPointerAction(progress, actionName, waitForEnabled, action, forceScrollOptions, options);
326
- }, {
327
- ...options,
328
- skipActionPreChecks
329
- });
316
+ }, { ...options, skipActionPreChecks });
330
317
  }
331
318
  async _performPointerAction(progress, actionName, waitForEnabled, action, forceScrollOptions, options) {
332
- const {
333
- force = false,
334
- position
335
- } = options;
319
+ const { force = false, position } = options;
336
320
  const doScrollIntoView = async () => {
337
321
  if (forceScrollOptions) {
338
- return await this.evaluateInUtility(([injected, node, options]) => {
339
- if (node.nodeType === 1 /* Node.ELEMENT_NODE */) node.scrollIntoView(options);
340
- return 'done';
322
+ return await this.evaluateInUtility(([injected, node, options2]) => {
323
+ if (node.nodeType === 1)
324
+ node.scrollIntoView(options2);
325
+ return "done";
341
326
  }, forceScrollOptions);
342
327
  }
343
- return await this._scrollRectIntoViewIfNeeded(position ? {
344
- x: position.x,
345
- y: position.y,
346
- width: 0,
347
- height: 0
348
- } : undefined);
328
+ return await this._scrollRectIntoViewIfNeeded(progress, position ? { x: position.x, y: position.y, width: 0, height: 0 } : void 0);
349
329
  };
350
330
  if (this._frame.parentFrame()) {
351
- // Best-effort scroll to make sure any iframes containing this element are scrolled
352
- // into view and visible, so they are not throttled.
353
- // See https://github.com/microsoft/playwright/issues/27196 for an example.
354
- progress.throwIfAborted(); // Avoid action that has side-effects.
355
- await doScrollIntoView().catch(() => {});
331
+ await progress.race(doScrollIntoView().catch(() => {
332
+ }));
356
333
  }
357
- if (options.__testHookBeforeStable) await options.__testHookBeforeStable();
334
+ if (options.__testHookBeforeStable)
335
+ await progress.race(options.__testHookBeforeStable());
358
336
  if (!force) {
359
- const elementStates = waitForEnabled ? ['visible', 'enabled', 'stable'] : ['visible', 'stable'];
360
- progress.log(` waiting for element to be ${waitForEnabled ? 'visible, enabled and stable' : 'visible and stable'}`);
361
- const result = await this.evaluateInUtility(async ([injected, node, {
362
- elementStates
363
- }]) => {
364
- return await injected.checkElementStates(node, elementStates);
365
- }, {
366
- elementStates
367
- });
368
- if (result) return result;
369
- progress.log(` element is ${waitForEnabled ? 'visible, enabled and stable' : 'visible and stable'}`);
337
+ const elementStates = waitForEnabled ? ["visible", "enabled", "stable"] : ["visible", "stable"];
338
+ progress.log(` waiting for element to be ${waitForEnabled ? "visible, enabled and stable" : "visible and stable"}`);
339
+ const result = await progress.race(this.evaluateInUtility(async ([injected, node, { elementStates: elementStates2 }]) => {
340
+ return await injected.checkElementStates(node, elementStates2);
341
+ }, { elementStates }));
342
+ if (result)
343
+ return result;
344
+ progress.log(` element is ${waitForEnabled ? "visible, enabled and stable" : "visible and stable"}`);
370
345
  }
371
- if (options.__testHookAfterStable) await options.__testHookAfterStable();
372
- progress.log(' scrolling into view if needed');
373
- progress.throwIfAborted(); // Avoid action that has side-effects.
374
- const scrolled = await doScrollIntoView();
375
- if (scrolled !== 'done') return scrolled;
376
- progress.log(' done scrolling');
377
- const maybePoint = position ? await this._offsetPoint(position) : await this._clickablePoint();
378
- if (typeof maybePoint === 'string') return maybePoint;
346
+ if (options.__testHookAfterStable)
347
+ await progress.race(options.__testHookAfterStable());
348
+ progress.log(" scrolling into view if needed");
349
+ const scrolled = await progress.race(doScrollIntoView());
350
+ if (scrolled !== "done")
351
+ return scrolled;
352
+ progress.log(" done scrolling");
353
+ const maybePoint = position ? await progress.race(this._offsetPoint(position)) : await progress.race(this._clickablePoint());
354
+ if (typeof maybePoint === "string")
355
+ return maybePoint;
379
356
  const point = roundPoint(maybePoint);
380
357
  progress.metadata.point = point;
381
- await this.instrumentation.onBeforeInputAction(this, progress.metadata);
358
+ await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
382
359
  let hitTargetInterceptionHandle;
383
360
  if (force) {
384
361
  progress.log(` forcing action`);
385
362
  } else {
386
- if (options.__testHookBeforeHitTarget) await options.__testHookBeforeHitTarget();
387
- const frameCheckResult = await this._checkFrameIsHitTarget(point);
388
- if (frameCheckResult === 'error:notconnected' || 'hitTargetDescription' in frameCheckResult) return frameCheckResult;
363
+ if (options.__testHookBeforeHitTarget)
364
+ await progress.race(options.__testHookBeforeHitTarget());
365
+ const frameCheckResult = await progress.race(this._checkFrameIsHitTarget(point));
366
+ if (frameCheckResult === "error:notconnected" || "hitTargetDescription" in frameCheckResult)
367
+ return frameCheckResult;
389
368
  const hitPoint = frameCheckResult.framePoint;
390
- const actionType = actionName === 'move and up' ? 'drag' : actionName === 'hover' || actionName === 'tap' ? actionName : 'mouse';
391
- const handle = await this.evaluateHandleInUtility(([injected, node, {
392
- actionType,
393
- hitPoint,
394
- trial
395
- }]) => injected.setupHitTargetInterceptor(node, actionType, hitPoint, trial), {
396
- actionType,
397
- hitPoint,
398
- trial: !!options.trial
399
- });
400
- if (handle === 'error:notconnected') return handle;
369
+ const actionType = actionName === "move and up" ? "drag" : actionName === "hover" || actionName === "tap" ? actionName : "mouse";
370
+ const handle = await progress.race(this.evaluateHandleInUtility(([injected, node, { actionType: actionType2, hitPoint: hitPoint2, trial }]) => injected.setupHitTargetInterceptor(node, actionType2, hitPoint2, trial), { actionType, hitPoint, trial: !!options.trial }));
371
+ if (handle === "error:notconnected")
372
+ return handle;
401
373
  if (!handle._objectId) {
402
374
  const error = handle.rawValue();
403
- if (error === 'error:notconnected') return error;
404
- return {
405
- hitTargetDescription: error
406
- };
375
+ if (error === "error:notconnected")
376
+ return error;
377
+ return { hitTargetDescription: error };
407
378
  }
408
379
  hitTargetInterceptionHandle = handle;
409
380
  progress.cleanupWhenAborted(() => {
410
- // Do not await here, just in case the renderer is stuck (e.g. on alert)
411
- // and we won't be able to cleanup.
412
- hitTargetInterceptionHandle.evaluate(h => h.stop()).catch(e => {});
381
+ hitTargetInterceptionHandle.evaluate((h) => h.stop()).catch((e) => {
382
+ });
413
383
  hitTargetInterceptionHandle.dispose();
414
384
  });
415
385
  }
416
- const actionResult = await this._page._frameManager.waitForSignalsCreatedBy(progress, options.waitAfter === true, async () => {
417
- if (options.__testHookBeforePointerAction) await options.__testHookBeforePointerAction();
418
- progress.throwIfAborted(); // Avoid action that has side-effects.
386
+ const actionResult = await this._page.frameManager.waitForSignalsCreatedBy(progress, options.waitAfter === true, async () => {
387
+ if (options.__testHookBeforePointerAction)
388
+ await progress.race(options.__testHookBeforePointerAction());
419
389
  let restoreModifiers;
420
- if (options && options.modifiers) restoreModifiers = await this._page.keyboard.ensureModifiers(options.modifiers);
390
+ if (options && options.modifiers)
391
+ restoreModifiers = await this._page.keyboard.ensureModifiers(progress, options.modifiers);
421
392
  progress.log(` performing ${actionName} action`);
422
393
  await action(point);
423
- if (restoreModifiers) await this._page.keyboard.ensureModifiers(restoreModifiers);
394
+ if (restoreModifiers)
395
+ await this._page.keyboard.ensureModifiers(progress, restoreModifiers);
424
396
  if (hitTargetInterceptionHandle) {
425
397
  const stopHitTargetInterception = this._frame.raceAgainstEvaluationStallingEvents(() => {
426
- return hitTargetInterceptionHandle.evaluate(h => h.stop());
427
- }).catch(e => 'done').finally(() => {
428
- var _hitTargetInterceptio;
429
- (_hitTargetInterceptio = hitTargetInterceptionHandle) === null || _hitTargetInterceptio === void 0 || _hitTargetInterceptio.dispose();
398
+ return hitTargetInterceptionHandle.evaluate((h) => h.stop());
399
+ }).catch((e) => "done").finally(() => {
400
+ hitTargetInterceptionHandle?.dispose();
430
401
  });
431
402
  if (options.waitAfter !== false) {
432
- // When noWaitAfter is passed, we do not want to accidentally stall on
433
- // non-committed navigation blocking the evaluate.
434
- const hitTargetResult = await stopHitTargetInterception;
435
- if (hitTargetResult !== 'done') return hitTargetResult;
403
+ const hitTargetResult = await progress.race(stopHitTargetInterception);
404
+ if (hitTargetResult !== "done")
405
+ return hitTargetResult;
436
406
  }
437
407
  }
438
- progress.log(` ${options.trial ? 'trial ' : ''}${actionName} action done`);
439
- progress.log(' waiting for scheduled navigations to finish');
440
- if (options.__testHookAfterPointerAction) await options.__testHookAfterPointerAction();
441
- return 'done';
408
+ progress.log(` ${options.trial ? "trial " : ""}${actionName} action done`);
409
+ progress.log(" waiting for scheduled navigations to finish");
410
+ if (options.__testHookAfterPointerAction)
411
+ await progress.race(options.__testHookAfterPointerAction());
412
+ return "done";
442
413
  });
443
- if (actionResult !== 'done') return actionResult;
444
- progress.log(' navigations have finished');
445
- return 'done';
446
- }
447
- async _markAsTargetElement(metadata) {
448
- if (!metadata.id) return;
449
- await this.evaluateInUtility(([injected, node, callId]) => {
450
- if (node.nodeType === 1 /* Node.ELEMENT_NODE */) injected.markTargetElements(new Set([node]), callId);
451
- }, metadata.id);
452
- }
453
- async hover(metadata, options) {
454
- const controller = new _progress.ProgressController(metadata, this);
455
- return controller.run(async progress => {
456
- await this._markAsTargetElement(metadata);
457
- const result = await this._hover(progress, options);
458
- return assertDone(throwRetargetableDOMError(result));
459
- }, this._page._timeoutSettings.timeout(options));
414
+ if (actionResult !== "done")
415
+ return actionResult;
416
+ progress.log(" navigations have finished");
417
+ return "done";
418
+ }
419
+ async _markAsTargetElement(progress) {
420
+ if (!progress.metadata.id)
421
+ return;
422
+ await progress.race(this.evaluateInUtility(([injected, node, callId]) => {
423
+ if (node.nodeType === 1)
424
+ injected.markTargetElements(/* @__PURE__ */ new Set([node]), callId);
425
+ }, progress.metadata.id));
426
+ }
427
+ async hover(progress, options) {
428
+ await this._markAsTargetElement(progress);
429
+ const result = await this._hover(progress, options);
430
+ return assertDone(throwRetargetableDOMError(result));
460
431
  }
461
432
  _hover(progress, options) {
462
- return this._retryPointerAction(progress, 'hover', false /* waitForEnabled */, point => this._page.mouse.move(point.x, point.y), {
463
- ...options,
464
- waitAfter: 'disabled'
465
- });
433
+ return this._retryPointerAction(progress, "hover", false, (point) => this._page.mouse.move(progress, point.x, point.y), { ...options, waitAfter: "disabled" });
466
434
  }
467
- async click(metadata, options = {}) {
468
- const controller = new _progress.ProgressController(metadata, this);
469
- return controller.run(async progress => {
470
- await this._markAsTargetElement(metadata);
471
- const result = await this._click(progress, {
472
- ...options,
473
- waitAfter: !options.noWaitAfter
474
- });
475
- return assertDone(throwRetargetableDOMError(result));
476
- }, this._page._timeoutSettings.timeout(options));
435
+ async click(progress, options) {
436
+ await this._markAsTargetElement(progress);
437
+ const result = await this._click(progress, { ...options, waitAfter: !options.noWaitAfter });
438
+ return assertDone(throwRetargetableDOMError(result));
477
439
  }
478
440
  _click(progress, options) {
479
- return this._retryPointerAction(progress, 'click', true /* waitForEnabled */, point => this._page.mouse.click(point.x, point.y, options), options);
441
+ return this._retryPointerAction(progress, "click", true, (point) => this._page.mouse.click(progress, point.x, point.y, options), options);
480
442
  }
481
- async dblclick(metadata, options) {
482
- const controller = new _progress.ProgressController(metadata, this);
483
- return controller.run(async progress => {
484
- await this._markAsTargetElement(metadata);
485
- const result = await this._dblclick(progress, options);
486
- return assertDone(throwRetargetableDOMError(result));
487
- }, this._page._timeoutSettings.timeout(options));
443
+ async dblclick(progress, options) {
444
+ await this._markAsTargetElement(progress);
445
+ const result = await this._dblclick(progress, options);
446
+ return assertDone(throwRetargetableDOMError(result));
488
447
  }
489
448
  _dblclick(progress, options) {
490
- return this._retryPointerAction(progress, 'dblclick', true /* waitForEnabled */, point => this._page.mouse.dblclick(point.x, point.y, options), {
491
- ...options,
492
- waitAfter: 'disabled'
493
- });
449
+ return this._retryPointerAction(progress, "dblclick", true, (point) => this._page.mouse.click(progress, point.x, point.y, { ...options, clickCount: 2 }), { ...options, waitAfter: "disabled" });
494
450
  }
495
- async tap(metadata, options = {}) {
496
- const controller = new _progress.ProgressController(metadata, this);
497
- return controller.run(async progress => {
498
- await this._markAsTargetElement(metadata);
499
- const result = await this._tap(progress, options);
500
- return assertDone(throwRetargetableDOMError(result));
501
- }, this._page._timeoutSettings.timeout(options));
451
+ async tap(progress, options) {
452
+ await this._markAsTargetElement(progress);
453
+ const result = await this._tap(progress, options);
454
+ return assertDone(throwRetargetableDOMError(result));
502
455
  }
503
456
  _tap(progress, options) {
504
- return this._retryPointerAction(progress, 'tap', true /* waitForEnabled */, point => this._page.touchscreen.tap(point.x, point.y), {
505
- ...options,
506
- waitAfter: 'disabled'
507
- });
457
+ return this._retryPointerAction(progress, "tap", true, (point) => this._page.touchscreen.tap(progress, point.x, point.y), { ...options, waitAfter: "disabled" });
508
458
  }
509
- async selectOption(metadata, elements, values, options) {
510
- const controller = new _progress.ProgressController(metadata, this);
511
- return controller.run(async progress => {
512
- await this._markAsTargetElement(metadata);
513
- const result = await this._selectOption(progress, elements, values, options);
514
- return throwRetargetableDOMError(result);
515
- }, this._page._timeoutSettings.timeout(options));
459
+ async selectOption(progress, elements, values, options) {
460
+ await this._markAsTargetElement(progress);
461
+ const result = await this._selectOption(progress, elements, values, options);
462
+ return throwRetargetableDOMError(result);
516
463
  }
517
464
  async _selectOption(progress, elements, values, options) {
518
465
  let resultingOptions = [];
519
- await this._retryAction(progress, 'select option', async () => {
520
- await this.instrumentation.onBeforeInputAction(this, progress.metadata);
521
- if (!options.force) progress.log(` waiting for element to be visible and enabled`);
466
+ const result = await this._retryAction(progress, "select option", async () => {
467
+ await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
468
+ if (!options.force)
469
+ progress.log(` waiting for element to be visible and enabled`);
522
470
  const optionsToSelect = [...elements, ...values];
523
- const result = await this.evaluateInUtility(async ([injected, node, {
524
- optionsToSelect,
525
- force
526
- }]) => {
471
+ const result2 = await progress.race(this.evaluateInUtility(async ([injected, node, { optionsToSelect: optionsToSelect2, force }]) => {
527
472
  if (!force) {
528
- const checkResult = await injected.checkElementStates(node, ['visible', 'enabled']);
529
- if (checkResult) return checkResult;
473
+ const checkResult = await injected.checkElementStates(node, ["visible", "enabled"]);
474
+ if (checkResult)
475
+ return checkResult;
530
476
  }
531
- return injected.selectOptions(node, optionsToSelect);
532
- }, {
533
- optionsToSelect,
534
- force: options.force
535
- });
536
- if (Array.isArray(result)) {
537
- progress.log(' selected specified option(s)');
538
- resultingOptions = result;
539
- return 'done';
477
+ return injected.selectOptions(node, optionsToSelect2);
478
+ }, { optionsToSelect, force: options.force }));
479
+ if (Array.isArray(result2)) {
480
+ progress.log(" selected specified option(s)");
481
+ resultingOptions = result2;
482
+ return "done";
540
483
  }
541
- return result;
484
+ return result2;
542
485
  }, options);
486
+ if (result === "error:notconnected")
487
+ return result;
543
488
  return resultingOptions;
544
489
  }
545
- async fill(metadata, value, options = {}) {
546
- const controller = new _progress.ProgressController(metadata, this);
547
- return controller.run(async progress => {
548
- await this._markAsTargetElement(metadata);
549
- const result = await this._fill(progress, value, options);
550
- assertDone(throwRetargetableDOMError(result));
551
- }, this._page._timeoutSettings.timeout(options));
490
+ async fill(progress, value, options) {
491
+ await this._markAsTargetElement(progress);
492
+ const result = await this._fill(progress, value, options);
493
+ assertDone(throwRetargetableDOMError(result));
552
494
  }
553
495
  async _fill(progress, value, options) {
554
496
  progress.log(` fill("${value}")`);
555
- return await this._retryAction(progress, 'fill', async () => {
556
- await this.instrumentation.onBeforeInputAction(this, progress.metadata);
557
- if (!options.force) progress.log(' waiting for element to be visible, enabled and editable');
558
- const result = await this.evaluateInUtility(async ([injected, node, {
559
- value,
560
- force
561
- }]) => {
497
+ return await this._retryAction(progress, "fill", async () => {
498
+ await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
499
+ if (!options.force)
500
+ progress.log(" waiting for element to be visible, enabled and editable");
501
+ const result = await progress.race(this.evaluateInUtility(async ([injected, node, { value: value2, force }]) => {
562
502
  if (!force) {
563
- const checkResult = await injected.checkElementStates(node, ['visible', 'enabled', 'editable']);
564
- if (checkResult) return checkResult;
503
+ const checkResult = await injected.checkElementStates(node, ["visible", "enabled", "editable"]);
504
+ if (checkResult)
505
+ return checkResult;
565
506
  }
566
- return injected.fill(node, value);
567
- }, {
568
- value,
569
- force: options.force
570
- });
571
- progress.throwIfAborted(); // Avoid action that has side-effects.
572
- if (result === 'needsinput') {
573
- if (value) await this._page.keyboard.insertText(value);else await this._page.keyboard.press('Delete');
574
- return 'done';
507
+ return injected.fill(node, value2);
508
+ }, { value, force: options.force }));
509
+ if (result === "needsinput") {
510
+ if (value)
511
+ await this._page.keyboard.insertText(progress, value);
512
+ else
513
+ await this._page.keyboard.press(progress, "Delete");
514
+ return "done";
575
515
  } else {
576
516
  return result;
577
517
  }
578
518
  }, options);
579
519
  }
580
- async selectText(metadata, options = {}) {
581
- const controller = new _progress.ProgressController(metadata, this);
582
- return controller.run(async progress => {
583
- const result = await this._retryAction(progress, 'selectText', async () => {
584
- if (!options.force) progress.log(' waiting for element to be visible');
585
- return await this.evaluateInUtility(async ([injected, node, {
586
- force
587
- }]) => {
588
- if (!force) {
589
- const checkResult = await injected.checkElementStates(node, ['visible']);
590
- if (checkResult) return checkResult;
591
- }
592
- return injected.selectText(node);
593
- }, {
594
- force: options.force
595
- });
596
- }, options);
597
- assertDone(throwRetargetableDOMError(result));
598
- }, this._page._timeoutSettings.timeout(options));
599
- }
600
- async setInputFiles(metadata, params) {
601
- const inputFileItems = await (0, _fileUploadUtils.prepareFilesForUpload)(this._frame, params);
602
- const controller = new _progress.ProgressController(metadata, this);
603
- return controller.run(async progress => {
604
- await this._markAsTargetElement(metadata);
605
- const result = await this._setInputFiles(progress, inputFileItems);
606
- return assertDone(throwRetargetableDOMError(result));
607
- }, this._page._timeoutSettings.timeout(params));
520
+ async selectText(progress, options) {
521
+ const result = await this._retryAction(progress, "selectText", async () => {
522
+ if (!options.force)
523
+ progress.log(" waiting for element to be visible");
524
+ return await progress.race(this.evaluateInUtility(async ([injected, node, { force }]) => {
525
+ if (!force) {
526
+ const checkResult = await injected.checkElementStates(node, ["visible"]);
527
+ if (checkResult)
528
+ return checkResult;
529
+ }
530
+ return injected.selectText(node);
531
+ }, { force: options.force }));
532
+ }, options);
533
+ assertDone(throwRetargetableDOMError(result));
534
+ }
535
+ async setInputFiles(progress, params) {
536
+ const inputFileItems = await progress.race((0, import_fileUploadUtils.prepareFilesForUpload)(this._frame, params));
537
+ await this._markAsTargetElement(progress);
538
+ const result = await this._setInputFiles(progress, inputFileItems);
539
+ return assertDone(throwRetargetableDOMError(result));
608
540
  }
609
541
  async _setInputFiles(progress, items) {
610
- const {
611
- filePayloads,
612
- localPaths,
613
- localDirectory
614
- } = items;
542
+ const { filePayloads, localPaths, localDirectory } = items;
615
543
  const multiple = filePayloads && filePayloads.length > 1 || localPaths && localPaths.length > 1;
616
- const result = await this.evaluateHandleInUtility(([injected, node, {
617
- multiple,
618
- directoryUpload
619
- }]) => {
620
- const element = injected.retarget(node, 'follow-label');
621
- if (!element) return;
622
- if (element.tagName !== 'INPUT') throw injected.createStacklessError('Node is not an HTMLInputElement');
544
+ const result = await progress.race(this.evaluateHandleInUtility(([injected, node, { multiple: multiple2, directoryUpload }]) => {
545
+ const element = injected.retarget(node, "follow-label");
546
+ if (!element)
547
+ return;
548
+ if (element.tagName !== "INPUT")
549
+ throw injected.createStacklessError("Node is not an HTMLInputElement");
623
550
  const inputElement = element;
624
- if (multiple && !inputElement.multiple && !inputElement.webkitdirectory) throw injected.createStacklessError('Non-multiple file input can only accept single file');
625
- if (directoryUpload && !inputElement.webkitdirectory) throw injected.createStacklessError('File input does not support directories, pass individual files instead');
626
- if (!directoryUpload && inputElement.webkitdirectory) throw injected.createStacklessError('[webkitdirectory] input requires passing a path to a directory');
551
+ if (multiple2 && !inputElement.multiple && !inputElement.webkitdirectory)
552
+ throw injected.createStacklessError("Non-multiple file input can only accept single file");
553
+ if (directoryUpload && !inputElement.webkitdirectory)
554
+ throw injected.createStacklessError("File input does not support directories, pass individual files instead");
555
+ if (!directoryUpload && inputElement.webkitdirectory)
556
+ throw injected.createStacklessError("[webkitdirectory] input requires passing a path to a directory");
627
557
  return inputElement;
628
- }, {
629
- multiple,
630
- directoryUpload: !!localDirectory
631
- });
632
- if (result === 'error:notconnected' || !result.asElement()) return 'error:notconnected';
558
+ }, { multiple, directoryUpload: !!localDirectory }));
559
+ if (result === "error:notconnected" || !result.asElement())
560
+ return "error:notconnected";
633
561
  const retargeted = result.asElement();
634
- await this.instrumentation.onBeforeInputAction(this, progress.metadata);
635
- progress.throwIfAborted(); // Avoid action that has side-effects.
562
+ await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
636
563
  if (localPaths || localDirectory) {
637
564
  const localPathsOrDirectory = localDirectory ? [localDirectory] : localPaths;
638
- await Promise.all(localPathsOrDirectory.map(localPath => _fs.default.promises.access(localPath, _fs.default.constants.F_OK)));
639
- // Browsers traverse the given directory asynchronously and we want to ensure all files are uploaded.
640
- const waitForInputEvent = localDirectory ? this.evaluate(node => new Promise(fulfill => {
641
- node.addEventListener('input', fulfill, {
642
- once: true
643
- });
644
- })).catch(() => {}) : Promise.resolve();
645
- await this._page._delegate.setInputFilePaths(retargeted, localPathsOrDirectory);
646
- await waitForInputEvent;
565
+ await progress.race(Promise.all(localPathsOrDirectory.map((localPath) => import_fs.default.promises.access(localPath, import_fs.default.constants.F_OK))));
566
+ const waitForInputEvent = localDirectory ? this.evaluate((node) => new Promise((fulfill) => {
567
+ node.addEventListener("input", fulfill, { once: true });
568
+ })).catch(() => {
569
+ }) : Promise.resolve();
570
+ await progress.race(this._page.delegate.setInputFilePaths(retargeted, localPathsOrDirectory));
571
+ await progress.race(waitForInputEvent);
647
572
  } else {
648
- await retargeted.evaluateInUtility(([injected, node, files]) => injected.setInputFiles(node, files), filePayloads);
573
+ await progress.race(retargeted.evaluateInUtility(([injected, node, files]) => injected.setInputFiles(node, files), filePayloads));
649
574
  }
650
- return 'done';
575
+ return "done";
651
576
  }
652
- async focus(metadata) {
653
- const controller = new _progress.ProgressController(metadata, this);
654
- await controller.run(async progress => {
655
- await this._markAsTargetElement(metadata);
656
- const result = await this._focus(progress);
657
- return assertDone(throwRetargetableDOMError(result));
658
- }, 0);
577
+ async focus(progress) {
578
+ await this._markAsTargetElement(progress);
579
+ const result = await this._focus(progress);
580
+ return assertDone(throwRetargetableDOMError(result));
659
581
  }
660
582
  async _focus(progress, resetSelectionIfNotFocused) {
661
- progress.throwIfAborted(); // Avoid action that has side-effects.
662
- return await this.evaluateInUtility(([injected, node, resetSelectionIfNotFocused]) => injected.focusNode(node, resetSelectionIfNotFocused), resetSelectionIfNotFocused);
583
+ return await progress.race(this.evaluateInUtility(([injected, node, resetSelectionIfNotFocused2]) => injected.focusNode(node, resetSelectionIfNotFocused2), resetSelectionIfNotFocused));
663
584
  }
664
585
  async _blur(progress) {
665
- progress.throwIfAborted(); // Avoid action that has side-effects.
666
- return await this.evaluateInUtility(([injected, node]) => injected.blurNode(node), {});
586
+ return await progress.race(this.evaluateInUtility(([injected, node]) => injected.blurNode(node), {}));
667
587
  }
668
- async type(metadata, text, options) {
669
- const controller = new _progress.ProgressController(metadata, this);
670
- return controller.run(async progress => {
671
- await this._markAsTargetElement(metadata);
672
- const result = await this._type(progress, text, options);
673
- return assertDone(throwRetargetableDOMError(result));
674
- }, this._page._timeoutSettings.timeout(options));
588
+ async type(progress, text, options) {
589
+ await this._markAsTargetElement(progress);
590
+ const result = await this._type(progress, text, options);
591
+ return assertDone(throwRetargetableDOMError(result));
675
592
  }
676
593
  async _type(progress, text, options) {
677
594
  progress.log(`elementHandle.type("${text}")`);
678
- await this.instrumentation.onBeforeInputAction(this, progress.metadata);
679
- const result = await this._focus(progress, true /* resetSelectionIfNotFocused */);
680
- if (result !== 'done') return result;
681
- progress.throwIfAborted(); // Avoid action that has side-effects.
682
- await this._page.keyboard.type(text, options);
683
- return 'done';
684
- }
685
- async press(metadata, key, options) {
686
- const controller = new _progress.ProgressController(metadata, this);
687
- return controller.run(async progress => {
688
- await this._markAsTargetElement(metadata);
689
- const result = await this._press(progress, key, options);
690
- return assertDone(throwRetargetableDOMError(result));
691
- }, this._page._timeoutSettings.timeout(options));
595
+ await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
596
+ const result = await this._focus(
597
+ progress,
598
+ true
599
+ /* resetSelectionIfNotFocused */
600
+ );
601
+ if (result !== "done")
602
+ return result;
603
+ await this._page.keyboard.type(progress, text, options);
604
+ return "done";
605
+ }
606
+ async press(progress, key, options) {
607
+ await this._markAsTargetElement(progress);
608
+ const result = await this._press(progress, key, options);
609
+ return assertDone(throwRetargetableDOMError(result));
692
610
  }
693
611
  async _press(progress, key, options) {
694
612
  progress.log(`elementHandle.press("${key}")`);
695
- await this.instrumentation.onBeforeInputAction(this, progress.metadata);
696
- return this._page._frameManager.waitForSignalsCreatedBy(progress, !options.noWaitAfter, async () => {
697
- const result = await this._focus(progress, true /* resetSelectionIfNotFocused */);
698
- if (result !== 'done') return result;
699
- progress.throwIfAborted(); // Avoid action that has side-effects.
700
- await this._page.keyboard.press(key, options);
701
- return 'done';
613
+ await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
614
+ return this._page.frameManager.waitForSignalsCreatedBy(progress, !options.noWaitAfter, async () => {
615
+ const result = await this._focus(
616
+ progress,
617
+ true
618
+ /* resetSelectionIfNotFocused */
619
+ );
620
+ if (result !== "done")
621
+ return result;
622
+ await this._page.keyboard.press(progress, key, options);
623
+ return "done";
702
624
  });
703
625
  }
704
- async check(metadata, options) {
705
- const controller = new _progress.ProgressController(metadata, this);
706
- return controller.run(async progress => {
707
- const result = await this._setChecked(progress, true, options);
708
- return assertDone(throwRetargetableDOMError(result));
709
- }, this._page._timeoutSettings.timeout(options));
626
+ async check(progress, options) {
627
+ const result = await this._setChecked(progress, true, options);
628
+ return assertDone(throwRetargetableDOMError(result));
710
629
  }
711
- async uncheck(metadata, options) {
712
- const controller = new _progress.ProgressController(metadata, this);
713
- return controller.run(async progress => {
714
- const result = await this._setChecked(progress, false, options);
715
- return assertDone(throwRetargetableDOMError(result));
716
- }, this._page._timeoutSettings.timeout(options));
630
+ async uncheck(progress, options) {
631
+ const result = await this._setChecked(progress, false, options);
632
+ return assertDone(throwRetargetableDOMError(result));
717
633
  }
718
634
  async _setChecked(progress, state, options) {
719
635
  const isChecked = async () => {
720
- const result = await this.evaluateInUtility(([injected, node]) => injected.elementState(node, 'checked'), {});
721
- if (result === 'error:notconnected' || result.received === 'error:notconnected') throwElementIsNotAttached();
722
- return result.matches;
636
+ const result2 = await progress.race(this.evaluateInUtility(([injected, node]) => injected.elementState(node, "checked"), {}));
637
+ if (result2 === "error:notconnected" || result2.received === "error:notconnected")
638
+ throwElementIsNotAttached();
639
+ return result2.matches;
723
640
  };
724
- await this._markAsTargetElement(progress.metadata);
725
- if ((await isChecked()) === state) return 'done';
726
- const result = await this._click(progress, {
727
- ...options,
728
- waitAfter: 'disabled'
729
- });
730
- if (result !== 'done') return result;
731
- if (options.trial) return 'done';
732
- if ((await isChecked()) !== state) throw new NonRecoverableDOMError('Clicking the checkbox did not change its state');
733
- return 'done';
641
+ await this._markAsTargetElement(progress);
642
+ if (await isChecked() === state)
643
+ return "done";
644
+ const result = await this._click(progress, { ...options, waitAfter: "disabled" });
645
+ if (result !== "done")
646
+ return result;
647
+ if (options.trial)
648
+ return "done";
649
+ if (await isChecked() !== state)
650
+ throw new NonRecoverableDOMError("Clicking the checkbox did not change its state");
651
+ return "done";
734
652
  }
735
653
  async boundingBox() {
736
- return this._page._delegate.getBoundingBox(this);
654
+ return this._page.delegate.getBoundingBox(this);
737
655
  }
738
656
  async ariaSnapshot(options) {
739
- return await this.evaluateInUtility(([injected, element, options]) => injected.ariaSnapshot(element, options), options);
657
+ return await this.evaluateInUtility(([injected, element, options2]) => injected.ariaSnapshot(element, options2), options);
740
658
  }
741
- async screenshot(metadata, options = {}) {
742
- const controller = new _progress.ProgressController(metadata, this);
743
- return controller.run(progress => this._page._screenshotter.screenshotElement(progress, this, options), this._page._timeoutSettings.timeout(options));
659
+ async screenshot(progress, options) {
660
+ return await this._page.screenshotter.screenshotElement(progress, this, options);
744
661
  }
745
662
  async querySelector(selector, options) {
746
663
  return this._frame.selectors.query(selector, options, this);
@@ -754,42 +671,39 @@ class ElementHandle extends js.JSHandle {
754
671
  async evalOnSelectorAll(selector, expression, isFunction, arg) {
755
672
  return this._frame.evalOnSelectorAll(selector, expression, isFunction, arg, this);
756
673
  }
757
- async isVisible(metadata) {
758
- return this._frame.isVisible(metadata, ':scope', {}, this);
674
+ async isVisible(progress) {
675
+ return this._frame.isVisible(progress, ":scope", {}, this);
759
676
  }
760
- async isHidden(metadata) {
761
- return this._frame.isHidden(metadata, ':scope', {}, this);
677
+ async isHidden(progress) {
678
+ return this._frame.isHidden(progress, ":scope", {}, this);
762
679
  }
763
- async isEnabled(metadata) {
764
- return this._frame.isEnabled(metadata, ':scope', {}, this);
680
+ async isEnabled(progress) {
681
+ return this._frame.isEnabled(progress, ":scope", {}, this);
765
682
  }
766
- async isDisabled(metadata) {
767
- return this._frame.isDisabled(metadata, ':scope', {}, this);
683
+ async isDisabled(progress) {
684
+ return this._frame.isDisabled(progress, ":scope", {}, this);
768
685
  }
769
- async isEditable(metadata) {
770
- return this._frame.isEditable(metadata, ':scope', {}, this);
686
+ async isEditable(progress) {
687
+ return this._frame.isEditable(progress, ":scope", {}, this);
771
688
  }
772
- async isChecked(metadata) {
773
- return this._frame.isChecked(metadata, ':scope', {}, this);
689
+ async isChecked(progress) {
690
+ return this._frame.isChecked(progress, ":scope", {}, this);
774
691
  }
775
- async waitForElementState(metadata, state, options = {}) {
776
- const controller = new _progress.ProgressController(metadata, this);
777
- return controller.run(async progress => {
778
- const actionName = `wait for ${state}`;
779
- const result = await this._retryAction(progress, actionName, async () => {
780
- return await this.evaluateInUtility(async ([injected, node, state]) => {
781
- return (await injected.checkElementStates(node, [state])) || 'done';
782
- }, state);
783
- }, {});
784
- assertDone(throwRetargetableDOMError(result));
785
- }, this._page._timeoutSettings.timeout(options));
692
+ async waitForElementState(progress, state) {
693
+ const actionName = `wait for ${state}`;
694
+ const result = await this._retryAction(progress, actionName, async () => {
695
+ return await progress.race(this.evaluateInUtility(async ([injected, node, state2]) => {
696
+ return await injected.checkElementStates(node, [state2]) || "done";
697
+ }, state));
698
+ }, {});
699
+ assertDone(throwRetargetableDOMError(result));
786
700
  }
787
- async waitForSelector(metadata, selector, options = {}) {
788
- return this._frame.waitForSelector(metadata, selector, options, this);
701
+ async waitForSelector(progress, selector, options) {
702
+ return await this._frame.waitForSelector(progress, selector, true, options, this);
789
703
  }
790
704
  async _adoptTo(context) {
791
705
  if (this._context !== context) {
792
- const adopted = await this._page._delegate.adoptElementHandle(this, context);
706
+ const adopted = await this._page.delegate.adoptElementHandle(this, context);
793
707
  this.dispose();
794
708
  return adopted;
795
709
  }
@@ -801,58 +715,38 @@ class ElementHandle extends js.JSHandle {
801
715
  while (frame.parentFrame()) {
802
716
  const frameElement = await frame.frameElement();
803
717
  const box = await frameElement.boundingBox();
804
- const style = await frameElement.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch(e => 'error:notconnected');
805
- if (!box || style === 'error:notconnected') return 'error:notconnected';
806
- if (style === 'transformed') {
807
- // We cannot translate coordinates when iframe has any transform applied.
808
- // The best we can do right now is to skip the hitPoint check,
809
- // and solely rely on the event interceptor.
810
- return {
811
- framePoint: undefined
812
- };
718
+ const style = await frameElement.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch((e) => "error:notconnected");
719
+ if (!box || style === "error:notconnected")
720
+ return "error:notconnected";
721
+ if (style === "transformed") {
722
+ return { framePoint: void 0 };
813
723
  }
814
- // Translate from viewport coordinates to frame coordinates.
815
- const pointInFrame = {
816
- x: point.x - box.x - style.left,
817
- y: point.y - box.y - style.top
818
- };
819
- data.push({
820
- frame,
821
- frameElement,
822
- pointInFrame
823
- });
724
+ const pointInFrame = { x: point.x - box.x - style.left, y: point.y - box.y - style.top };
725
+ data.push({ frame, frameElement, pointInFrame });
824
726
  frame = frame.parentFrame();
825
727
  }
826
- // Add main frame.
827
- data.push({
828
- frame,
829
- frameElement: null,
830
- pointInFrame: point
831
- });
728
+ data.push({ frame, frameElement: null, pointInFrame: point });
832
729
  for (let i = data.length - 1; i > 0; i--) {
833
730
  const element = data[i - 1].frameElement;
834
- const point = data[i].pointInFrame;
835
- // Hit target in the parent frame should hit the child frame element.
836
- const hitTargetResult = await element.evaluateInUtility(([injected, element, hitPoint]) => {
837
- return injected.expectHitTarget(hitPoint, element);
838
- }, point);
839
- if (hitTargetResult !== 'done') return hitTargetResult;
731
+ const point2 = data[i].pointInFrame;
732
+ const hitTargetResult = await element.evaluateInUtility(([injected, element2, hitPoint]) => {
733
+ return injected.expectHitTarget(hitPoint, element2);
734
+ }, point2);
735
+ if (hitTargetResult !== "done")
736
+ return hitTargetResult;
840
737
  }
841
- return {
842
- framePoint: data[0].pointInFrame
843
- };
738
+ return { framePoint: data[0].pointInFrame };
844
739
  }
845
740
  }
846
- exports.ElementHandle = ElementHandle;
847
741
  function throwRetargetableDOMError(result) {
848
- if (result === 'error:notconnected') throwElementIsNotAttached();
742
+ if (result === "error:notconnected")
743
+ throwElementIsNotAttached();
849
744
  return result;
850
745
  }
851
746
  function throwElementIsNotAttached() {
852
- throw new Error('Element is not attached to the DOM');
747
+ throw new Error("Element is not attached to the DOM");
853
748
  }
854
749
  function assertDone(result) {
855
- // This function converts 'done' to void and ensures typescript catches unhandled errors.
856
750
  }
857
751
  function roundPoint(point) {
858
752
  return {
@@ -861,10 +755,7 @@ function roundPoint(point) {
861
755
  };
862
756
  }
863
757
  function quadMiddlePoint(quad) {
864
- const result = {
865
- x: 0,
866
- y: 0
867
- };
758
+ const result = { x: 0, y: 0 };
868
759
  for (const point of quad) {
869
760
  result.x += point.x / 4;
870
761
  result.y += point.y / 4;
@@ -877,23 +768,35 @@ function triangleArea(p1, p2, p3) {
877
768
  function isPointInsideQuad(point, quad) {
878
769
  const area1 = triangleArea(point, quad[0], quad[1]) + triangleArea(point, quad[1], quad[2]) + triangleArea(point, quad[2], quad[3]) + triangleArea(point, quad[3], quad[0]);
879
770
  const area2 = triangleArea(quad[0], quad[1], quad[2]) + triangleArea(quad[1], quad[2], quad[3]);
880
- // Check that point is inside the quad.
881
- if (Math.abs(area1 - area2) > 0.1) return false;
882
- // Check that point is not on the right/bottom edge, because clicking
883
- // there does not actually click the element.
771
+ if (Math.abs(area1 - area2) > 0.1)
772
+ return false;
884
773
  return point.x < Math.max(quad[0].x, quad[1].x, quad[2].x, quad[3].x) && point.y < Math.max(quad[0].y, quad[1].y, quad[2].y, quad[3].y);
885
774
  }
886
775
  function findIntegerPointInsideQuad(quad) {
887
- // Try all four rounding directions of the middle point.
888
776
  const point = quadMiddlePoint(quad);
889
777
  point.x = Math.floor(point.x);
890
778
  point.y = Math.floor(point.y);
891
- if (isPointInsideQuad(point, quad)) return point;
779
+ if (isPointInsideQuad(point, quad))
780
+ return point;
892
781
  point.x += 1;
893
- if (isPointInsideQuad(point, quad)) return point;
782
+ if (isPointInsideQuad(point, quad))
783
+ return point;
894
784
  point.y += 1;
895
- if (isPointInsideQuad(point, quad)) return point;
785
+ if (isPointInsideQuad(point, quad))
786
+ return point;
896
787
  point.x -= 1;
897
- if (isPointInsideQuad(point, quad)) return point;
788
+ if (isPointInsideQuad(point, quad))
789
+ return point;
898
790
  }
899
- const kUnableToAdoptErrorMessage = exports.kUnableToAdoptErrorMessage = 'Unable to adopt element handle from a different document';
791
+ const kUnableToAdoptErrorMessage = "Unable to adopt element handle from a different document";
792
+ // Annotate the CommonJS export names for ESM import in node:
793
+ 0 && (module.exports = {
794
+ ElementHandle,
795
+ FrameExecutionContext,
796
+ NonRecoverableDOMError,
797
+ assertDone,
798
+ isNonRecoverableDOMError,
799
+ kUnableToAdoptErrorMessage,
800
+ throwElementIsNotAttached,
801
+ throwRetargetableDOMError
802
+ });