rebrowser-playwright-core 1.47.100 → 1.49.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/README.md +1 -1
- package/ThirdPartyNotices.txt +70 -384
- package/bin/reinstall_chrome_beta_linux.sh +10 -8
- package/bin/reinstall_chrome_stable_linux.sh +10 -8
- package/bin/reinstall_msedge_beta_linux.sh +11 -9
- package/bin/reinstall_msedge_dev_linux.sh +11 -9
- package/bin/reinstall_msedge_stable_linux.sh +11 -9
- package/browsers.json +24 -12
- package/lib/cli/program.js +49 -19
- package/lib/client/api.js +6 -0
- package/lib/client/browserContext.js +20 -2
- package/lib/client/channelOwner.js +6 -2
- package/lib/client/connection.js +3 -0
- package/lib/client/fetch.js +16 -21
- package/lib/client/jsHandle.js +0 -8
- package/lib/client/localUtils.js +1 -0
- package/lib/client/locator.js +7 -0
- package/lib/client/network.js +180 -17
- package/lib/client/page.js +25 -2
- package/lib/client/playwright.js +6 -3
- package/lib/client/tracing.js +29 -20
- package/lib/client/waiter.js +15 -11
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +7 -0
- package/lib/generated/webSocketMockSource.js +7 -0
- package/lib/protocol/validator.js +103 -17
- package/lib/server/ariaSnapshot.js +33 -0
- package/lib/server/bidi/bidiBrowser.js +23 -8
- package/lib/server/bidi/bidiChromium.js +124 -0
- package/lib/server/bidi/bidiConnection.js +1 -3
- package/lib/server/bidi/bidiExecutionContext.js +0 -6
- package/lib/server/bidi/bidiFirefox.js +15 -21
- package/lib/server/bidi/bidiInput.js +16 -32
- package/lib/server/bidi/bidiNetworkManager.js +39 -5
- package/lib/server/bidi/bidiOverCdp.js +103 -0
- package/lib/server/bidi/bidiPage.js +98 -25
- package/lib/server/bidi/bidiPdf.js +140 -0
- package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
- package/lib/server/browser.js +13 -2
- package/lib/server/browserContext.js +6 -23
- package/lib/server/browserType.js +43 -12
- package/lib/server/chromium/chromium.js +9 -17
- package/lib/server/chromium/chromiumSwitches.js +3 -1
- package/lib/server/chromium/crBrowser.js +4 -3
- package/lib/server/chromium/crConnection.js +153 -0
- package/lib/server/chromium/crExecutionContext.js +0 -20
- package/lib/server/chromium/crPage.js +13 -7
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/codegen/csharp.js +12 -17
- package/lib/server/codegen/java.js +5 -8
- package/lib/server/codegen/javascript.js +29 -7
- package/lib/server/codegen/language.js +14 -2
- package/lib/server/codegen/python.js +13 -17
- package/lib/server/cookieStore.js +73 -0
- package/lib/server/debugController.js +10 -7
- package/lib/server/deviceDescriptorsSource.json +127 -127
- package/lib/server/dialog.js +1 -0
- package/lib/server/dispatchers/androidDispatcher.js +13 -2
- package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
- package/lib/server/dispatchers/debugControllerDispatcher.js +1 -1
- package/lib/server/dispatchers/dispatcher.js +1 -1
- package/lib/server/dispatchers/frameDispatcher.js +8 -1
- package/lib/server/dispatchers/jsHandleDispatcher.js +0 -5
- package/lib/server/dispatchers/pageDispatcher.js +9 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +2 -1
- package/lib/server/dispatchers/tracingDispatcher.js +10 -0
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
- package/lib/server/dom.js +79 -36
- package/lib/server/download.js +9 -2
- package/lib/server/fetch.js +105 -96
- package/lib/server/firefox/ffBrowser.js +6 -4
- package/lib/server/firefox/ffExecutionContext.js +0 -15
- package/lib/server/firefox/ffNetworkManager.js +1 -1
- package/lib/server/firefox/ffPage.js +6 -3
- package/lib/server/firefox/firefox.js +2 -13
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +68 -67
- package/lib/server/har/harTracer.js +11 -0
- package/lib/server/index.js +0 -6
- package/lib/server/input.js +0 -1
- package/lib/server/javascript.js +0 -13
- package/lib/server/page.js +53 -9
- package/lib/server/playwright.js +5 -2
- package/lib/server/progress.js +0 -3
- package/lib/server/recorder/contextRecorder.js +33 -50
- package/lib/server/recorder/recorderApp.js +22 -25
- package/lib/server/recorder/recorderCollection.js +68 -79
- package/lib/server/recorder/recorderInTraceViewer.js +144 -0
- package/lib/server/recorder/recorderRunner.js +75 -97
- package/lib/server/recorder/recorderUtils.js +48 -6
- package/lib/server/recorder.js +87 -47
- package/lib/server/registry/index.js +154 -26
- package/lib/server/registry/nativeDeps.js +6 -3
- package/lib/server/socksClientCertificatesInterceptor.js +15 -3
- package/lib/server/trace/recorder/snapshotter.js +2 -12
- package/lib/server/trace/recorder/snapshotterInjected.js +21 -3
- package/lib/server/trace/recorder/tracing.js +127 -17
- package/lib/server/trace/test/inMemorySnapshotter.js +4 -4
- package/lib/server/trace/viewer/traceViewer.js +4 -6
- package/lib/server/webkit/webkit.js +1 -1
- package/lib/server/webkit/wkBrowser.js +8 -7
- package/lib/server/webkit/wkExecutionContext.js +0 -16
- package/lib/server/webkit/wkPage.js +11 -4
- package/lib/utils/comparators.js +12 -30
- package/lib/utils/crypto.js +1 -4
- package/lib/utils/happy-eyeballs.js +13 -0
- package/lib/utils/hostPlatform.js +8 -2
- package/lib/utils/httpServer.js +1 -0
- package/lib/utils/isomorphic/ariaSnapshot.js +267 -0
- package/lib/utils/isomorphic/locatorGenerators.js +30 -21
- package/lib/utils/isomorphic/locatorParser.js +2 -2
- package/lib/utils/isomorphic/recorderUtils.js +227 -0
- package/lib/utils/isomorphic/stringUtils.js +30 -0
- package/lib/utils/isomorphic/urlMatch.js +5 -1
- package/lib/utils/network.js +1 -1
- package/lib/utils/sequence.js +64 -0
- package/lib/utils/stackTrace.js +16 -3
- package/lib/utils/zones.js +32 -23
- package/lib/utilsBundle.js +4 -5
- package/lib/utilsBundleImpl/index.js +190 -33
- package/lib/vite/htmlReport/index.html +19 -16
- package/lib/vite/recorder/assets/codeMirrorModule-AFvV6hAs.js +24 -0
- package/lib/vite/recorder/assets/index-_cTWgVuJ.js +184 -0
- package/lib/vite/recorder/assets/{index-B-MT5gKo.css → index-iA1aAGZg.css} +1 -1
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-KatbITLF.js +24 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DdpLd2bb.js +68 -0
- package/lib/vite/traceViewer/assets/workbench-CdYbzWFD.js +9 -0
- package/lib/vite/traceViewer/embedded.6m3UZh7r.js +2 -0
- package/lib/vite/traceViewer/embedded.html +5 -3
- package/lib/vite/traceViewer/index.WUV-8boJ.js +2 -0
- package/lib/vite/traceViewer/index.html +24 -5
- package/lib/vite/traceViewer/inspectorTab.DEOUW62d.css +1 -0
- package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- package/lib/vite/traceViewer/recorder.OT2tVHgn.js +2 -0
- package/lib/vite/traceViewer/recorder.html +17 -0
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.BZBTyvGn.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +6 -4
- package/lib/vite/traceViewer/{uiMode.D3cNFP6u.css → uiMode.voC1ZiOQ.css} +1 -1
- package/lib/vite/traceViewer/workbench.C-zR9ysA.css +1 -0
- package/package.json +1 -1
- package/types/protocol.d.ts +135 -16
- package/types/types.d.ts +2149 -965
- package/lib/generated/recorderSource.js +0 -7
- package/lib/third_party/diff_match_patch.js +0 -2222
- package/lib/vite/recorder/assets/codeMirrorModule-aW6Vz3gf.js +0 -24
- package/lib/vite/recorder/assets/index-DCpXOVIh.js +0 -47
- package/lib/vite/traceViewer/assets/codeMirrorModule-eFKCUIu2.js +0 -24
- package/lib/vite/traceViewer/assets/workbench-D0cirtfA.js +0 -72
- package/lib/vite/traceViewer/embedded.BkuvsLJp.js +0 -2
- package/lib/vite/traceViewer/index.C968kAiC.js +0 -2
- package/lib/vite/traceViewer/uiMode.BkFnr4V0.js +0 -10
- package/lib/vite/traceViewer/workbench.DjbIuxix.css +0 -1
- /package/lib/server/recorder/{recorderActions.js → recorderFrontend.js} +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BidiChromium = void 0;
|
|
7
|
+
var _os = _interopRequireDefault(require("os"));
|
|
8
|
+
var _utils = require("../../utils");
|
|
9
|
+
var _browserType = require("../browserType");
|
|
10
|
+
var _chromiumSwitches = require("../chromium/chromiumSwitches");
|
|
11
|
+
var _bidiBrowser = require("./bidiBrowser");
|
|
12
|
+
var _bidiConnection = require("./bidiConnection");
|
|
13
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
+
/**
|
|
15
|
+
* Copyright (c) Microsoft Corporation.
|
|
16
|
+
*
|
|
17
|
+
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
18
|
+
* you may not use this file except in compliance with the License.
|
|
19
|
+
* You may obtain a copy of the License at
|
|
20
|
+
*
|
|
21
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
22
|
+
*
|
|
23
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
24
|
+
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
25
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
26
|
+
* See the License for the specific language governing permissions and
|
|
27
|
+
* limitations under the License.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
class BidiChromium extends _browserType.BrowserType {
|
|
31
|
+
constructor(parent) {
|
|
32
|
+
super(parent, 'bidi');
|
|
33
|
+
this._useBidi = true;
|
|
34
|
+
}
|
|
35
|
+
async connectToTransport(transport, options) {
|
|
36
|
+
// Chrome doesn't support Bidi, we create Bidi over CDP which is used by Chrome driver.
|
|
37
|
+
// bidiOverCdp depends on chromium-bidi which we only have in devDependencies, so
|
|
38
|
+
// we load bidiOverCdp dynamically.
|
|
39
|
+
const bidiTransport = await require('./bidiOverCdp').connectBidiOverCdp(transport);
|
|
40
|
+
transport[kBidiOverCdpWrapper] = bidiTransport;
|
|
41
|
+
return _bidiBrowser.BidiBrowser.connect(this.attribution.playwright, bidiTransport, options);
|
|
42
|
+
}
|
|
43
|
+
doRewriteStartupLog(error) {
|
|
44
|
+
if (!error.logs) return error;
|
|
45
|
+
if (error.logs.includes('Missing X server')) error.logs = '\n' + (0, _utils.wrapInASCIIBox)(_browserType.kNoXServerRunningError, 1);
|
|
46
|
+
// These error messages are taken from Chromium source code as of July, 2020:
|
|
47
|
+
// https://github.com/chromium/chromium/blob/70565f67e79f79e17663ad1337dc6e63ee207ce9/content/browser/zygote_host/zygote_host_impl_linux.cc
|
|
48
|
+
if (!error.logs.includes('crbug.com/357670') && !error.logs.includes('No usable sandbox!') && !error.logs.includes('crbug.com/638180')) return error;
|
|
49
|
+
error.logs = [`Chromium sandboxing failed!`, `================================`, `To avoid the sandboxing issue, do either of the following:`, ` - (preferred): Configure your environment to support sandboxing`, ` - (alternative): Launch Chromium without sandbox using 'chromiumSandbox: false' option`, `================================`, ``].join('\n');
|
|
50
|
+
return error;
|
|
51
|
+
}
|
|
52
|
+
amendEnvironment(env, userDataDir, executable, browserArguments) {
|
|
53
|
+
return env;
|
|
54
|
+
}
|
|
55
|
+
attemptToGracefullyCloseBrowser(transport) {
|
|
56
|
+
const bidiTransport = transport[kBidiOverCdpWrapper];
|
|
57
|
+
if (bidiTransport) transport = bidiTransport;
|
|
58
|
+
transport.send({
|
|
59
|
+
method: 'browser.close',
|
|
60
|
+
params: {},
|
|
61
|
+
id: _bidiConnection.kBrowserCloseMessageId
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
defaultArgs(options, isPersistent, userDataDir) {
|
|
65
|
+
const chromeArguments = this._innerDefaultArgs(options);
|
|
66
|
+
chromeArguments.push(`--user-data-dir=${userDataDir}`);
|
|
67
|
+
chromeArguments.push('--remote-debugging-port=0');
|
|
68
|
+
if (isPersistent) chromeArguments.push('about:blank');else chromeArguments.push('--no-startup-window');
|
|
69
|
+
return chromeArguments;
|
|
70
|
+
}
|
|
71
|
+
readyState(options) {
|
|
72
|
+
(0, _utils.assert)(options.useWebSocket);
|
|
73
|
+
return new ChromiumReadyState();
|
|
74
|
+
}
|
|
75
|
+
_innerDefaultArgs(options) {
|
|
76
|
+
const {
|
|
77
|
+
args = []
|
|
78
|
+
} = options;
|
|
79
|
+
const userDataDirArg = args.find(arg => arg.startsWith('--user-data-dir'));
|
|
80
|
+
if (userDataDirArg) throw this._createUserDataDirArgMisuseError('--user-data-dir');
|
|
81
|
+
if (args.find(arg => arg.startsWith('--remote-debugging-pipe'))) throw new Error('Playwright manages remote debugging connection itself.');
|
|
82
|
+
if (args.find(arg => !arg.startsWith('-'))) throw new Error('Arguments can not specify page to be opened');
|
|
83
|
+
const chromeArguments = [..._chromiumSwitches.chromiumSwitches];
|
|
84
|
+
if (_os.default.platform() === 'darwin') {
|
|
85
|
+
// See https://github.com/microsoft/playwright/issues/7362
|
|
86
|
+
chromeArguments.push('--enable-use-zoom-for-dsf=false');
|
|
87
|
+
// See https://bugs.chromium.org/p/chromium/issues/detail?id=1407025.
|
|
88
|
+
if (options.headless) chromeArguments.push('--use-angle');
|
|
89
|
+
}
|
|
90
|
+
if (options.devtools) chromeArguments.push('--auto-open-devtools-for-tabs');
|
|
91
|
+
if (options.headless) {
|
|
92
|
+
chromeArguments.push('--headless');
|
|
93
|
+
chromeArguments.push('--hide-scrollbars', '--mute-audio', '--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4');
|
|
94
|
+
}
|
|
95
|
+
if (options.chromiumSandbox !== true) chromeArguments.push('--no-sandbox');
|
|
96
|
+
const proxy = options.proxyOverride || options.proxy;
|
|
97
|
+
if (proxy) {
|
|
98
|
+
const proxyURL = new URL(proxy.server);
|
|
99
|
+
const isSocks = proxyURL.protocol === 'socks5:';
|
|
100
|
+
// https://www.chromium.org/developers/design-documents/network-settings
|
|
101
|
+
if (isSocks && !this.attribution.playwright.options.socksProxyPort) {
|
|
102
|
+
// https://www.chromium.org/developers/design-documents/network-stack/socks-proxy
|
|
103
|
+
chromeArguments.push(`--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE ${proxyURL.hostname}"`);
|
|
104
|
+
}
|
|
105
|
+
chromeArguments.push(`--proxy-server=${proxy.server}`);
|
|
106
|
+
const proxyBypassRules = [];
|
|
107
|
+
// https://source.chromium.org/chromium/chromium/src/+/master:net/docs/proxy.md;l=548;drc=71698e610121078e0d1a811054dcf9fd89b49578
|
|
108
|
+
if (this.attribution.playwright.options.socksProxyPort) proxyBypassRules.push('<-loopback>');
|
|
109
|
+
if (proxy.bypass) proxyBypassRules.push(...proxy.bypass.split(',').map(t => t.trim()).map(t => t.startsWith('.') ? '*' + t : t));
|
|
110
|
+
if (!process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes('<-loopback>')) proxyBypassRules.push('<-loopback>');
|
|
111
|
+
if (proxyBypassRules.length > 0) chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(';')}`);
|
|
112
|
+
}
|
|
113
|
+
chromeArguments.push(...args);
|
|
114
|
+
return chromeArguments;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.BidiChromium = BidiChromium;
|
|
118
|
+
class ChromiumReadyState extends _browserType.BrowserReadyState {
|
|
119
|
+
onBrowserOutput(message) {
|
|
120
|
+
const match = message.match(/DevTools listening on (.*)/);
|
|
121
|
+
if (match) this._wsEndpoint.resolve(match[1]);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const kBidiOverCdpWrapper = Symbol('kBidiConnectionWrapper');
|
|
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.kBrowserCloseMessageId = exports.BidiSession = exports.BidiConnection = void 0;
|
|
7
7
|
var _events = require("events");
|
|
8
|
-
var _utils = require("../../utils");
|
|
9
8
|
var _debugLogger = require("../../utils/debugLogger");
|
|
10
9
|
var _helper = require("../helper");
|
|
11
10
|
var _protocolError = require("../protocolError");
|
|
@@ -66,7 +65,7 @@ class BidiConnection {
|
|
|
66
65
|
var _object$params$source;
|
|
67
66
|
// Route page events to the right session.
|
|
68
67
|
let context;
|
|
69
|
-
if ('context' in object.params) context = object.params.context;else if (object.method === 'log.entryAdded') context = (_object$params$source = object.params.source) === null || _object$params$source === void 0 ? void 0 : _object$params$source.context;
|
|
68
|
+
if ('context' in object.params) context = object.params.context;else if (object.method === 'log.entryAdded' || object.method === 'script.message') context = (_object$params$source = object.params.source) === null || _object$params$source === void 0 ? void 0 : _object$params$source.context;
|
|
70
69
|
if (context) {
|
|
71
70
|
const session = this._browsingContextToSession.get(context);
|
|
72
71
|
if (session) {
|
|
@@ -197,7 +196,6 @@ class BidiSession extends _events.EventEmitter {
|
|
|
197
196
|
}
|
|
198
197
|
} else if (object.id) {
|
|
199
198
|
// Response might come after session has been disposed and rejected all callbacks.
|
|
200
|
-
(0, _utils.assert)(this.isDisposed());
|
|
201
199
|
} else {
|
|
202
200
|
Promise.resolve().then(() => this.emit(object.method, object.params));
|
|
203
201
|
}
|
|
@@ -79,9 +79,6 @@ class BidiExecutionContext {
|
|
|
79
79
|
if (response.type === 'exception') throw new js.JavaScriptErrorInEvaluate(response.exceptionDetails.text + '\nFull val: ' + JSON.stringify(response.exceptionDetails));
|
|
80
80
|
throw new js.JavaScriptErrorInEvaluate('Unexpected response type: ' + JSON.stringify(response));
|
|
81
81
|
}
|
|
82
|
-
rawCallFunctionNoReply(func, ...args) {
|
|
83
|
-
throw new Error('Method not implemented.');
|
|
84
|
-
}
|
|
85
82
|
async evaluateWithArguments(functionDeclaration, returnByValue, utilityScript, values, objectIds) {
|
|
86
83
|
const response = await this._session.send('script.callFunction', {
|
|
87
84
|
functionDeclaration,
|
|
@@ -124,9 +121,6 @@ class BidiExecutionContext {
|
|
|
124
121
|
handles: [objectId]
|
|
125
122
|
});
|
|
126
123
|
}
|
|
127
|
-
objectCount(objectId) {
|
|
128
|
-
throw new Error('Method not implemented.');
|
|
129
|
-
}
|
|
130
124
|
async rawCallFunction(functionDeclaration, arg) {
|
|
131
125
|
const response = await this._session.send('script.callFunction', {
|
|
132
126
|
functionDeclaration,
|
|
@@ -10,6 +10,7 @@ var _utils = require("../../utils");
|
|
|
10
10
|
var _browserType = require("../browserType");
|
|
11
11
|
var _bidiBrowser = require("./bidiBrowser");
|
|
12
12
|
var _bidiConnection = require("./bidiConnection");
|
|
13
|
+
var _firefoxPrefs = require("./third_party/firefoxPrefs");
|
|
13
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
15
|
/**
|
|
15
16
|
* Copyright (c) Microsoft Corporation.
|
|
@@ -44,6 +45,12 @@ class BidiFirefox extends _browserType.BrowserType {
|
|
|
44
45
|
}
|
|
45
46
|
amendEnvironment(env, userDataDir, executable, browserArguments) {
|
|
46
47
|
if (!_path.default.isAbsolute(_os.default.homedir())) throw new Error(`Cannot launch Firefox with relative home directory. Did you set ${_os.default.platform() === 'win32' ? 'USERPROFILE' : 'HOME'} to a relative path?`);
|
|
48
|
+
env = {
|
|
49
|
+
...env,
|
|
50
|
+
'MOZ_CRASHREPORTER': '1',
|
|
51
|
+
'MOZ_CRASHREPORTER_NO_REPORT': '1',
|
|
52
|
+
'MOZ_CRASHREPORTER_SHUTDOWN': '1'
|
|
53
|
+
};
|
|
47
54
|
if (_os.default.platform() === 'linux') {
|
|
48
55
|
// Always remove SNAP_NAME and SNAP_INSTANCE_NAME env variables since they
|
|
49
56
|
// confuse Firefox: in our case, builds never come from SNAP.
|
|
@@ -63,6 +70,12 @@ class BidiFirefox extends _browserType.BrowserType {
|
|
|
63
70
|
id: _bidiConnection.kBrowserCloseMessageId
|
|
64
71
|
});
|
|
65
72
|
}
|
|
73
|
+
async prepareUserDataDir(options, userDataDir) {
|
|
74
|
+
await (0, _firefoxPrefs.createProfile)({
|
|
75
|
+
path: userDataDir,
|
|
76
|
+
preferences: options.firefoxUserPrefs || {}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
66
79
|
defaultArgs(options, isPersistent, userDataDir) {
|
|
67
80
|
const {
|
|
68
81
|
args = [],
|
|
@@ -74,37 +87,18 @@ class BidiFirefox extends _browserType.BrowserType {
|
|
|
74
87
|
if (headless) firefoxArguments.push('--headless');else firefoxArguments.push('--foreground');
|
|
75
88
|
firefoxArguments.push(`--profile`, userDataDir);
|
|
76
89
|
firefoxArguments.push(...args);
|
|
77
|
-
// TODO: make ephemeral context work without this argument.
|
|
78
|
-
firefoxArguments.push('about:blank');
|
|
79
|
-
// if (isPersistent)
|
|
80
|
-
// firefoxArguments.push('about:blank');
|
|
81
|
-
// else
|
|
82
|
-
// firefoxArguments.push('-silent');
|
|
83
90
|
return firefoxArguments;
|
|
84
91
|
}
|
|
85
92
|
readyState(options) {
|
|
86
93
|
(0, _utils.assert)(options.useWebSocket);
|
|
87
|
-
return new
|
|
94
|
+
return new FirefoxReadyState();
|
|
88
95
|
}
|
|
89
96
|
}
|
|
90
97
|
exports.BidiFirefox = BidiFirefox;
|
|
91
|
-
class
|
|
92
|
-
constructor() {
|
|
93
|
-
this._wsEndpoint = new _utils.ManualPromise();
|
|
94
|
-
}
|
|
98
|
+
class FirefoxReadyState extends _browserType.BrowserReadyState {
|
|
95
99
|
onBrowserOutput(message) {
|
|
96
100
|
// Bidi WebSocket in Firefox.
|
|
97
101
|
const match = message.match(/WebDriver BiDi listening on (ws:\/\/.*)$/);
|
|
98
102
|
if (match) this._wsEndpoint.resolve(match[1] + '/session');
|
|
99
103
|
}
|
|
100
|
-
onBrowserExit() {
|
|
101
|
-
// Unblock launch when browser prematurely exits.
|
|
102
|
-
this._wsEndpoint.resolve(undefined);
|
|
103
|
-
}
|
|
104
|
-
async waitUntilReady() {
|
|
105
|
-
const wsEndpoint = await this._wsEndpoint;
|
|
106
|
-
return {
|
|
107
|
-
wsEndpoint
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
104
|
}
|
|
@@ -82,7 +82,7 @@ class RawMouseImpl {
|
|
|
82
82
|
this._session = session;
|
|
83
83
|
}
|
|
84
84
|
async move(x, y, button, buttons, modifiers, forClick) {
|
|
85
|
-
//
|
|
85
|
+
// Bidi throws when x/y are not integers.
|
|
86
86
|
x = Math.round(x);
|
|
87
87
|
y = Math.round(y);
|
|
88
88
|
await this._performActions([{
|
|
@@ -103,41 +103,25 @@ class RawMouseImpl {
|
|
|
103
103
|
button: toBidiButton(button)
|
|
104
104
|
}]);
|
|
105
105
|
}
|
|
106
|
-
async
|
|
106
|
+
async wheel(x, y, buttons, modifiers, deltaX, deltaY) {
|
|
107
|
+
// Bidi throws when x/y are not integers.
|
|
107
108
|
x = Math.round(x);
|
|
108
109
|
y = Math.round(y);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
110
|
+
await this._session.send('input.performActions', {
|
|
111
|
+
context: this._session.sessionId,
|
|
112
|
+
actions: [{
|
|
113
|
+
type: 'wheel',
|
|
114
|
+
id: 'pw_mouse_wheel',
|
|
115
|
+
actions: [{
|
|
116
|
+
type: 'scroll',
|
|
117
|
+
x,
|
|
118
|
+
y,
|
|
119
|
+
deltaX,
|
|
120
|
+
deltaY
|
|
121
|
+
}]
|
|
122
|
+
}]
|
|
119
123
|
});
|
|
120
|
-
for (let cc = 1; cc <= clickCount; ++cc) {
|
|
121
|
-
actions.push({
|
|
122
|
-
type: 'pointerDown',
|
|
123
|
-
button
|
|
124
|
-
});
|
|
125
|
-
if (delay) actions.push({
|
|
126
|
-
type: 'pause',
|
|
127
|
-
duration: delay
|
|
128
|
-
});
|
|
129
|
-
actions.push({
|
|
130
|
-
type: 'pointerUp',
|
|
131
|
-
button
|
|
132
|
-
});
|
|
133
|
-
if (delay && cc < clickCount) actions.push({
|
|
134
|
-
type: 'pause',
|
|
135
|
-
duration: delay
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
await this._performActions(actions);
|
|
139
124
|
}
|
|
140
|
-
async wheel(x, y, buttons, modifiers, deltaX, deltaY) {}
|
|
141
125
|
async _performActions(actions) {
|
|
142
126
|
await this._session.send('input.performActions', {
|
|
143
127
|
context: this._session.sessionId,
|
|
@@ -8,6 +8,7 @@ exports.bidiBytesValueToString = bidiBytesValueToString;
|
|
|
8
8
|
var _eventsHelper = require("../../utils/eventsHelper");
|
|
9
9
|
var network = _interopRequireWildcard(require("../network"));
|
|
10
10
|
var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
|
|
11
|
+
var _cookieStore = require("../cookieStore");
|
|
11
12
|
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); }
|
|
12
13
|
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; }
|
|
13
14
|
/**
|
|
@@ -59,7 +60,7 @@ class BidiNetworkManager {
|
|
|
59
60
|
var _redirectedFrom$_orig;
|
|
60
61
|
this._session.sendMayFail('network.continueRequest', {
|
|
61
62
|
request: param.request.request,
|
|
62
|
-
|
|
63
|
+
...(((_redirectedFrom$_orig = redirectedFrom._originalRequestRoute) === null || _redirectedFrom$_orig === void 0 ? void 0 : _redirectedFrom$_orig._alreadyContinuedHeaders) || {})
|
|
63
64
|
});
|
|
64
65
|
} else {
|
|
65
66
|
route = new BidiRouteImpl(this._session, param.request.request);
|
|
@@ -242,13 +243,12 @@ class BidiRouteImpl {
|
|
|
242
243
|
return header;
|
|
243
244
|
});
|
|
244
245
|
}
|
|
245
|
-
this._alreadyContinuedHeaders =
|
|
246
|
+
this._alreadyContinuedHeaders = headers;
|
|
246
247
|
await this._session.sendMayFail('network.continueRequest', {
|
|
247
248
|
request: this._requestId,
|
|
248
249
|
url: overrides.url,
|
|
249
250
|
method: overrides.method,
|
|
250
|
-
|
|
251
|
-
headers: this._alreadyContinuedHeaders,
|
|
251
|
+
...toBidiRequestHeaders(this._alreadyContinuedHeaders),
|
|
252
252
|
body: overrides.postData ? {
|
|
253
253
|
type: 'base64',
|
|
254
254
|
value: Buffer.from(overrides.postData).toString('base64')
|
|
@@ -261,7 +261,7 @@ class BidiRouteImpl {
|
|
|
261
261
|
request: this._requestId,
|
|
262
262
|
statusCode: response.status,
|
|
263
263
|
reasonPhrase: network.statusText(response.status),
|
|
264
|
-
|
|
264
|
+
...toBidiResponseHeaders(response.headers),
|
|
265
265
|
body: {
|
|
266
266
|
type: 'base64',
|
|
267
267
|
value: base64body
|
|
@@ -285,6 +285,34 @@ function fromBidiHeaders(bidiHeaders) {
|
|
|
285
285
|
});
|
|
286
286
|
return result;
|
|
287
287
|
}
|
|
288
|
+
function toBidiRequestHeaders(allHeaders) {
|
|
289
|
+
const bidiHeaders = toBidiHeaders(allHeaders);
|
|
290
|
+
const cookies = bidiHeaders.filter(h => h.name.toLowerCase() === 'cookie');
|
|
291
|
+
const headers = bidiHeaders.filter(h => h.name.toLowerCase() !== 'cookie');
|
|
292
|
+
return {
|
|
293
|
+
cookies,
|
|
294
|
+
headers
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
function toBidiResponseHeaders(headers) {
|
|
298
|
+
const setCookieHeaders = headers.filter(h => h.name.toLowerCase() === 'set-cookie');
|
|
299
|
+
const otherHeaders = headers.filter(h => h.name.toLowerCase() !== 'set-cookie');
|
|
300
|
+
const rawCookies = setCookieHeaders.map(h => (0, _cookieStore.parseRawCookie)(h.value));
|
|
301
|
+
const cookies = rawCookies.filter(Boolean).map(c => {
|
|
302
|
+
return {
|
|
303
|
+
...c,
|
|
304
|
+
value: {
|
|
305
|
+
type: 'string',
|
|
306
|
+
value: c.value
|
|
307
|
+
},
|
|
308
|
+
sameSite: toBidiSameSite(c.sameSite)
|
|
309
|
+
};
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
cookies,
|
|
313
|
+
headers: toBidiHeaders(otherHeaders)
|
|
314
|
+
};
|
|
315
|
+
}
|
|
288
316
|
function toBidiHeaders(headers) {
|
|
289
317
|
return headers.map(({
|
|
290
318
|
name,
|
|
@@ -301,4 +329,10 @@ function bidiBytesValueToString(value) {
|
|
|
301
329
|
if (value.type === 'string') return value.value;
|
|
302
330
|
if (value.type === 'base64') return Buffer.from(value.type, 'base64').toString('binary');
|
|
303
331
|
return 'unknown value type: ' + value.type;
|
|
332
|
+
}
|
|
333
|
+
function toBidiSameSite(sameSite) {
|
|
334
|
+
if (!sameSite) return undefined;
|
|
335
|
+
if (sameSite === 'Strict') return bidi.Network.SameSite.Strict;
|
|
336
|
+
if (sameSite === 'Lax') return bidi.Network.SameSite.Lax;
|
|
337
|
+
return bidi.Network.SameSite.None;
|
|
304
338
|
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.connectBidiOverCdp = connectBidiOverCdp;
|
|
7
|
+
var bidiMapper = _interopRequireWildcard(require("chromium-bidi/lib/cjs/bidiMapper/BidiMapper"));
|
|
8
|
+
var bidiCdpConnection = _interopRequireWildcard(require("chromium-bidi/lib/cjs/cdp/CdpConnection"));
|
|
9
|
+
var _debugLogger = require("../../utils/debugLogger");
|
|
10
|
+
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); }
|
|
11
|
+
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; }
|
|
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
|
+
const bidiServerLogger = (prefix, ...args) => {
|
|
29
|
+
_debugLogger.debugLogger.log(prefix, args);
|
|
30
|
+
};
|
|
31
|
+
async function connectBidiOverCdp(cdp) {
|
|
32
|
+
let server = undefined;
|
|
33
|
+
const bidiTransport = new BidiTransportImpl();
|
|
34
|
+
const bidiConnection = new BidiConnection(bidiTransport, () => {
|
|
35
|
+
var _server;
|
|
36
|
+
return (_server = server) === null || _server === void 0 ? void 0 : _server.close();
|
|
37
|
+
});
|
|
38
|
+
const cdpTransportImpl = new CdpTransportImpl(cdp);
|
|
39
|
+
const cdpConnection = new bidiCdpConnection.MapperCdpConnection(cdpTransportImpl, bidiServerLogger);
|
|
40
|
+
// Make sure onclose event is propagated.
|
|
41
|
+
cdp.onclose = () => {
|
|
42
|
+
var _bidiConnection$onclo;
|
|
43
|
+
return (_bidiConnection$onclo = bidiConnection.onclose) === null || _bidiConnection$onclo === void 0 ? void 0 : _bidiConnection$onclo.call(bidiConnection);
|
|
44
|
+
};
|
|
45
|
+
server = await bidiMapper.BidiServer.createAndStart(bidiTransport, cdpConnection, await cdpConnection.createBrowserSession(), /* selfTargetId= */'', undefined, bidiServerLogger);
|
|
46
|
+
return bidiConnection;
|
|
47
|
+
}
|
|
48
|
+
class BidiTransportImpl {
|
|
49
|
+
constructor() {
|
|
50
|
+
this._handler = void 0;
|
|
51
|
+
this._bidiConnection = void 0;
|
|
52
|
+
}
|
|
53
|
+
setOnMessage(handler) {
|
|
54
|
+
this._handler = handler;
|
|
55
|
+
}
|
|
56
|
+
sendMessage(message) {
|
|
57
|
+
var _this$_bidiConnection, _this$_bidiConnection2;
|
|
58
|
+
return (_this$_bidiConnection = (_this$_bidiConnection2 = this._bidiConnection).onmessage) === null || _this$_bidiConnection === void 0 ? void 0 : _this$_bidiConnection.call(_this$_bidiConnection2, message);
|
|
59
|
+
}
|
|
60
|
+
close() {
|
|
61
|
+
var _this$_bidiConnection3, _this$_bidiConnection4;
|
|
62
|
+
(_this$_bidiConnection3 = (_this$_bidiConnection4 = this._bidiConnection).onclose) === null || _this$_bidiConnection3 === void 0 || _this$_bidiConnection3.call(_this$_bidiConnection4);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
class BidiConnection {
|
|
66
|
+
constructor(bidiTransport, closeCallback) {
|
|
67
|
+
this._bidiTransport = void 0;
|
|
68
|
+
this._closeCallback = void 0;
|
|
69
|
+
this.onmessage = void 0;
|
|
70
|
+
this.onclose = void 0;
|
|
71
|
+
this._bidiTransport = bidiTransport;
|
|
72
|
+
this._bidiTransport._bidiConnection = this;
|
|
73
|
+
this._closeCallback = closeCallback;
|
|
74
|
+
}
|
|
75
|
+
send(s) {
|
|
76
|
+
var _this$_bidiTransport$, _this$_bidiTransport;
|
|
77
|
+
(_this$_bidiTransport$ = (_this$_bidiTransport = this._bidiTransport)._handler) === null || _this$_bidiTransport$ === void 0 || _this$_bidiTransport$.call(_this$_bidiTransport, s);
|
|
78
|
+
}
|
|
79
|
+
close() {
|
|
80
|
+
this._closeCallback();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
class CdpTransportImpl {
|
|
84
|
+
constructor(connection) {
|
|
85
|
+
this._connection = void 0;
|
|
86
|
+
this._handler = void 0;
|
|
87
|
+
this._bidiConnection = void 0;
|
|
88
|
+
this._connection = connection;
|
|
89
|
+
this._connection.onmessage = message => {
|
|
90
|
+
var _this$_handler;
|
|
91
|
+
(_this$_handler = this._handler) === null || _this$_handler === void 0 || _this$_handler.call(this, JSON.stringify(message));
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
setOnMessage(handler) {
|
|
95
|
+
this._handler = handler;
|
|
96
|
+
}
|
|
97
|
+
sendMessage(message) {
|
|
98
|
+
return this._connection.send(JSON.parse(message));
|
|
99
|
+
}
|
|
100
|
+
close() {
|
|
101
|
+
this._connection.close();
|
|
102
|
+
}
|
|
103
|
+
}
|