@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,447 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FFBrowserContext = exports.FFBrowser = void 0;
7
+ var _errors = require("../errors");
8
+ var _utils = require("../../utils");
9
+ var _browser = require("../browser");
10
+ var _browserContext = require("../browserContext");
11
+ var network = _interopRequireWildcard(require("../network"));
12
+ var _ffConnection = require("./ffConnection");
13
+ var _ffPage = require("./ffPage");
14
+ 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); }
15
+ 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; }
16
+ /**
17
+ * Copyright 2018 Google Inc. All rights reserved.
18
+ * Modifications copyright (c) Microsoft Corporation.
19
+ *
20
+ * Licensed under the Apache License, Version 2.0 (the 'License');
21
+ * you may not use this file except in compliance with the License.
22
+ * You may obtain a copy of the License at
23
+ *
24
+ * http://www.apache.org/licenses/LICENSE-2.0
25
+ *
26
+ * Unless required by applicable law or agreed to in writing, software
27
+ * distributed under the License is distributed on an 'AS IS' BASIS,
28
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29
+ * See the License for the specific language governing permissions and
30
+ * limitations under the License.
31
+ */
32
+
33
+ class FFBrowser extends _browser.Browser {
34
+ static async connect(parent, transport, options) {
35
+ var _options$originalLaun;
36
+ const connection = new _ffConnection.FFConnection(transport, options.protocolLogger, options.browserLogsCollector);
37
+ const browser = new FFBrowser(parent, connection, options);
38
+ if (options.__testHookOnConnectToBrowser) await options.__testHookOnConnectToBrowser();
39
+ let firefoxUserPrefs = (_options$originalLaun = options.originalLaunchOptions.firefoxUserPrefs) !== null && _options$originalLaun !== void 0 ? _options$originalLaun : {};
40
+ if (Object.keys(kBandaidFirefoxUserPrefs).length) firefoxUserPrefs = {
41
+ ...kBandaidFirefoxUserPrefs,
42
+ ...firefoxUserPrefs
43
+ };
44
+ const promises = [browser.session.send('Browser.enable', {
45
+ attachToDefaultContext: !!options.persistent,
46
+ userPrefs: Object.entries(firefoxUserPrefs).map(([name, value]) => ({
47
+ name,
48
+ value
49
+ }))
50
+ }), browser._initVersion()];
51
+ if (options.persistent) {
52
+ browser._defaultContext = new FFBrowserContext(browser, undefined, options.persistent);
53
+ promises.push(browser._defaultContext._initialize());
54
+ }
55
+ if (options.proxy) promises.push(browser.session.send('Browser.setBrowserProxy', toJugglerProxyOptions(options.proxy)));
56
+ await Promise.all(promises);
57
+ return browser;
58
+ }
59
+ constructor(parent, connection, options) {
60
+ super(parent, options);
61
+ this._connection = void 0;
62
+ this.session = void 0;
63
+ this._ffPages = void 0;
64
+ this._contexts = void 0;
65
+ this._version = '';
66
+ this._userAgent = '';
67
+ this._connection = connection;
68
+ this.session = connection.rootSession;
69
+ this._ffPages = new Map();
70
+ this._contexts = new Map();
71
+ this._connection.on(_ffConnection.ConnectionEvents.Disconnected, () => this._onDisconnect());
72
+ this.session.on('Browser.attachedToTarget', this._onAttachedToTarget.bind(this));
73
+ this.session.on('Browser.detachedFromTarget', this._onDetachedFromTarget.bind(this));
74
+ this.session.on('Browser.downloadCreated', this._onDownloadCreated.bind(this));
75
+ this.session.on('Browser.downloadFinished', this._onDownloadFinished.bind(this));
76
+ this.session.on('Browser.videoRecordingFinished', this._onVideoRecordingFinished.bind(this));
77
+ }
78
+ async _initVersion() {
79
+ const result = await this.session.send('Browser.getInfo');
80
+ this._version = result.version.substring(result.version.indexOf('/') + 1);
81
+ this._userAgent = result.userAgent;
82
+ }
83
+ isConnected() {
84
+ return !this._connection._closed;
85
+ }
86
+ async doCreateNewContext(options) {
87
+ if (options.isMobile) throw new Error('options.isMobile is not supported in Firefox');
88
+ const {
89
+ browserContextId
90
+ } = await this.session.send('Browser.createBrowserContext', {
91
+ removeOnDetach: true
92
+ });
93
+ const context = new FFBrowserContext(this, browserContextId, options);
94
+ await context._initialize();
95
+ this._contexts.set(browserContextId, context);
96
+ return context;
97
+ }
98
+ contexts() {
99
+ return Array.from(this._contexts.values());
100
+ }
101
+ version() {
102
+ return this._version;
103
+ }
104
+ userAgent() {
105
+ return this._userAgent;
106
+ }
107
+ _onDetachedFromTarget(payload) {
108
+ const ffPage = this._ffPages.get(payload.targetId);
109
+ this._ffPages.delete(payload.targetId);
110
+ ffPage.didClose();
111
+ }
112
+ _onAttachedToTarget(payload) {
113
+ const {
114
+ targetId,
115
+ browserContextId,
116
+ openerId,
117
+ type
118
+ } = payload.targetInfo;
119
+ (0, _utils.assert)(type === 'page');
120
+ const context = browserContextId ? this._contexts.get(browserContextId) : this._defaultContext;
121
+ (0, _utils.assert)(context, `Unknown context id:${browserContextId}, _defaultContext: ${this._defaultContext}`);
122
+ const session = this._connection.createSession(payload.sessionId);
123
+ const opener = openerId ? this._ffPages.get(openerId) : null;
124
+ const ffPage = new _ffPage.FFPage(session, context, opener);
125
+ this._ffPages.set(targetId, ffPage);
126
+ }
127
+ _onDownloadCreated(payload) {
128
+ const ffPage = this._ffPages.get(payload.pageTargetId);
129
+ if (!ffPage) return;
130
+
131
+ // Abort the navigation that turned into download.
132
+ ffPage._page._frameManager.frameAbortedNavigation(payload.frameId, 'Download is starting');
133
+ let originPage = ffPage._initializedPage;
134
+ // If it's a new window download, report it on the opener page.
135
+ if (!originPage) {
136
+ // Resume the page creation with an error. The page will automatically close right
137
+ // after the download begins.
138
+ ffPage._markAsError(new Error('Starting new page download'));
139
+ if (ffPage._opener) originPage = ffPage._opener._initializedPage;
140
+ }
141
+ if (!originPage) return;
142
+ this._downloadCreated(originPage, payload.uuid, payload.url, payload.suggestedFileName);
143
+ }
144
+ _onDownloadFinished(payload) {
145
+ const error = payload.canceled ? 'canceled' : payload.error;
146
+ this._downloadFinished(payload.uuid, error);
147
+ }
148
+ _onVideoRecordingFinished(payload) {
149
+ var _this$_takeVideo;
150
+ (_this$_takeVideo = this._takeVideo(payload.screencastId)) === null || _this$_takeVideo === void 0 || _this$_takeVideo.reportFinished();
151
+ }
152
+ _onDisconnect() {
153
+ for (const video of this._idToVideo.values()) video.artifact.reportFinished(new _errors.TargetClosedError());
154
+ this._idToVideo.clear();
155
+ for (const ffPage of this._ffPages.values()) ffPage.didClose();
156
+ this._ffPages.clear();
157
+ this._didClose();
158
+ }
159
+ }
160
+ exports.FFBrowser = FFBrowser;
161
+ class FFBrowserContext extends _browserContext.BrowserContext {
162
+ constructor(browser, browserContextId, options) {
163
+ super(browser, options, browserContextId);
164
+ }
165
+ async _initialize() {
166
+ (0, _utils.assert)(!this._ffPages().length);
167
+ const browserContextId = this._browserContextId;
168
+ const promises = [super._initialize()];
169
+ if (this._options.acceptDownloads !== 'internal-browser-default') {
170
+ promises.push(this._browser.session.send('Browser.setDownloadOptions', {
171
+ browserContextId,
172
+ downloadOptions: {
173
+ behavior: this._options.acceptDownloads === 'accept' ? 'saveToDisk' : 'cancel',
174
+ downloadsDir: this._browser.options.downloadsPath
175
+ }
176
+ }));
177
+ }
178
+ if (this._options.viewport) {
179
+ const viewport = {
180
+ viewportSize: {
181
+ width: this._options.viewport.width,
182
+ height: this._options.viewport.height
183
+ },
184
+ deviceScaleFactor: this._options.deviceScaleFactor || 1
185
+ };
186
+ promises.push(this._browser.session.send('Browser.setDefaultViewport', {
187
+ browserContextId,
188
+ viewport
189
+ }));
190
+ }
191
+ if (this._options.hasTouch) promises.push(this._browser.session.send('Browser.setTouchOverride', {
192
+ browserContextId,
193
+ hasTouch: true
194
+ }));
195
+ if (this._options.userAgent) promises.push(this._browser.session.send('Browser.setUserAgentOverride', {
196
+ browserContextId,
197
+ userAgent: this._options.userAgent
198
+ }));
199
+ if (this._options.bypassCSP) promises.push(this._browser.session.send('Browser.setBypassCSP', {
200
+ browserContextId,
201
+ bypassCSP: true
202
+ }));
203
+ if (this._options.ignoreHTTPSErrors) promises.push(this._browser.session.send('Browser.setIgnoreHTTPSErrors', {
204
+ browserContextId,
205
+ ignoreHTTPSErrors: true
206
+ }));
207
+ if (this._options.javaScriptEnabled === false) promises.push(this._browser.session.send('Browser.setJavaScriptDisabled', {
208
+ browserContextId,
209
+ javaScriptDisabled: true
210
+ }));
211
+ if (this._options.locale) promises.push(this._browser.session.send('Browser.setLocaleOverride', {
212
+ browserContextId,
213
+ locale: this._options.locale
214
+ }));
215
+ if (this._options.timezoneId) promises.push(this._browser.session.send('Browser.setTimezoneOverride', {
216
+ browserContextId,
217
+ timezoneId: this._options.timezoneId
218
+ }));
219
+ if (this._options.extraHTTPHeaders || this._options.locale) promises.push(this.setExtraHTTPHeaders(this._options.extraHTTPHeaders || []));
220
+ if (this._options.httpCredentials) promises.push(this.setHTTPCredentials(this._options.httpCredentials));
221
+ if (this._options.geolocation) promises.push(this.setGeolocation(this._options.geolocation));
222
+ if (this._options.offline) promises.push(this.setOffline(this._options.offline));
223
+ if (this._options.colorScheme !== 'no-override') {
224
+ promises.push(this._browser.session.send('Browser.setColorScheme', {
225
+ browserContextId,
226
+ colorScheme: this._options.colorScheme !== undefined ? this._options.colorScheme : 'light'
227
+ }));
228
+ }
229
+ if (this._options.reducedMotion !== 'no-override') {
230
+ promises.push(this._browser.session.send('Browser.setReducedMotion', {
231
+ browserContextId,
232
+ reducedMotion: this._options.reducedMotion !== undefined ? this._options.reducedMotion : 'no-preference'
233
+ }));
234
+ }
235
+ if (this._options.forcedColors !== 'no-override') {
236
+ promises.push(this._browser.session.send('Browser.setForcedColors', {
237
+ browserContextId,
238
+ forcedColors: this._options.forcedColors !== undefined ? this._options.forcedColors : 'none'
239
+ }));
240
+ }
241
+ if (this._options.recordVideo) {
242
+ promises.push(this._ensureVideosPath().then(() => {
243
+ return this._browser.session.send('Browser.setVideoRecordingOptions', {
244
+ // validateBrowserContextOptions ensures correct video size.
245
+ options: {
246
+ ...this._options.recordVideo.size,
247
+ dir: this._options.recordVideo.dir
248
+ },
249
+ browserContextId: this._browserContextId
250
+ });
251
+ }));
252
+ }
253
+ if (this._options.proxy) {
254
+ promises.push(this._browser.session.send('Browser.setContextProxy', {
255
+ browserContextId: this._browserContextId,
256
+ ...toJugglerProxyOptions(this._options.proxy)
257
+ }));
258
+ }
259
+ await Promise.all(promises);
260
+ }
261
+ _ffPages() {
262
+ return Array.from(this._browser._ffPages.values()).filter(ffPage => ffPage._browserContext === this);
263
+ }
264
+ pages() {
265
+ return this._ffPages().map(ffPage => ffPage._initializedPage).filter(pageOrNull => !!pageOrNull);
266
+ }
267
+ async newPageDelegate() {
268
+ (0, _browserContext.assertBrowserContextIsNotOwned)(this);
269
+ const {
270
+ targetId
271
+ } = await this._browser.session.send('Browser.newPage', {
272
+ browserContextId: this._browserContextId
273
+ }).catch(e => {
274
+ if (e.message.includes('Failed to override timezone')) throw new Error(`Invalid timezone ID: ${this._options.timezoneId}`);
275
+ throw e;
276
+ });
277
+ return this._browser._ffPages.get(targetId);
278
+ }
279
+ async doGetCookies(urls) {
280
+ const {
281
+ cookies
282
+ } = await this._browser.session.send('Browser.getCookies', {
283
+ browserContextId: this._browserContextId
284
+ });
285
+ return network.filterCookies(cookies.map(c => {
286
+ const copy = {
287
+ ...c
288
+ };
289
+ delete copy.size;
290
+ delete copy.session;
291
+ return copy;
292
+ }), urls);
293
+ }
294
+ async addCookies(cookies) {
295
+ const cc = network.rewriteCookies(cookies).map(c => ({
296
+ ...c,
297
+ expires: c.expires === -1 ? undefined : c.expires
298
+ }));
299
+ await this._browser.session.send('Browser.setCookies', {
300
+ browserContextId: this._browserContextId,
301
+ cookies: cc
302
+ });
303
+ }
304
+ async clearCookies() {
305
+ await this._browser.session.send('Browser.clearCookies', {
306
+ browserContextId: this._browserContextId
307
+ });
308
+ }
309
+ async doGrantPermissions(origin, permissions) {
310
+ const webPermissionToProtocol = new Map([['geolocation', 'geo'], ['persistent-storage', 'persistent-storage'], ['push', 'push'], ['notifications', 'desktop-notification']]);
311
+ const filtered = permissions.map(permission => {
312
+ const protocolPermission = webPermissionToProtocol.get(permission);
313
+ if (!protocolPermission) throw new Error('Unknown permission: ' + permission);
314
+ return protocolPermission;
315
+ });
316
+ await this._browser.session.send('Browser.grantPermissions', {
317
+ origin: origin,
318
+ browserContextId: this._browserContextId,
319
+ permissions: filtered
320
+ });
321
+ }
322
+ async doClearPermissions() {
323
+ await this._browser.session.send('Browser.resetPermissions', {
324
+ browserContextId: this._browserContextId
325
+ });
326
+ }
327
+ async setGeolocation(geolocation) {
328
+ (0, _browserContext.verifyGeolocation)(geolocation);
329
+ this._options.geolocation = geolocation;
330
+ await this._browser.session.send('Browser.setGeolocationOverride', {
331
+ browserContextId: this._browserContextId,
332
+ geolocation: geolocation || null
333
+ });
334
+ }
335
+ async setExtraHTTPHeaders(headers) {
336
+ this._options.extraHTTPHeaders = headers;
337
+ let allHeaders = this._options.extraHTTPHeaders;
338
+ if (this._options.locale) allHeaders = network.mergeHeaders([allHeaders, network.singleHeader('Accept-Language', this._options.locale)]);
339
+ await this._browser.session.send('Browser.setExtraHTTPHeaders', {
340
+ browserContextId: this._browserContextId,
341
+ headers: allHeaders
342
+ });
343
+ }
344
+ async setUserAgent(userAgent) {
345
+ await this._browser.session.send('Browser.setUserAgentOverride', {
346
+ browserContextId: this._browserContextId,
347
+ userAgent: userAgent || null
348
+ });
349
+ }
350
+ async setOffline(offline) {
351
+ this._options.offline = offline;
352
+ await this._browser.session.send('Browser.setOnlineOverride', {
353
+ browserContextId: this._browserContextId,
354
+ override: offline ? 'offline' : 'online'
355
+ });
356
+ }
357
+ async doSetHTTPCredentials(httpCredentials) {
358
+ this._options.httpCredentials = httpCredentials;
359
+ await this._browser.session.send('Browser.setHTTPCredentials', {
360
+ browserContextId: this._browserContextId,
361
+ credentials: httpCredentials || null
362
+ });
363
+ }
364
+ async doAddInitScript(source) {
365
+ await this._browser.session.send('Browser.setInitScripts', {
366
+ browserContextId: this._browserContextId,
367
+ scripts: this.initScripts.map(script => ({
368
+ script
369
+ }))
370
+ });
371
+ }
372
+ async doRemoveInitScripts() {
373
+ await this._browser.session.send('Browser.setInitScripts', {
374
+ browserContextId: this._browserContextId,
375
+ scripts: []
376
+ });
377
+ }
378
+ async doExposeBinding(binding) {
379
+ await this._browser.session.send('Browser.addBinding', {
380
+ browserContextId: this._browserContextId,
381
+ name: binding.name,
382
+ script: binding.source
383
+ });
384
+ }
385
+ async doRemoveExposedBindings() {
386
+ // TODO: implement me.
387
+ // This is not a critical problem, what ends up happening is
388
+ // an old binding will be restored upon page reload and will point nowhere.
389
+ }
390
+ async doUpdateRequestInterception() {
391
+ await this._browser.session.send('Browser.setRequestInterception', {
392
+ browserContextId: this._browserContextId,
393
+ enabled: !!this._requestInterceptor
394
+ });
395
+ }
396
+ onClosePersistent() {}
397
+ async clearCache() {
398
+ // Clearing only the context cache does not work: https://bugzilla.mozilla.org/show_bug.cgi?id=1819147
399
+ await this._browser.session.send('Browser.clearCache');
400
+ }
401
+ async doClose(reason) {
402
+ if (!this._browserContextId) {
403
+ if (this._options.recordVideo) {
404
+ await this._browser.session.send('Browser.setVideoRecordingOptions', {
405
+ options: undefined,
406
+ browserContextId: this._browserContextId
407
+ });
408
+ }
409
+ // Closing persistent context should close the browser.
410
+ await this._browser.close({
411
+ reason
412
+ });
413
+ } else {
414
+ await this._browser.session.send('Browser.removeBrowserContext', {
415
+ browserContextId: this._browserContextId
416
+ });
417
+ this._browser._contexts.delete(this._browserContextId);
418
+ }
419
+ }
420
+ async cancelDownload(uuid) {
421
+ await this._browser.session.send('Browser.cancelDownload', {
422
+ uuid
423
+ });
424
+ }
425
+ }
426
+ exports.FFBrowserContext = FFBrowserContext;
427
+ function toJugglerProxyOptions(proxy) {
428
+ const proxyServer = new URL(proxy.server);
429
+ let port = parseInt(proxyServer.port, 10);
430
+ let type = 'http';
431
+ if (proxyServer.protocol === 'socks5:') type = 'socks';else if (proxyServer.protocol === 'socks4:') type = 'socks4';else if (proxyServer.protocol === 'https:') type = 'https';
432
+ if (proxyServer.port === '') {
433
+ if (proxyServer.protocol === 'http:') port = 80;else if (proxyServer.protocol === 'https:') port = 443;
434
+ }
435
+ return {
436
+ type,
437
+ bypass: proxy.bypass ? proxy.bypass.split(',').map(domain => domain.trim()) : [],
438
+ host: proxyServer.hostname,
439
+ port,
440
+ username: proxy.username,
441
+ password: proxy.password
442
+ };
443
+ }
444
+
445
+ // Prefs for quick fixes that didn't make it to the build.
446
+ // Should all be moved to `playwright.cfg`.
447
+ const kBandaidFirefoxUserPrefs = {};
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.kBrowserCloseMessageId = exports.FFSession = exports.FFConnection = exports.ConnectionEvents = void 0;
7
+ var _events = require("events");
8
+ var _debugLogger = require("../../utils/debugLogger");
9
+ var _helper = require("../helper");
10
+ var _protocolError = require("../protocolError");
11
+ /**
12
+ * Copyright 2017 Google Inc. All rights reserved.
13
+ * Modifications copyright (c) Microsoft Corporation.
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the 'License');
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an 'AS IS' BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ */
27
+
28
+ const ConnectionEvents = exports.ConnectionEvents = {
29
+ Disconnected: Symbol('Disconnected')
30
+ };
31
+
32
+ // FFPlaywright uses this special id to issue Browser.close command which we
33
+ // should ignore.
34
+ const kBrowserCloseMessageId = exports.kBrowserCloseMessageId = -9999;
35
+ class FFConnection extends _events.EventEmitter {
36
+ constructor(transport, protocolLogger, browserLogsCollector) {
37
+ super();
38
+ this._lastId = void 0;
39
+ this._transport = void 0;
40
+ this._protocolLogger = void 0;
41
+ this._browserLogsCollector = void 0;
42
+ this._browserDisconnectedLogs = void 0;
43
+ this.rootSession = void 0;
44
+ this._sessions = void 0;
45
+ this._closed = void 0;
46
+ this.setMaxListeners(0);
47
+ this._transport = transport;
48
+ this._protocolLogger = protocolLogger;
49
+ this._browserLogsCollector = browserLogsCollector;
50
+ this._lastId = 0;
51
+ this._sessions = new Map();
52
+ this._closed = false;
53
+ this.rootSession = new FFSession(this, '', message => this._rawSend(message));
54
+ this._sessions.set('', this.rootSession);
55
+ this._transport.onmessage = this._onMessage.bind(this);
56
+ // onclose should be set last, since it can be immediately called.
57
+ this._transport.onclose = this._onClose.bind(this);
58
+ }
59
+ nextMessageId() {
60
+ return ++this._lastId;
61
+ }
62
+ _rawSend(message) {
63
+ this._protocolLogger('send', message);
64
+ this._transport.send(message);
65
+ }
66
+ async _onMessage(message) {
67
+ this._protocolLogger('receive', message);
68
+ if (message.id === kBrowserCloseMessageId) return;
69
+ const session = this._sessions.get(message.sessionId || '');
70
+ if (session) session.dispatchMessage(message);
71
+ }
72
+ _onClose() {
73
+ this._closed = true;
74
+ this._transport.onmessage = undefined;
75
+ this._transport.onclose = undefined;
76
+ this._browserDisconnectedLogs = _helper.helper.formatBrowserLogs(this._browserLogsCollector.recentLogs());
77
+ this.rootSession.dispose();
78
+ Promise.resolve().then(() => this.emit(ConnectionEvents.Disconnected));
79
+ }
80
+ close() {
81
+ if (!this._closed) this._transport.close();
82
+ }
83
+ createSession(sessionId) {
84
+ const session = new FFSession(this, sessionId, message => this._rawSend({
85
+ ...message,
86
+ sessionId
87
+ }));
88
+ this._sessions.set(sessionId, session);
89
+ return session;
90
+ }
91
+ }
92
+ exports.FFConnection = FFConnection;
93
+ class FFSession extends _events.EventEmitter {
94
+ constructor(connection, sessionId, rawSend) {
95
+ super();
96
+ this._connection = void 0;
97
+ this._disposed = false;
98
+ this._callbacks = void 0;
99
+ this._sessionId = void 0;
100
+ this._rawSend = void 0;
101
+ this._crashed = false;
102
+ this.on = void 0;
103
+ this.addListener = void 0;
104
+ this.off = void 0;
105
+ this.removeListener = void 0;
106
+ this.once = void 0;
107
+ this.setMaxListeners(0);
108
+ this._callbacks = new Map();
109
+ this._connection = connection;
110
+ this._sessionId = sessionId;
111
+ this._rawSend = rawSend;
112
+ this.on = super.on;
113
+ this.addListener = super.addListener;
114
+ this.off = super.removeListener;
115
+ this.removeListener = super.removeListener;
116
+ this.once = super.once;
117
+ }
118
+ markAsCrashed() {
119
+ this._crashed = true;
120
+ }
121
+ async send(method, params) {
122
+ if (this._crashed || this._disposed || this._connection._closed || this._connection._browserDisconnectedLogs) throw new _protocolError.ProtocolError(this._crashed ? 'crashed' : 'closed', undefined, this._connection._browserDisconnectedLogs);
123
+ const id = this._connection.nextMessageId();
124
+ this._rawSend({
125
+ method,
126
+ params,
127
+ id
128
+ });
129
+ return new Promise((resolve, reject) => {
130
+ this._callbacks.set(id, {
131
+ resolve,
132
+ reject,
133
+ error: new _protocolError.ProtocolError('error', method)
134
+ });
135
+ });
136
+ }
137
+ sendMayFail(method, params) {
138
+ return this.send(method, params).catch(error => _debugLogger.debugLogger.log('error', error));
139
+ }
140
+ dispatchMessage(object) {
141
+ if (object.id) {
142
+ const callback = this._callbacks.get(object.id);
143
+ // Callbacks could be all rejected if someone has called `.dispose()`.
144
+ if (callback) {
145
+ this._callbacks.delete(object.id);
146
+ if (object.error) {
147
+ callback.error.setMessage(object.error.message);
148
+ callback.reject(callback.error);
149
+ } else {
150
+ callback.resolve(object.result);
151
+ }
152
+ }
153
+ } else {
154
+ Promise.resolve().then(() => this.emit(object.method, object.params));
155
+ }
156
+ }
157
+ dispose() {
158
+ this._disposed = true;
159
+ this._connection._sessions.delete(this._sessionId);
160
+ for (const callback of this._callbacks.values()) {
161
+ callback.error.type = this._crashed ? 'crashed' : 'closed';
162
+ callback.error.logs = this._connection._browserDisconnectedLogs;
163
+ callback.reject(callback.error);
164
+ }
165
+ this._callbacks.clear();
166
+ }
167
+ }
168
+ exports.FFSession = FFSession;