@checkly/playwright-core 1.47.20-alpha → 1.48.20
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/browsers.json +14 -10
- package/lib/checkly/escapeRegExp.js +33 -0
- package/lib/checkly/secretsFilter.js +23 -0
- package/lib/cli/program.js +26 -14
- package/lib/client/api.js +6 -0
- package/lib/client/browserContext.js +20 -2
- package/lib/client/channelOwner.js +5 -2
- package/lib/client/connection.js +3 -0
- package/lib/client/fetch.js +16 -3
- package/lib/client/jsHandle.js +0 -8
- package/lib/client/localUtils.js +1 -0
- package/lib/client/network.js +175 -17
- package/lib/client/page.js +21 -0
- package/lib/client/playwright.js +6 -3
- package/lib/client/tracing.js +16 -20
- 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 +80 -14
- package/lib/server/bidi/bidiBrowser.js +23 -8
- package/lib/server/bidi/bidiChromium.js +124 -0
- package/lib/server/bidi/bidiConnection.js +1 -1
- package/lib/server/bidi/bidiExecutionContext.js +0 -3
- 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 +39 -11
- package/lib/server/chromium/chromium.js +3 -15
- package/lib/server/chromium/chromiumSwitches.js +3 -1
- package/lib/server/chromium/crBrowser.js +4 -3
- package/lib/server/chromium/crExecutionContext.js +0 -7
- package/lib/server/chromium/crPage.js +5 -2
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/codegen/csharp.js +2 -2
- package/lib/server/codegen/java.js +1 -1
- package/lib/server/codegen/javascript.js +1 -1
- package/lib/server/codegen/language.js +14 -2
- package/lib/server/codegen/python.js +2 -2
- package/lib/server/cookieStore.js +73 -0
- package/lib/server/debugController.js +2 -2
- package/lib/server/deviceDescriptorsSource.json +51 -51
- package/lib/server/dialog.js +1 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
- 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/webSocketRouteDispatcher.js +189 -0
- package/lib/server/download.js +9 -2
- package/lib/server/fetch.js +96 -99
- package/lib/server/firefox/ffBrowser.js +6 -4
- package/lib/server/firefox/ffExecutionContext.js +0 -3
- package/lib/server/firefox/ffPage.js +3 -0
- package/lib/server/firefox/firefox.js +2 -13
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +3 -2
- package/lib/server/har/harTracer.js +11 -0
- package/lib/server/input.js +0 -1
- package/lib/server/javascript.js +0 -7
- package/lib/server/page.js +5 -1
- package/lib/server/playwright.js +5 -2
- package/lib/server/recorder/contextRecorder.js +33 -50
- package/lib/server/recorder/recorderActions.js +2 -1
- package/lib/server/recorder/recorderApp.js +16 -10
- package/lib/server/recorder/recorderCollection.js +68 -79
- package/lib/server/recorder/recorderFrontend.js +5 -0
- package/lib/server/recorder/recorderInTraceViewer.js +144 -0
- package/lib/server/recorder/recorderRunner.js +75 -97
- package/lib/server/recorder/recorderUtils.js +47 -6
- package/lib/server/recorder.js +30 -25
- package/lib/server/registry/index.js +85 -4
- package/lib/server/socksClientCertificatesInterceptor.js +15 -3
- package/lib/server/trace/recorder/snapshotter.js +1 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +2 -2
- package/lib/server/trace/recorder/tracing.js +70 -5
- package/lib/server/trace/test/inMemorySnapshotter.js +1 -1
- package/lib/server/trace/viewer/traceViewer.js +2 -5
- package/lib/server/webkit/webkit.js +1 -1
- package/lib/server/webkit/wkBrowser.js +6 -5
- package/lib/server/webkit/wkExecutionContext.js +0 -3
- package/lib/server/webkit/wkPage.js +4 -1
- package/lib/utils/happy-eyeballs.js +13 -0
- package/lib/utils/hostPlatform.js +2 -2
- package/lib/utils/httpServer.js +1 -0
- package/lib/utils/isomorphic/locatorGenerators.js +9 -18
- package/lib/utils/isomorphic/locatorParser.js +2 -2
- package/lib/utils/isomorphic/recorderUtils.js +195 -0
- package/lib/vite/htmlReport/index.html +12 -12
- package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +24 -0
- package/lib/vite/recorder/assets/{index-B-MT5gKo.css → index-BW-aOBcL.css} +1 -1
- package/lib/vite/recorder/assets/{index-D-5S5PPN.js → index-Bxxcmxlu.js} +10 -15
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-BTYWvxEC.js +16437 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-BdBhzV6t.js +16443 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-BqcXH1AO.js +16838 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DZoSgqUd.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DblsdhjA.js +16449 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DtXZtbmO.js +16437 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-EhKN7Okm.js +16449 -0
- package/lib/vite/{recorder/assets/codeMirrorModule-C-fQ5QZD.js → traceViewer/assets/codeMirrorModule-MzSmL4X2.js} +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-U6XMqGkV.js +16437 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-lDjkI8Ax.js +24 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BABZNwlH.js +17351 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BB2Bm-wy.js +17361 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BHcfR9dD.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BPzVEZSf.js +17351 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BPzhNk9r.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-C_OTuI8x.js +17361 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DOc4D3cX.js +17361 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DpvLVMq5.js +17351 -0
- package/lib/vite/traceViewer/assets/workbench-B13nfocr.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-BcgGQnKb.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-BwodYCgl.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-ByyWxoT8.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-CWtpwfKK.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-DLv_q9ji.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-DZqNXdoV.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-DhqI6jeL.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-I4s6sWjN.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-M-Dh_RgU.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-gtYcQBNA.js +9 -0
- package/lib/vite/traceViewer/assets/xtermModule-DZP0glxx.js +5982 -0
- package/lib/vite/traceViewer/embedded.27BGR_eD.js +105 -0
- package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
- package/lib/vite/traceViewer/embedded.BIubxTi3.js +2 -0
- package/lib/vite/traceViewer/embedded.CHH7D63q.js +106 -0
- package/lib/vite/traceViewer/embedded.CorI3dFX.js +104 -0
- package/lib/vite/traceViewer/embedded.D4lqGydT.js +2 -0
- package/lib/vite/traceViewer/embedded.DTjd2aiy.js +105 -0
- package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
- package/lib/vite/traceViewer/embedded.Dxe2heQk.js +2 -0
- package/lib/vite/traceViewer/embedded.SsjKHrxC.js +105 -0
- package/lib/vite/traceViewer/embedded.Zu332ZC1.js +106 -0
- package/lib/vite/traceViewer/embedded.f-PLGsBT.js +2 -0
- package/lib/vite/traceViewer/embedded.html +5 -3
- package/lib/vite/traceViewer/embedded.ymLJ2mBS.js +106 -0
- package/lib/vite/traceViewer/index.B7aiTMfZ.js +2 -0
- package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
- package/lib/vite/traceViewer/index.Bfh46hDK.js +197 -0
- package/lib/vite/traceViewer/index.BrT2kfuc.js +2 -0
- package/lib/vite/traceViewer/index.C8ZWP1Qw.js +197 -0
- package/lib/vite/traceViewer/index.CB297BuW.js +2 -0
- package/lib/vite/traceViewer/index.CLxsp2W_.js +197 -0
- package/lib/vite/traceViewer/index.DPD22sZn.js +2 -0
- package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
- package/lib/vite/traceViewer/index.DsjmhbB6.js +195 -0
- package/lib/vite/traceViewer/index.Dz3icWJV.js +196 -0
- package/lib/vite/traceViewer/index.PqcsvBxQ.js +196 -0
- package/lib/vite/traceViewer/index.html +5 -3
- package/lib/vite/traceViewer/index.yxAwzeWG.js +196 -0
- package/lib/vite/traceViewer/inspectorTab.DGJWXOSd.css +3145 -0
- package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
- package/lib/vite/traceViewer/recorder.7Wl6HrQl.js +550 -0
- package/lib/vite/traceViewer/recorder.BHq8OXiu.js +551 -0
- package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- package/lib/vite/traceViewer/recorder.BaRuS6Pc.js +2 -0
- package/lib/vite/traceViewer/recorder.BufKu9Hp.js +550 -0
- package/lib/vite/traceViewer/recorder.C88JDknq.js +2 -0
- package/lib/vite/traceViewer/recorder.Ch-WHviK.js +2 -0
- package/lib/vite/traceViewer/recorder.DBDpiNOK.css +15 -0
- package/lib/vite/traceViewer/recorder.Fwf59ZKh.js +551 -0
- package/lib/vite/traceViewer/recorder.POd-toIn.js +2 -0
- package/lib/vite/traceViewer/recorder.am-MV-DQ.js +550 -0
- package/lib/vite/traceViewer/recorder.html +17 -0
- package/lib/vite/traceViewer/recorder.zV_xPHM4.js +551 -0
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.2tr9k625.js +5 -0
- package/lib/vite/traceViewer/uiMode.B11wexdJ.js +5 -0
- package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +5 -0
- package/lib/vite/traceViewer/uiMode.BH2Nj2h0.js +1724 -0
- package/lib/vite/traceViewer/uiMode.BZoFj6zV.js +1723 -0
- package/lib/vite/traceViewer/uiMode.C4nbcio6.js +1730 -0
- package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
- package/lib/vite/traceViewer/uiMode.CBRJkC_K.js +1724 -0
- package/lib/vite/traceViewer/uiMode.CpC2B27N.js +1724 -0
- package/lib/vite/traceViewer/uiMode.DRmgrHSk.css +1462 -0
- package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +5 -0
- package/lib/vite/traceViewer/uiMode.Dlo9s_YX.js +1723 -0
- package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
- package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
- package/lib/vite/traceViewer/uiMode.html +6 -4
- package/lib/vite/traceViewer/uiMode.wsGnVMQK.js +1723 -0
- package/lib/vite/traceViewer/workbench.9Es1K_T7.css +549 -0
- package/lib/vite/traceViewer/workbench.BQNDbcQ0.css +550 -0
- package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
- package/lib/vite/traceViewer/workbench.DlsCx8k5.css +1 -0
- package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
- package/package.json +1 -1
- package/types/protocol.d.ts +610 -173
- package/types/types.d.ts +2037 -949
|
@@ -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
|
+
}
|
|
@@ -14,6 +14,7 @@ var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
|
|
|
14
14
|
var _bidiExecutionContext = require("./bidiExecutionContext");
|
|
15
15
|
var _bidiNetworkManager = require("./bidiNetworkManager");
|
|
16
16
|
var _browserContext = require("../browserContext");
|
|
17
|
+
var _bidiPdf = require("./bidiPdf");
|
|
17
18
|
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); }
|
|
18
19
|
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; }
|
|
19
20
|
/**
|
|
@@ -33,6 +34,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
33
34
|
*/
|
|
34
35
|
|
|
35
36
|
const UTILITY_WORLD_NAME = '__playwright_utility_world__';
|
|
37
|
+
const kPlaywrightBindingChannel = 'playwrightChannel';
|
|
36
38
|
class BidiPage {
|
|
37
39
|
constructor(browserContext, bidiSession, opener) {
|
|
38
40
|
this.rawMouse = void 0;
|
|
@@ -46,7 +48,9 @@ class BidiPage {
|
|
|
46
48
|
this._sessionListeners = [];
|
|
47
49
|
this._browserContext = void 0;
|
|
48
50
|
this._networkManager = void 0;
|
|
51
|
+
this._pdf = void 0;
|
|
49
52
|
this._initializedPage = null;
|
|
53
|
+
this._initScriptIds = [];
|
|
50
54
|
this._session = bidiSession;
|
|
51
55
|
this._opener = opener;
|
|
52
56
|
this.rawKeyboard = new _bidiInput.RawKeyboardImpl(bidiSession);
|
|
@@ -56,8 +60,9 @@ class BidiPage {
|
|
|
56
60
|
this._page = new _page.Page(this, browserContext);
|
|
57
61
|
this._browserContext = browserContext;
|
|
58
62
|
this._networkManager = new _bidiNetworkManager.BidiNetworkManager(this._session, this._page, this._onNavigationResponseStarted.bind(this));
|
|
63
|
+
this._pdf = new _bidiPdf.BidiPDF(this._session);
|
|
59
64
|
this._page.on(_page.Page.Events.FrameDetached, frame => this._removeContextsForFrame(frame, false));
|
|
60
|
-
this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.contextDestroyed', this._onBrowsingContextDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationStarted', this._onNavigationStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationAborted', this._onNavigationAborted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationFailed', this._onNavigationFailed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.fragmentNavigated', this._onFragmentNavigated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.domContentLoaded', this._onDomContentLoaded.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.load', this._onLoad.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.userPromptOpened', this._onUserPromptOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'log.entryAdded', this._onLogEntryAdded.bind(this))];
|
|
65
|
+
this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.message', this._onScriptMessage.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.contextDestroyed', this._onBrowsingContextDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationStarted', this._onNavigationStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationAborted', this._onNavigationAborted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationFailed', this._onNavigationFailed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.fragmentNavigated', this._onFragmentNavigated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.domContentLoaded', this._onDomContentLoaded.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.load', this._onLoad.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.userPromptOpened', this._onUserPromptOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'log.entryAdded', this._onLogEntryAdded.bind(this))];
|
|
61
66
|
|
|
62
67
|
// Initialize main frame.
|
|
63
68
|
this._pagePromise = this._initialize().finally(async () => {
|
|
@@ -72,18 +77,12 @@ class BidiPage {
|
|
|
72
77
|
});
|
|
73
78
|
}
|
|
74
79
|
async _initialize() {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
root: this._session.sessionId
|
|
79
|
-
});
|
|
80
|
-
this._handleFrameTree(contexts[0]);
|
|
81
|
-
await Promise.all([this.updateHttpCredentials(), this.updateRequestInterception(), this._updateViewport()]);
|
|
80
|
+
// Initialize main frame.
|
|
81
|
+
this._onFrameAttached(this._session.sessionId, null);
|
|
82
|
+
await Promise.all([this.updateHttpCredentials(), this.updateRequestInterception(), this._updateViewport(), this._installMainBinding(), this._addAllInitScripts()]);
|
|
82
83
|
}
|
|
83
|
-
|
|
84
|
-
this.
|
|
85
|
-
if (!frameTree.children) return;
|
|
86
|
-
for (const child of frameTree.children) this._handleFrameTree(child);
|
|
84
|
+
async _addAllInitScripts() {
|
|
85
|
+
return Promise.all(this._page.allInitScripts().map(initScript => this.addInitScript(initScript)));
|
|
87
86
|
}
|
|
88
87
|
potentiallyUninitializedPage() {
|
|
89
88
|
return this._page;
|
|
@@ -236,7 +235,11 @@ class BidiPage {
|
|
|
236
235
|
await this._updateViewport();
|
|
237
236
|
}
|
|
238
237
|
async updateUserAgent() {}
|
|
239
|
-
async bringToFront() {
|
|
238
|
+
async bringToFront() {
|
|
239
|
+
await this._session.send('browsingContext.activate', {
|
|
240
|
+
context: this._session.sessionId
|
|
241
|
+
});
|
|
242
|
+
}
|
|
240
243
|
async _updateViewport() {
|
|
241
244
|
const options = this._browserContext._options;
|
|
242
245
|
const deviceSize = this._page.emulatedSize();
|
|
@@ -266,20 +269,72 @@ class BidiPage {
|
|
|
266
269
|
wait: bidi.BrowsingContext.ReadinessState.Interactive
|
|
267
270
|
});
|
|
268
271
|
}
|
|
269
|
-
goBack() {
|
|
270
|
-
|
|
272
|
+
async goBack() {
|
|
273
|
+
return await this._session.send('browsingContext.traverseHistory', {
|
|
274
|
+
context: this._session.sessionId,
|
|
275
|
+
delta: -1
|
|
276
|
+
}).then(() => true).catch(() => false);
|
|
277
|
+
}
|
|
278
|
+
async goForward() {
|
|
279
|
+
return await this._session.send('browsingContext.traverseHistory', {
|
|
280
|
+
context: this._session.sessionId,
|
|
281
|
+
delta: +1
|
|
282
|
+
}).then(() => true).catch(() => false);
|
|
271
283
|
}
|
|
272
|
-
|
|
284
|
+
async requestGC() {
|
|
273
285
|
throw new Error('Method not implemented.');
|
|
274
286
|
}
|
|
287
|
+
|
|
288
|
+
// TODO: consider calling this only when bindings are added.
|
|
289
|
+
async _installMainBinding() {
|
|
290
|
+
const functionDeclaration = addMainBinding.toString();
|
|
291
|
+
const args = [{
|
|
292
|
+
type: 'channel',
|
|
293
|
+
value: {
|
|
294
|
+
channel: kPlaywrightBindingChannel,
|
|
295
|
+
ownership: bidi.Script.ResultOwnership.Root
|
|
296
|
+
}
|
|
297
|
+
}];
|
|
298
|
+
const promises = [];
|
|
299
|
+
promises.push(this._session.send('script.addPreloadScript', {
|
|
300
|
+
functionDeclaration,
|
|
301
|
+
arguments: args
|
|
302
|
+
}));
|
|
303
|
+
promises.push(this._session.send('script.callFunction', {
|
|
304
|
+
functionDeclaration,
|
|
305
|
+
arguments: args,
|
|
306
|
+
target: toBidiExecutionContext(await this._page.mainFrame()._mainContext())._target,
|
|
307
|
+
awaitPromise: false,
|
|
308
|
+
userActivation: false
|
|
309
|
+
}));
|
|
310
|
+
await Promise.all(promises);
|
|
311
|
+
}
|
|
312
|
+
async _onScriptMessage(event) {
|
|
313
|
+
if (event.channel !== kPlaywrightBindingChannel) return;
|
|
314
|
+
const pageOrError = await this.pageOrError();
|
|
315
|
+
if (pageOrError instanceof Error) return;
|
|
316
|
+
const context = this._realmToContext.get(event.source.realm);
|
|
317
|
+
if (!context) return;
|
|
318
|
+
if (event.data.type !== 'string') return;
|
|
319
|
+
await this._page._onBindingCalled(event.data.value, context);
|
|
320
|
+
}
|
|
275
321
|
async addInitScript(initScript) {
|
|
276
|
-
|
|
322
|
+
const {
|
|
323
|
+
script
|
|
324
|
+
} = await this._session.send('script.addPreloadScript', {
|
|
325
|
+
// TODO: remove function call from the source.
|
|
326
|
+
functionDeclaration: `() => { return ${initScript.source} }`,
|
|
327
|
+
// TODO: push to iframes?
|
|
328
|
+
contexts: [this._session.sessionId]
|
|
329
|
+
});
|
|
330
|
+
if (!initScript.internal) this._initScriptIds.push(script);
|
|
277
331
|
}
|
|
278
332
|
async removeNonInternalInitScripts() {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
333
|
+
const promises = this._initScriptIds.map(script => this._session.send('script.removePreloadScript', {
|
|
334
|
+
script
|
|
335
|
+
}));
|
|
336
|
+
this._initScriptIds = [];
|
|
337
|
+
await Promise.all(promises);
|
|
283
338
|
}
|
|
284
339
|
async closePage(runBeforeUnload) {
|
|
285
340
|
await this._session.send('browsingContext.close', {
|
|
@@ -289,7 +344,22 @@ class BidiPage {
|
|
|
289
344
|
}
|
|
290
345
|
async setBackgroundColor(color) {}
|
|
291
346
|
async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
|
|
292
|
-
|
|
347
|
+
const rect = documentRect || viewportRect;
|
|
348
|
+
const {
|
|
349
|
+
data
|
|
350
|
+
} = await this._session.send('browsingContext.captureScreenshot', {
|
|
351
|
+
context: this._session.sessionId,
|
|
352
|
+
format: {
|
|
353
|
+
type: `image/${format === 'png' ? 'png' : 'jpeg'}`,
|
|
354
|
+
quality: quality || 80
|
|
355
|
+
},
|
|
356
|
+
origin: documentRect ? 'document' : 'viewport',
|
|
357
|
+
clip: {
|
|
358
|
+
type: 'box',
|
|
359
|
+
...rect
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
return Buffer.from(data, 'base64');
|
|
293
363
|
}
|
|
294
364
|
async getContentFrame(handle) {
|
|
295
365
|
const executionContext = toBidiExecutionContext(handle._context);
|
|
@@ -419,6 +489,9 @@ class BidiPage {
|
|
|
419
489
|
}
|
|
420
490
|
async inputActionEpilogue() {}
|
|
421
491
|
async resetForReuse() {}
|
|
492
|
+
async pdf(options) {
|
|
493
|
+
return this._pdf.generate(options);
|
|
494
|
+
}
|
|
422
495
|
async getFrameElement(frame) {
|
|
423
496
|
const parent = frame.parentFrame();
|
|
424
497
|
if (!parent) throw new Error('Frame has been detached.');
|
|
@@ -445,11 +518,11 @@ class BidiPage {
|
|
|
445
518
|
shouldToggleStyleSheetToSyncAnimations() {
|
|
446
519
|
return true;
|
|
447
520
|
}
|
|
448
|
-
useMainWorldForSetContent() {
|
|
449
|
-
return true;
|
|
450
|
-
}
|
|
451
521
|
}
|
|
452
522
|
exports.BidiPage = BidiPage;
|
|
523
|
+
function addMainBinding(callback) {
|
|
524
|
+
globalThis['__playwright__binding__'] = callback;
|
|
525
|
+
}
|
|
453
526
|
function toBidiExecutionContext(executionContext) {
|
|
454
527
|
return executionContext[contextDelegateSymbol];
|
|
455
528
|
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BidiPDF = void 0;
|
|
7
|
+
var _utils = require("../../utils");
|
|
8
|
+
/**
|
|
9
|
+
* Copyright 2017 Google Inc. All rights reserved.
|
|
10
|
+
* Modifications copyright (c) Microsoft Corporation.
|
|
11
|
+
*
|
|
12
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
+
* you may not use this file except in compliance with the License.
|
|
14
|
+
* You may obtain a copy of the License at
|
|
15
|
+
*
|
|
16
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
+
*
|
|
18
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
+
* See the License for the specific language governing permissions and
|
|
22
|
+
* limitations under the License.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const PagePaperFormats = {
|
|
26
|
+
letter: {
|
|
27
|
+
width: 8.5,
|
|
28
|
+
height: 11
|
|
29
|
+
},
|
|
30
|
+
legal: {
|
|
31
|
+
width: 8.5,
|
|
32
|
+
height: 14
|
|
33
|
+
},
|
|
34
|
+
tabloid: {
|
|
35
|
+
width: 11,
|
|
36
|
+
height: 17
|
|
37
|
+
},
|
|
38
|
+
ledger: {
|
|
39
|
+
width: 17,
|
|
40
|
+
height: 11
|
|
41
|
+
},
|
|
42
|
+
a0: {
|
|
43
|
+
width: 33.1,
|
|
44
|
+
height: 46.8
|
|
45
|
+
},
|
|
46
|
+
a1: {
|
|
47
|
+
width: 23.4,
|
|
48
|
+
height: 33.1
|
|
49
|
+
},
|
|
50
|
+
a2: {
|
|
51
|
+
width: 16.54,
|
|
52
|
+
height: 23.4
|
|
53
|
+
},
|
|
54
|
+
a3: {
|
|
55
|
+
width: 11.7,
|
|
56
|
+
height: 16.54
|
|
57
|
+
},
|
|
58
|
+
a4: {
|
|
59
|
+
width: 8.27,
|
|
60
|
+
height: 11.7
|
|
61
|
+
},
|
|
62
|
+
a5: {
|
|
63
|
+
width: 5.83,
|
|
64
|
+
height: 8.27
|
|
65
|
+
},
|
|
66
|
+
a6: {
|
|
67
|
+
width: 4.13,
|
|
68
|
+
height: 5.83
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const unitToPixels = {
|
|
72
|
+
'px': 1,
|
|
73
|
+
'in': 96,
|
|
74
|
+
'cm': 37.8,
|
|
75
|
+
'mm': 3.78
|
|
76
|
+
};
|
|
77
|
+
function convertPrintParameterToInches(text) {
|
|
78
|
+
if (text === undefined) return undefined;
|
|
79
|
+
let unit = text.substring(text.length - 2).toLowerCase();
|
|
80
|
+
let valueText = '';
|
|
81
|
+
if (unitToPixels.hasOwnProperty(unit)) {
|
|
82
|
+
valueText = text.substring(0, text.length - 2);
|
|
83
|
+
} else {
|
|
84
|
+
// In case of unknown unit try to parse the whole parameter as number of pixels.
|
|
85
|
+
// This is consistent with phantom's paperSize behavior.
|
|
86
|
+
unit = 'px';
|
|
87
|
+
valueText = text;
|
|
88
|
+
}
|
|
89
|
+
const value = Number(valueText);
|
|
90
|
+
(0, _utils.assert)(!isNaN(value), 'Failed to parse parameter value: ' + text);
|
|
91
|
+
const pixels = value * unitToPixels[unit];
|
|
92
|
+
return pixels / 96;
|
|
93
|
+
}
|
|
94
|
+
class BidiPDF {
|
|
95
|
+
constructor(session) {
|
|
96
|
+
this._session = void 0;
|
|
97
|
+
this._session = session;
|
|
98
|
+
}
|
|
99
|
+
async generate(options) {
|
|
100
|
+
const {
|
|
101
|
+
scale = 1,
|
|
102
|
+
printBackground = false,
|
|
103
|
+
landscape = false,
|
|
104
|
+
pageRanges = '',
|
|
105
|
+
margin = {}
|
|
106
|
+
} = options;
|
|
107
|
+
let paperWidth = 8.5;
|
|
108
|
+
let paperHeight = 11;
|
|
109
|
+
if (options.format) {
|
|
110
|
+
const format = PagePaperFormats[options.format.toLowerCase()];
|
|
111
|
+
(0, _utils.assert)(format, 'Unknown paper format: ' + options.format);
|
|
112
|
+
paperWidth = format.width;
|
|
113
|
+
paperHeight = format.height;
|
|
114
|
+
} else {
|
|
115
|
+
paperWidth = convertPrintParameterToInches(options.width) || paperWidth;
|
|
116
|
+
paperHeight = convertPrintParameterToInches(options.height) || paperHeight;
|
|
117
|
+
}
|
|
118
|
+
const {
|
|
119
|
+
data
|
|
120
|
+
} = await this._session.send('browsingContext.print', {
|
|
121
|
+
context: this._session.sessionId,
|
|
122
|
+
background: printBackground,
|
|
123
|
+
margin: {
|
|
124
|
+
bottom: convertPrintParameterToInches(margin.bottom) || 0,
|
|
125
|
+
left: convertPrintParameterToInches(margin.left) || 0,
|
|
126
|
+
right: convertPrintParameterToInches(margin.right) || 0,
|
|
127
|
+
top: convertPrintParameterToInches(margin.top) || 0
|
|
128
|
+
},
|
|
129
|
+
orientation: landscape ? 'landscape' : 'portrait',
|
|
130
|
+
page: {
|
|
131
|
+
width: paperWidth,
|
|
132
|
+
height: paperHeight
|
|
133
|
+
},
|
|
134
|
+
pageRanges: pageRanges ? pageRanges.split(',').map(r => r.trim()) : undefined,
|
|
135
|
+
scale
|
|
136
|
+
});
|
|
137
|
+
return Buffer.from(data, 'base64');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.BidiPDF = BidiPDF;
|