@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.
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +3 -0
- package/ThirdPartyNotices.txt +1513 -0
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +2 -0
- package/bin/install_media_pack.ps1 +5 -0
- package/bin/reinstall_chrome_beta_linux.sh +40 -0
- package/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/bin/reinstall_chrome_beta_win.ps1 +23 -0
- package/bin/reinstall_chrome_stable_linux.sh +40 -0
- package/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/bin/reinstall_chrome_stable_win.ps1 +23 -0
- package/bin/reinstall_msedge_beta_linux.sh +40 -0
- package/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/bin/reinstall_msedge_beta_win.ps1 +22 -0
- package/bin/reinstall_msedge_dev_linux.sh +40 -0
- package/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/bin/reinstall_msedge_dev_win.ps1 +22 -0
- package/bin/reinstall_msedge_stable_linux.sh +40 -0
- package/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/bin/reinstall_msedge_stable_win.ps1 +23 -0
- package/browsers.json +64 -0
- package/cli.js +17 -0
- package/index.d.ts +17 -0
- package/index.js +33 -0
- package/index.mjs +28 -0
- package/lib/androidServerImpl.js +69 -0
- package/lib/browserServerImpl.js +92 -0
- package/lib/cli/driver.js +97 -0
- package/lib/cli/program.js +582 -0
- package/lib/cli/programWithTestStub.js +67 -0
- package/lib/client/accessibility.js +50 -0
- package/lib/client/android.js +473 -0
- package/lib/client/api.js +272 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +509 -0
- package/lib/client/browserType.js +233 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +229 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +40 -0
- package/lib/client/connection.js +327 -0
- package/lib/client/consoleMessage.js +55 -0
- package/lib/client/coverage.js +41 -0
- package/lib/client/dialog.js +57 -0
- package/lib/client/download.js +62 -0
- package/lib/client/electron.js +130 -0
- package/lib/client/elementHandle.js +291 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/events.js +93 -0
- package/lib/client/fetch.js +343 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +506 -0
- package/lib/client/harRouter.js +93 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +123 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +35 -0
- package/lib/client/locator.js +432 -0
- package/lib/client/network.js +601 -0
- package/lib/client/page.js +707 -0
- package/lib/client/playwright.js +74 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +135 -0
- package/lib/client/types.js +24 -0
- package/lib/client/video.js +51 -0
- package/lib/client/waiter.js +158 -0
- package/lib/client/webError.js +37 -0
- package/lib/client/worker.js +71 -0
- package/lib/client/writableStream.js +54 -0
- package/lib/common/socksProxy.js +569 -0
- package/lib/common/timeoutSettings.js +73 -0
- package/lib/common/types.js +5 -0
- package/lib/generated/consoleApiSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +7 -0
- package/lib/generated/recorderSource.js +7 -0
- package/lib/generated/utilityScriptSource.js +7 -0
- package/lib/image_tools/colorUtils.js +98 -0
- package/lib/image_tools/compare.js +108 -0
- package/lib/image_tools/imageChannel.js +70 -0
- package/lib/image_tools/stats.js +102 -0
- package/lib/inProcessFactory.js +54 -0
- package/lib/inprocess.js +20 -0
- package/lib/outofprocess.js +67 -0
- package/lib/protocol/debug.js +27 -0
- package/lib/protocol/serializers.js +172 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2599 -0
- package/lib/protocol/validatorPrimitives.js +139 -0
- package/lib/remote/playwrightConnection.js +274 -0
- package/lib/remote/playwrightServer.js +110 -0
- package/lib/server/accessibility.js +62 -0
- package/lib/server/android/android.js +441 -0
- package/lib/server/android/backendAdb.js +172 -0
- package/lib/server/artifact.js +104 -0
- package/lib/server/browser.js +129 -0
- package/lib/server/browserContext.js +609 -0
- package/lib/server/browserType.js +300 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +346 -0
- package/lib/server/chromium/chromiumSwitches.js +41 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +521 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +104 -0
- package/lib/server/chromium/crDragDrop.js +144 -0
- package/lib/server/chromium/crExecutionContext.js +156 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +723 -0
- package/lib/server/chromium/crPage.js +1173 -0
- package/lib/server/chromium/crPdf.js +147 -0
- package/lib/server/chromium/crProtocolHelper.js +131 -0
- package/lib/server/chromium/crServiceWorker.js +115 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/console.js +59 -0
- package/lib/server/cookieStore.js +112 -0
- package/lib/server/debugController.js +236 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +21 -0
- package/lib/server/deviceDescriptorsSource.json +1549 -0
- package/lib/server/dialog.js +70 -0
- package/lib/server/dispatchers/androidDispatcher.js +193 -0
- package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
- package/lib/server/dispatchers/browserDispatcher.js +170 -0
- package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- package/lib/server/dispatchers/dispatcher.js +400 -0
- package/lib/server/dispatchers/electronDispatcher.js +80 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +287 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +363 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
- package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- package/lib/server/dispatchers/streamDispatcher.js +62 -0
- package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
- package/lib/server/dom.js +808 -0
- package/lib/server/download.js +53 -0
- package/lib/server/electron/electron.js +254 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +611 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +71 -0
- package/lib/server/firefox/ffAccessibility.js +215 -0
- package/lib/server/firefox/ffBrowser.js +447 -0
- package/lib/server/firefox/ffConnection.js +168 -0
- package/lib/server/firefox/ffExecutionContext.js +138 -0
- package/lib/server/firefox/ffInput.js +150 -0
- package/lib/server/firefox/ffNetworkManager.js +231 -0
- package/lib/server/firefox/ffPage.js +558 -0
- package/lib/server/firefox/firefox.js +91 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1597 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +539 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +96 -0
- package/lib/server/input.js +301 -0
- package/lib/server/instrumentation.js +74 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
- package/lib/server/javascript.js +305 -0
- package/lib/server/launchApp.js +90 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +607 -0
- package/lib/server/page.js +793 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +82 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/codeGenerator.js +153 -0
- package/lib/server/recorder/csharp.js +310 -0
- package/lib/server/recorder/java.js +216 -0
- package/lib/server/recorder/javascript.js +229 -0
- package/lib/server/recorder/jsonl.js +47 -0
- package/lib/server/recorder/language.js +44 -0
- package/lib/server/recorder/python.js +275 -0
- package/lib/server/recorder/recorderActions.js +5 -0
- package/lib/server/recorder/recorderApp.js +181 -0
- package/lib/server/recorder/recorderUtils.js +48 -0
- package/lib/server/recorder/utils.js +45 -0
- package/lib/server/recorder.js +700 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +925 -0
- package/lib/server/registry/nativeDeps.js +383 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +354 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +168 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +552 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +229 -0
- package/lib/server/transport.js +191 -0
- package/lib/server/types.js +24 -0
- package/lib/server/usKeyboardLayout.js +555 -0
- package/lib/server/webkit/webkit.js +87 -0
- package/lib/server/webkit/wkAccessibility.js +194 -0
- package/lib/server/webkit/wkBrowser.js +328 -0
- package/lib/server/webkit/wkConnection.js +173 -0
- package/lib/server/webkit/wkExecutionContext.js +146 -0
- package/lib/server/webkit/wkInput.js +169 -0
- package/lib/server/webkit/wkInterceptableRequest.js +158 -0
- package/lib/server/webkit/wkPage.js +1198 -0
- package/lib/server/webkit/wkProvisionalPage.js +59 -0
- package/lib/server/webkit/wkWorkers.js +104 -0
- package/lib/third_party/diff_match_patch.js +2222 -0
- package/lib/third_party/pixelmatch.js +255 -0
- package/lib/utils/ascii.js +31 -0
- package/lib/utils/comparators.js +171 -0
- package/lib/utils/crypto.js +33 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +89 -0
- package/lib/utils/env.js +47 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/fileUtils.js +66 -0
- package/lib/utils/glob.js +83 -0
- package/lib/utils/happy-eyeballs.js +154 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +124 -0
- package/lib/utils/httpServer.js +195 -0
- package/lib/utils/index.js +324 -0
- package/lib/utils/isomorphic/cssParser.js +250 -0
- package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- package/lib/utils/isomorphic/locatorGenerators.js +651 -0
- package/lib/utils/isomorphic/locatorParser.js +179 -0
- package/lib/utils/isomorphic/locatorUtils.js +62 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +107 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/mimeType.js +29 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +189 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +41 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +123 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +131 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +125 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +99 -0
- package/lib/utilsBundle.js +81 -0
- package/lib/utilsBundleImpl/index.js +51 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
- package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
- package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
- package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
- package/lib/vite/recorder/index.html +29 -0
- package/lib/vite/recorder/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
- package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
- package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
- package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
- package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
- package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
- package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
- package/lib/vite/traceViewer/index.html +26 -0
- package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
- package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/snapshot.html +21 -0
- package/lib/vite/traceViewer/sw.bundle.js +4 -0
- package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
- package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
- package/lib/vite/traceViewer/uiMode.html +17 -0
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
- package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
- package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
- package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +43 -0
- package/types/protocol.d.ts +20304 -0
- package/types/structs.d.ts +45 -0
- 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
|
+
}
|