@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,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;
|