@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,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Download = void 0;
7
+ var _path = _interopRequireDefault(require("path"));
8
+ var _page = require("./page");
9
+ var _utils = require("../utils");
10
+ var _artifact = require("./artifact");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ /**
13
+ * 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
+ class Download {
29
+ constructor(page, downloadsPath, uuid, url, suggestedFilename) {
30
+ this.artifact = void 0;
31
+ this.url = void 0;
32
+ this._page = void 0;
33
+ this._suggestedFilename = void 0;
34
+ const unaccessibleErrorMessage = page._browserContext._options.acceptDownloads === 'deny' ? 'Pass { acceptDownloads: true } when you are creating your browser context.' : undefined;
35
+ this.artifact = new _artifact.Artifact(page, _path.default.join(downloadsPath, uuid), unaccessibleErrorMessage, () => {
36
+ return this._page._browserContext.cancelDownload(uuid);
37
+ });
38
+ this._page = page;
39
+ this.url = url;
40
+ this._suggestedFilename = suggestedFilename;
41
+ page._browserContext._downloads.add(this);
42
+ if (suggestedFilename !== undefined) this._page.emit(_page.Page.Events.Download, this);
43
+ }
44
+ _filenameSuggested(suggestedFilename) {
45
+ (0, _utils.assert)(this._suggestedFilename === undefined);
46
+ this._suggestedFilename = suggestedFilename;
47
+ this._page.emit(_page.Page.Events.Download, this);
48
+ }
49
+ suggestedFilename() {
50
+ return this._suggestedFilename;
51
+ }
52
+ }
53
+ exports.Download = Download;
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ElectronApplication = exports.Electron = void 0;
7
+ var _fs = _interopRequireDefault(require("fs"));
8
+ var _os = _interopRequireDefault(require("os"));
9
+ var _path = _interopRequireDefault(require("path"));
10
+ var _crBrowser = require("../chromium/crBrowser");
11
+ var _crConnection = require("../chromium/crConnection");
12
+ var _crExecutionContext = require("../chromium/crExecutionContext");
13
+ var js = _interopRequireWildcard(require("../javascript"));
14
+ var _timeoutSettings = require("../../common/timeoutSettings");
15
+ var _utils = require("../../utils");
16
+ var _transport = require("../transport");
17
+ var _processLauncher = require("../../utils/processLauncher");
18
+ var _browserContext = require("../browserContext");
19
+ var _progress = require("../progress");
20
+ var _helper = require("../helper");
21
+ var _eventsHelper = require("../../utils/eventsHelper");
22
+ var readline = _interopRequireWildcard(require("readline"));
23
+ var _debugLogger = require("../../utils/debugLogger");
24
+ var _instrumentation = require("../instrumentation");
25
+ 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); }
26
+ 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; }
27
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
+ /**
29
+ * Copyright (c) Microsoft Corporation.
30
+ *
31
+ * Licensed under the Apache License, Version 2.0 (the "License");
32
+ * you may not use this file except in compliance with the License.
33
+ * You may obtain a copy of the License at
34
+ *
35
+ * http://www.apache.org/licenses/LICENSE-2.0
36
+ *
37
+ * Unless required by applicable law or agreed to in writing, software
38
+ * distributed under the License is distributed on an "AS IS" BASIS,
39
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
40
+ * See the License for the specific language governing permissions and
41
+ * limitations under the License.
42
+ */
43
+
44
+ const ARTIFACTS_FOLDER = _path.default.join(_os.default.tmpdir(), 'playwright-artifacts-');
45
+ class ElectronApplication extends _instrumentation.SdkObject {
46
+ constructor(parent, browser, nodeConnection, process) {
47
+ super(parent, 'electron-app');
48
+ this._browserContext = void 0;
49
+ this._nodeConnection = void 0;
50
+ this._nodeSession = void 0;
51
+ this._nodeExecutionContext = void 0;
52
+ this._nodeElectronHandlePromise = new _utils.ManualPromise();
53
+ this._timeoutSettings = new _timeoutSettings.TimeoutSettings();
54
+ this._process = void 0;
55
+ this._process = process;
56
+ this._browserContext = browser._defaultContext;
57
+ this._browserContext.on(_browserContext.BrowserContext.Events.Close, () => {
58
+ // Emit application closed after context closed.
59
+ Promise.resolve().then(() => this.emit(ElectronApplication.Events.Close));
60
+ });
61
+ this._nodeConnection = nodeConnection;
62
+ this._nodeSession = nodeConnection.rootSession;
63
+ this._nodeSession.on('Runtime.executionContextCreated', async event => {
64
+ if (!event.context.auxData || !event.context.auxData.isDefault) return;
65
+ const crExecutionContext = new _crExecutionContext.CRExecutionContext(this._nodeSession, event.context);
66
+ this._nodeExecutionContext = new js.ExecutionContext(this, crExecutionContext, 'electron');
67
+ const {
68
+ result: remoteObject
69
+ } = await crExecutionContext._client.send('Runtime.evaluate', {
70
+ expression: `require('electron')`,
71
+ contextId: event.context.id,
72
+ // Needed after Electron 28 to get access to require: https://github.com/microsoft/playwright/issues/28048
73
+ includeCommandLineAPI: true
74
+ });
75
+ this._nodeElectronHandlePromise.resolve(new js.JSHandle(this._nodeExecutionContext, 'object', 'ElectronModule', remoteObject.objectId));
76
+ });
77
+ this._browserContext.setCustomCloseHandler(async () => {
78
+ await this._browserContext.stopVideoRecording();
79
+ const electronHandle = await this._nodeElectronHandlePromise;
80
+ await electronHandle.evaluate(({
81
+ app
82
+ }) => app.quit()).catch(() => {});
83
+ });
84
+ }
85
+ async initialize() {
86
+ await this._nodeSession.send('Runtime.enable', {});
87
+ // Delay loading the app until browser is started and the browser targets are configured to auto-attach.
88
+ await this._nodeSession.send('Runtime.evaluate', {
89
+ expression: '__playwright_run()'
90
+ });
91
+ }
92
+ process() {
93
+ return this._process;
94
+ }
95
+ context() {
96
+ return this._browserContext;
97
+ }
98
+ async close() {
99
+ const progressController = new _progress.ProgressController((0, _instrumentation.serverSideCallMetadata)(), this);
100
+ const closed = progressController.run(progress => _helper.helper.waitForEvent(progress, this, ElectronApplication.Events.Close).promise);
101
+ await this._browserContext.close({
102
+ reason: 'Application exited'
103
+ });
104
+ this._nodeConnection.close();
105
+ await closed;
106
+ }
107
+ async browserWindow(page) {
108
+ // Assume CRPage as Electron is always Chromium.
109
+ const targetId = page._delegate._targetId;
110
+ const electronHandle = await this._nodeElectronHandlePromise;
111
+ return await electronHandle.evaluateHandle(({
112
+ BrowserWindow,
113
+ webContents
114
+ }, targetId) => {
115
+ const wc = webContents.fromDevToolsTargetId(targetId);
116
+ return BrowserWindow.fromWebContents(wc);
117
+ }, targetId);
118
+ }
119
+ }
120
+ exports.ElectronApplication = ElectronApplication;
121
+ ElectronApplication.Events = {
122
+ Close: 'close'
123
+ };
124
+ class Electron extends _instrumentation.SdkObject {
125
+ constructor(playwright) {
126
+ super(playwright, 'electron');
127
+ }
128
+ async launch(options) {
129
+ const {
130
+ args = []
131
+ } = options;
132
+ const controller = new _progress.ProgressController((0, _instrumentation.serverSideCallMetadata)(), this);
133
+ controller.setLogName('browser');
134
+ return controller.run(async progress => {
135
+ let app = undefined;
136
+ // --remote-debugging-port=0 must be the last playwright's argument, loader.ts relies on it.
137
+ const electronArguments = ['--inspect=0', '--remote-debugging-port=0', ...args];
138
+ if (_os.default.platform() === 'linux') {
139
+ const runningAsRoot = process.geteuid && process.geteuid() === 0;
140
+ if (runningAsRoot && electronArguments.indexOf('--no-sandbox') === -1) electronArguments.unshift('--no-sandbox');
141
+ }
142
+ const artifactsDir = await _fs.default.promises.mkdtemp(ARTIFACTS_FOLDER);
143
+ const browserLogsCollector = new _debugLogger.RecentLogsCollector();
144
+ const env = options.env ? (0, _processLauncher.envArrayToObject)(options.env) : process.env;
145
+ let command;
146
+ if (options.executablePath) {
147
+ command = options.executablePath;
148
+ } else {
149
+ try {
150
+ // By default we fallback to the Electron App executable path.
151
+ // 'electron/index.js' resolves to the actual Electron App.
152
+ command = require('electron/index.js');
153
+ } catch (error) {
154
+ if ((error === null || error === void 0 ? void 0 : error.code) === 'MODULE_NOT_FOUND') {
155
+ throw new Error('\n' + (0, _utils.wrapInASCIIBox)(['Electron executablePath not found!', 'Please install it using `npm install -D electron` or set the executablePath to your Electron executable.'].join('\n'), 1));
156
+ }
157
+ throw error;
158
+ }
159
+ // Only use our own loader for non-packaged apps.
160
+ // Packaged apps might have their own command line handling.
161
+ electronArguments.unshift('-r', require.resolve('./loader'));
162
+ }
163
+
164
+ // When debugging Playwright test that runs Electron, NODE_OPTIONS
165
+ // will make the debugger attach to Electron's Node. But Playwright
166
+ // also needs to attach to drive the automation. Disable external debugging.
167
+ delete env.NODE_OPTIONS;
168
+ const {
169
+ launchedProcess,
170
+ gracefullyClose,
171
+ kill
172
+ } = await (0, _processLauncher.launchProcess)({
173
+ command,
174
+ args: electronArguments,
175
+ env,
176
+ log: message => {
177
+ progress.log(message);
178
+ browserLogsCollector.log(message);
179
+ },
180
+ stdio: 'pipe',
181
+ cwd: options.cwd,
182
+ tempDirectories: [artifactsDir],
183
+ attemptToGracefullyClose: () => app.close(),
184
+ handleSIGINT: true,
185
+ handleSIGTERM: true,
186
+ handleSIGHUP: true,
187
+ onExit: () => {}
188
+ });
189
+ const waitForXserverError = new Promise(async (resolve, reject) => {
190
+ waitForLine(progress, launchedProcess, /Unable to open X display/).then(() => reject(new Error(['Unable to open X display!', `================================`, 'Most likely this is because there is no X server available.', "Use 'xvfb-run' on Linux to launch your tests with an emulated display server.", "For example: 'xvfb-run npm run test:e2e'", `================================`, progress.metadata.log].join('\n')))).catch(() => {});
191
+ });
192
+ const nodeMatch = await waitForLine(progress, launchedProcess, /^Debugger listening on (ws:\/\/.*)$/);
193
+ const nodeTransport = await _transport.WebSocketTransport.connect(progress, nodeMatch[1]);
194
+ const nodeConnection = new _crConnection.CRConnection(nodeTransport, _helper.helper.debugProtocolLogger(), browserLogsCollector);
195
+
196
+ // Immediately release exiting process under debug.
197
+ waitForLine(progress, launchedProcess, /Waiting for the debugger to disconnect\.\.\./).then(() => {
198
+ nodeTransport.close();
199
+ }).catch(() => {});
200
+ const chromeMatch = await Promise.race([waitForLine(progress, launchedProcess, /^DevTools listening on (ws:\/\/.*)$/), waitForXserverError]);
201
+ const chromeTransport = await _transport.WebSocketTransport.connect(progress, chromeMatch[1]);
202
+ const browserProcess = {
203
+ onclose: undefined,
204
+ process: launchedProcess,
205
+ close: gracefullyClose,
206
+ kill
207
+ };
208
+ const contextOptions = {
209
+ ...options,
210
+ noDefaultViewport: true
211
+ };
212
+ const browserOptions = {
213
+ name: 'electron',
214
+ isChromium: true,
215
+ headful: true,
216
+ persistent: contextOptions,
217
+ browserProcess,
218
+ protocolLogger: _helper.helper.debugProtocolLogger(),
219
+ browserLogsCollector,
220
+ artifactsDir,
221
+ downloadsPath: artifactsDir,
222
+ tracesDir: options.tracesDir || artifactsDir,
223
+ originalLaunchOptions: {}
224
+ };
225
+ (0, _browserContext.validateBrowserContextOptions)(contextOptions, browserOptions);
226
+ const browser = await _crBrowser.CRBrowser.connect(this.attribution.playwright, chromeTransport, browserOptions);
227
+ app = new ElectronApplication(this, browser, nodeConnection, launchedProcess);
228
+ await app.initialize();
229
+ return app;
230
+ }, _timeoutSettings.TimeoutSettings.launchTimeout(options));
231
+ }
232
+ }
233
+ exports.Electron = Electron;
234
+ function waitForLine(progress, process, regex) {
235
+ return new Promise((resolve, reject) => {
236
+ const rl = readline.createInterface({
237
+ input: process.stderr
238
+ });
239
+ const failError = new Error('Process failed to launch!');
240
+ const listeners = [_eventsHelper.eventsHelper.addEventListener(rl, 'line', onLine), _eventsHelper.eventsHelper.addEventListener(rl, 'close', reject.bind(null, failError)), _eventsHelper.eventsHelper.addEventListener(process, 'exit', reject.bind(null, failError)),
241
+ // It is Ok to remove error handler because we did not create process and there is another listener.
242
+ _eventsHelper.eventsHelper.addEventListener(process, 'error', reject.bind(null, failError))];
243
+ progress.cleanupWhenAborted(cleanup);
244
+ function onLine(line) {
245
+ const match = line.match(regex);
246
+ if (!match) return;
247
+ cleanup();
248
+ resolve(match);
249
+ }
250
+ function cleanup() {
251
+ _eventsHelper.eventsHelper.removeEventListeners(listeners);
252
+ }
253
+ });
254
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Copyright (c) Microsoft Corporation.
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ const {
20
+ app
21
+ } = require('electron');
22
+ const {
23
+ chromiumSwitches
24
+ } = require('../chromium/chromiumSwitches');
25
+
26
+ // Always pass user arguments first, see https://github.com/microsoft/playwright/issues/16614 and
27
+ // https://github.com/microsoft/playwright/issues/29198.
28
+ // [Electron, -r, loader.js[, --no-sandbox>], --inspect=0, --remote-debugging-port=0, ...args]
29
+ process.argv.splice(1, process.argv.indexOf('--remote-debugging-port=0'));
30
+ for (const arg of chromiumSwitches) {
31
+ const match = arg.match(/--([^=]*)=?(.*)/);
32
+ app.commandLine.appendSwitch(match[1], match[2]);
33
+ }
34
+
35
+ // Defer ready event.
36
+ const originalWhenReady = app.whenReady();
37
+ const originalEmit = app.emit.bind(app);
38
+ let readyEventArgs;
39
+ app.emit = (event, ...args) => {
40
+ if (event === 'ready') {
41
+ readyEventArgs = args;
42
+ return app.listenerCount('ready') > 0;
43
+ }
44
+ return originalEmit(event, ...args);
45
+ };
46
+ let isReady = false;
47
+ let whenReadyCallback;
48
+ const whenReadyPromise = new Promise(f => whenReadyCallback = f);
49
+ app.isReady = () => isReady;
50
+ app.whenReady = () => whenReadyPromise;
51
+ globalThis.__playwright_run = async () => {
52
+ // Wait for app to be ready to avoid browser initialization races.
53
+ const event = await originalWhenReady;
54
+ isReady = true;
55
+ whenReadyCallback(event);
56
+ originalEmit('ready', ...readyEventArgs);
57
+ };
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TimeoutError = exports.TargetClosedError = void 0;
7
+ exports.isTargetClosedError = isTargetClosedError;
8
+ exports.parseError = parseError;
9
+ exports.serializeError = serializeError;
10
+ var _utils = require("../utils");
11
+ var _serializers = require("../protocol/serializers");
12
+ /**
13
+ * 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
+ class CustomError extends Error {
29
+ constructor(message) {
30
+ super(message);
31
+ this.name = this.constructor.name;
32
+ }
33
+ }
34
+ class TimeoutError extends CustomError {}
35
+ exports.TimeoutError = TimeoutError;
36
+ class TargetClosedError extends CustomError {
37
+ constructor(cause, logs) {
38
+ super((cause || 'Target page, context or browser has been closed') + (logs || ''));
39
+ }
40
+ }
41
+ exports.TargetClosedError = TargetClosedError;
42
+ function isTargetClosedError(error) {
43
+ return error instanceof TargetClosedError || error.name === 'TargetClosedError';
44
+ }
45
+ function serializeError(e) {
46
+ if ((0, _utils.isError)(e)) return {
47
+ error: {
48
+ message: e.message,
49
+ stack: e.stack,
50
+ name: e.name
51
+ }
52
+ };
53
+ return {
54
+ value: (0, _serializers.serializeValue)(e, value => ({
55
+ fallThrough: value
56
+ }))
57
+ };
58
+ }
59
+ function parseError(error) {
60
+ if (!error.error) {
61
+ if (error.value === undefined) throw new Error('Serialized error must have either an error or a value');
62
+ return (0, _serializers.parseSerializedValue)(error.value, undefined);
63
+ }
64
+ const e = new Error(error.error.message);
65
+ e.stack = error.error.stack || '';
66
+ e.name = error.error.name;
67
+ return e;
68
+ }