rebrowser-playwright-core 1.49.1 → 1.64.1

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 (393) hide show
  1. package/ThirdPartyNotices.txt +7 -1228
  2. package/bin/install_webkit_wsl.ps1 +33 -0
  3. package/bin/reinstall_chrome_beta_linux.sh +1 -1
  4. package/bin/reinstall_chrome_beta_mac.sh +1 -1
  5. package/bin/reinstall_chrome_stable_linux.sh +1 -1
  6. package/bin/reinstall_chrome_stable_mac.sh +1 -1
  7. package/bin/reinstall_msedge_beta_linux.sh +7 -1
  8. package/bin/reinstall_msedge_beta_mac.sh +1 -1
  9. package/bin/reinstall_msedge_dev_linux.sh +7 -1
  10. package/bin/reinstall_msedge_dev_mac.sh +1 -1
  11. package/bin/reinstall_msedge_stable_linux.sh +7 -1
  12. package/bin/reinstall_msedge_stable_mac.sh +1 -1
  13. package/browsers.json +21 -34
  14. package/cli.js +5 -1
  15. package/index.js +2 -18
  16. package/lib/bootstrap.js +149 -0
  17. package/lib/coreBundle.js +78218 -0
  18. package/lib/entry/cliDaemon.js +5 -0
  19. package/lib/entry/dashboardApp.js +3 -0
  20. package/lib/entry/mcp.js +10 -0
  21. package/lib/entry/oopBrowserDownload.js +3 -0
  22. package/lib/package.js +50 -0
  23. package/lib/server/electron/loader.js +109 -43
  24. package/lib/serverRegistry.js +1939 -0
  25. package/lib/serverRegistry.js.LICENSE +65 -0
  26. package/lib/tools/cli-client/channelSessions.js +141 -0
  27. package/lib/tools/cli-client/cli.js +7 -0
  28. package/lib/tools/cli-client/help.json +808 -0
  29. package/lib/tools/cli-client/minimist.js +128 -0
  30. package/lib/tools/cli-client/output.js +352 -0
  31. package/lib/tools/cli-client/program.js +422 -0
  32. package/lib/tools/cli-client/registry.js +180 -0
  33. package/lib/tools/cli-client/session.js +261 -0
  34. package/lib/tools/dashboard/appIcon.png +0 -0
  35. package/lib/tools/skills/playwright-cli/SKILL.md +493 -0
  36. package/lib/tools/skills/playwright-cli/references/element-attributes.md +23 -0
  37. package/lib/tools/skills/playwright-cli/references/playwright-tests.md +39 -0
  38. package/lib/tools/skills/playwright-cli/references/pr-attachments.md +60 -0
  39. package/lib/tools/skills/playwright-cli/references/request-mocking.md +87 -0
  40. package/lib/tools/skills/playwright-cli/references/running-code.md +245 -0
  41. package/lib/tools/skills/playwright-cli/references/session-management.md +227 -0
  42. package/lib/tools/skills/playwright-cli/references/storage-state.md +275 -0
  43. package/lib/tools/skills/playwright-cli/references/test-generation.md +433 -0
  44. package/lib/tools/skills/playwright-cli/references/tracing.md +139 -0
  45. package/lib/tools/skills/playwright-cli/references/video-recording.md +216 -0
  46. package/lib/tools/skills/playwright-component-testing/SKILL.md +136 -0
  47. package/lib/tools/skills/playwright-component-testing/references/gallery-spec.md +144 -0
  48. package/lib/tools/skills/playwright-component-testing/references/migration.md +89 -0
  49. package/lib/tools/skills/playwright-component-testing/references/react.md +69 -0
  50. package/lib/tools/skills/playwright-component-testing/references/typing.md +173 -0
  51. package/lib/tools/skills/playwright-component-testing/references/vue.md +77 -0
  52. package/lib/tools/skills/playwright-trace/SKILL.md +174 -0
  53. package/lib/tools/utils/extension.js +112 -0
  54. package/lib/tools/utils/socketConnection.js +108 -0
  55. package/lib/utilsBundle.js +86076 -79
  56. package/lib/utilsBundle.js.LICENSE +1890 -0
  57. package/lib/vite/dashboard/assets/codeMirrorModule--QdMvsKi.css +1 -0
  58. package/lib/vite/dashboard/assets/codeMirrorModule-CQ8RZGBm.js +32 -0
  59. package/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +0 -0
  60. package/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +1 -0
  61. package/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +1 -0
  62. package/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +1 -0
  63. package/lib/vite/dashboard/assets/index-AwgwcYie.css +1 -0
  64. package/lib/vite/dashboard/assets/index-hRvO4yU2.js +12 -0
  65. package/lib/vite/dashboard/assets/safari-na3_-uQk.svg +1 -0
  66. package/lib/vite/dashboard/index.html +29 -0
  67. package/lib/vite/dashboard/playwright-logo.svg +24 -0
  68. package/lib/vite/htmlReport/index.html +3 -56
  69. package/lib/vite/htmlReport/report.css +2 -0
  70. package/lib/vite/htmlReport/report.js +32 -0
  71. package/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css +1 -0
  72. package/lib/vite/recorder/assets/codeMirrorModule-DK72OMRi.js +32 -0
  73. package/lib/vite/recorder/assets/index-BZpYJZ-P.css +1 -0
  74. package/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
  75. package/lib/vite/recorder/index.html +3 -3
  76. package/lib/vite/traceViewer/assets/codeMirrorModule-BEB2e8M3.js +32 -0
  77. package/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
  78. package/lib/vite/traceViewer/assets/urlMatch-L3liM589.js +1 -0
  79. package/lib/vite/traceViewer/assets/xtermModule-B794rD2Z.js +7 -0
  80. package/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css +1 -0
  81. package/lib/vite/traceViewer/defaultSettingsView.C8BeHuxd.css +1 -0
  82. package/lib/vite/traceViewer/index.B_TqY17P.css +1 -0
  83. package/lib/vite/traceViewer/index.html +9 -11
  84. package/lib/vite/traceViewer/index.oNry3Hjv.js +1 -0
  85. package/lib/vite/traceViewer/manifest.webmanifest +16 -0
  86. package/lib/vite/traceViewer/snapshot.B_Jk1wbt.js +1 -0
  87. package/lib/vite/traceViewer/snapshot.html +4 -15
  88. package/lib/vite/traceViewer/sw.bundle.js +4 -3
  89. package/lib/vite/traceViewer/uiMode.CYwC_gH1.js +5 -0
  90. package/lib/vite/traceViewer/uiMode.CyMfwkXJ.css +1 -0
  91. package/lib/vite/traceViewer/uiMode.html +6 -8
  92. package/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css +1 -0
  93. package/lib/webp_codec.LICENSE +173 -0
  94. package/lib/webp_codec.wasm +0 -0
  95. package/lib/{utilsBundleImpl/xdg-open → xdg-open} +338 -137
  96. package/package.json +6 -16
  97. package/types/protocol.d.ts +9357 -6200
  98. package/types/structs.d.ts +8 -1
  99. package/types/types.d.ts +9490 -4947
  100. package/bin/PrintDeps.exe +0 -0
  101. package/bin/README.md +0 -2
  102. package/lib/androidServerImpl.js +0 -69
  103. package/lib/browserServerImpl.js +0 -92
  104. package/lib/cli/driver.js +0 -95
  105. package/lib/cli/program.js +0 -607
  106. package/lib/cli/programWithTestStub.js +0 -67
  107. package/lib/client/accessibility.js +0 -50
  108. package/lib/client/android.js +0 -473
  109. package/lib/client/api.js +0 -285
  110. package/lib/client/artifact.js +0 -79
  111. package/lib/client/browser.js +0 -145
  112. package/lib/client/browserContext.js +0 -559
  113. package/lib/client/browserType.js +0 -241
  114. package/lib/client/cdpSession.js +0 -53
  115. package/lib/client/channelOwner.js +0 -235
  116. package/lib/client/clientHelper.js +0 -57
  117. package/lib/client/clientInstrumentation.js +0 -50
  118. package/lib/client/clock.js +0 -68
  119. package/lib/client/connection.js +0 -333
  120. package/lib/client/consoleMessage.js +0 -55
  121. package/lib/client/coverage.js +0 -41
  122. package/lib/client/dialog.js +0 -57
  123. package/lib/client/download.js +0 -62
  124. package/lib/client/electron.js +0 -135
  125. package/lib/client/elementHandle.js +0 -321
  126. package/lib/client/errors.js +0 -77
  127. package/lib/client/eventEmitter.js +0 -314
  128. package/lib/client/events.js +0 -94
  129. package/lib/client/fetch.js +0 -391
  130. package/lib/client/fileChooser.js +0 -45
  131. package/lib/client/frame.js +0 -504
  132. package/lib/client/harRouter.js +0 -99
  133. package/lib/client/input.js +0 -111
  134. package/lib/client/jsHandle.js +0 -121
  135. package/lib/client/jsonPipe.js +0 -35
  136. package/lib/client/localUtils.js +0 -36
  137. package/lib/client/locator.js +0 -448
  138. package/lib/client/network.js +0 -767
  139. package/lib/client/page.js +0 -748
  140. package/lib/client/playwright.js +0 -80
  141. package/lib/client/selectors.js +0 -67
  142. package/lib/client/stream.js +0 -54
  143. package/lib/client/tracing.js +0 -147
  144. package/lib/client/types.js +0 -24
  145. package/lib/client/video.js +0 -51
  146. package/lib/client/waiter.js +0 -162
  147. package/lib/client/webError.js +0 -37
  148. package/lib/client/worker.js +0 -71
  149. package/lib/client/writableStream.js +0 -54
  150. package/lib/common/socksProxy.js +0 -569
  151. package/lib/common/timeoutSettings.js +0 -73
  152. package/lib/common/types.js +0 -5
  153. package/lib/generated/clockSource.js +0 -7
  154. package/lib/generated/consoleApiSource.js +0 -7
  155. package/lib/generated/injectedScriptSource.js +0 -7
  156. package/lib/generated/pollingRecorderSource.js +0 -7
  157. package/lib/generated/utilityScriptSource.js +0 -7
  158. package/lib/generated/webSocketMockSource.js +0 -7
  159. package/lib/image_tools/colorUtils.js +0 -98
  160. package/lib/image_tools/compare.js +0 -108
  161. package/lib/image_tools/imageChannel.js +0 -70
  162. package/lib/image_tools/stats.js +0 -102
  163. package/lib/inProcessFactory.js +0 -54
  164. package/lib/inprocess.js +0 -20
  165. package/lib/outofprocess.js +0 -67
  166. package/lib/protocol/debug.js +0 -27
  167. package/lib/protocol/serializers.js +0 -173
  168. package/lib/protocol/transport.js +0 -82
  169. package/lib/protocol/validator.js +0 -2780
  170. package/lib/protocol/validatorPrimitives.js +0 -139
  171. package/lib/remote/playwrightConnection.js +0 -274
  172. package/lib/remote/playwrightServer.js +0 -110
  173. package/lib/server/accessibility.js +0 -62
  174. package/lib/server/android/android.js +0 -441
  175. package/lib/server/android/backendAdb.js +0 -172
  176. package/lib/server/ariaSnapshot.js +0 -33
  177. package/lib/server/artifact.js +0 -104
  178. package/lib/server/bidi/bidiBrowser.js +0 -311
  179. package/lib/server/bidi/bidiChromium.js +0 -124
  180. package/lib/server/bidi/bidiConnection.js +0 -204
  181. package/lib/server/bidi/bidiExecutionContext.js +0 -156
  182. package/lib/server/bidi/bidiFirefox.js +0 -104
  183. package/lib/server/bidi/bidiInput.js +0 -158
  184. package/lib/server/bidi/bidiNetworkManager.js +0 -338
  185. package/lib/server/bidi/bidiOverCdp.js +0 -103
  186. package/lib/server/bidi/bidiPage.js +0 -529
  187. package/lib/server/bidi/bidiPdf.js +0 -140
  188. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -93
  189. package/lib/server/bidi/third_party/bidiKeyboard.js +0 -238
  190. package/lib/server/bidi/third_party/bidiProtocol.js +0 -139
  191. package/lib/server/bidi/third_party/bidiSerializer.js +0 -144
  192. package/lib/server/bidi/third_party/firefoxPrefs.js +0 -221
  193. package/lib/server/browser.js +0 -148
  194. package/lib/server/browserContext.js +0 -667
  195. package/lib/server/browserType.js +0 -338
  196. package/lib/server/chromium/chromium.js +0 -354
  197. package/lib/server/chromium/chromiumSwitches.js +0 -46
  198. package/lib/server/chromium/crAccessibility.js +0 -237
  199. package/lib/server/chromium/crBrowser.js +0 -516
  200. package/lib/server/chromium/crConnection.js +0 -381
  201. package/lib/server/chromium/crCoverage.js +0 -246
  202. package/lib/server/chromium/crDevTools.js +0 -108
  203. package/lib/server/chromium/crDragDrop.js +0 -143
  204. package/lib/server/chromium/crExecutionContext.js +0 -136
  205. package/lib/server/chromium/crInput.js +0 -171
  206. package/lib/server/chromium/crNetworkManager.js +0 -767
  207. package/lib/server/chromium/crPage.js +0 -1143
  208. package/lib/server/chromium/crPdf.js +0 -153
  209. package/lib/server/chromium/crProtocolHelper.js +0 -133
  210. package/lib/server/chromium/crServiceWorker.js +0 -114
  211. package/lib/server/chromium/defaultFontFamilies.js +0 -145
  212. package/lib/server/chromium/videoRecorder.js +0 -155
  213. package/lib/server/clock.js +0 -125
  214. package/lib/server/codegen/csharp.js +0 -294
  215. package/lib/server/codegen/java.js +0 -232
  216. package/lib/server/codegen/javascript.js +0 -245
  217. package/lib/server/codegen/jsonl.js +0 -47
  218. package/lib/server/codegen/language.js +0 -88
  219. package/lib/server/codegen/languages.js +0 -30
  220. package/lib/server/codegen/python.js +0 -261
  221. package/lib/server/codegen/types.js +0 -5
  222. package/lib/server/console.js +0 -57
  223. package/lib/server/cookieStore.js +0 -185
  224. package/lib/server/debugController.js +0 -237
  225. package/lib/server/debugger.js +0 -132
  226. package/lib/server/deviceDescriptors.js +0 -26
  227. package/lib/server/deviceDescriptorsSource.json +0 -1669
  228. package/lib/server/dialog.js +0 -71
  229. package/lib/server/dispatchers/androidDispatcher.js +0 -204
  230. package/lib/server/dispatchers/artifactDispatcher.js +0 -118
  231. package/lib/server/dispatchers/browserContextDispatcher.js +0 -368
  232. package/lib/server/dispatchers/browserDispatcher.js +0 -170
  233. package/lib/server/dispatchers/browserTypeDispatcher.js +0 -55
  234. package/lib/server/dispatchers/cdpSessionDispatcher.js +0 -48
  235. package/lib/server/dispatchers/debugControllerDispatcher.js +0 -103
  236. package/lib/server/dispatchers/dialogDispatcher.js +0 -44
  237. package/lib/server/dispatchers/dispatcher.js +0 -395
  238. package/lib/server/dispatchers/electronDispatcher.js +0 -93
  239. package/lib/server/dispatchers/elementHandlerDispatcher.js +0 -228
  240. package/lib/server/dispatchers/frameDispatcher.js +0 -293
  241. package/lib/server/dispatchers/jsHandleDispatcher.js +0 -97
  242. package/lib/server/dispatchers/jsonPipeDispatcher.js +0 -59
  243. package/lib/server/dispatchers/localUtilsDispatcher.js +0 -413
  244. package/lib/server/dispatchers/networkDispatchers.js +0 -221
  245. package/lib/server/dispatchers/pageDispatcher.js +0 -367
  246. package/lib/server/dispatchers/playwrightDispatcher.js +0 -107
  247. package/lib/server/dispatchers/selectorsDispatcher.js +0 -36
  248. package/lib/server/dispatchers/streamDispatcher.js +0 -62
  249. package/lib/server/dispatchers/tracingDispatcher.js +0 -64
  250. package/lib/server/dispatchers/webSocketRouteDispatcher.js +0 -189
  251. package/lib/server/dispatchers/writableStreamDispatcher.js +0 -58
  252. package/lib/server/dom.js +0 -888
  253. package/lib/server/download.js +0 -60
  254. package/lib/server/electron/electron.js +0 -296
  255. package/lib/server/errors.js +0 -68
  256. package/lib/server/fetch.js +0 -669
  257. package/lib/server/fileChooser.js +0 -42
  258. package/lib/server/fileUploadUtils.js +0 -75
  259. package/lib/server/firefox/ffAccessibility.js +0 -216
  260. package/lib/server/firefox/ffBrowser.js +0 -460
  261. package/lib/server/firefox/ffConnection.js +0 -168
  262. package/lib/server/firefox/ffExecutionContext.js +0 -123
  263. package/lib/server/firefox/ffInput.js +0 -150
  264. package/lib/server/firefox/ffNetworkManager.js +0 -233
  265. package/lib/server/firefox/ffPage.js +0 -559
  266. package/lib/server/firefox/firefox.js +0 -99
  267. package/lib/server/formData.js +0 -75
  268. package/lib/server/frameSelectors.js +0 -171
  269. package/lib/server/frames.js +0 -1691
  270. package/lib/server/har/harRecorder.js +0 -139
  271. package/lib/server/har/harTracer.js +0 -542
  272. package/lib/server/helper.js +0 -103
  273. package/lib/server/index.js +0 -108
  274. package/lib/server/input.js +0 -310
  275. package/lib/server/instrumentation.js +0 -70
  276. package/lib/server/isomorphic/utilityScriptSerializers.js +0 -226
  277. package/lib/server/javascript.js +0 -293
  278. package/lib/server/launchApp.js +0 -91
  279. package/lib/server/macEditingCommands.js +0 -139
  280. package/lib/server/network.js +0 -617
  281. package/lib/server/page.js +0 -873
  282. package/lib/server/pipeTransport.js +0 -85
  283. package/lib/server/playwright.js +0 -88
  284. package/lib/server/progress.js +0 -99
  285. package/lib/server/protocolError.js +0 -49
  286. package/lib/server/recorder/contextRecorder.js +0 -299
  287. package/lib/server/recorder/recorderApp.js +0 -187
  288. package/lib/server/recorder/recorderCollection.js +0 -116
  289. package/lib/server/recorder/recorderFrontend.js +0 -5
  290. package/lib/server/recorder/recorderInTraceViewer.js +0 -144
  291. package/lib/server/recorder/recorderRunner.js +0 -155
  292. package/lib/server/recorder/recorderUtils.js +0 -113
  293. package/lib/server/recorder/throttledFile.js +0 -46
  294. package/lib/server/recorder.js +0 -364
  295. package/lib/server/registry/browserFetcher.js +0 -168
  296. package/lib/server/registry/dependencies.js +0 -322
  297. package/lib/server/registry/index.js +0 -1052
  298. package/lib/server/registry/nativeDeps.js +0 -493
  299. package/lib/server/registry/oopDownloadBrowserMain.js +0 -138
  300. package/lib/server/screenshotter.js +0 -348
  301. package/lib/server/selectors.js +0 -73
  302. package/lib/server/socksClientCertificatesInterceptor.js +0 -340
  303. package/lib/server/socksInterceptor.js +0 -100
  304. package/lib/server/trace/recorder/snapshotter.js +0 -161
  305. package/lib/server/trace/recorder/snapshotterInjected.js +0 -511
  306. package/lib/server/trace/recorder/tracing.js +0 -596
  307. package/lib/server/trace/test/inMemorySnapshotter.js +0 -93
  308. package/lib/server/trace/viewer/traceViewer.js +0 -214
  309. package/lib/server/transport.js +0 -191
  310. package/lib/server/types.js +0 -24
  311. package/lib/server/usKeyboardLayout.js +0 -555
  312. package/lib/server/webkit/webkit.js +0 -87
  313. package/lib/server/webkit/wkAccessibility.js +0 -194
  314. package/lib/server/webkit/wkBrowser.js +0 -329
  315. package/lib/server/webkit/wkConnection.js +0 -173
  316. package/lib/server/webkit/wkExecutionContext.js +0 -130
  317. package/lib/server/webkit/wkInput.js +0 -169
  318. package/lib/server/webkit/wkInterceptableRequest.js +0 -162
  319. package/lib/server/webkit/wkPage.js +0 -1225
  320. package/lib/server/webkit/wkProvisionalPage.js +0 -94
  321. package/lib/server/webkit/wkWorkers.js +0 -104
  322. package/lib/third_party/pixelmatch.js +0 -255
  323. package/lib/utils/ascii.js +0 -31
  324. package/lib/utils/comparators.js +0 -153
  325. package/lib/utils/crypto.js +0 -171
  326. package/lib/utils/debug.js +0 -46
  327. package/lib/utils/debugLogger.js +0 -91
  328. package/lib/utils/env.js +0 -49
  329. package/lib/utils/eventsHelper.js +0 -38
  330. package/lib/utils/expectUtils.js +0 -33
  331. package/lib/utils/fileUtils.js +0 -205
  332. package/lib/utils/happy-eyeballs.js +0 -194
  333. package/lib/utils/headers.js +0 -52
  334. package/lib/utils/hostPlatform.js +0 -139
  335. package/lib/utils/httpServer.js +0 -237
  336. package/lib/utils/index.js +0 -368
  337. package/lib/utils/isomorphic/ariaSnapshot.js +0 -267
  338. package/lib/utils/isomorphic/cssParser.js +0 -250
  339. package/lib/utils/isomorphic/cssTokenizer.js +0 -979
  340. package/lib/utils/isomorphic/locatorGenerators.js +0 -660
  341. package/lib/utils/isomorphic/locatorParser.js +0 -179
  342. package/lib/utils/isomorphic/locatorUtils.js +0 -62
  343. package/lib/utils/isomorphic/mimeType.js +0 -29
  344. package/lib/utils/isomorphic/recorderUtils.js +0 -227
  345. package/lib/utils/isomorphic/selectorParser.js +0 -397
  346. package/lib/utils/isomorphic/stringUtils.js +0 -169
  347. package/lib/utils/isomorphic/traceUtils.js +0 -39
  348. package/lib/utils/isomorphic/urlMatch.js +0 -124
  349. package/lib/utils/linuxUtils.js +0 -78
  350. package/lib/utils/manualPromise.js +0 -109
  351. package/lib/utils/multimap.js +0 -75
  352. package/lib/utils/network.js +0 -160
  353. package/lib/utils/processLauncher.js +0 -248
  354. package/lib/utils/profiler.js +0 -53
  355. package/lib/utils/rtti.js +0 -44
  356. package/lib/utils/semaphore.js +0 -51
  357. package/lib/utils/sequence.js +0 -64
  358. package/lib/utils/spawnAsync.js +0 -45
  359. package/lib/utils/stackTrace.js +0 -134
  360. package/lib/utils/task.js +0 -58
  361. package/lib/utils/time.js +0 -37
  362. package/lib/utils/timeoutRunner.js +0 -66
  363. package/lib/utils/traceUtils.js +0 -44
  364. package/lib/utils/userAgent.js +0 -105
  365. package/lib/utils/wsServer.js +0 -127
  366. package/lib/utils/zipFile.js +0 -75
  367. package/lib/utils/zones.js +0 -71
  368. package/lib/utilsBundleImpl/index.js +0 -210
  369. package/lib/vite/recorder/assets/codeMirrorModule-C5j27SYZ.js +0 -24
  370. package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +0 -1
  371. package/lib/vite/recorder/assets/index-iA1aAGZg.css +0 -1
  372. package/lib/vite/recorder/assets/index-m0XdVJHe.js +0 -184
  373. package/lib/vite/traceViewer/assets/codeMirrorModule-BBCX0spr.js +0 -24
  374. package/lib/vite/traceViewer/assets/inspectorTab-B4Iw34Ow.js +0 -68
  375. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +0 -1
  376. package/lib/vite/traceViewer/assets/workbench-DFlGYqou.js +0 -9
  377. package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +0 -9
  378. package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +0 -1
  379. package/lib/vite/traceViewer/embedded.CmarehFk.js +0 -2
  380. package/lib/vite/traceViewer/embedded.html +0 -18
  381. package/lib/vite/traceViewer/embedded.w7WN2u1R.css +0 -1
  382. package/lib/vite/traceViewer/index.CrbWWHbf.css +0 -1
  383. package/lib/vite/traceViewer/index.FBucu_gE.js +0 -2
  384. package/lib/vite/traceViewer/inspectorTab.DEOUW62d.css +0 -1
  385. package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  386. package/lib/vite/traceViewer/recorder.CW_rzcEp.js +0 -2
  387. package/lib/vite/traceViewer/recorder.html +0 -17
  388. package/lib/vite/traceViewer/uiMode.CDUVjusr.js +0 -5
  389. package/lib/vite/traceViewer/uiMode.voC1ZiOQ.css +0 -1
  390. package/lib/vite/traceViewer/workbench.C-zR9ysA.css +0 -1
  391. package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +0 -32
  392. package/lib/zipBundle.js +0 -25
  393. package/lib/zipBundleImpl.js +0 -5
@@ -1,1225 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.WKPage = void 0;
7
- var _path = _interopRequireDefault(require("path"));
8
- var _os = _interopRequireDefault(require("os"));
9
- var _utilsBundle = require("../../utilsBundle");
10
- var _stackTrace = require("../../utils/stackTrace");
11
- var _utils = require("../../utils");
12
- var _hostPlatform = require("../../utils/hostPlatform");
13
- var dialog = _interopRequireWildcard(require("../dialog"));
14
- var dom = _interopRequireWildcard(require("../dom"));
15
- var _eventsHelper = require("../../utils/eventsHelper");
16
- var _helper = require("../helper");
17
- var network = _interopRequireWildcard(require("../network"));
18
- var _page = require("../page");
19
- var _wkAccessibility = require("./wkAccessibility");
20
- var _wkConnection = require("./wkConnection");
21
- var _wkExecutionContext = require("./wkExecutionContext");
22
- var _wkInput = require("./wkInput");
23
- var _wkInterceptableRequest = require("./wkInterceptableRequest");
24
- var _wkProvisionalPage = require("./wkProvisionalPage");
25
- var _wkWorkers = require("./wkWorkers");
26
- var _debugLogger = require("../../utils/debugLogger");
27
- var _manualPromise = require("../../utils/manualPromise");
28
- var _browserContext = require("../browserContext");
29
- var _errors = require("../errors");
30
- 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); }
31
- 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 && Object.prototype.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; }
32
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
- /**
34
- * Copyright 2017 Google Inc. All rights reserved.
35
- * Modifications copyright (c) Microsoft Corporation.
36
- *
37
- * Licensed under the Apache License, Version 2.0 (the "License");
38
- * you may not use this file except in compliance with the License.
39
- * You may obtain a copy of the License at
40
- *
41
- * http://www.apache.org/licenses/LICENSE-2.0
42
- *
43
- * Unless required by applicable law or agreed to in writing, software
44
- * distributed under the License is distributed on an "AS IS" BASIS,
45
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
46
- * See the License for the specific language governing permissions and
47
- * limitations under the License.
48
- */
49
-
50
- const UTILITY_WORLD_NAME = '__playwright_utility_world__';
51
- class WKPage {
52
- constructor(browserContext, pageProxySession, opener) {
53
- this.rawMouse = void 0;
54
- this.rawKeyboard = void 0;
55
- this.rawTouchscreen = void 0;
56
- this._session = void 0;
57
- this._provisionalPage = null;
58
- this._page = void 0;
59
- this._pagePromise = new _manualPromise.ManualPromise();
60
- this._pageProxySession = void 0;
61
- this._opener = void 0;
62
- this._requestIdToRequest = new Map();
63
- this._requestIdToRequestWillBeSentEvent = new Map();
64
- this._workers = void 0;
65
- this._contextIdToContext = void 0;
66
- this._sessionListeners = [];
67
- this._eventListeners = void 0;
68
- this._browserContext = void 0;
69
- this._initializedPage = null;
70
- this._firstNonInitialNavigationCommittedPromise = void 0;
71
- this._firstNonInitialNavigationCommittedFulfill = () => {};
72
- this._firstNonInitialNavigationCommittedReject = e => {};
73
- this._lastConsoleMessage = null;
74
- this._requestIdToResponseReceivedPayloadEvent = new Map();
75
- // Holds window features for the next popup being opened via window.open,
76
- // until the popup page proxy arrives.
77
- this._nextWindowOpenPopupFeatures = void 0;
78
- this._recordingVideoFile = null;
79
- this._screencastGeneration = 0;
80
- this._pageProxySession = pageProxySession;
81
- this._opener = opener;
82
- this.rawKeyboard = new _wkInput.RawKeyboardImpl(pageProxySession);
83
- this.rawMouse = new _wkInput.RawMouseImpl(pageProxySession);
84
- this.rawTouchscreen = new _wkInput.RawTouchscreenImpl(pageProxySession);
85
- this._contextIdToContext = new Map();
86
- this._page = new _page.Page(this, browserContext);
87
- this.rawMouse.setPage(this._page);
88
- this._workers = new _wkWorkers.WKWorkers(this._page);
89
- this._session = undefined;
90
- this._browserContext = browserContext;
91
- this._page.on(_page.Page.Events.FrameDetached, frame => this._removeContextsForFrame(frame, false));
92
- this._eventListeners = [_eventsHelper.eventsHelper.addEventListener(this._pageProxySession, 'Target.targetCreated', this._onTargetCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._pageProxySession, 'Target.targetDestroyed', this._onTargetDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._pageProxySession, 'Target.dispatchMessageFromTarget', this._onDispatchMessageFromTarget.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._pageProxySession, 'Target.didCommitProvisionalTarget', this._onDidCommitProvisionalTarget.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._pageProxySession, 'Screencast.screencastFrame', this._onScreencastFrame.bind(this))];
93
- this._firstNonInitialNavigationCommittedPromise = new Promise((f, r) => {
94
- this._firstNonInitialNavigationCommittedFulfill = f;
95
- this._firstNonInitialNavigationCommittedReject = r;
96
- });
97
- if (opener && !browserContext._options.noDefaultViewport && opener._nextWindowOpenPopupFeatures) {
98
- const viewportSize = _helper.helper.getViewportSizeFromWindowFeatures(opener._nextWindowOpenPopupFeatures);
99
- opener._nextWindowOpenPopupFeatures = undefined;
100
- if (viewportSize) this._page._emulatedSize = {
101
- viewport: viewportSize,
102
- screen: viewportSize
103
- };
104
- }
105
- }
106
- potentiallyUninitializedPage() {
107
- return this._page;
108
- }
109
- async _initializePageProxySession() {
110
- if (this._page._browserContext.isSettingStorageState()) return;
111
- const promises = [this._pageProxySession.send('Dialog.enable'), this._pageProxySession.send('Emulation.setActiveAndFocused', {
112
- active: true
113
- })];
114
- const contextOptions = this._browserContext._options;
115
- if (contextOptions.javaScriptEnabled === false) promises.push(this._pageProxySession.send('Emulation.setJavaScriptEnabled', {
116
- enabled: false
117
- }));
118
- promises.push(this._updateViewport());
119
- promises.push(this.updateHttpCredentials());
120
- if (this._browserContext._permissions.size) {
121
- for (const [key, value] of this._browserContext._permissions) promises.push(this._grantPermissions(key, value));
122
- }
123
- if (this._browserContext._options.recordVideo) {
124
- const outputFile = _path.default.join(this._browserContext._options.recordVideo.dir, (0, _utils.createGuid)() + '.webm');
125
- promises.push(this._browserContext._ensureVideosPath().then(() => {
126
- return this._startVideo({
127
- // validateBrowserContextOptions ensures correct video size.
128
- ...this._browserContext._options.recordVideo.size,
129
- outputFile
130
- });
131
- }));
132
- }
133
- await Promise.all(promises);
134
- }
135
- _setSession(session) {
136
- _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
137
- this._session = session;
138
- this.rawKeyboard.setSession(session);
139
- this.rawMouse.setSession(session);
140
- this._addSessionListeners();
141
- this._workers.setSession(session);
142
- }
143
-
144
- // This method is called for provisional targets as well. The session passed as the parameter
145
- // may be different from the current session and may be destroyed without becoming current.
146
- async _initializeSession(session, provisional, resourceTreeHandler) {
147
- await this._initializeSessionMayThrow(session, resourceTreeHandler).catch(e => {
148
- // Provisional session can be disposed at any time, for example due to new navigation initiating
149
- // a new provisional page.
150
- if (provisional && session.isDisposed()) return;
151
- // Swallow initialization errors due to newer target swap in,
152
- // since we will reinitialize again.
153
- if (this._session === session) throw e;
154
- });
155
- }
156
- async _initializeSessionMayThrow(session, resourceTreeHandler) {
157
- const [, frameTree] = await Promise.all([
158
- // Page agent must be enabled before Runtime.
159
- session.send('Page.enable'), session.send('Page.getResourceTree')]);
160
- resourceTreeHandler(frameTree);
161
- const promises = [
162
- // Resource tree should be received before first execution context.
163
- session.send('Runtime.enable'), session.send('Runtime.addBinding', {
164
- name: _page.PageBinding.kPlaywrightBinding
165
- }), session.send('Page.createUserWorld', {
166
- name: UTILITY_WORLD_NAME
167
- }).catch(_ => {}),
168
- // Worlds are per-process
169
- session.send('Console.enable'), session.send('Network.enable'), this._workers.initializeSession(session)];
170
- if (this._page.needsRequestInterception()) {
171
- promises.push(session.send('Network.setInterceptionEnabled', {
172
- enabled: true
173
- }));
174
- promises.push(session.send('Network.setResourceCachingDisabled', {
175
- disabled: true
176
- }));
177
- promises.push(session.send('Network.addInterception', {
178
- url: '.*',
179
- stage: 'request',
180
- isRegex: true
181
- }));
182
- }
183
- if (this._page._browserContext.isSettingStorageState()) {
184
- await Promise.all(promises);
185
- return;
186
- }
187
- const contextOptions = this._browserContext._options;
188
- if (contextOptions.userAgent) promises.push(this.updateUserAgent());
189
- const emulatedMedia = this._page.emulatedMedia();
190
- if (emulatedMedia.media || emulatedMedia.colorScheme || emulatedMedia.reducedMotion || emulatedMedia.forcedColors) promises.push(WKPage._setEmulateMedia(session, emulatedMedia.media, emulatedMedia.colorScheme, emulatedMedia.reducedMotion, emulatedMedia.forcedColors));
191
- const bootstrapScript = this._calculateBootstrapScript();
192
- if (bootstrapScript.length) promises.push(session.send('Page.setBootstrapScript', {
193
- source: bootstrapScript
194
- }));
195
- this._page.frames().map(frame => frame.evaluateExpression(bootstrapScript).catch(e => {}));
196
- if (contextOptions.bypassCSP) promises.push(session.send('Page.setBypassCSP', {
197
- enabled: true
198
- }));
199
- const emulatedSize = this._page.emulatedSize();
200
- if (emulatedSize) {
201
- promises.push(session.send('Page.setScreenSizeOverride', {
202
- width: emulatedSize.screen.width,
203
- height: emulatedSize.screen.height
204
- }));
205
- }
206
- promises.push(this.updateEmulateMedia());
207
- promises.push(session.send('Network.setExtraHTTPHeaders', {
208
- headers: (0, _utils.headersArrayToObject)(this._calculateExtraHTTPHeaders(), false /* lowerCase */)
209
- }));
210
- if (contextOptions.offline) promises.push(session.send('Network.setEmulateOfflineState', {
211
- offline: true
212
- }));
213
- promises.push(session.send('Page.setTouchEmulationEnabled', {
214
- enabled: !!contextOptions.hasTouch
215
- }));
216
- if (contextOptions.timezoneId) {
217
- promises.push(session.send('Page.setTimeZone', {
218
- timeZone: contextOptions.timezoneId
219
- }).catch(e => {
220
- throw new Error(`Invalid timezone ID: ${contextOptions.timezoneId}`);
221
- }));
222
- }
223
- if (this._page.fileChooserIntercepted()) promises.push(session.send('Page.setInterceptFileChooserDialog', {
224
- enabled: true
225
- }));
226
- promises.push(session.send('Page.overrideSetting', {
227
- setting: 'DeviceOrientationEventEnabled',
228
- value: contextOptions.isMobile
229
- }));
230
- promises.push(session.send('Page.overrideSetting', {
231
- setting: 'FullScreenEnabled',
232
- value: !contextOptions.isMobile
233
- }));
234
- promises.push(session.send('Page.overrideSetting', {
235
- setting: 'NotificationsEnabled',
236
- value: !contextOptions.isMobile
237
- }));
238
- promises.push(session.send('Page.overrideSetting', {
239
- setting: 'PointerLockEnabled',
240
- value: !contextOptions.isMobile
241
- }));
242
- promises.push(session.send('Page.overrideSetting', {
243
- setting: 'InputTypeMonthEnabled',
244
- value: contextOptions.isMobile
245
- }));
246
- promises.push(session.send('Page.overrideSetting', {
247
- setting: 'InputTypeWeekEnabled',
248
- value: contextOptions.isMobile
249
- }));
250
- promises.push(session.send('Page.overrideSetting', {
251
- setting: 'FixedBackgroundsPaintRelativeToDocument',
252
- value: contextOptions.isMobile
253
- }));
254
- await Promise.all(promises);
255
- }
256
- _onDidCommitProvisionalTarget(event) {
257
- const {
258
- oldTargetId,
259
- newTargetId
260
- } = event;
261
- (0, _utils.assert)(this._provisionalPage);
262
- (0, _utils.assert)(this._provisionalPage._session.sessionId === newTargetId, 'Unknown new target: ' + newTargetId);
263
- (0, _utils.assert)(this._session.sessionId === oldTargetId, 'Unknown old target: ' + oldTargetId);
264
- const newSession = this._provisionalPage._session;
265
- this._provisionalPage.commit();
266
- this._provisionalPage.dispose();
267
- this._provisionalPage = null;
268
- this._setSession(newSession);
269
- }
270
- _onTargetDestroyed(event) {
271
- const {
272
- targetId,
273
- crashed
274
- } = event;
275
- if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) {
276
- this._maybeCancelCoopNavigationRequest(this._provisionalPage);
277
- this._provisionalPage._session.dispose();
278
- this._provisionalPage.dispose();
279
- this._provisionalPage = null;
280
- } else if (this._session.sessionId === targetId) {
281
- this._session.dispose();
282
- _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
283
- if (crashed) {
284
- this._session.markAsCrashed();
285
- this._page._didCrash();
286
- }
287
- }
288
- }
289
- didClose() {
290
- this._pageProxySession.dispose();
291
- _eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
292
- _eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
293
- if (this._session) this._session.dispose();
294
- if (this._provisionalPage) {
295
- this._provisionalPage._session.dispose();
296
- this._provisionalPage.dispose();
297
- this._provisionalPage = null;
298
- }
299
- this._firstNonInitialNavigationCommittedReject(new _errors.TargetClosedError());
300
- this._page._didClose();
301
- }
302
- dispatchMessageToSession(message) {
303
- this._pageProxySession.dispatchMessage(message);
304
- }
305
- handleProvisionalLoadFailed(event) {
306
- if (!this._initializedPage) {
307
- this._firstNonInitialNavigationCommittedReject(new Error('Initial load failed'));
308
- return;
309
- }
310
- if (!this._provisionalPage) return;
311
- let errorText = event.error;
312
- if (errorText.includes('cancelled')) errorText += '; maybe frame was detached?';
313
- this._page._frameManager.frameAbortedNavigation(this._page.mainFrame()._id, errorText, event.loaderId);
314
- }
315
- handleWindowOpen(event) {
316
- (0, _utils.debugAssert)(!this._nextWindowOpenPopupFeatures);
317
- this._nextWindowOpenPopupFeatures = event.windowFeatures;
318
- }
319
- async pageOrError() {
320
- return this._pagePromise;
321
- }
322
- async _onTargetCreated(event) {
323
- const {
324
- targetInfo
325
- } = event;
326
- const session = new _wkConnection.WKSession(this._pageProxySession.connection, targetInfo.targetId, message => {
327
- this._pageProxySession.send('Target.sendMessageToTarget', {
328
- message: JSON.stringify(message),
329
- targetId: targetInfo.targetId
330
- }).catch(e => {
331
- session.dispatchMessage({
332
- id: message.id,
333
- error: {
334
- message: e.message
335
- }
336
- });
337
- });
338
- });
339
- (0, _utils.assert)(targetInfo.type === 'page', 'Only page targets are expected in WebKit, received: ' + targetInfo.type);
340
- if (!targetInfo.isProvisional) {
341
- (0, _utils.assert)(!this._initializedPage);
342
- let pageOrError;
343
- try {
344
- this._setSession(session);
345
- await Promise.all([this._initializePageProxySession(), this._initializeSession(session, false, ({
346
- frameTree
347
- }) => this._handleFrameTree(frameTree))]);
348
- pageOrError = this._page;
349
- } catch (e) {
350
- pageOrError = e;
351
- }
352
- if (targetInfo.isPaused) this._pageProxySession.sendMayFail('Target.resume', {
353
- targetId: targetInfo.targetId
354
- });
355
- if (pageOrError instanceof _page.Page && this._page.mainFrame().url() === '') {
356
- try {
357
- // Initial empty page has an empty url. We should wait until the first real url has been loaded,
358
- // even if that url is about:blank. This is especially important for popups, where we need the
359
- // actual url before interacting with it.
360
- await this._firstNonInitialNavigationCommittedPromise;
361
- } catch (e) {
362
- pageOrError = e;
363
- }
364
- } else {
365
- // Avoid rejection on disconnect.
366
- this._firstNonInitialNavigationCommittedPromise.catch(() => {});
367
- }
368
- await this._page.initOpener(this._opener);
369
- // Note: it is important to call |reportAsNew| before resolving pageOrError promise,
370
- // so that anyone who awaits pageOrError got a ready and reported page.
371
- this._initializedPage = pageOrError instanceof _page.Page ? pageOrError : null;
372
- this._page.reportAsNew(pageOrError instanceof _page.Page ? undefined : pageOrError);
373
- this._pagePromise.resolve(pageOrError);
374
- } else {
375
- (0, _utils.assert)(targetInfo.isProvisional);
376
- (0, _utils.assert)(!this._provisionalPage);
377
- this._provisionalPage = new _wkProvisionalPage.WKProvisionalPage(session, this);
378
- if (targetInfo.isPaused) {
379
- this._provisionalPage.initializationPromise.then(() => {
380
- this._pageProxySession.sendMayFail('Target.resume', {
381
- targetId: targetInfo.targetId
382
- });
383
- });
384
- }
385
- }
386
- }
387
- _onDispatchMessageFromTarget(event) {
388
- const {
389
- targetId,
390
- message
391
- } = event;
392
- if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) this._provisionalPage._session.dispatchMessage(JSON.parse(message));else if (this._session.sessionId === targetId) this._session.dispatchMessage(JSON.parse(message));else throw new Error('Unknown target: ' + targetId);
393
- }
394
- _addSessionListeners() {
395
- this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameNavigated', event => this._onFrameNavigated(event.frame, false)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.navigatedWithinDocument', event => this._onFrameNavigatedWithinDocument(event.frameId, event.url)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameAttached', event => this._onFrameAttached(event.frameId, event.parentFrameId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameDetached', event => this._onFrameDetached(event.frameId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.willCheckNavigationPolicy', event => this._onWillCheckNavigationPolicy(event.frameId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.didCheckNavigationPolicy', event => this._onDidCheckNavigationPolicy(event.frameId, event.cancel)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameScheduledNavigation', event => this._onFrameScheduledNavigation(event.frameId, event.delay, event.targetIsCurrentFrame)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.loadEventFired', event => this._page._frameManager.frameLifecycleEvent(event.frameId, 'load')), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.domContentEventFired', event => this._page._frameManager.frameLifecycleEvent(event.frameId, 'domcontentloaded')), _eventsHelper.eventsHelper.addEventListener(this._session, 'Runtime.executionContextCreated', event => this._onExecutionContextCreated(event.context)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Runtime.bindingCalled', event => this._onBindingCalled(event.contextId, event.argument)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Console.messageAdded', event => this._onConsoleMessage(event)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Console.messageRepeatCountUpdated', event => this._onConsoleRepeatCountUpdated(event)), _eventsHelper.eventsHelper.addEventListener(this._pageProxySession, 'Dialog.javascriptDialogOpening', event => this._onDialog(event)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.fileChooserOpened', event => this._onFileChooserOpened(event)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.requestWillBeSent', e => this._onRequestWillBeSent(this._session, e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.requestIntercepted', e => this._onRequestIntercepted(this._session, e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.responseReceived', e => this._onResponseReceived(this._session, e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.loadingFinished', e => this._onLoadingFinished(e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.loadingFailed', e => this._onLoadingFailed(this._session, e)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketCreated', e => this._page._frameManager.onWebSocketCreated(e.requestId, e.url)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketWillSendHandshakeRequest', e => this._page._frameManager.onWebSocketRequest(e.requestId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketHandshakeResponseReceived', e => this._page._frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketFrameSent', e => e.response.payloadData && this._page._frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketFrameReceived', e => e.response.payloadData && this._page._frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketClosed', e => this._page._frameManager.webSocketClosed(e.requestId)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Network.webSocketFrameError', e => this._page._frameManager.webSocketError(e.requestId, e.errorMessage))];
396
- }
397
- async _updateState(method, params) {
398
- await this._forAllSessions(session => session.send(method, params).then());
399
- }
400
- async _forAllSessions(callback) {
401
- const sessions = [this._session];
402
- // If the state changes during provisional load, push it to the provisional page
403
- // as well to always be in sync with the backend.
404
- if (this._provisionalPage) sessions.push(this._provisionalPage._session);
405
- await Promise.all(sessions.map(session => callback(session).catch(e => {})));
406
- }
407
- _onWillCheckNavigationPolicy(frameId) {
408
- // It may happen that new policy check occurs while there is an ongoing
409
- // provisional load, in this case it should be safe to ignore it as it will
410
- // either:
411
- // - end up canceled, e.g. ctrl+click opening link in new tab, having no effect
412
- // on this page
413
- // - start new provisional load which we will miss in our signal trackers but
414
- // we certainly won't hang waiting for it to finish and there is high chance
415
- // that the current provisional page will commit navigation canceling the new
416
- // one.
417
- if (this._provisionalPage) return;
418
- this._page._frameManager.frameRequestedNavigation(frameId);
419
- }
420
- _onDidCheckNavigationPolicy(frameId, cancel) {
421
- if (!cancel) return;
422
- // This is a cross-process navigation that is canceled in the original page and continues in
423
- // the provisional page. Bail out as we are tracking it.
424
- if (this._provisionalPage) return;
425
- this._page._frameManager.frameAbortedNavigation(frameId, 'Navigation canceled by policy check');
426
- }
427
- _onFrameScheduledNavigation(frameId, delay, targetIsCurrentFrame) {
428
- if (targetIsCurrentFrame) this._page._frameManager.frameRequestedNavigation(frameId);
429
- }
430
- _handleFrameTree(frameTree) {
431
- this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId || null);
432
- this._onFrameNavigated(frameTree.frame, true);
433
- this._page._frameManager.frameLifecycleEvent(frameTree.frame.id, 'domcontentloaded');
434
- this._page._frameManager.frameLifecycleEvent(frameTree.frame.id, 'load');
435
- if (!frameTree.childFrames) return;
436
- for (const child of frameTree.childFrames) this._handleFrameTree(child);
437
- }
438
- _onFrameAttached(frameId, parentFrameId) {
439
- return this._page._frameManager.frameAttached(frameId, parentFrameId);
440
- }
441
- _onFrameNavigated(framePayload, initial) {
442
- const frame = this._page._frameManager.frame(framePayload.id);
443
- (0, _utils.assert)(frame);
444
- this._removeContextsForFrame(frame, true);
445
- if (!framePayload.parentId) this._workers.clear();
446
- this._page._frameManager.frameCommittedNewDocumentNavigation(framePayload.id, framePayload.url, framePayload.name || '', framePayload.loaderId, initial);
447
- if (!initial) this._firstNonInitialNavigationCommittedFulfill();
448
- }
449
- _onFrameNavigatedWithinDocument(frameId, url) {
450
- this._page._frameManager.frameCommittedSameDocumentNavigation(frameId, url);
451
- }
452
- _onFrameDetached(frameId) {
453
- this._page._frameManager.frameDetached(frameId);
454
- }
455
- _removeContextsForFrame(frame, notifyFrame) {
456
- for (const [contextId, context] of this._contextIdToContext) {
457
- if (context.frame === frame) {
458
- this._contextIdToContext.delete(contextId);
459
- if (notifyFrame) frame._contextDestroyed(context);
460
- }
461
- }
462
- }
463
- _onExecutionContextCreated(contextPayload) {
464
- if (this._contextIdToContext.has(contextPayload.id)) return;
465
- const frame = this._page._frameManager.frame(contextPayload.frameId);
466
- if (!frame) return;
467
- const delegate = new _wkExecutionContext.WKExecutionContext(this._session, contextPayload.id);
468
- let worldName = null;
469
- if (contextPayload.type === 'normal') worldName = 'main';else if (contextPayload.type === 'user' && contextPayload.name === UTILITY_WORLD_NAME) worldName = 'utility';
470
- const context = new dom.FrameExecutionContext(delegate, frame, worldName);
471
- context[contextDelegateSymbol] = delegate;
472
- if (worldName) frame._contextCreated(worldName, context);
473
- this._contextIdToContext.set(contextPayload.id, context);
474
- }
475
- async _onBindingCalled(contextId, argument) {
476
- const pageOrError = await this.pageOrError();
477
- if (!(pageOrError instanceof Error)) {
478
- const context = this._contextIdToContext.get(contextId);
479
- if (context) await this._page._onBindingCalled(argument, context);
480
- }
481
- }
482
- async navigateFrame(frame, url, referrer) {
483
- if (this._pageProxySession.isDisposed()) throw new _errors.TargetClosedError();
484
- const pageProxyId = this._pageProxySession.sessionId;
485
- const result = await this._pageProxySession.connection.browserSession.send('Playwright.navigate', {
486
- url,
487
- pageProxyId,
488
- frameId: frame._id,
489
- referrer
490
- });
491
- return {
492
- newDocumentId: result.loaderId
493
- };
494
- }
495
- _onConsoleMessage(event) {
496
- // Note: do no introduce await in this function, otherwise we lose the ordering.
497
- // For example, frame.setContent relies on this.
498
- const {
499
- type,
500
- level,
501
- text,
502
- parameters,
503
- url,
504
- line: lineNumber,
505
- column: columnNumber,
506
- source
507
- } = event.message;
508
- if (level === 'error' && source === 'javascript') {
509
- const {
510
- name,
511
- message
512
- } = (0, _stackTrace.splitErrorMessage)(text);
513
- let stack;
514
- if (event.message.stackTrace) {
515
- stack = text + '\n' + event.message.stackTrace.callFrames.map(callFrame => {
516
- return ` at ${callFrame.functionName || 'unknown'} (${callFrame.url}:${callFrame.lineNumber}:${callFrame.columnNumber})`;
517
- }).join('\n');
518
- } else {
519
- stack = '';
520
- }
521
- this._lastConsoleMessage = null;
522
- const error = new Error(message);
523
- error.stack = stack;
524
- error.name = name;
525
- this._page.emitOnContextOnceInitialized(_browserContext.BrowserContext.Events.PageError, error, this._page);
526
- return;
527
- }
528
- let derivedType = type || '';
529
- if (type === 'log') derivedType = level;else if (type === 'timing') derivedType = 'timeEnd';
530
- const handles = [];
531
- for (const p of parameters || []) {
532
- let context;
533
- if (p.objectId) {
534
- const objectId = JSON.parse(p.objectId);
535
- context = this._contextIdToContext.get(objectId.injectedScriptId);
536
- } else {
537
- // Pick any context if the parameter is a value.
538
- context = [...this._contextIdToContext.values()].find(c => c.frame === this._page.mainFrame());
539
- }
540
- if (!context) return;
541
- handles.push(context.createHandle(p));
542
- }
543
- this._lastConsoleMessage = {
544
- derivedType,
545
- text,
546
- handles,
547
- count: 0,
548
- location: {
549
- url: url || '',
550
- lineNumber: (lineNumber || 1) - 1,
551
- columnNumber: (columnNumber || 1) - 1
552
- }
553
- };
554
- this._onConsoleRepeatCountUpdated({
555
- count: 1
556
- });
557
- }
558
- _onConsoleRepeatCountUpdated(event) {
559
- if (this._lastConsoleMessage) {
560
- const {
561
- derivedType,
562
- text,
563
- handles,
564
- count,
565
- location
566
- } = this._lastConsoleMessage;
567
- for (let i = count; i < event.count; ++i) this._page._addConsoleMessage(derivedType, handles, location, handles.length ? undefined : text);
568
- this._lastConsoleMessage.count = event.count;
569
- }
570
- }
571
- _onDialog(event) {
572
- this._page.emitOnContext(_browserContext.BrowserContext.Events.Dialog, new dialog.Dialog(this._page, event.type, event.message, async (accept, promptText) => {
573
- // TODO: this should actually be a RDP event that notifies about a cancelled navigation attempt.
574
- if (event.type === 'beforeunload' && !accept) this._page._frameManager.frameAbortedNavigation(this._page.mainFrame()._id, 'navigation cancelled by beforeunload dialog');
575
- await this._pageProxySession.send('Dialog.handleJavaScriptDialog', {
576
- accept,
577
- promptText
578
- });
579
- }, event.defaultPrompt));
580
- }
581
- async _onFileChooserOpened(event) {
582
- let handle;
583
- try {
584
- const context = await this._page._frameManager.frame(event.frameId)._mainContext();
585
- handle = context.createHandle(event.element).asElement();
586
- } catch (e) {
587
- // During async processing, frame/context may go away. We should not throw.
588
- return;
589
- }
590
- await this._page._onFileChooserOpened(handle);
591
- }
592
- static async _setEmulateMedia(session, mediaType, colorScheme, reducedMotion, forcedColors) {
593
- const promises = [];
594
- promises.push(session.send('Page.setEmulatedMedia', {
595
- media: mediaType === 'no-override' ? '' : mediaType
596
- }));
597
- let appearance = undefined;
598
- switch (colorScheme) {
599
- case 'light':
600
- appearance = 'Light';
601
- break;
602
- case 'dark':
603
- appearance = 'Dark';
604
- break;
605
- case 'no-override':
606
- appearance = undefined;
607
- break;
608
- }
609
- promises.push(session.send('Page.overrideUserPreference', {
610
- name: 'PrefersColorScheme',
611
- value: appearance
612
- }));
613
- let reducedMotionWk = undefined;
614
- switch (reducedMotion) {
615
- case 'reduce':
616
- reducedMotionWk = 'Reduce';
617
- break;
618
- case 'no-preference':
619
- reducedMotionWk = 'NoPreference';
620
- break;
621
- case 'no-override':
622
- reducedMotionWk = undefined;
623
- break;
624
- }
625
- promises.push(session.send('Page.overrideUserPreference', {
626
- name: 'PrefersReducedMotion',
627
- value: reducedMotionWk
628
- }));
629
- let forcedColorsWk = undefined;
630
- switch (forcedColors) {
631
- case 'active':
632
- forcedColorsWk = 'Active';
633
- break;
634
- case 'none':
635
- forcedColorsWk = 'None';
636
- break;
637
- case 'no-override':
638
- forcedColorsWk = undefined;
639
- break;
640
- }
641
- promises.push(session.send('Page.setForcedColors', {
642
- forcedColors: forcedColorsWk
643
- }));
644
- await Promise.all(promises);
645
- }
646
- async updateExtraHTTPHeaders() {
647
- await this._updateState('Network.setExtraHTTPHeaders', {
648
- headers: (0, _utils.headersArrayToObject)(this._calculateExtraHTTPHeaders(), false /* lowerCase */)
649
- });
650
- }
651
- _calculateExtraHTTPHeaders() {
652
- const locale = this._browserContext._options.locale;
653
- const headers = network.mergeHeaders([this._browserContext._options.extraHTTPHeaders, this._page.extraHTTPHeaders(), locale ? network.singleHeader('Accept-Language', locale) : undefined]);
654
- return headers;
655
- }
656
- async updateEmulateMedia() {
657
- const emulatedMedia = this._page.emulatedMedia();
658
- const colorScheme = emulatedMedia.colorScheme;
659
- const reducedMotion = emulatedMedia.reducedMotion;
660
- const forcedColors = emulatedMedia.forcedColors;
661
- await this._forAllSessions(session => WKPage._setEmulateMedia(session, emulatedMedia.media, colorScheme, reducedMotion, forcedColors));
662
- }
663
- async updateEmulatedViewportSize() {
664
- this._browserContext._validateEmulatedViewport(this._page.viewportSize());
665
- await this._updateViewport();
666
- }
667
- async updateUserAgent() {
668
- const contextOptions = this._browserContext._options;
669
- this._updateState('Page.overrideUserAgent', {
670
- value: contextOptions.userAgent
671
- });
672
- }
673
- async bringToFront() {
674
- this._pageProxySession.send('Target.activate', {
675
- targetId: this._session.sessionId
676
- });
677
- }
678
- async _updateViewport() {
679
- const options = this._browserContext._options;
680
- const deviceSize = this._page.emulatedSize();
681
- if (deviceSize === null) return;
682
- const viewportSize = deviceSize.viewport;
683
- const screenSize = deviceSize.screen;
684
- const promises = [this._pageProxySession.send('Emulation.setDeviceMetricsOverride', {
685
- width: viewportSize.width,
686
- height: viewportSize.height,
687
- fixedLayout: !!options.isMobile,
688
- deviceScaleFactor: options.deviceScaleFactor || 1
689
- }), this._session.send('Page.setScreenSizeOverride', {
690
- width: screenSize.width,
691
- height: screenSize.height
692
- })];
693
- if (options.isMobile) {
694
- const angle = viewportSize.width > viewportSize.height ? 90 : 0;
695
- // Special handling for macOS 12.
696
- const useLegacySetOrientationOverrideMethod = _os.default.platform() === 'darwin' && parseInt(_os.default.release().split('.')[0], 10) <= 21;
697
- if (useLegacySetOrientationOverrideMethod) promises.push(this._session.send('Page.setOrientationOverride', {
698
- angle
699
- }));else promises.push(this._pageProxySession.send('Emulation.setOrientationOverride', {
700
- angle
701
- }));
702
- }
703
- await Promise.all(promises);
704
- }
705
- async updateRequestInterception() {
706
- const enabled = this._page.needsRequestInterception();
707
- await Promise.all([this._updateState('Network.setInterceptionEnabled', {
708
- enabled
709
- }), this._updateState('Network.setResourceCachingDisabled', {
710
- disabled: enabled
711
- }), this._updateState('Network.addInterception', {
712
- url: '.*',
713
- stage: 'request',
714
- isRegex: true
715
- })]);
716
- }
717
- async updateOffline() {
718
- await this._updateState('Network.setEmulateOfflineState', {
719
- offline: !!this._browserContext._options.offline
720
- });
721
- }
722
- async updateHttpCredentials() {
723
- const credentials = this._browserContext._options.httpCredentials || {
724
- username: '',
725
- password: '',
726
- origin: ''
727
- };
728
- await this._pageProxySession.send('Emulation.setAuthCredentials', {
729
- username: credentials.username,
730
- password: credentials.password,
731
- origin: credentials.origin
732
- });
733
- }
734
- async updateFileChooserInterception() {
735
- const enabled = this._page.fileChooserIntercepted();
736
- await this._session.send('Page.setInterceptFileChooserDialog', {
737
- enabled
738
- }).catch(() => {}); // target can be closed.
739
- }
740
- async reload() {
741
- await this._session.send('Page.reload');
742
- }
743
- goBack() {
744
- return this._session.send('Page.goBack').then(() => true).catch(error => {
745
- if (error instanceof Error && error.message.includes(`Protocol error (Page.goBack): Failed to go`)) return false;
746
- throw error;
747
- });
748
- }
749
- goForward() {
750
- return this._session.send('Page.goForward').then(() => true).catch(error => {
751
- if (error instanceof Error && error.message.includes(`Protocol error (Page.goForward): Failed to go`)) return false;
752
- throw error;
753
- });
754
- }
755
- async requestGC() {
756
- await this._session.send('Heap.gc');
757
- }
758
- async addInitScript(initScript) {
759
- await this._updateBootstrapScript();
760
- }
761
- async removeNonInternalInitScripts() {
762
- await this._updateBootstrapScript();
763
- }
764
- _calculateBootstrapScript() {
765
- const scripts = [];
766
- if (!this._page.context()._options.isMobile) {
767
- scripts.push('delete window.orientation');
768
- scripts.push('delete window.ondevicemotion');
769
- scripts.push('delete window.ondeviceorientation');
770
- }
771
- scripts.push('if (!window.safari) window.safari = { pushNotification: { toString() { return "[object SafariRemoteNotification]"; } } };');
772
- scripts.push('if (!window.GestureEvent) window.GestureEvent = function GestureEvent() {};');
773
- scripts.push(...this._page.allInitScripts().map(script => script.source));
774
- return scripts.join(';\n');
775
- }
776
- async _updateBootstrapScript() {
777
- await this._updateState('Page.setBootstrapScript', {
778
- source: this._calculateBootstrapScript()
779
- });
780
- }
781
- async closePage(runBeforeUnload) {
782
- await this._stopVideo();
783
- await this._pageProxySession.sendMayFail('Target.close', {
784
- targetId: this._session.sessionId,
785
- runBeforeUnload
786
- });
787
- }
788
- async setBackgroundColor(color) {
789
- await this._session.send('Page.setDefaultBackgroundColorOverride', {
790
- color
791
- });
792
- }
793
- _toolbarHeight() {
794
- var _this$_page$_browserC;
795
- if ((_this$_page$_browserC = this._page._browserContext._browser) !== null && _this$_page$_browserC !== void 0 && _this$_page$_browserC.options.headful) return _hostPlatform.hostPlatform === 'mac10.15' ? 55 : 59;
796
- return 0;
797
- }
798
- async _startVideo(options) {
799
- (0, _utils.assert)(!this._recordingVideoFile);
800
- const {
801
- screencastId
802
- } = await this._pageProxySession.send('Screencast.startVideo', {
803
- file: options.outputFile,
804
- width: options.width,
805
- height: options.height,
806
- toolbarHeight: this._toolbarHeight()
807
- });
808
- this._recordingVideoFile = options.outputFile;
809
- this._browserContext._browser._videoStarted(this._browserContext, screencastId, options.outputFile, this.pageOrError());
810
- }
811
- async _stopVideo() {
812
- if (!this._recordingVideoFile) return;
813
- await this._pageProxySession.sendMayFail('Screencast.stopVideo');
814
- this._recordingVideoFile = null;
815
- }
816
- validateScreenshotDimension(side, omitDeviceScaleFactor) {
817
- // Cairo based implementations (Linux and Windows) have hard limit of 32767
818
- // (see https://github.com/microsoft/playwright/issues/16727).
819
- if (process.platform === 'darwin') return;
820
- if (!omitDeviceScaleFactor && this._page._browserContext._options.deviceScaleFactor) side = Math.ceil(side * this._page._browserContext._options.deviceScaleFactor);
821
- if (side > 32767) throw new Error('Cannot take screenshot larger than 32767 pixels on any dimension');
822
- }
823
- async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
824
- const rect = documentRect || viewportRect;
825
- const omitDeviceScaleFactor = scale === 'css';
826
- this.validateScreenshotDimension(rect.width, omitDeviceScaleFactor);
827
- this.validateScreenshotDimension(rect.height, omitDeviceScaleFactor);
828
- const result = await this._session.send('Page.snapshotRect', {
829
- ...rect,
830
- coordinateSystem: documentRect ? 'Page' : 'Viewport',
831
- omitDeviceScaleFactor
832
- });
833
- const prefix = 'data:image/png;base64,';
834
- let buffer = Buffer.from(result.dataURL.substr(prefix.length), 'base64');
835
- if (format === 'jpeg') buffer = _utilsBundle.jpegjs.encode(_utilsBundle.PNG.sync.read(buffer), quality).data;
836
- return buffer;
837
- }
838
- async getContentFrame(handle) {
839
- const nodeInfo = await this._session.send('DOM.describeNode', {
840
- objectId: handle._objectId
841
- });
842
- if (!nodeInfo.contentFrameId) return null;
843
- return this._page._frameManager.frame(nodeInfo.contentFrameId);
844
- }
845
- async getOwnerFrame(handle) {
846
- if (!handle._objectId) return null;
847
- const nodeInfo = await this._session.send('DOM.describeNode', {
848
- objectId: handle._objectId
849
- });
850
- return nodeInfo.ownerFrameId || null;
851
- }
852
- isElementHandle(remoteObject) {
853
- return remoteObject.subtype === 'node';
854
- }
855
- async getBoundingBox(handle) {
856
- const quads = await this.getContentQuads(handle);
857
- if (!quads || !quads.length) return null;
858
- let minX = Infinity;
859
- let maxX = -Infinity;
860
- let minY = Infinity;
861
- let maxY = -Infinity;
862
- for (const quad of quads) {
863
- for (const point of quad) {
864
- minX = Math.min(minX, point.x);
865
- maxX = Math.max(maxX, point.x);
866
- minY = Math.min(minY, point.y);
867
- maxY = Math.max(maxY, point.y);
868
- }
869
- }
870
- return {
871
- x: minX,
872
- y: minY,
873
- width: maxX - minX,
874
- height: maxY - minY
875
- };
876
- }
877
- async scrollRectIntoViewIfNeeded(handle, rect) {
878
- return await this._session.send('DOM.scrollIntoViewIfNeeded', {
879
- objectId: handle._objectId,
880
- rect
881
- }).then(() => 'done').catch(e => {
882
- if (e instanceof Error && e.message.includes('Node does not have a layout object')) return 'error:notvisible';
883
- if (e instanceof Error && e.message.includes('Node is detached from document')) return 'error:notconnected';
884
- throw e;
885
- });
886
- }
887
- async setScreencastOptions(options) {
888
- if (options) {
889
- const so = {
890
- ...options,
891
- toolbarHeight: this._toolbarHeight()
892
- };
893
- const {
894
- generation
895
- } = await this._pageProxySession.send('Screencast.startScreencast', so);
896
- this._screencastGeneration = generation;
897
- } else {
898
- await this._pageProxySession.send('Screencast.stopScreencast');
899
- }
900
- }
901
- _onScreencastFrame(event) {
902
- const generation = this._screencastGeneration;
903
- this._page.throttleScreencastFrameAck(() => {
904
- this._pageProxySession.send('Screencast.screencastFrameAck', {
905
- generation
906
- }).catch(e => _debugLogger.debugLogger.log('error', e));
907
- });
908
- const buffer = Buffer.from(event.data, 'base64');
909
- this._page.emit(_page.Page.Events.ScreencastFrame, {
910
- buffer,
911
- width: event.deviceWidth,
912
- height: event.deviceHeight
913
- });
914
- }
915
- rafCountForStablePosition() {
916
- return process.platform === 'win32' ? 5 : 1;
917
- }
918
- async getContentQuads(handle) {
919
- const result = await this._session.sendMayFail('DOM.getContentQuads', {
920
- objectId: handle._objectId
921
- });
922
- if (!result) return null;
923
- return result.quads.map(quad => [{
924
- x: quad[0],
925
- y: quad[1]
926
- }, {
927
- x: quad[2],
928
- y: quad[3]
929
- }, {
930
- x: quad[4],
931
- y: quad[5]
932
- }, {
933
- x: quad[6],
934
- y: quad[7]
935
- }]);
936
- }
937
- async setInputFiles(handle, files) {
938
- const objectId = handle._objectId;
939
- const protocolFiles = files.map(file => ({
940
- name: file.name,
941
- type: file.mimeType,
942
- data: file.buffer
943
- }));
944
- await this._session.send('DOM.setInputFiles', {
945
- objectId,
946
- files: protocolFiles
947
- });
948
- }
949
- async setInputFilePaths(handle, paths) {
950
- const pageProxyId = this._pageProxySession.sessionId;
951
- const objectId = handle._objectId;
952
- await Promise.all([this._pageProxySession.connection.browserSession.send('Playwright.grantFileReadAccess', {
953
- pageProxyId,
954
- paths
955
- }), this._session.send('DOM.setInputFiles', {
956
- objectId,
957
- paths
958
- })]);
959
- }
960
- async adoptElementHandle(handle, to) {
961
- const result = await this._session.sendMayFail('DOM.resolveNode', {
962
- objectId: handle._objectId,
963
- executionContextId: to[contextDelegateSymbol]._contextId
964
- });
965
- if (!result || result.object.subtype === 'null') throw new Error(dom.kUnableToAdoptErrorMessage);
966
- return to.createHandle(result.object);
967
- }
968
- async getAccessibilityTree(needle) {
969
- return (0, _wkAccessibility.getAccessibilityTree)(this._session, needle);
970
- }
971
- async inputActionEpilogue() {}
972
- async resetForReuse() {}
973
- async getFrameElement(frame) {
974
- const parent = frame.parentFrame();
975
- if (!parent) throw new Error('Frame has been detached.');
976
- const context = await parent._mainContext();
977
- const result = await this._session.send('DOM.resolveNode', {
978
- frameId: frame._id,
979
- executionContextId: context[contextDelegateSymbol]._contextId
980
- });
981
- if (!result || result.object.subtype === 'null') throw new Error('Frame has been detached.');
982
- return context.createHandle(result.object);
983
- }
984
- _maybeCancelCoopNavigationRequest(provisionalPage) {
985
- const navigationRequest = provisionalPage.coopNavigationRequest();
986
- for (const [requestId, request] of this._requestIdToRequest) {
987
- if (request.request === navigationRequest) {
988
- // Make sure the request completes if the provisional navigation is canceled.
989
- this._onLoadingFailed(provisionalPage._session, {
990
- requestId: requestId,
991
- errorText: 'Provisiolal navigation canceled.',
992
- timestamp: request._timestamp,
993
- canceled: true
994
- });
995
- return;
996
- }
997
- }
998
- }
999
- _adoptRequestFromNewProcess(navigationRequest, newSession, newRequestId) {
1000
- for (const [requestId, request] of this._requestIdToRequest) {
1001
- if (request.request === navigationRequest) {
1002
- this._requestIdToRequest.delete(requestId);
1003
- request.adoptRequestFromNewProcess(newSession, newRequestId);
1004
- this._requestIdToRequest.set(newRequestId, request);
1005
- return;
1006
- }
1007
- }
1008
- }
1009
- _onRequestWillBeSent(session, event) {
1010
- if (event.request.url.startsWith('data:')) return;
1011
-
1012
- // We do not support intercepting redirects.
1013
- if (this._page.needsRequestInterception() && !event.redirectResponse) this._requestIdToRequestWillBeSentEvent.set(event.requestId, event);else this._onRequest(session, event, false);
1014
- }
1015
- _onRequest(session, event, intercepted) {
1016
- let redirectedFrom = null;
1017
- if (event.redirectResponse) {
1018
- const request = this._requestIdToRequest.get(event.requestId);
1019
- // If we connect late to the target, we could have missed the requestWillBeSent event.
1020
- if (request) {
1021
- this._handleRequestRedirect(request, event.requestId, event.redirectResponse, event.timestamp);
1022
- redirectedFrom = request;
1023
- }
1024
- }
1025
- const frame = redirectedFrom ? redirectedFrom.request.frame() : this._page._frameManager.frame(event.frameId);
1026
- // sometimes we get stray network events for detached frames
1027
- // TODO(einbinder) why?
1028
- if (!frame) return;
1029
-
1030
- // TODO(einbinder) this will fail if we are an XHR document request
1031
- const isNavigationRequest = event.type === 'Document';
1032
- const documentId = isNavigationRequest ? event.loaderId : undefined;
1033
- const request = new _wkInterceptableRequest.WKInterceptableRequest(session, frame, event, redirectedFrom, documentId);
1034
- let route;
1035
- if (intercepted) {
1036
- route = new _wkInterceptableRequest.WKRouteImpl(session, event.requestId);
1037
- // There is no point in waiting for the raw headers in Network.responseReceived when intercepting.
1038
- // Use provisional headers as raw headers, so that client can call allHeaders() from the route handler.
1039
- request.request.setRawRequestHeaders(null);
1040
- }
1041
- this._requestIdToRequest.set(event.requestId, request);
1042
- this._page._frameManager.requestStarted(request.request, route);
1043
- }
1044
- _handleRequestRedirect(request, requestId, responsePayload, timestamp) {
1045
- const response = request.createResponse(responsePayload);
1046
- response._securityDetailsFinished();
1047
- response._serverAddrFinished();
1048
- response.setResponseHeadersSize(null);
1049
- response.setEncodedBodySize(null);
1050
- response._requestFinished(responsePayload.timing ? _helper.helper.secondsToRoundishMillis(timestamp - request._timestamp) : -1);
1051
- this._requestIdToRequest.delete(requestId);
1052
- this._page._frameManager.requestReceivedResponse(response);
1053
- this._page._frameManager.reportRequestFinished(request.request, response);
1054
- }
1055
- _onRequestIntercepted(session, event) {
1056
- const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
1057
- if (!requestWillBeSentEvent) {
1058
- // Intercepted, although we do not intend to allow interception.
1059
- // Just continue.
1060
- session.sendMayFail('Network.interceptWithRequest', {
1061
- requestId: event.requestId
1062
- });
1063
- return;
1064
- }
1065
- this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
1066
- this._onRequest(session, requestWillBeSentEvent, true);
1067
- }
1068
- _onResponseReceived(session, event) {
1069
- const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
1070
- if (requestWillBeSentEvent) {
1071
- this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
1072
- // We received a response, so the request won't be intercepted (e.g. it was handled by a
1073
- // service worker and we don't intercept service workers).
1074
- this._onRequest(session, requestWillBeSentEvent, false);
1075
- }
1076
- const request = this._requestIdToRequest.get(event.requestId);
1077
- // FileUpload sends a response without a matching request.
1078
- if (!request) return;
1079
- this._requestIdToResponseReceivedPayloadEvent.set(event.requestId, event);
1080
- const response = request.createResponse(event.response);
1081
- this._page._frameManager.requestReceivedResponse(response);
1082
- if (response.status() === 204 && request.request.isNavigationRequest()) {
1083
- this._onLoadingFailed(session, {
1084
- requestId: event.requestId,
1085
- errorText: 'Aborted: 204 No Content',
1086
- timestamp: event.timestamp
1087
- });
1088
- }
1089
- }
1090
- _onLoadingFinished(event) {
1091
- const request = this._requestIdToRequest.get(event.requestId);
1092
- // For certain requestIds we never receive requestWillBeSent event.
1093
- // @see https://crbug.com/750469
1094
- if (!request) return;
1095
-
1096
- // Under certain conditions we never get the Network.responseReceived
1097
- // event from protocol. @see https://crbug.com/883475
1098
- const response = request.request._existingResponse();
1099
- if (response) {
1100
- var _event$metrics, _event$metrics2, _responseReceivedPayl, _responseReceivedPayl2, _responseReceivedPayl3, _event$metrics3, _event$metrics$respon, _event$metrics4, _event$metrics$respon2, _event$metrics5;
1101
- const responseReceivedPayload = this._requestIdToResponseReceivedPayloadEvent.get(event.requestId);
1102
- response._serverAddrFinished(parseRemoteAddress(event === null || event === void 0 || (_event$metrics = event.metrics) === null || _event$metrics === void 0 ? void 0 : _event$metrics.remoteAddress));
1103
- response._securityDetailsFinished({
1104
- protocol: isLoadedSecurely(response.url(), response.timing()) ? (_event$metrics2 = event.metrics) === null || _event$metrics2 === void 0 || (_event$metrics2 = _event$metrics2.securityConnection) === null || _event$metrics2 === void 0 ? void 0 : _event$metrics2.protocol : undefined,
1105
- subjectName: responseReceivedPayload === null || responseReceivedPayload === void 0 || (_responseReceivedPayl = responseReceivedPayload.response.security) === null || _responseReceivedPayl === void 0 || (_responseReceivedPayl = _responseReceivedPayl.certificate) === null || _responseReceivedPayl === void 0 ? void 0 : _responseReceivedPayl.subject,
1106
- validFrom: responseReceivedPayload === null || responseReceivedPayload === void 0 || (_responseReceivedPayl2 = responseReceivedPayload.response.security) === null || _responseReceivedPayl2 === void 0 || (_responseReceivedPayl2 = _responseReceivedPayl2.certificate) === null || _responseReceivedPayl2 === void 0 ? void 0 : _responseReceivedPayl2.validFrom,
1107
- validTo: responseReceivedPayload === null || responseReceivedPayload === void 0 || (_responseReceivedPayl3 = responseReceivedPayload.response.security) === null || _responseReceivedPayl3 === void 0 || (_responseReceivedPayl3 = _responseReceivedPayl3.certificate) === null || _responseReceivedPayl3 === void 0 ? void 0 : _responseReceivedPayl3.validUntil
1108
- });
1109
- if ((_event$metrics3 = event.metrics) !== null && _event$metrics3 !== void 0 && _event$metrics3.protocol) response._setHttpVersion(event.metrics.protocol);
1110
- response.setEncodedBodySize((_event$metrics$respon = (_event$metrics4 = event.metrics) === null || _event$metrics4 === void 0 ? void 0 : _event$metrics4.responseBodyBytesReceived) !== null && _event$metrics$respon !== void 0 ? _event$metrics$respon : null);
1111
- response.setResponseHeadersSize((_event$metrics$respon2 = (_event$metrics5 = event.metrics) === null || _event$metrics5 === void 0 ? void 0 : _event$metrics5.responseHeaderBytesReceived) !== null && _event$metrics$respon2 !== void 0 ? _event$metrics$respon2 : null);
1112
- response._requestFinished(_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
1113
- } else {
1114
- // Use provisional headers if we didn't have the response with raw headers.
1115
- request.request.setRawRequestHeaders(null);
1116
- }
1117
- this._requestIdToResponseReceivedPayloadEvent.delete(event.requestId);
1118
- this._requestIdToRequest.delete(event.requestId);
1119
- this._page._frameManager.reportRequestFinished(request.request, response);
1120
- }
1121
- _onLoadingFailed(session, event) {
1122
- const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId);
1123
- if (requestWillBeSentEvent) {
1124
- this._requestIdToRequestWillBeSentEvent.delete(event.requestId);
1125
- // If loading failed, the request won't be intercepted (e.g. it was handled by a
1126
- // service worker and we don't intercept service workers).
1127
- this._onRequest(session, requestWillBeSentEvent, false);
1128
- }
1129
- const request = this._requestIdToRequest.get(event.requestId);
1130
- // For certain requestIds we never receive requestWillBeSent event.
1131
- // @see https://crbug.com/750469
1132
- if (!request) return;
1133
- const response = request.request._existingResponse();
1134
- if (response) {
1135
- response._serverAddrFinished();
1136
- response._securityDetailsFinished();
1137
- response.setResponseHeadersSize(null);
1138
- response.setEncodedBodySize(null);
1139
- response._requestFinished(_helper.helper.secondsToRoundishMillis(event.timestamp - request._timestamp));
1140
- } else {
1141
- // Use provisional headers if we didn't have the response with raw headers.
1142
- request.request.setRawRequestHeaders(null);
1143
- }
1144
- this._requestIdToRequest.delete(event.requestId);
1145
- request.request._setFailureText(event.errorText);
1146
- this._page._frameManager.requestFailed(request.request, event.errorText.includes('cancelled'));
1147
- }
1148
- async _grantPermissions(origin, permissions) {
1149
- const webPermissionToProtocol = new Map([['geolocation', 'geolocation'], ['notifications', 'notifications'], ['clipboard-read', 'clipboard-read']]);
1150
- const filtered = permissions.map(permission => {
1151
- const protocolPermission = webPermissionToProtocol.get(permission);
1152
- if (!protocolPermission) throw new Error('Unknown permission: ' + permission);
1153
- return protocolPermission;
1154
- });
1155
- await this._pageProxySession.send('Emulation.grantPermissions', {
1156
- origin,
1157
- permissions: filtered
1158
- });
1159
- }
1160
- async _clearPermissions() {
1161
- await this._pageProxySession.send('Emulation.resetPermissions', {});
1162
- }
1163
- shouldToggleStyleSheetToSyncAnimations() {
1164
- return true;
1165
- }
1166
- }
1167
-
1168
- /**
1169
- * WebKit Remote Addresses look like:
1170
- *
1171
- * macOS:
1172
- * ::1.8911
1173
- * 2606:2800:220:1:248:1893:25c8:1946.443
1174
- * 127.0.0.1:8000
1175
- *
1176
- * ubuntu:
1177
- * ::1:8907
1178
- * 127.0.0.1:8000
1179
- *
1180
- * NB: They look IPv4 and IPv6's with ports but use an alternative notation.
1181
- */
1182
- exports.WKPage = WKPage;
1183
- function parseRemoteAddress(value) {
1184
- if (!value) return;
1185
- try {
1186
- const colon = value.lastIndexOf(':');
1187
- const dot = value.lastIndexOf('.');
1188
- if (dot < 0) {
1189
- // IPv6ish:port
1190
- return {
1191
- ipAddress: `[${value.slice(0, colon)}]`,
1192
- port: +value.slice(colon + 1)
1193
- };
1194
- }
1195
- if (colon > dot) {
1196
- // IPv4:port
1197
- const [address, port] = value.split(':');
1198
- return {
1199
- ipAddress: address,
1200
- port: +port
1201
- };
1202
- } else {
1203
- // IPv6ish.port
1204
- const [address, port] = value.split('.');
1205
- return {
1206
- ipAddress: `[${address}]`,
1207
- port: +port
1208
- };
1209
- }
1210
- } catch (_) {}
1211
- }
1212
-
1213
- /**
1214
- * Adapted from Source/WebInspectorUI/UserInterface/Models/Resource.js in
1215
- * WebKit codebase.
1216
- */
1217
- function isLoadedSecurely(url, timing) {
1218
- try {
1219
- const u = new URL(url);
1220
- if (u.protocol !== 'https:' && u.protocol !== 'wss:' && u.protocol !== 'sftp:') return false;
1221
- if (timing.secureConnectionStart === -1 && timing.connectStart !== -1) return false;
1222
- return true;
1223
- } catch (_) {}
1224
- }
1225
- const contextDelegateSymbol = Symbol('delegate');