@checkly/playwright-core 1.41.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 (305) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +3 -0
  4. package/ThirdPartyNotices.txt +1513 -0
  5. package/bin/PrintDeps.exe +0 -0
  6. package/bin/README.md +2 -0
  7. package/bin/install_media_pack.ps1 +5 -0
  8. package/bin/reinstall_chrome_beta_linux.sh +40 -0
  9. package/bin/reinstall_chrome_beta_mac.sh +13 -0
  10. package/bin/reinstall_chrome_beta_win.ps1 +23 -0
  11. package/bin/reinstall_chrome_stable_linux.sh +40 -0
  12. package/bin/reinstall_chrome_stable_mac.sh +12 -0
  13. package/bin/reinstall_chrome_stable_win.ps1 +23 -0
  14. package/bin/reinstall_msedge_beta_linux.sh +40 -0
  15. package/bin/reinstall_msedge_beta_mac.sh +11 -0
  16. package/bin/reinstall_msedge_beta_win.ps1 +22 -0
  17. package/bin/reinstall_msedge_dev_linux.sh +40 -0
  18. package/bin/reinstall_msedge_dev_mac.sh +11 -0
  19. package/bin/reinstall_msedge_dev_win.ps1 +22 -0
  20. package/bin/reinstall_msedge_stable_linux.sh +40 -0
  21. package/bin/reinstall_msedge_stable_mac.sh +11 -0
  22. package/bin/reinstall_msedge_stable_win.ps1 +23 -0
  23. package/browsers.json +64 -0
  24. package/cli.js +17 -0
  25. package/index.d.ts +17 -0
  26. package/index.js +33 -0
  27. package/index.mjs +28 -0
  28. package/lib/androidServerImpl.js +69 -0
  29. package/lib/browserServerImpl.js +92 -0
  30. package/lib/cli/driver.js +97 -0
  31. package/lib/cli/program.js +582 -0
  32. package/lib/cli/programWithTestStub.js +67 -0
  33. package/lib/client/accessibility.js +50 -0
  34. package/lib/client/android.js +473 -0
  35. package/lib/client/api.js +272 -0
  36. package/lib/client/artifact.js +79 -0
  37. package/lib/client/browser.js +145 -0
  38. package/lib/client/browserContext.js +509 -0
  39. package/lib/client/browserType.js +233 -0
  40. package/lib/client/cdpSession.js +53 -0
  41. package/lib/client/channelOwner.js +229 -0
  42. package/lib/client/clientHelper.js +57 -0
  43. package/lib/client/clientInstrumentation.js +40 -0
  44. package/lib/client/connection.js +327 -0
  45. package/lib/client/consoleMessage.js +55 -0
  46. package/lib/client/coverage.js +41 -0
  47. package/lib/client/dialog.js +57 -0
  48. package/lib/client/download.js +62 -0
  49. package/lib/client/electron.js +130 -0
  50. package/lib/client/elementHandle.js +291 -0
  51. package/lib/client/errors.js +77 -0
  52. package/lib/client/events.js +93 -0
  53. package/lib/client/fetch.js +343 -0
  54. package/lib/client/fileChooser.js +45 -0
  55. package/lib/client/frame.js +506 -0
  56. package/lib/client/harRouter.js +93 -0
  57. package/lib/client/input.js +111 -0
  58. package/lib/client/jsHandle.js +123 -0
  59. package/lib/client/jsonPipe.js +35 -0
  60. package/lib/client/localUtils.js +35 -0
  61. package/lib/client/locator.js +432 -0
  62. package/lib/client/network.js +601 -0
  63. package/lib/client/page.js +707 -0
  64. package/lib/client/playwright.js +74 -0
  65. package/lib/client/selectors.js +67 -0
  66. package/lib/client/stream.js +54 -0
  67. package/lib/client/tracing.js +135 -0
  68. package/lib/client/types.js +24 -0
  69. package/lib/client/video.js +51 -0
  70. package/lib/client/waiter.js +158 -0
  71. package/lib/client/webError.js +37 -0
  72. package/lib/client/worker.js +71 -0
  73. package/lib/client/writableStream.js +54 -0
  74. package/lib/common/socksProxy.js +569 -0
  75. package/lib/common/timeoutSettings.js +73 -0
  76. package/lib/common/types.js +5 -0
  77. package/lib/generated/consoleApiSource.js +7 -0
  78. package/lib/generated/injectedScriptSource.js +7 -0
  79. package/lib/generated/recorderSource.js +7 -0
  80. package/lib/generated/utilityScriptSource.js +7 -0
  81. package/lib/image_tools/colorUtils.js +98 -0
  82. package/lib/image_tools/compare.js +108 -0
  83. package/lib/image_tools/imageChannel.js +70 -0
  84. package/lib/image_tools/stats.js +102 -0
  85. package/lib/inProcessFactory.js +54 -0
  86. package/lib/inprocess.js +20 -0
  87. package/lib/outofprocess.js +67 -0
  88. package/lib/protocol/debug.js +27 -0
  89. package/lib/protocol/serializers.js +172 -0
  90. package/lib/protocol/transport.js +82 -0
  91. package/lib/protocol/validator.js +2599 -0
  92. package/lib/protocol/validatorPrimitives.js +139 -0
  93. package/lib/remote/playwrightConnection.js +274 -0
  94. package/lib/remote/playwrightServer.js +110 -0
  95. package/lib/server/accessibility.js +62 -0
  96. package/lib/server/android/android.js +441 -0
  97. package/lib/server/android/backendAdb.js +172 -0
  98. package/lib/server/artifact.js +104 -0
  99. package/lib/server/browser.js +129 -0
  100. package/lib/server/browserContext.js +609 -0
  101. package/lib/server/browserType.js +300 -0
  102. package/lib/server/chromium/appIcon.png +0 -0
  103. package/lib/server/chromium/chromium.js +346 -0
  104. package/lib/server/chromium/chromiumSwitches.js +41 -0
  105. package/lib/server/chromium/crAccessibility.js +237 -0
  106. package/lib/server/chromium/crBrowser.js +521 -0
  107. package/lib/server/chromium/crConnection.js +228 -0
  108. package/lib/server/chromium/crCoverage.js +246 -0
  109. package/lib/server/chromium/crDevTools.js +104 -0
  110. package/lib/server/chromium/crDragDrop.js +144 -0
  111. package/lib/server/chromium/crExecutionContext.js +156 -0
  112. package/lib/server/chromium/crInput.js +171 -0
  113. package/lib/server/chromium/crNetworkManager.js +723 -0
  114. package/lib/server/chromium/crPage.js +1173 -0
  115. package/lib/server/chromium/crPdf.js +147 -0
  116. package/lib/server/chromium/crProtocolHelper.js +131 -0
  117. package/lib/server/chromium/crServiceWorker.js +115 -0
  118. package/lib/server/chromium/defaultFontFamilies.js +145 -0
  119. package/lib/server/chromium/videoRecorder.js +155 -0
  120. package/lib/server/console.js +59 -0
  121. package/lib/server/cookieStore.js +112 -0
  122. package/lib/server/debugController.js +236 -0
  123. package/lib/server/debugger.js +132 -0
  124. package/lib/server/deviceDescriptors.js +21 -0
  125. package/lib/server/deviceDescriptorsSource.json +1549 -0
  126. package/lib/server/dialog.js +70 -0
  127. package/lib/server/dispatchers/androidDispatcher.js +193 -0
  128. package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  129. package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
  130. package/lib/server/dispatchers/browserDispatcher.js +170 -0
  131. package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
  132. package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
  133. package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
  134. package/lib/server/dispatchers/dialogDispatcher.js +44 -0
  135. package/lib/server/dispatchers/dispatcher.js +400 -0
  136. package/lib/server/dispatchers/electronDispatcher.js +80 -0
  137. package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
  138. package/lib/server/dispatchers/frameDispatcher.js +287 -0
  139. package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
  140. package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
  141. package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
  142. package/lib/server/dispatchers/networkDispatchers.js +221 -0
  143. package/lib/server/dispatchers/pageDispatcher.js +363 -0
  144. package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
  145. package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
  146. package/lib/server/dispatchers/streamDispatcher.js +62 -0
  147. package/lib/server/dispatchers/tracingDispatcher.js +54 -0
  148. package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
  149. package/lib/server/dom.js +808 -0
  150. package/lib/server/download.js +53 -0
  151. package/lib/server/electron/electron.js +254 -0
  152. package/lib/server/electron/loader.js +57 -0
  153. package/lib/server/errors.js +68 -0
  154. package/lib/server/fetch.js +611 -0
  155. package/lib/server/fileChooser.js +42 -0
  156. package/lib/server/fileUploadUtils.js +71 -0
  157. package/lib/server/firefox/ffAccessibility.js +215 -0
  158. package/lib/server/firefox/ffBrowser.js +447 -0
  159. package/lib/server/firefox/ffConnection.js +168 -0
  160. package/lib/server/firefox/ffExecutionContext.js +138 -0
  161. package/lib/server/firefox/ffInput.js +150 -0
  162. package/lib/server/firefox/ffNetworkManager.js +231 -0
  163. package/lib/server/firefox/ffPage.js +558 -0
  164. package/lib/server/firefox/firefox.js +91 -0
  165. package/lib/server/formData.js +75 -0
  166. package/lib/server/frameSelectors.js +171 -0
  167. package/lib/server/frames.js +1597 -0
  168. package/lib/server/har/harRecorder.js +139 -0
  169. package/lib/server/har/harTracer.js +539 -0
  170. package/lib/server/helper.js +103 -0
  171. package/lib/server/index.js +96 -0
  172. package/lib/server/input.js +301 -0
  173. package/lib/server/instrumentation.js +74 -0
  174. package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
  175. package/lib/server/javascript.js +305 -0
  176. package/lib/server/launchApp.js +90 -0
  177. package/lib/server/macEditingCommands.js +139 -0
  178. package/lib/server/network.js +607 -0
  179. package/lib/server/page.js +793 -0
  180. package/lib/server/pipeTransport.js +85 -0
  181. package/lib/server/playwright.js +82 -0
  182. package/lib/server/progress.js +102 -0
  183. package/lib/server/protocolError.js +49 -0
  184. package/lib/server/recorder/codeGenerator.js +153 -0
  185. package/lib/server/recorder/csharp.js +310 -0
  186. package/lib/server/recorder/java.js +216 -0
  187. package/lib/server/recorder/javascript.js +229 -0
  188. package/lib/server/recorder/jsonl.js +47 -0
  189. package/lib/server/recorder/language.js +44 -0
  190. package/lib/server/recorder/python.js +275 -0
  191. package/lib/server/recorder/recorderActions.js +5 -0
  192. package/lib/server/recorder/recorderApp.js +181 -0
  193. package/lib/server/recorder/recorderUtils.js +48 -0
  194. package/lib/server/recorder/utils.js +45 -0
  195. package/lib/server/recorder.js +700 -0
  196. package/lib/server/registry/browserFetcher.js +168 -0
  197. package/lib/server/registry/dependencies.js +322 -0
  198. package/lib/server/registry/index.js +925 -0
  199. package/lib/server/registry/nativeDeps.js +383 -0
  200. package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
  201. package/lib/server/screenshotter.js +354 -0
  202. package/lib/server/selectors.js +73 -0
  203. package/lib/server/socksInterceptor.js +100 -0
  204. package/lib/server/trace/recorder/snapshotter.js +168 -0
  205. package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
  206. package/lib/server/trace/recorder/tracing.js +552 -0
  207. package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
  208. package/lib/server/trace/viewer/traceViewer.js +229 -0
  209. package/lib/server/transport.js +191 -0
  210. package/lib/server/types.js +24 -0
  211. package/lib/server/usKeyboardLayout.js +555 -0
  212. package/lib/server/webkit/webkit.js +87 -0
  213. package/lib/server/webkit/wkAccessibility.js +194 -0
  214. package/lib/server/webkit/wkBrowser.js +328 -0
  215. package/lib/server/webkit/wkConnection.js +173 -0
  216. package/lib/server/webkit/wkExecutionContext.js +146 -0
  217. package/lib/server/webkit/wkInput.js +169 -0
  218. package/lib/server/webkit/wkInterceptableRequest.js +158 -0
  219. package/lib/server/webkit/wkPage.js +1198 -0
  220. package/lib/server/webkit/wkProvisionalPage.js +59 -0
  221. package/lib/server/webkit/wkWorkers.js +104 -0
  222. package/lib/third_party/diff_match_patch.js +2222 -0
  223. package/lib/third_party/pixelmatch.js +255 -0
  224. package/lib/utils/ascii.js +31 -0
  225. package/lib/utils/comparators.js +171 -0
  226. package/lib/utils/crypto.js +33 -0
  227. package/lib/utils/debug.js +46 -0
  228. package/lib/utils/debugLogger.js +89 -0
  229. package/lib/utils/env.js +47 -0
  230. package/lib/utils/eventsHelper.js +38 -0
  231. package/lib/utils/fileUtils.js +66 -0
  232. package/lib/utils/glob.js +83 -0
  233. package/lib/utils/happy-eyeballs.js +154 -0
  234. package/lib/utils/headers.js +52 -0
  235. package/lib/utils/hostPlatform.js +124 -0
  236. package/lib/utils/httpServer.js +195 -0
  237. package/lib/utils/index.js +324 -0
  238. package/lib/utils/isomorphic/cssParser.js +250 -0
  239. package/lib/utils/isomorphic/cssTokenizer.js +979 -0
  240. package/lib/utils/isomorphic/locatorGenerators.js +651 -0
  241. package/lib/utils/isomorphic/locatorParser.js +179 -0
  242. package/lib/utils/isomorphic/locatorUtils.js +62 -0
  243. package/lib/utils/isomorphic/selectorParser.js +397 -0
  244. package/lib/utils/isomorphic/stringUtils.js +107 -0
  245. package/lib/utils/isomorphic/traceUtils.js +39 -0
  246. package/lib/utils/linuxUtils.js +78 -0
  247. package/lib/utils/manualPromise.js +109 -0
  248. package/lib/utils/mimeType.js +29 -0
  249. package/lib/utils/multimap.js +75 -0
  250. package/lib/utils/network.js +189 -0
  251. package/lib/utils/processLauncher.js +248 -0
  252. package/lib/utils/profiler.js +53 -0
  253. package/lib/utils/rtti.js +41 -0
  254. package/lib/utils/semaphore.js +51 -0
  255. package/lib/utils/spawnAsync.js +45 -0
  256. package/lib/utils/stackTrace.js +123 -0
  257. package/lib/utils/task.js +58 -0
  258. package/lib/utils/time.js +37 -0
  259. package/lib/utils/timeoutRunner.js +131 -0
  260. package/lib/utils/traceUtils.js +44 -0
  261. package/lib/utils/userAgent.js +105 -0
  262. package/lib/utils/wsServer.js +125 -0
  263. package/lib/utils/zipFile.js +75 -0
  264. package/lib/utils/zones.js +99 -0
  265. package/lib/utilsBundle.js +81 -0
  266. package/lib/utilsBundleImpl/index.js +51 -0
  267. package/lib/utilsBundleImpl/xdg-open +1066 -0
  268. package/lib/vite/htmlReport/index.html +66 -0
  269. package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
  270. package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
  271. package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
  272. package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
  273. package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
  274. package/lib/vite/recorder/index.html +29 -0
  275. package/lib/vite/recorder/playwright-logo.svg +9 -0
  276. package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
  277. package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
  278. package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
  279. package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
  280. package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
  281. package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
  282. package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
  283. package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
  284. package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
  285. package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
  286. package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
  287. package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
  288. package/lib/vite/traceViewer/index.html +26 -0
  289. package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
  290. package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  291. package/lib/vite/traceViewer/snapshot.html +21 -0
  292. package/lib/vite/traceViewer/sw.bundle.js +4 -0
  293. package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
  294. package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
  295. package/lib/vite/traceViewer/uiMode.html +17 -0
  296. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
  297. package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
  298. package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
  299. package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
  300. package/lib/zipBundle.js +25 -0
  301. package/lib/zipBundleImpl.js +5 -0
  302. package/package.json +43 -0
  303. package/types/protocol.d.ts +20304 -0
  304. package/types/structs.d.ts +45 -0
  305. package/types/types.d.ts +20626 -0
@@ -0,0 +1,521 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CRBrowserContext = exports.CRBrowser = void 0;
7
+ var _path = _interopRequireDefault(require("path"));
8
+ var _browser = require("../browser");
9
+ var _browserContext = require("../browserContext");
10
+ var _utils = require("../../utils");
11
+ var network = _interopRequireWildcard(require("../network"));
12
+ var _page = require("../page");
13
+ var _frames = require("../frames");
14
+ var _crConnection = require("./crConnection");
15
+ var _crPage = require("./crPage");
16
+ var _crProtocolHelper = require("./crProtocolHelper");
17
+ var _crServiceWorker = require("./crServiceWorker");
18
+ var _artifact = require("../artifact");
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 && 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; }
21
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
+ /**
23
+ * Copyright 2017 Google Inc. All rights reserved.
24
+ * Modifications copyright (c) Microsoft Corporation.
25
+ *
26
+ * Licensed under the Apache License, Version 2.0 (the "License");
27
+ * you may not use this file except in compliance with the License.
28
+ * You may obtain a copy of the License at
29
+ *
30
+ * http://www.apache.org/licenses/LICENSE-2.0
31
+ *
32
+ * Unless required by applicable law or agreed to in writing, software
33
+ * distributed under the License is distributed on an "AS IS" BASIS,
34
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
35
+ * See the License for the specific language governing permissions and
36
+ * limitations under the License.
37
+ */
38
+
39
+ class CRBrowser extends _browser.Browser {
40
+ static async connect(parent, transport, options, devtools) {
41
+ // Make a copy in case we need to update `headful` property below.
42
+ options = {
43
+ ...options
44
+ };
45
+ const connection = new _crConnection.CRConnection(transport, options.protocolLogger, options.browserLogsCollector);
46
+ const browser = new CRBrowser(parent, connection, options);
47
+ browser._devtools = devtools;
48
+ if (browser.isClank()) browser._isCollocatedWithServer = false;
49
+ const session = connection.rootSession;
50
+ if (options.__testHookOnConnectToBrowser) await options.__testHookOnConnectToBrowser();
51
+ const version = await session.send('Browser.getVersion');
52
+ browser._version = version.product.substring(version.product.indexOf('/') + 1);
53
+ browser._userAgent = version.userAgent;
54
+ // We don't trust the option as it may lie in case of connectOverCDP where remote browser
55
+ // may have been launched with different options.
56
+ browser.options.headful = !version.userAgent.includes('Headless');
57
+ if (!options.persistent) {
58
+ await session.send('Target.setAutoAttach', {
59
+ autoAttach: true,
60
+ waitForDebuggerOnStart: true,
61
+ flatten: true
62
+ });
63
+ return browser;
64
+ }
65
+ browser._defaultContext = new CRBrowserContext(browser, undefined, options.persistent);
66
+ await Promise.all([session.send('Target.setAutoAttach', {
67
+ autoAttach: true,
68
+ waitForDebuggerOnStart: true,
69
+ flatten: true
70
+ }).then(async () => {
71
+ // Target.setAutoAttach has a bug where it does not wait for new Targets being attached.
72
+ // However making a dummy call afterwards fixes this.
73
+ // This can be removed after https://chromium-review.googlesource.com/c/chromium/src/+/2885888 lands in stable.
74
+ await session.send('Target.getTargetInfo');
75
+ }), browser._defaultContext._initialize()]);
76
+ await browser._waitForAllPagesToBeInitialized();
77
+ return browser;
78
+ }
79
+ constructor(parent, connection, options) {
80
+ super(parent, options);
81
+ this._connection = void 0;
82
+ this._session = void 0;
83
+ this._clientRootSessionPromise = null;
84
+ this._contexts = new Map();
85
+ this._crPages = new Map();
86
+ this._backgroundPages = new Map();
87
+ this._serviceWorkers = new Map();
88
+ this._devtools = void 0;
89
+ this._version = '';
90
+ this._tracingRecording = false;
91
+ this._tracingClient = void 0;
92
+ this._userAgent = '';
93
+ this._connection = connection;
94
+ this._session = this._connection.rootSession;
95
+ this._connection.on(_crConnection.ConnectionEvents.Disconnected, () => this._didDisconnect());
96
+ this._session.on('Target.attachedToTarget', this._onAttachedToTarget.bind(this));
97
+ this._session.on('Target.detachedFromTarget', this._onDetachedFromTarget.bind(this));
98
+ this._session.on('Browser.downloadWillBegin', this._onDownloadWillBegin.bind(this));
99
+ this._session.on('Browser.downloadProgress', this._onDownloadProgress.bind(this));
100
+ }
101
+ async doCreateNewContext(options) {
102
+ let proxyBypassList = undefined;
103
+ if (options.proxy) {
104
+ if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK) proxyBypassList = options.proxy.bypass;else proxyBypassList = '<-loopback>' + (options.proxy.bypass ? `,${options.proxy.bypass}` : '');
105
+ }
106
+ const {
107
+ browserContextId
108
+ } = await this._session.send('Target.createBrowserContext', {
109
+ disposeOnDetach: true,
110
+ proxyServer: options.proxy ? options.proxy.server : undefined,
111
+ proxyBypassList
112
+ });
113
+ const context = new CRBrowserContext(this, browserContextId, options);
114
+ await context._initialize();
115
+ this._contexts.set(browserContextId, context);
116
+ return context;
117
+ }
118
+ contexts() {
119
+ return Array.from(this._contexts.values());
120
+ }
121
+ version() {
122
+ return this._version;
123
+ }
124
+ userAgent() {
125
+ return this._userAgent;
126
+ }
127
+ _platform() {
128
+ if (this._userAgent.includes('Windows')) return 'win';
129
+ if (this._userAgent.includes('Macintosh')) return 'mac';
130
+ return 'linux';
131
+ }
132
+ isClank() {
133
+ return this.options.name === 'clank';
134
+ }
135
+ async _waitForAllPagesToBeInitialized() {
136
+ await Promise.all([...this._crPages.values()].map(page => page.pageOrError()));
137
+ }
138
+ _onAttachedToTarget({
139
+ targetInfo,
140
+ sessionId,
141
+ waitingForDebugger
142
+ }) {
143
+ if (targetInfo.type === 'browser') return;
144
+ const session = this._session.createChildSession(sessionId);
145
+ (0, _utils.assert)(targetInfo.browserContextId, 'targetInfo: ' + JSON.stringify(targetInfo, null, 2));
146
+ let context = this._contexts.get(targetInfo.browserContextId) || null;
147
+ if (!context) {
148
+ // TODO: auto attach only to pages from our contexts.
149
+ // assert(this._defaultContext);
150
+ context = this._defaultContext;
151
+ }
152
+ if (targetInfo.type === 'other' && targetInfo.url.startsWith('devtools://devtools') && this._devtools) {
153
+ this._devtools.install(session);
154
+ return;
155
+ }
156
+ const treatOtherAsPage = targetInfo.type === 'other' && process.env.PW_CHROMIUM_ATTACH_TO_OTHER;
157
+ if (!context || targetInfo.type === 'other' && !treatOtherAsPage) {
158
+ session.detach().catch(() => {});
159
+ return;
160
+ }
161
+ (0, _utils.assert)(!this._crPages.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
162
+ (0, _utils.assert)(!this._backgroundPages.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
163
+ (0, _utils.assert)(!this._serviceWorkers.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
164
+ if (targetInfo.type === 'background_page') {
165
+ const backgroundPage = new _crPage.CRPage(session, targetInfo.targetId, context, null, {
166
+ hasUIWindow: false,
167
+ isBackgroundPage: true
168
+ });
169
+ this._backgroundPages.set(targetInfo.targetId, backgroundPage);
170
+ return;
171
+ }
172
+ if (targetInfo.type === 'page' || treatOtherAsPage) {
173
+ const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null;
174
+ const crPage = new _crPage.CRPage(session, targetInfo.targetId, context, opener, {
175
+ hasUIWindow: targetInfo.type === 'page',
176
+ isBackgroundPage: false
177
+ });
178
+ this._crPages.set(targetInfo.targetId, crPage);
179
+ return;
180
+ }
181
+ if (targetInfo.type === 'service_worker') {
182
+ const serviceWorker = new _crServiceWorker.CRServiceWorker(context, session, targetInfo.url);
183
+ this._serviceWorkers.set(targetInfo.targetId, serviceWorker);
184
+ context.emit(CRBrowserContext.CREvents.ServiceWorker, serviceWorker);
185
+ return;
186
+ }
187
+
188
+ // Detach from any targets we are not interested in, to avoid side-effects.
189
+ //
190
+ // One example of a side effect: upon shared worker restart, we receive
191
+ // Inspector.targetReloadedAfterCrash and backend waits for Runtime.runIfWaitingForDebugger
192
+ // from any attached client. If we do not resume, shared worker will stall.
193
+ session.detach().catch(() => {});
194
+ }
195
+ _onDetachedFromTarget(payload) {
196
+ const targetId = payload.targetId;
197
+ const crPage = this._crPages.get(targetId);
198
+ if (crPage) {
199
+ this._crPages.delete(targetId);
200
+ crPage.didClose();
201
+ return;
202
+ }
203
+ const backgroundPage = this._backgroundPages.get(targetId);
204
+ if (backgroundPage) {
205
+ this._backgroundPages.delete(targetId);
206
+ backgroundPage.didClose();
207
+ return;
208
+ }
209
+ const serviceWorker = this._serviceWorkers.get(targetId);
210
+ if (serviceWorker) {
211
+ this._serviceWorkers.delete(targetId);
212
+ serviceWorker.didClose();
213
+ return;
214
+ }
215
+ }
216
+ _didDisconnect() {
217
+ for (const crPage of this._crPages.values()) crPage.didClose();
218
+ this._crPages.clear();
219
+ for (const backgroundPage of this._backgroundPages.values()) backgroundPage.didClose();
220
+ this._backgroundPages.clear();
221
+ for (const serviceWorker of this._serviceWorkers.values()) serviceWorker.didClose();
222
+ this._serviceWorkers.clear();
223
+ this._didClose();
224
+ }
225
+ _findOwningPage(frameId) {
226
+ for (const crPage of this._crPages.values()) {
227
+ const frame = crPage._page._frameManager.frame(frameId);
228
+ if (frame) return crPage;
229
+ }
230
+ return null;
231
+ }
232
+ _onDownloadWillBegin(payload) {
233
+ const page = this._findOwningPage(payload.frameId);
234
+ if (!page) {
235
+ // There might be no page when download originates from something unusual, like
236
+ // a DevTools window or maybe an extension page.
237
+ // See https://github.com/microsoft/playwright/issues/22551.
238
+ return;
239
+ }
240
+ page.willBeginDownload();
241
+ let originPage = page._initializedPage;
242
+ // If it's a new window download, report it on the opener page.
243
+ if (!originPage && page._opener) originPage = page._opener._initializedPage;
244
+ if (!originPage) return;
245
+ this._downloadCreated(originPage, payload.guid, payload.url, payload.suggestedFilename);
246
+ }
247
+ _onDownloadProgress(payload) {
248
+ if (payload.state === 'completed') this._downloadFinished(payload.guid, '');
249
+ if (payload.state === 'canceled') this._downloadFinished(payload.guid, this._closeReason || 'canceled');
250
+ }
251
+ async _closePage(crPage) {
252
+ await this._session.send('Target.closeTarget', {
253
+ targetId: crPage._targetId
254
+ });
255
+ }
256
+ async newBrowserCDPSession() {
257
+ return await this._connection.createBrowserSession();
258
+ }
259
+ async startTracing(page, options = {}) {
260
+ (0, _utils.assert)(!this._tracingRecording, 'Cannot start recording trace while already recording trace.');
261
+ this._tracingClient = page ? page._delegate._mainFrameSession._client : this._session;
262
+ const defaultCategories = ['-*', 'devtools.timeline', 'v8.execute', 'disabled-by-default-devtools.timeline', 'disabled-by-default-devtools.timeline.frame', 'toplevel', 'blink.console', 'blink.user_timing', 'latencyInfo', 'disabled-by-default-devtools.timeline.stack', 'disabled-by-default-v8.cpu_profiler', 'disabled-by-default-v8.cpu_profiler.hires'];
263
+ const {
264
+ screenshots = false,
265
+ categories = defaultCategories
266
+ } = options;
267
+ if (screenshots) categories.push('disabled-by-default-devtools.screenshot');
268
+ this._tracingRecording = true;
269
+ await this._tracingClient.send('Tracing.start', {
270
+ transferMode: 'ReturnAsStream',
271
+ categories: categories.join(',')
272
+ });
273
+ }
274
+ async stopTracing() {
275
+ (0, _utils.assert)(this._tracingClient, 'Tracing was not started.');
276
+ const [event] = await Promise.all([new Promise(f => this._tracingClient.once('Tracing.tracingComplete', f)), this._tracingClient.send('Tracing.end')]);
277
+ const tracingPath = _path.default.join(this.options.artifactsDir, (0, _utils.createGuid)() + '.crtrace');
278
+ await (0, _crProtocolHelper.saveProtocolStream)(this._tracingClient, event.stream, tracingPath);
279
+ this._tracingRecording = false;
280
+ const artifact = new _artifact.Artifact(this, tracingPath);
281
+ artifact.reportFinished();
282
+ return artifact;
283
+ }
284
+ isConnected() {
285
+ return !this._connection._closed;
286
+ }
287
+ async _clientRootSession() {
288
+ if (!this._clientRootSessionPromise) this._clientRootSessionPromise = this._connection.createBrowserSession();
289
+ return this._clientRootSessionPromise;
290
+ }
291
+ }
292
+ exports.CRBrowser = CRBrowser;
293
+ class CRBrowserContext extends _browserContext.BrowserContext {
294
+ constructor(browser, browserContextId, options) {
295
+ super(browser, options, browserContextId);
296
+ this._authenticateProxyViaCredentials();
297
+ }
298
+ async _initialize() {
299
+ (0, _utils.assert)(!Array.from(this._browser._crPages.values()).some(page => page._browserContext === this));
300
+ const promises = [super._initialize()];
301
+ if (this._browser.options.name !== 'electron' && this._browser.options.name !== 'clank' && this._options.acceptDownloads !== 'internal-browser-default') {
302
+ promises.push(this._browser._session.send('Browser.setDownloadBehavior', {
303
+ behavior: this._options.acceptDownloads === 'accept' ? 'allowAndName' : 'deny',
304
+ browserContextId: this._browserContextId,
305
+ downloadPath: this._browser.options.downloadsPath,
306
+ eventsEnabled: true
307
+ }));
308
+ }
309
+ await Promise.all(promises);
310
+ }
311
+ _crPages() {
312
+ return [...this._browser._crPages.values()].filter(crPage => crPage._browserContext === this);
313
+ }
314
+ pages() {
315
+ return this._crPages().map(crPage => crPage._initializedPage).filter(Boolean);
316
+ }
317
+ async newPageDelegate() {
318
+ (0, _browserContext.assertBrowserContextIsNotOwned)(this);
319
+ const oldKeys = this._browser.isClank() ? new Set(this._browser._crPages.keys()) : undefined;
320
+ let {
321
+ targetId
322
+ } = await this._browser._session.send('Target.createTarget', {
323
+ url: 'about:blank',
324
+ browserContextId: this._browserContextId
325
+ });
326
+ if (oldKeys) {
327
+ // Chrome for Android returns tab ids (1, 2, 3, 4, 5) instead of content target ids here, work around it via the
328
+ // heuristic assuming that there is only one page created at a time.
329
+ const newKeys = new Set(this._browser._crPages.keys());
330
+ // Remove old keys.
331
+ for (const key of oldKeys) newKeys.delete(key);
332
+ // Remove potential concurrent popups.
333
+ for (const key of newKeys) {
334
+ const page = this._browser._crPages.get(key);
335
+ if (page._opener) newKeys.delete(key);
336
+ }
337
+ (0, _utils.assert)(newKeys.size === 1);
338
+ [targetId] = [...newKeys];
339
+ }
340
+ return this._browser._crPages.get(targetId);
341
+ }
342
+ async doGetCookies(urls) {
343
+ const {
344
+ cookies
345
+ } = await this._browser._session.send('Storage.getCookies', {
346
+ browserContextId: this._browserContextId
347
+ });
348
+ return network.filterCookies(cookies.map(c => {
349
+ const copy = {
350
+ sameSite: 'Lax',
351
+ ...c
352
+ };
353
+ delete copy.size;
354
+ delete copy.priority;
355
+ delete copy.session;
356
+ delete copy.sameParty;
357
+ delete copy.sourceScheme;
358
+ delete copy.sourcePort;
359
+ return copy;
360
+ }), urls);
361
+ }
362
+ async addCookies(cookies) {
363
+ await this._browser._session.send('Storage.setCookies', {
364
+ cookies: network.rewriteCookies(cookies),
365
+ browserContextId: this._browserContextId
366
+ });
367
+ }
368
+ async clearCookies() {
369
+ await this._browser._session.send('Storage.clearCookies', {
370
+ browserContextId: this._browserContextId
371
+ });
372
+ }
373
+ async doGrantPermissions(origin, permissions) {
374
+ const webPermissionToProtocol = new Map([['geolocation', 'geolocation'], ['midi', 'midi'], ['notifications', 'notifications'], ['camera', 'videoCapture'], ['microphone', 'audioCapture'], ['background-sync', 'backgroundSync'], ['ambient-light-sensor', 'sensors'], ['accelerometer', 'sensors'], ['gyroscope', 'sensors'], ['magnetometer', 'sensors'], ['accessibility-events', 'accessibilityEvents'], ['clipboard-read', 'clipboardReadWrite'], ['clipboard-write', 'clipboardSanitizedWrite'], ['payment-handler', 'paymentHandler'],
375
+ // chrome-specific permissions we have.
376
+ ['midi-sysex', 'midiSysex']]);
377
+ const filtered = permissions.map(permission => {
378
+ const protocolPermission = webPermissionToProtocol.get(permission);
379
+ if (!protocolPermission) throw new Error('Unknown permission: ' + permission);
380
+ return protocolPermission;
381
+ });
382
+ await this._browser._session.send('Browser.grantPermissions', {
383
+ origin: origin === '*' ? undefined : origin,
384
+ browserContextId: this._browserContextId,
385
+ permissions: filtered
386
+ });
387
+ }
388
+ async doClearPermissions() {
389
+ await this._browser._session.send('Browser.resetPermissions', {
390
+ browserContextId: this._browserContextId
391
+ });
392
+ }
393
+ async setGeolocation(geolocation) {
394
+ (0, _browserContext.verifyGeolocation)(geolocation);
395
+ this._options.geolocation = geolocation;
396
+ for (const page of this.pages()) await page._delegate.updateGeolocation();
397
+ }
398
+ async setExtraHTTPHeaders(headers) {
399
+ this._options.extraHTTPHeaders = headers;
400
+ for (const page of this.pages()) await page._delegate.updateExtraHTTPHeaders();
401
+ for (const sw of this.serviceWorkers()) await sw.updateExtraHTTPHeaders(false);
402
+ }
403
+ async setUserAgent(userAgent) {
404
+ this._options.userAgent = userAgent;
405
+ for (const page of this.pages()) await page._delegate.updateUserAgent();
406
+ // TODO: service workers don't have Emulation domain?
407
+ }
408
+ async setOffline(offline) {
409
+ this._options.offline = offline;
410
+ for (const page of this.pages()) await page._delegate.updateOffline();
411
+ for (const sw of this.serviceWorkers()) await sw.updateOffline(false);
412
+ }
413
+ async doSetHTTPCredentials(httpCredentials) {
414
+ this._options.httpCredentials = httpCredentials;
415
+ for (const page of this.pages()) await page._delegate.updateHttpCredentials();
416
+ for (const sw of this.serviceWorkers()) await sw.updateHttpCredentials(false);
417
+ }
418
+ async doAddInitScript(source) {
419
+ for (const page of this.pages()) await page._delegate.addInitScript(source);
420
+ }
421
+ async doRemoveInitScripts() {
422
+ for (const page of this.pages()) await page._delegate.removeInitScripts();
423
+ }
424
+ async doExposeBinding(binding) {
425
+ for (const page of this.pages()) await page._delegate.exposeBinding(binding);
426
+ }
427
+ async doRemoveExposedBindings() {
428
+ for (const page of this.pages()) await page._delegate.removeExposedBindings();
429
+ }
430
+ async doUpdateRequestInterception() {
431
+ for (const page of this.pages()) await page._delegate.updateRequestInterception();
432
+ for (const sw of this.serviceWorkers()) await sw.updateRequestInterception();
433
+ }
434
+ async doClose(reason) {
435
+ // Headful chrome cannot dispose browser context with opened 'beforeunload'
436
+ // dialogs, so we should close all that are currently opened.
437
+ // We also won't get new ones since `Target.disposeBrowserContext` does not trigger
438
+ // beforeunload.
439
+ const openedBeforeUnloadDialogs = [];
440
+ for (const crPage of this._crPages()) {
441
+ const dialogs = [...crPage._page._frameManager._openedDialogs].filter(dialog => dialog.type() === 'beforeunload');
442
+ openedBeforeUnloadDialogs.push(...dialogs);
443
+ }
444
+ await Promise.all(openedBeforeUnloadDialogs.map(dialog => dialog.dismiss()));
445
+ if (!this._browserContextId) {
446
+ await this.stopVideoRecording();
447
+ // Closing persistent context should close the browser.
448
+ await this._browser.close({
449
+ reason
450
+ });
451
+ return;
452
+ }
453
+ await this._browser._session.send('Target.disposeBrowserContext', {
454
+ browserContextId: this._browserContextId
455
+ });
456
+ this._browser._contexts.delete(this._browserContextId);
457
+ for (const [targetId, serviceWorker] of this._browser._serviceWorkers) {
458
+ if (serviceWorker._browserContext !== this) continue;
459
+ // When closing a browser context, service workers are shutdown
460
+ // asynchronously and we get detached from them later.
461
+ // To avoid the wrong order of notifications, we manually fire
462
+ // "close" event here and forget about the service worker.
463
+ serviceWorker.didClose();
464
+ this._browser._serviceWorkers.delete(targetId);
465
+ }
466
+ }
467
+ async stopVideoRecording() {
468
+ await Promise.all(this._crPages().map(crPage => crPage._mainFrameSession._stopVideoRecording()));
469
+ }
470
+ onClosePersistent() {
471
+ // When persistent context is closed, we do not necessary get Target.detachedFromTarget
472
+ // for all the background pages.
473
+ for (const [targetId, backgroundPage] of this._browser._backgroundPages.entries()) {
474
+ if (backgroundPage._browserContext === this && backgroundPage._initializedPage) {
475
+ backgroundPage.didClose();
476
+ this._browser._backgroundPages.delete(targetId);
477
+ }
478
+ }
479
+ }
480
+ async clearCache() {
481
+ for (const page of this._crPages()) await page._mainFrameSession._networkManager.clearCache();
482
+ }
483
+ async cancelDownload(guid) {
484
+ // The upstream CDP method is implemented in a way that no explicit error would be given
485
+ // regarding the requested `guid`, even if the download is in a state not suitable for
486
+ // cancellation (finished, cancelled, etc.) or the guid is invalid at all.
487
+ await this._browser._session.send('Browser.cancelDownload', {
488
+ guid: guid,
489
+ browserContextId: this._browserContextId
490
+ });
491
+ }
492
+ backgroundPages() {
493
+ const result = [];
494
+ for (const backgroundPage of this._browser._backgroundPages.values()) {
495
+ if (backgroundPage._browserContext === this && backgroundPage._initializedPage) result.push(backgroundPage._initializedPage);
496
+ }
497
+ return result;
498
+ }
499
+ serviceWorkers() {
500
+ return Array.from(this._browser._serviceWorkers.values()).filter(serviceWorker => serviceWorker._browserContext === this);
501
+ }
502
+ async newCDPSession(page) {
503
+ let targetId = null;
504
+ if (page instanceof _page.Page) {
505
+ targetId = page._delegate._targetId;
506
+ } else if (page instanceof _frames.Frame) {
507
+ const session = page._page._delegate._sessions.get(page._id);
508
+ if (!session) throw new Error(`This frame does not have a separate CDP session, it is a part of the parent frame's session`);
509
+ targetId = session._targetId;
510
+ } else {
511
+ throw new Error('page: expected Page or Frame');
512
+ }
513
+ const rootSession = await this._browser._clientRootSession();
514
+ return rootSession.attachToTarget(targetId);
515
+ }
516
+ }
517
+ exports.CRBrowserContext = CRBrowserContext;
518
+ CRBrowserContext.CREvents = {
519
+ BackgroundPage: 'backgroundpage',
520
+ ServiceWorker: 'serviceworker'
521
+ };