@checkly/playwright-core 1.42.18 → 1.47.20-alpha
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/ThirdPartyNotices.txt +144 -109
- package/browsers.json +15 -25
- package/lib/androidServerImpl.js +1 -1
- package/lib/browserServerImpl.js +1 -1
- package/lib/cli/driver.js +1 -3
- package/lib/cli/program.js +5 -10
- package/lib/client/android.js +1 -1
- package/lib/client/api.js +7 -0
- package/lib/client/browserContext.js +37 -5
- package/lib/client/browserType.js +19 -11
- package/lib/client/channelOwner.js +19 -16
- package/lib/client/clientInstrumentation.js +17 -7
- package/lib/client/clock.js +68 -0
- package/lib/client/connection.js +9 -6
- package/lib/client/electron.js +7 -5
- package/lib/client/elementHandle.js +44 -14
- package/lib/client/eventEmitter.js +314 -0
- package/lib/client/fetch.js +81 -28
- package/lib/client/frame.js +2 -4
- package/lib/client/jsHandle.js +7 -1
- package/lib/client/locator.js +9 -0
- package/lib/client/network.js +12 -9
- package/lib/client/page.js +45 -23
- package/lib/client/playwright.js +3 -0
- package/lib/client/tracing.js +7 -4
- package/lib/common/socksProxy.js +2 -2
- package/lib/generated/clockSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/recorderSource.js +1 -1
- package/lib/generated/utilityScriptSource.js +1 -1
- package/lib/protocol/serializers.js +12 -11
- package/lib/protocol/validator.js +137 -55
- package/lib/server/bidi/bidiBrowser.js +296 -0
- package/lib/server/bidi/bidiConnection.js +206 -0
- package/lib/server/bidi/bidiExecutionContext.js +162 -0
- package/lib/server/bidi/bidiFirefox.js +110 -0
- package/lib/server/bidi/bidiInput.js +174 -0
- package/lib/server/bidi/bidiNetworkManager.js +304 -0
- package/lib/server/bidi/bidiPage.js +456 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
- package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
- package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
- package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
- package/lib/server/browser.js +9 -1
- package/lib/server/browserContext.js +97 -22
- package/lib/server/browserType.js +27 -20
- package/lib/server/chromium/chromium.js +30 -15
- package/lib/server/chromium/chromiumSwitches.js +6 -3
- package/lib/server/chromium/crBrowser.js +11 -17
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crDragDrop.js +28 -29
- package/lib/server/chromium/crNetworkManager.js +130 -84
- package/lib/server/chromium/crPage.js +34 -79
- package/lib/server/chromium/crProtocolHelper.js +3 -1
- package/lib/server/chromium/crServiceWorker.js +20 -23
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/clock.js +125 -0
- package/lib/server/codegen/csharp.js +299 -0
- package/lib/server/codegen/java.js +235 -0
- package/lib/server/codegen/javascript.js +223 -0
- package/lib/server/codegen/jsonl.js +47 -0
- package/lib/server/codegen/language.js +76 -0
- package/lib/server/codegen/languages.js +30 -0
- package/lib/server/codegen/python.js +265 -0
- package/lib/server/codegen/types.js +5 -0
- package/lib/server/debugController.js +3 -5
- package/lib/server/deviceDescriptors.js +9 -4
- package/lib/server/deviceDescriptorsSource.json +239 -119
- package/lib/server/dispatchers/androidDispatcher.js +1 -1
- package/lib/server/dispatchers/browserContextDispatcher.js +51 -7
- package/lib/server/dispatchers/dispatcher.js +36 -40
- package/lib/server/dispatchers/frameDispatcher.js +1 -2
- package/lib/server/dispatchers/jsHandleDispatcher.js +1 -1
- package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -6
- package/lib/server/dispatchers/localUtilsDispatcher.js +19 -5
- package/lib/server/dispatchers/networkDispatchers.js +2 -2
- package/lib/server/dispatchers/pageDispatcher.js +5 -2
- package/lib/server/dispatchers/playwrightDispatcher.js +1 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +8 -5
- package/lib/server/dom.js +90 -53
- package/lib/server/electron/electron.js +21 -4
- package/lib/server/fetch.js +74 -25
- package/lib/server/fileUploadUtils.js +7 -3
- package/lib/server/firefox/ffBrowser.js +36 -25
- package/lib/server/firefox/ffConnection.js +2 -2
- package/lib/server/firefox/ffNetworkManager.js +6 -4
- package/lib/server/firefox/ffPage.js +22 -24
- package/lib/server/firefox/firefox.js +25 -6
- package/lib/server/frameSelectors.js +2 -2
- package/lib/server/frames.js +205 -159
- package/lib/server/har/harTracer.js +4 -12
- package/lib/server/helper.js +3 -3
- package/lib/server/index.js +18 -0
- package/lib/server/input.js +18 -8
- package/lib/server/instrumentation.js +0 -4
- package/lib/server/isomorphic/utilityScriptSerializers.js +19 -5
- package/lib/server/javascript.js +3 -2
- package/lib/server/launchApp.js +3 -2
- package/lib/server/network.js +14 -4
- package/lib/server/page.js +75 -46
- package/lib/server/playwright.js +5 -2
- package/lib/server/recorder/codeGenerator.js +2 -1
- package/lib/server/recorder/contextRecorder.js +316 -0
- package/lib/server/recorder/csharp.js +2 -1
- package/lib/server/recorder/java.js +2 -1
- package/lib/server/recorder/javascript.js +2 -1
- package/lib/server/recorder/jsonl.js +2 -1
- package/lib/server/recorder/language.js +2 -1
- package/lib/server/recorder/python.js +2 -1
- package/lib/server/recorder/recorderApp.js +14 -5
- package/lib/server/recorder/recorderCollection.js +127 -0
- package/lib/server/recorder/recorderRunner.js +177 -0
- package/lib/server/recorder/recorderUtils.js +23 -0
- package/lib/server/recorder/throttledFile.js +46 -0
- package/lib/server/recorder/utils.js +2 -1
- package/lib/server/recorder.js +42 -418
- package/lib/server/registry/index.js +99 -100
- package/lib/server/registry/nativeDeps.js +107 -0
- package/lib/server/screenshotter.js +6 -12
- package/lib/server/socksClientCertificatesInterceptor.js +328 -0
- package/lib/server/trace/recorder/snapshotter.js +4 -1
- package/lib/server/trace/recorder/tracing.js +27 -96
- package/lib/server/trace/viewer/traceViewer.js +54 -67
- package/lib/server/transport.js +1 -1
- package/lib/server/webkit/webkit.js +5 -5
- package/lib/server/webkit/wkBrowser.js +14 -14
- package/lib/server/webkit/wkConnection.js +3 -3
- package/lib/server/webkit/wkInterceptableRequest.js +8 -4
- package/lib/server/webkit/wkPage.js +52 -34
- package/lib/server/webkit/wkProvisionalPage.js +36 -1
- package/lib/utils/crypto.js +141 -0
- package/lib/utils/debugLogger.js +2 -0
- package/lib/utils/env.js +4 -2
- package/lib/utils/expectUtils.js +33 -0
- package/lib/utils/fileUtils.js +140 -1
- package/lib/utils/glob.js +2 -1
- package/lib/utils/happy-eyeballs.js +29 -2
- package/lib/utils/hostPlatform.js +13 -4
- package/lib/utils/httpServer.js +54 -13
- package/lib/utils/index.js +53 -31
- package/lib/utils/isomorphic/cssTokenizer.js +1 -1
- package/lib/utils/isomorphic/locatorParser.js +1 -1
- package/lib/utils/isomorphic/mimeType.js +29 -0
- package/lib/utils/isomorphic/stringUtils.js +28 -1
- package/lib/utils/isomorphic/urlMatch.js +120 -0
- package/lib/utils/mimeType.js +2 -1
- package/lib/utils/network.js +7 -35
- package/lib/utils/stackTrace.js +2 -4
- package/lib/utils/timeoutRunner.js +11 -76
- package/lib/utils/zones.js +23 -60
- package/lib/utilsBundle.js +2 -1
- package/lib/utilsBundleImpl/index.js +33 -31
- package/lib/vite/htmlReport/index.html +12 -12
- package/lib/vite/recorder/assets/codeMirrorModule-C-fQ5QZD.js +24 -0
- package/lib/vite/recorder/assets/{codicon-zGuYmc9o.ttf → codicon-DCmgc-ay.ttf} +0 -0
- package/lib/vite/recorder/assets/index-B-MT5gKo.css +1 -0
- package/lib/vite/recorder/assets/index-D-5S5PPN.js +47 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
- package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- package/lib/vite/traceViewer/assets/workbench-Bjkiwcr1.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
- package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
- package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
- package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
- package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
- package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
- package/lib/vite/traceViewer/embedded.BVDVQOzc.js +2 -0
- package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
- package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
- package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
- package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
- package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
- package/lib/vite/traceViewer/embedded.html +16 -0
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
- package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
- package/lib/vite/traceViewer/index.B8dgQwuN.js +2 -0
- package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
- package/lib/vite/traceViewer/index.C0EgJ4oW.js +195 -0
- package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
- package/lib/vite/traceViewer/{index.-g_5lMbJ.css → index.CrbWWHbf.css} +1 -1
- package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
- package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
- package/lib/vite/traceViewer/index.html +5 -4
- package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
- package/lib/vite/traceViewer/snapshot.html +1 -1
- package/lib/vite/traceViewer/sw.bundle.js +3 -4
- package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
- package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
- package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
- package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
- package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +10 -0
- package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
- package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
- package/lib/vite/traceViewer/uiMode.html +5 -4
- package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
- package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
- package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
- package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
- package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
- package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
- package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
- package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
- package/package.json +2 -2
- package/types/protocol.d.ts +960 -78
- package/types/structs.d.ts +1 -1
- package/types/types.d.ts +3083 -2448
- package/lib/vite/recorder/assets/codeMirrorModule-W69B4LBB.js +0 -24
- package/lib/vite/recorder/assets/index-Ly3PcVUb.js +0 -47
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +0 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
- package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
- package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
- package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
- package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
- package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
- package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
- /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
- /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BidiFirefox = void 0;
|
|
7
|
+
var _os = _interopRequireDefault(require("os"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _utils = require("../../utils");
|
|
10
|
+
var _browserType = require("../browserType");
|
|
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 BidiFirefox extends _browserType.BrowserType {
|
|
31
|
+
constructor(parent) {
|
|
32
|
+
super(parent, 'bidi');
|
|
33
|
+
this._useBidi = true;
|
|
34
|
+
}
|
|
35
|
+
async connectToTransport(transport, options) {
|
|
36
|
+
return _bidiBrowser.BidiBrowser.connect(this.attribution.playwright, transport, options);
|
|
37
|
+
}
|
|
38
|
+
doRewriteStartupLog(error) {
|
|
39
|
+
if (!error.logs) return error;
|
|
40
|
+
// https://github.com/microsoft/playwright/issues/6500
|
|
41
|
+
if (error.logs.includes(`as root in a regular user's session is not supported.`)) error.logs = '\n' + (0, _utils.wrapInASCIIBox)(`Firefox is unable to launch if the $HOME folder isn't owned by the current user.\nWorkaround: Set the HOME=/root environment variable${process.env.GITHUB_ACTION ? ' in your GitHub Actions workflow file' : ''} when running Playwright.`, 1);
|
|
42
|
+
if (error.logs.includes('no DISPLAY environment variable specified')) error.logs = '\n' + (0, _utils.wrapInASCIIBox)(_browserType.kNoXServerRunningError, 1);
|
|
43
|
+
return error;
|
|
44
|
+
}
|
|
45
|
+
amendEnvironment(env, userDataDir, executable, browserArguments) {
|
|
46
|
+
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?`);
|
|
47
|
+
if (_os.default.platform() === 'linux') {
|
|
48
|
+
// Always remove SNAP_NAME and SNAP_INSTANCE_NAME env variables since they
|
|
49
|
+
// confuse Firefox: in our case, builds never come from SNAP.
|
|
50
|
+
// See https://github.com/microsoft/playwright/issues/20555
|
|
51
|
+
return {
|
|
52
|
+
...env,
|
|
53
|
+
SNAP_NAME: undefined,
|
|
54
|
+
SNAP_INSTANCE_NAME: undefined
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return env;
|
|
58
|
+
}
|
|
59
|
+
attemptToGracefullyCloseBrowser(transport) {
|
|
60
|
+
transport.send({
|
|
61
|
+
method: 'browser.close',
|
|
62
|
+
params: {},
|
|
63
|
+
id: _bidiConnection.kBrowserCloseMessageId
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
defaultArgs(options, isPersistent, userDataDir) {
|
|
67
|
+
const {
|
|
68
|
+
args = [],
|
|
69
|
+
headless
|
|
70
|
+
} = options;
|
|
71
|
+
const userDataDirArg = args.find(arg => arg.startsWith('-profile') || arg.startsWith('--profile'));
|
|
72
|
+
if (userDataDirArg) throw this._createUserDataDirArgMisuseError('--profile');
|
|
73
|
+
const firefoxArguments = ['--remote-debugging-port=0'];
|
|
74
|
+
if (headless) firefoxArguments.push('--headless');else firefoxArguments.push('--foreground');
|
|
75
|
+
firefoxArguments.push(`--profile`, userDataDir);
|
|
76
|
+
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
|
+
return firefoxArguments;
|
|
84
|
+
}
|
|
85
|
+
readyState(options) {
|
|
86
|
+
(0, _utils.assert)(options.useWebSocket);
|
|
87
|
+
return new BidiReadyState();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.BidiFirefox = BidiFirefox;
|
|
91
|
+
class BidiReadyState {
|
|
92
|
+
constructor() {
|
|
93
|
+
this._wsEndpoint = new _utils.ManualPromise();
|
|
94
|
+
}
|
|
95
|
+
onBrowserOutput(message) {
|
|
96
|
+
// Bidi WebSocket in Firefox.
|
|
97
|
+
const match = message.match(/WebDriver BiDi listening on (ws:\/\/.*)$/);
|
|
98
|
+
if (match) this._wsEndpoint.resolve(match[1] + '/session');
|
|
99
|
+
}
|
|
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
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RawTouchscreenImpl = exports.RawMouseImpl = exports.RawKeyboardImpl = void 0;
|
|
7
|
+
var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
|
|
8
|
+
var _bidiKeyboard = require("./third_party/bidiKeyboard");
|
|
9
|
+
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); }
|
|
10
|
+
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; }
|
|
11
|
+
/**
|
|
12
|
+
* Copyright (c) Microsoft Corporation.
|
|
13
|
+
*
|
|
14
|
+
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
15
|
+
* you may not use this file except in compliance with the License.
|
|
16
|
+
* You may obtain a copy of the License at
|
|
17
|
+
*
|
|
18
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
19
|
+
*
|
|
20
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
21
|
+
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
22
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
23
|
+
* See the License for the specific language governing permissions and
|
|
24
|
+
* limitations under the License.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
class RawKeyboardImpl {
|
|
28
|
+
constructor(session) {
|
|
29
|
+
this._session = void 0;
|
|
30
|
+
this._session = session;
|
|
31
|
+
}
|
|
32
|
+
setSession(session) {
|
|
33
|
+
this._session = session;
|
|
34
|
+
}
|
|
35
|
+
async keydown(modifiers, code, keyCode, keyCodeWithoutLocation, key, location, autoRepeat, text) {
|
|
36
|
+
const actions = [];
|
|
37
|
+
actions.push({
|
|
38
|
+
type: 'keyDown',
|
|
39
|
+
value: (0, _bidiKeyboard.getBidiKeyValue)(key)
|
|
40
|
+
});
|
|
41
|
+
// TODO: add modifiers?
|
|
42
|
+
await this._performActions(actions);
|
|
43
|
+
}
|
|
44
|
+
async keyup(modifiers, code, keyCode, keyCodeWithoutLocation, key, location) {
|
|
45
|
+
const actions = [];
|
|
46
|
+
actions.push({
|
|
47
|
+
type: 'keyUp',
|
|
48
|
+
value: (0, _bidiKeyboard.getBidiKeyValue)(key)
|
|
49
|
+
});
|
|
50
|
+
await this._performActions(actions);
|
|
51
|
+
}
|
|
52
|
+
async sendText(text) {
|
|
53
|
+
const actions = [];
|
|
54
|
+
for (const char of text) {
|
|
55
|
+
const value = (0, _bidiKeyboard.getBidiKeyValue)(char);
|
|
56
|
+
actions.push({
|
|
57
|
+
type: 'keyDown',
|
|
58
|
+
value
|
|
59
|
+
});
|
|
60
|
+
actions.push({
|
|
61
|
+
type: 'keyUp',
|
|
62
|
+
value
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
await this._performActions(actions);
|
|
66
|
+
}
|
|
67
|
+
async _performActions(actions) {
|
|
68
|
+
await this._session.send('input.performActions', {
|
|
69
|
+
context: this._session.sessionId,
|
|
70
|
+
actions: [{
|
|
71
|
+
type: 'key',
|
|
72
|
+
id: 'pw_keyboard',
|
|
73
|
+
actions
|
|
74
|
+
}]
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.RawKeyboardImpl = RawKeyboardImpl;
|
|
79
|
+
class RawMouseImpl {
|
|
80
|
+
constructor(session) {
|
|
81
|
+
this._session = void 0;
|
|
82
|
+
this._session = session;
|
|
83
|
+
}
|
|
84
|
+
async move(x, y, button, buttons, modifiers, forClick) {
|
|
85
|
+
// TODO: bidi throws when x/y are not integers.
|
|
86
|
+
x = Math.round(x);
|
|
87
|
+
y = Math.round(y);
|
|
88
|
+
await this._performActions([{
|
|
89
|
+
type: 'pointerMove',
|
|
90
|
+
x,
|
|
91
|
+
y
|
|
92
|
+
}]);
|
|
93
|
+
}
|
|
94
|
+
async down(x, y, button, buttons, modifiers, clickCount) {
|
|
95
|
+
await this._performActions([{
|
|
96
|
+
type: 'pointerDown',
|
|
97
|
+
button: toBidiButton(button)
|
|
98
|
+
}]);
|
|
99
|
+
}
|
|
100
|
+
async up(x, y, button, buttons, modifiers, clickCount) {
|
|
101
|
+
await this._performActions([{
|
|
102
|
+
type: 'pointerUp',
|
|
103
|
+
button: toBidiButton(button)
|
|
104
|
+
}]);
|
|
105
|
+
}
|
|
106
|
+
async click(x, y, options = {}) {
|
|
107
|
+
x = Math.round(x);
|
|
108
|
+
y = Math.round(y);
|
|
109
|
+
const button = toBidiButton(options.button || 'left');
|
|
110
|
+
const {
|
|
111
|
+
delay = null,
|
|
112
|
+
clickCount = 1
|
|
113
|
+
} = options;
|
|
114
|
+
const actions = [];
|
|
115
|
+
actions.push({
|
|
116
|
+
type: 'pointerMove',
|
|
117
|
+
x,
|
|
118
|
+
y
|
|
119
|
+
});
|
|
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
|
+
}
|
|
140
|
+
async wheel(x, y, buttons, modifiers, deltaX, deltaY) {}
|
|
141
|
+
async _performActions(actions) {
|
|
142
|
+
await this._session.send('input.performActions', {
|
|
143
|
+
context: this._session.sessionId,
|
|
144
|
+
actions: [{
|
|
145
|
+
type: 'pointer',
|
|
146
|
+
id: 'pw_mouse',
|
|
147
|
+
parameters: {
|
|
148
|
+
pointerType: bidi.Input.PointerType.Mouse
|
|
149
|
+
},
|
|
150
|
+
actions
|
|
151
|
+
}]
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.RawMouseImpl = RawMouseImpl;
|
|
156
|
+
class RawTouchscreenImpl {
|
|
157
|
+
constructor(session) {
|
|
158
|
+
this._session = void 0;
|
|
159
|
+
this._session = session;
|
|
160
|
+
}
|
|
161
|
+
async tap(x, y, modifiers) {}
|
|
162
|
+
}
|
|
163
|
+
exports.RawTouchscreenImpl = RawTouchscreenImpl;
|
|
164
|
+
function toBidiButton(button) {
|
|
165
|
+
switch (button) {
|
|
166
|
+
case 'left':
|
|
167
|
+
return 0;
|
|
168
|
+
case 'right':
|
|
169
|
+
return 2;
|
|
170
|
+
case 'middle':
|
|
171
|
+
return 1;
|
|
172
|
+
}
|
|
173
|
+
throw new Error('Unknown button: ' + button);
|
|
174
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BidiNetworkManager = void 0;
|
|
7
|
+
exports.bidiBytesValueToString = bidiBytesValueToString;
|
|
8
|
+
var _eventsHelper = require("../../utils/eventsHelper");
|
|
9
|
+
var network = _interopRequireWildcard(require("../network"));
|
|
10
|
+
var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
|
|
11
|
+
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
|
+
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
|
+
* Copyright (c) Microsoft Corporation.
|
|
15
|
+
*
|
|
16
|
+
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
17
|
+
* you may not use this file except in compliance with the License.
|
|
18
|
+
* You may obtain a copy of the License at
|
|
19
|
+
*
|
|
20
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
21
|
+
*
|
|
22
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
23
|
+
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
24
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
25
|
+
* See the License for the specific language governing permissions and
|
|
26
|
+
* limitations under the License.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
class BidiNetworkManager {
|
|
30
|
+
constructor(bidiSession, page, onNavigationResponseStarted) {
|
|
31
|
+
this._session = void 0;
|
|
32
|
+
this._requests = void 0;
|
|
33
|
+
this._page = void 0;
|
|
34
|
+
this._eventListeners = void 0;
|
|
35
|
+
this._onNavigationResponseStarted = void 0;
|
|
36
|
+
this._userRequestInterceptionEnabled = false;
|
|
37
|
+
this._protocolRequestInterceptionEnabled = false;
|
|
38
|
+
this._credentials = void 0;
|
|
39
|
+
this._intercepId = void 0;
|
|
40
|
+
this._session = bidiSession;
|
|
41
|
+
this._requests = new Map();
|
|
42
|
+
this._page = page;
|
|
43
|
+
this._onNavigationResponseStarted = onNavigationResponseStarted;
|
|
44
|
+
this._eventListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'network.beforeRequestSent', this._onBeforeRequestSent.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'network.responseStarted', this._onResponseStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'network.responseCompleted', this._onResponseCompleted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'network.fetchError', this._onFetchError.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'network.authRequired', this._onAuthRequired.bind(this))];
|
|
45
|
+
}
|
|
46
|
+
dispose() {
|
|
47
|
+
_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
48
|
+
}
|
|
49
|
+
_onBeforeRequestSent(param) {
|
|
50
|
+
if (param.request.url.startsWith('data:')) return;
|
|
51
|
+
const redirectedFrom = param.redirectCount ? this._requests.get(param.request.request) || null : null;
|
|
52
|
+
const frame = redirectedFrom ? redirectedFrom.request.frame() : param.context ? this._page._frameManager.frame(param.context) : null;
|
|
53
|
+
if (!frame) return;
|
|
54
|
+
if (redirectedFrom) this._requests.delete(redirectedFrom._id);
|
|
55
|
+
let route;
|
|
56
|
+
if (param.intercepts) {
|
|
57
|
+
// We do not support intercepting redirects.
|
|
58
|
+
if (redirectedFrom) {
|
|
59
|
+
var _redirectedFrom$_orig;
|
|
60
|
+
this._session.sendMayFail('network.continueRequest', {
|
|
61
|
+
request: param.request.request,
|
|
62
|
+
headers: (_redirectedFrom$_orig = redirectedFrom._originalRequestRoute) === null || _redirectedFrom$_orig === void 0 ? void 0 : _redirectedFrom$_orig._alreadyContinuedHeaders
|
|
63
|
+
});
|
|
64
|
+
} else {
|
|
65
|
+
route = new BidiRouteImpl(this._session, param.request.request);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const request = new BidiRequest(frame, redirectedFrom, param, route);
|
|
69
|
+
this._requests.set(request._id, request);
|
|
70
|
+
this._page._frameManager.requestStarted(request.request, route);
|
|
71
|
+
}
|
|
72
|
+
_onResponseStarted(params) {
|
|
73
|
+
const request = this._requests.get(params.request.request);
|
|
74
|
+
if (!request) return;
|
|
75
|
+
const getResponseBody = async () => {
|
|
76
|
+
throw new Error(`Response body is not available for requests in Bidi`);
|
|
77
|
+
};
|
|
78
|
+
const timings = params.request.timings;
|
|
79
|
+
const startTime = timings.requestTime;
|
|
80
|
+
function relativeToStart(time) {
|
|
81
|
+
if (!time) return -1;
|
|
82
|
+
return (time - startTime) / 1000;
|
|
83
|
+
}
|
|
84
|
+
const timing = {
|
|
85
|
+
startTime: startTime / 1000,
|
|
86
|
+
requestStart: relativeToStart(timings.requestStart),
|
|
87
|
+
responseStart: relativeToStart(timings.responseStart),
|
|
88
|
+
domainLookupStart: relativeToStart(timings.dnsStart),
|
|
89
|
+
domainLookupEnd: relativeToStart(timings.dnsEnd),
|
|
90
|
+
connectStart: relativeToStart(timings.connectStart),
|
|
91
|
+
secureConnectionStart: relativeToStart(timings.tlsStart),
|
|
92
|
+
connectEnd: relativeToStart(timings.connectEnd)
|
|
93
|
+
};
|
|
94
|
+
const response = new network.Response(request.request, params.response.status, params.response.statusText, fromBidiHeaders(params.response.headers), timing, getResponseBody, false);
|
|
95
|
+
response._serverAddrFinished();
|
|
96
|
+
response._securityDetailsFinished();
|
|
97
|
+
// "raw" headers are the same as "provisional" headers in Bidi.
|
|
98
|
+
response.setRawResponseHeaders(null);
|
|
99
|
+
response.setResponseHeadersSize(params.response.headersSize);
|
|
100
|
+
this._page._frameManager.requestReceivedResponse(response);
|
|
101
|
+
if (params.navigation) this._onNavigationResponseStarted(params);
|
|
102
|
+
}
|
|
103
|
+
_onResponseCompleted(params) {
|
|
104
|
+
const request = this._requests.get(params.request.request);
|
|
105
|
+
if (!request) return;
|
|
106
|
+
const response = request.request._existingResponse();
|
|
107
|
+
// TODO: body size is the encoded size
|
|
108
|
+
response.setTransferSize(params.response.bodySize);
|
|
109
|
+
response.setEncodedBodySize(params.response.bodySize);
|
|
110
|
+
|
|
111
|
+
// Keep redirected requests in the map for future reference as redirectedFrom.
|
|
112
|
+
const isRedirected = response.status() >= 300 && response.status() <= 399;
|
|
113
|
+
const responseEndTime = params.request.timings.responseEnd / 1000 - response.timing().startTime;
|
|
114
|
+
if (isRedirected) {
|
|
115
|
+
response._requestFinished(responseEndTime);
|
|
116
|
+
} else {
|
|
117
|
+
this._requests.delete(request._id);
|
|
118
|
+
response._requestFinished(responseEndTime);
|
|
119
|
+
}
|
|
120
|
+
response._setHttpVersion(params.response.protocol);
|
|
121
|
+
this._page._frameManager.reportRequestFinished(request.request, response);
|
|
122
|
+
}
|
|
123
|
+
_onFetchError(params) {
|
|
124
|
+
const request = this._requests.get(params.request.request);
|
|
125
|
+
if (!request) return;
|
|
126
|
+
this._requests.delete(request._id);
|
|
127
|
+
const response = request.request._existingResponse();
|
|
128
|
+
if (response) {
|
|
129
|
+
response.setTransferSize(null);
|
|
130
|
+
response.setEncodedBodySize(null);
|
|
131
|
+
response._requestFinished(-1);
|
|
132
|
+
}
|
|
133
|
+
request.request._setFailureText(params.errorText);
|
|
134
|
+
// TODO: support canceled flag
|
|
135
|
+
this._page._frameManager.requestFailed(request.request, params.errorText === 'NS_BINDING_ABORTED');
|
|
136
|
+
}
|
|
137
|
+
_onAuthRequired(params) {
|
|
138
|
+
var _params$response$auth;
|
|
139
|
+
const isBasic = (_params$response$auth = params.response.authChallenges) === null || _params$response$auth === void 0 ? void 0 : _params$response$auth.some(challenge => challenge.scheme.startsWith('Basic'));
|
|
140
|
+
const credentials = this._page._browserContext._options.httpCredentials;
|
|
141
|
+
if (isBasic && credentials) {
|
|
142
|
+
this._session.sendMayFail('network.continueWithAuth', {
|
|
143
|
+
request: params.request.request,
|
|
144
|
+
action: 'provideCredentials',
|
|
145
|
+
credentials: {
|
|
146
|
+
type: 'password',
|
|
147
|
+
username: credentials.username,
|
|
148
|
+
password: credentials.password
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
} else {
|
|
152
|
+
this._session.sendMayFail('network.continueWithAuth', {
|
|
153
|
+
request: params.request.request,
|
|
154
|
+
action: 'default'
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async setRequestInterception(value) {
|
|
159
|
+
this._userRequestInterceptionEnabled = value;
|
|
160
|
+
await this._updateProtocolRequestInterception();
|
|
161
|
+
}
|
|
162
|
+
async setCredentials(credentials) {
|
|
163
|
+
this._credentials = credentials;
|
|
164
|
+
await this._updateProtocolRequestInterception();
|
|
165
|
+
}
|
|
166
|
+
async _updateProtocolRequestInterception(initial) {
|
|
167
|
+
const enabled = this._userRequestInterceptionEnabled || !!this._credentials;
|
|
168
|
+
if (enabled === this._protocolRequestInterceptionEnabled) return;
|
|
169
|
+
this._protocolRequestInterceptionEnabled = enabled;
|
|
170
|
+
if (initial && !enabled) return;
|
|
171
|
+
const cachePromise = this._session.send('network.setCacheBehavior', {
|
|
172
|
+
cacheBehavior: enabled ? 'bypass' : 'default'
|
|
173
|
+
});
|
|
174
|
+
let interceptPromise = Promise.resolve(undefined);
|
|
175
|
+
if (enabled) {
|
|
176
|
+
interceptPromise = this._session.send('network.addIntercept', {
|
|
177
|
+
phases: [bidi.Network.InterceptPhase.AuthRequired, bidi.Network.InterceptPhase.BeforeRequestSent],
|
|
178
|
+
urlPatterns: [{
|
|
179
|
+
type: 'pattern'
|
|
180
|
+
}]
|
|
181
|
+
// urlPatterns: [{ type: 'string', pattern: '*' }],
|
|
182
|
+
}).then(r => {
|
|
183
|
+
this._intercepId = r.intercept;
|
|
184
|
+
});
|
|
185
|
+
} else if (this._intercepId) {
|
|
186
|
+
interceptPromise = this._session.send('network.removeIntercept', {
|
|
187
|
+
intercept: this._intercepId
|
|
188
|
+
});
|
|
189
|
+
this._intercepId = undefined;
|
|
190
|
+
}
|
|
191
|
+
await Promise.all([cachePromise, interceptPromise]);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
exports.BidiNetworkManager = BidiNetworkManager;
|
|
195
|
+
class BidiRequest {
|
|
196
|
+
constructor(frame, redirectedFrom, payload, route) {
|
|
197
|
+
var _payload$navigation;
|
|
198
|
+
this.request = void 0;
|
|
199
|
+
this._id = void 0;
|
|
200
|
+
this._redirectedTo = void 0;
|
|
201
|
+
// Only first request in the chain can be intercepted, so this will
|
|
202
|
+
// store the first and only Route in the chain (if any).
|
|
203
|
+
this._originalRequestRoute = void 0;
|
|
204
|
+
this._id = payload.request.request;
|
|
205
|
+
if (redirectedFrom) redirectedFrom._redirectedTo = this;
|
|
206
|
+
// TODO: missing in the spec?
|
|
207
|
+
const postDataBuffer = null;
|
|
208
|
+
this.request = new network.Request(frame._page._browserContext, frame, null, redirectedFrom ? redirectedFrom.request : null, (_payload$navigation = payload.navigation) !== null && _payload$navigation !== void 0 ? _payload$navigation : undefined, payload.request.url, 'other', payload.request.method, postDataBuffer, fromBidiHeaders(payload.request.headers));
|
|
209
|
+
// "raw" headers are the same as "provisional" headers in Bidi.
|
|
210
|
+
this.request.setRawRequestHeaders(null);
|
|
211
|
+
this.request._setBodySize(payload.request.bodySize || 0);
|
|
212
|
+
this._originalRequestRoute = route !== null && route !== void 0 ? route : redirectedFrom === null || redirectedFrom === void 0 ? void 0 : redirectedFrom._originalRequestRoute;
|
|
213
|
+
route === null || route === void 0 || route._setRequest(this.request);
|
|
214
|
+
}
|
|
215
|
+
_finalRequest() {
|
|
216
|
+
let request = this;
|
|
217
|
+
while (request._redirectedTo) request = request._redirectedTo;
|
|
218
|
+
return request;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
class BidiRouteImpl {
|
|
222
|
+
constructor(session, requestId) {
|
|
223
|
+
this._requestId = void 0;
|
|
224
|
+
this._session = void 0;
|
|
225
|
+
this._request = void 0;
|
|
226
|
+
this._alreadyContinuedHeaders = void 0;
|
|
227
|
+
this._session = session;
|
|
228
|
+
this._requestId = requestId;
|
|
229
|
+
}
|
|
230
|
+
_setRequest(request) {
|
|
231
|
+
this._request = request;
|
|
232
|
+
}
|
|
233
|
+
async continue(overrides) {
|
|
234
|
+
// Firefox does not update content-length header.
|
|
235
|
+
let headers = overrides.headers || this._request.headers();
|
|
236
|
+
if (overrides.postData && headers) {
|
|
237
|
+
headers = headers.map(header => {
|
|
238
|
+
if (header.name.toLowerCase() === 'content-length') return {
|
|
239
|
+
name: header.name,
|
|
240
|
+
value: overrides.postData.byteLength.toString()
|
|
241
|
+
};
|
|
242
|
+
return header;
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
this._alreadyContinuedHeaders = toBidiHeaders(headers);
|
|
246
|
+
await this._session.sendMayFail('network.continueRequest', {
|
|
247
|
+
request: this._requestId,
|
|
248
|
+
url: overrides.url,
|
|
249
|
+
method: overrides.method,
|
|
250
|
+
// TODO: cookies!
|
|
251
|
+
headers: this._alreadyContinuedHeaders,
|
|
252
|
+
body: overrides.postData ? {
|
|
253
|
+
type: 'base64',
|
|
254
|
+
value: Buffer.from(overrides.postData).toString('base64')
|
|
255
|
+
} : undefined
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
async fulfill(response) {
|
|
259
|
+
const base64body = response.isBase64 ? response.body : Buffer.from(response.body).toString('base64');
|
|
260
|
+
await this._session.sendMayFail('network.provideResponse', {
|
|
261
|
+
request: this._requestId,
|
|
262
|
+
statusCode: response.status,
|
|
263
|
+
reasonPhrase: network.statusText(response.status),
|
|
264
|
+
headers: toBidiHeaders(response.headers),
|
|
265
|
+
body: {
|
|
266
|
+
type: 'base64',
|
|
267
|
+
value: base64body
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
async abort(errorCode) {
|
|
272
|
+
await this._session.sendMayFail('network.failRequest', {
|
|
273
|
+
request: this._requestId
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
function fromBidiHeaders(bidiHeaders) {
|
|
278
|
+
const result = [];
|
|
279
|
+
for (const {
|
|
280
|
+
name,
|
|
281
|
+
value
|
|
282
|
+
} of bidiHeaders) result.push({
|
|
283
|
+
name,
|
|
284
|
+
value: bidiBytesValueToString(value)
|
|
285
|
+
});
|
|
286
|
+
return result;
|
|
287
|
+
}
|
|
288
|
+
function toBidiHeaders(headers) {
|
|
289
|
+
return headers.map(({
|
|
290
|
+
name,
|
|
291
|
+
value
|
|
292
|
+
}) => ({
|
|
293
|
+
name,
|
|
294
|
+
value: {
|
|
295
|
+
type: 'string',
|
|
296
|
+
value
|
|
297
|
+
}
|
|
298
|
+
}));
|
|
299
|
+
}
|
|
300
|
+
function bidiBytesValueToString(value) {
|
|
301
|
+
if (value.type === 'string') return value.value;
|
|
302
|
+
if (value.type === 'base64') return Buffer.from(value.type, 'base64').toString('binary');
|
|
303
|
+
return 'unknown value type: ' + value.type;
|
|
304
|
+
}
|