patchright-core 1.48.2
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 +3 -0
- package/ThirdPartyNotices.txt +1548 -0
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +2 -0
- package/bin/install_media_pack.ps1 +5 -0
- package/bin/reinstall_chrome_beta_linux.sh +40 -0
- package/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/bin/reinstall_chrome_beta_win.ps1 +24 -0
- package/bin/reinstall_chrome_stable_linux.sh +40 -0
- package/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/bin/reinstall_chrome_stable_win.ps1 +24 -0
- package/bin/reinstall_msedge_beta_linux.sh +40 -0
- package/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/bin/reinstall_msedge_beta_win.ps1 +23 -0
- package/bin/reinstall_msedge_dev_linux.sh +40 -0
- package/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/bin/reinstall_msedge_dev_win.ps1 +23 -0
- package/bin/reinstall_msedge_stable_linux.sh +40 -0
- package/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/bin/reinstall_msedge_stable_win.ps1 +24 -0
- package/browsers.json +57 -0
- package/cli.js +18 -0
- package/index.d.ts +17 -0
- package/index.js +33 -0
- package/index.mjs +28 -0
- package/lib/androidServerImpl.js +69 -0
- package/lib/browserServerImpl.js +92 -0
- package/lib/cli/driver.js +95 -0
- package/lib/cli/program.js +589 -0
- package/lib/cli/programWithTestStub.js +67 -0
- package/lib/client/accessibility.js +50 -0
- package/lib/client/android.js +473 -0
- package/lib/client/api.js +285 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +583 -0
- package/lib/client/browserType.js +241 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +235 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +50 -0
- package/lib/client/clock.js +69 -0
- package/lib/client/connection.js +333 -0
- package/lib/client/consoleMessage.js +55 -0
- package/lib/client/coverage.js +41 -0
- package/lib/client/dialog.js +57 -0
- package/lib/client/download.js +62 -0
- package/lib/client/electron.js +135 -0
- package/lib/client/elementHandle.js +321 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/eventEmitter.js +314 -0
- package/lib/client/events.js +94 -0
- package/lib/client/fetch.js +391 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +504 -0
- package/lib/client/harRouter.js +99 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +121 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +36 -0
- package/lib/client/locator.js +441 -0
- package/lib/client/network.js +762 -0
- package/lib/client/page.js +770 -0
- package/lib/client/playwright.js +80 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +134 -0
- package/lib/client/types.js +24 -0
- package/lib/client/video.js +51 -0
- package/lib/client/waiter.js +158 -0
- package/lib/client/webError.js +37 -0
- package/lib/client/worker.js +71 -0
- package/lib/client/writableStream.js +54 -0
- package/lib/common/socksProxy.js +569 -0
- package/lib/common/timeoutSettings.js +73 -0
- package/lib/common/types.js +5 -0
- package/lib/generated/clockSource.js +7 -0
- package/lib/generated/consoleApiSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +7 -0
- package/lib/generated/pollingRecorderSource.js +7 -0
- package/lib/generated/utilityScriptSource.js +7 -0
- package/lib/generated/webSocketMockSource.js +7 -0
- package/lib/image_tools/colorUtils.js +98 -0
- package/lib/image_tools/compare.js +108 -0
- package/lib/image_tools/imageChannel.js +70 -0
- package/lib/image_tools/stats.js +102 -0
- package/lib/inProcessFactory.js +54 -0
- package/lib/inprocess.js +20 -0
- package/lib/outofprocess.js +67 -0
- package/lib/protocol/debug.js +27 -0
- package/lib/protocol/serializers.js +173 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2760 -0
- package/lib/protocol/validatorPrimitives.js +139 -0
- package/lib/remote/playwrightConnection.js +274 -0
- package/lib/remote/playwrightServer.js +110 -0
- package/lib/server/accessibility.js +62 -0
- package/lib/server/android/android.js +441 -0
- package/lib/server/android/backendAdb.js +172 -0
- package/lib/server/artifact.js +104 -0
- package/lib/server/bidi/bidiBrowser.js +311 -0
- package/lib/server/bidi/bidiChromium.js +124 -0
- package/lib/server/bidi/bidiConnection.js +206 -0
- package/lib/server/bidi/bidiExecutionContext.js +159 -0
- package/lib/server/bidi/bidiFirefox.js +104 -0
- package/lib/server/bidi/bidiInput.js +158 -0
- package/lib/server/bidi/bidiNetworkManager.js +338 -0
- package/lib/server/bidi/bidiOverCdp.js +103 -0
- package/lib/server/bidi/bidiPage.js +529 -0
- package/lib/server/bidi/bidiPdf.js +140 -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/bidi/third_party/firefoxPrefs.js +221 -0
- package/lib/server/browser.js +148 -0
- package/lib/server/browserContext.js +666 -0
- package/lib/server/browserType.js +335 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +350 -0
- package/lib/server/chromium/chromiumSwitches.js +36 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +522 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +104 -0
- package/lib/server/chromium/crDragDrop.js +143 -0
- package/lib/server/chromium/crExecutionContext.js +149 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +809 -0
- package/lib/server/chromium/crPage.js +1235 -0
- package/lib/server/chromium/crPdf.js +153 -0
- package/lib/server/chromium/crProtocolHelper.js +133 -0
- package/lib/server/chromium/crServiceWorker.js +111 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/clock.js +133 -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 +88 -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/console.js +57 -0
- package/lib/server/cookieStore.js +185 -0
- package/lib/server/debugController.js +234 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +26 -0
- package/lib/server/deviceDescriptorsSource.json +1669 -0
- package/lib/server/dialog.js +71 -0
- package/lib/server/dispatchers/androidDispatcher.js +193 -0
- package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +368 -0
- package/lib/server/dispatchers/browserDispatcher.js +170 -0
- package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- package/lib/server/dispatchers/dispatcher.js +395 -0
- package/lib/server/dispatchers/electronDispatcher.js +93 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +286 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +97 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +59 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +413 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +367 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +107 -0
- package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- package/lib/server/dispatchers/streamDispatcher.js +62 -0
- package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +58 -0
- package/lib/server/dom.js +845 -0
- package/lib/server/download.js +60 -0
- package/lib/server/electron/electron.js +296 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +656 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +75 -0
- package/lib/server/firefox/ffAccessibility.js +216 -0
- package/lib/server/firefox/ffBrowser.js +460 -0
- package/lib/server/firefox/ffConnection.js +168 -0
- package/lib/server/firefox/ffExecutionContext.js +135 -0
- package/lib/server/firefox/ffInput.js +150 -0
- package/lib/server/firefox/ffNetworkManager.js +233 -0
- package/lib/server/firefox/ffPage.js +559 -0
- package/lib/server/firefox/firefox.js +99 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1808 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +542 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +114 -0
- package/lib/server/input.js +310 -0
- package/lib/server/instrumentation.js +70 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +226 -0
- package/lib/server/javascript.js +299 -0
- package/lib/server/launchApp.js +91 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +617 -0
- package/lib/server/page.js +819 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +88 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/contextRecorder.js +299 -0
- package/lib/server/recorder/recorderApp.js +196 -0
- package/lib/server/recorder/recorderCollection.js +116 -0
- package/lib/server/recorder/recorderFrontend.js +5 -0
- package/lib/server/recorder/recorderInTraceViewer.js +144 -0
- package/lib/server/recorder/recorderRunner.js +155 -0
- package/lib/server/recorder/recorderUtils.js +112 -0
- package/lib/server/recorder/throttledFile.js +46 -0
- package/lib/server/recorder.js +329 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +1005 -0
- package/lib/server/registry/nativeDeps.js +490 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +348 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksClientCertificatesInterceptor.js +340 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +172 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +542 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +213 -0
- package/lib/server/transport.js +191 -0
- package/lib/server/types.js +24 -0
- package/lib/server/usKeyboardLayout.js +555 -0
- package/lib/server/webkit/webkit.js +87 -0
- package/lib/server/webkit/wkAccessibility.js +194 -0
- package/lib/server/webkit/wkBrowser.js +329 -0
- package/lib/server/webkit/wkConnection.js +173 -0
- package/lib/server/webkit/wkExecutionContext.js +143 -0
- package/lib/server/webkit/wkInput.js +169 -0
- package/lib/server/webkit/wkInterceptableRequest.js +162 -0
- package/lib/server/webkit/wkPage.js +1219 -0
- package/lib/server/webkit/wkProvisionalPage.js +94 -0
- package/lib/server/webkit/wkWorkers.js +104 -0
- package/lib/third_party/diff_match_patch.js +2222 -0
- package/lib/third_party/pixelmatch.js +255 -0
- package/lib/utils/ascii.js +31 -0
- package/lib/utils/comparators.js +171 -0
- package/lib/utils/crypto.js +174 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +91 -0
- package/lib/utils/env.js +49 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/expectUtils.js +33 -0
- package/lib/utils/fileUtils.js +205 -0
- package/lib/utils/happy-eyeballs.js +194 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +133 -0
- package/lib/utils/httpServer.js +237 -0
- package/lib/utils/index.js +368 -0
- package/lib/utils/isomorphic/cssParser.js +250 -0
- package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- package/lib/utils/isomorphic/locatorGenerators.js +642 -0
- package/lib/utils/isomorphic/locatorParser.js +179 -0
- package/lib/utils/isomorphic/locatorUtils.js +62 -0
- package/lib/utils/isomorphic/mimeType.js +29 -0
- package/lib/utils/isomorphic/recorderUtils.js +195 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +139 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/isomorphic/urlMatch.js +120 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +160 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +44 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +121 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +66 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +127 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +62 -0
- package/lib/utilsBundle.js +82 -0
- package/lib/utilsBundleImpl/index.js +53 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-baozm8ur.js +24 -0
- package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +1 -0
- package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/lib/vite/recorder/assets/index-2ElAIWFB.js +42 -0
- package/lib/vite/recorder/assets/index-BW-aOBcL.css +1 -0
- package/lib/vite/recorder/index.html +29 -0
- package/lib/vite/recorder/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Bh1rfd2w.js +24 -0
- package/lib/vite/traceViewer/assets/inspectorTab-7GHnKvSD.js +64 -0
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- package/lib/vite/traceViewer/assets/workbench-DPQnTHYP.js +9 -0
- package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +1 -0
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/embedded.BlHoW5LY.js +2 -0
- package/lib/vite/traceViewer/embedded.html +18 -0
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- package/lib/vite/traceViewer/index.CrbWWHbf.css +1 -0
- package/lib/vite/traceViewer/index.DaWVfou1.js +2 -0
- package/lib/vite/traceViewer/index.html +29 -0
- package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
- package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- package/lib/vite/traceViewer/recorder.C4zxcvd2.js +2 -0
- package/lib/vite/traceViewer/recorder.html +17 -0
- package/lib/vite/traceViewer/snapshot.html +21 -0
- package/lib/vite/traceViewer/sw.bundle.js +3 -0
- package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
- package/lib/vite/traceViewer/uiMode.html +20 -0
- package/lib/vite/traceViewer/uiMode.mTXWniJb.js +5 -0
- package/lib/vite/traceViewer/workbench.D3JVcA9K.css +1 -0
- package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +44 -0
- package/types/protocol.d.ts +21571 -0
- package/types/structs.d.ts +45 -0
- package/types/types.d.ts +22519 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BidiPage = void 0;
|
|
7
|
+
var _eventsHelper = require("../../utils/eventsHelper");
|
|
8
|
+
var _utils = require("../../utils");
|
|
9
|
+
var dom = _interopRequireWildcard(require("../dom"));
|
|
10
|
+
var dialog = _interopRequireWildcard(require("../dialog"));
|
|
11
|
+
var _page = require("../page");
|
|
12
|
+
var _bidiInput = require("./bidiInput");
|
|
13
|
+
var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
|
|
14
|
+
var _bidiExecutionContext = require("./bidiExecutionContext");
|
|
15
|
+
var _bidiNetworkManager = require("./bidiNetworkManager");
|
|
16
|
+
var _browserContext = require("../browserContext");
|
|
17
|
+
var _bidiPdf = require("./bidiPdf");
|
|
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); }
|
|
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; }
|
|
20
|
+
/**
|
|
21
|
+
* Copyright (c) Microsoft Corporation.
|
|
22
|
+
*
|
|
23
|
+
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
24
|
+
* you may not use this file except in compliance with the License.
|
|
25
|
+
* You may obtain a copy of the License at
|
|
26
|
+
*
|
|
27
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
28
|
+
*
|
|
29
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
30
|
+
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
31
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
32
|
+
* See the License for the specific language governing permissions and
|
|
33
|
+
* limitations under the License.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
const UTILITY_WORLD_NAME = '__playwright_utility_world__';
|
|
37
|
+
const kPlaywrightBindingChannel = 'playwrightChannel';
|
|
38
|
+
class BidiPage {
|
|
39
|
+
constructor(browserContext, bidiSession, opener) {
|
|
40
|
+
this.rawMouse = void 0;
|
|
41
|
+
this.rawKeyboard = void 0;
|
|
42
|
+
this.rawTouchscreen = void 0;
|
|
43
|
+
this._page = void 0;
|
|
44
|
+
this._pagePromise = void 0;
|
|
45
|
+
this._session = void 0;
|
|
46
|
+
this._opener = void 0;
|
|
47
|
+
this._realmToContext = void 0;
|
|
48
|
+
this._sessionListeners = [];
|
|
49
|
+
this._browserContext = void 0;
|
|
50
|
+
this._networkManager = void 0;
|
|
51
|
+
this._pdf = void 0;
|
|
52
|
+
this._initializedPage = null;
|
|
53
|
+
this._initScriptIds = [];
|
|
54
|
+
this._session = bidiSession;
|
|
55
|
+
this._opener = opener;
|
|
56
|
+
this.rawKeyboard = new _bidiInput.RawKeyboardImpl(bidiSession);
|
|
57
|
+
this.rawMouse = new _bidiInput.RawMouseImpl(bidiSession);
|
|
58
|
+
this.rawTouchscreen = new _bidiInput.RawTouchscreenImpl(bidiSession);
|
|
59
|
+
this._realmToContext = new Map();
|
|
60
|
+
this._page = new _page.Page(this, browserContext);
|
|
61
|
+
this._browserContext = browserContext;
|
|
62
|
+
this._networkManager = new _bidiNetworkManager.BidiNetworkManager(this._session, this._page, this._onNavigationResponseStarted.bind(this));
|
|
63
|
+
this._pdf = new _bidiPdf.BidiPDF(this._session);
|
|
64
|
+
this._page.on(_page.Page.Events.FrameDetached, frame => this._removeContextsForFrame(frame, false));
|
|
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))];
|
|
66
|
+
|
|
67
|
+
// Initialize main frame.
|
|
68
|
+
this._pagePromise = this._initialize().finally(async () => {
|
|
69
|
+
await this._page.initOpener(this._opener);
|
|
70
|
+
}).then(() => {
|
|
71
|
+
this._initializedPage = this._page;
|
|
72
|
+
this._page.reportAsNew();
|
|
73
|
+
return this._page;
|
|
74
|
+
}).catch(e => {
|
|
75
|
+
this._page.reportAsNew(e);
|
|
76
|
+
return e;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async _initialize() {
|
|
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()]);
|
|
83
|
+
}
|
|
84
|
+
async _addAllInitScripts() {
|
|
85
|
+
return Promise.all(this._page.allInitScripts().map(initScript => this.addInitScript(initScript)));
|
|
86
|
+
}
|
|
87
|
+
potentiallyUninitializedPage() {
|
|
88
|
+
return this._page;
|
|
89
|
+
}
|
|
90
|
+
didClose() {
|
|
91
|
+
this._session.dispose();
|
|
92
|
+
_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
|
|
93
|
+
this._page._didClose();
|
|
94
|
+
}
|
|
95
|
+
async pageOrError() {
|
|
96
|
+
// TODO: Wait for first execution context to be created and maybe about:blank navigated.
|
|
97
|
+
return this._pagePromise;
|
|
98
|
+
}
|
|
99
|
+
_onFrameAttached(frameId, parentFrameId) {
|
|
100
|
+
return this._page._frameManager.frameAttached(frameId, parentFrameId);
|
|
101
|
+
}
|
|
102
|
+
_removeContextsForFrame(frame, notifyFrame) {
|
|
103
|
+
for (const [contextId, context] of this._realmToContext) {
|
|
104
|
+
if (context.frame === frame) {
|
|
105
|
+
this._realmToContext.delete(contextId);
|
|
106
|
+
if (notifyFrame) frame._contextDestroyed(context);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
_onRealmCreated(realmInfo) {
|
|
111
|
+
if (this._realmToContext.has(realmInfo.realm)) return;
|
|
112
|
+
if (realmInfo.type !== 'window') return;
|
|
113
|
+
const frame = this._page._frameManager.frame(realmInfo.context);
|
|
114
|
+
if (!frame) return;
|
|
115
|
+
const delegate = new _bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
|
|
116
|
+
let worldName;
|
|
117
|
+
if (!realmInfo.sandbox) {
|
|
118
|
+
worldName = 'main';
|
|
119
|
+
// Force creating utility world every time the main world is created (e.g. due to navigation).
|
|
120
|
+
this._touchUtilityWorld(realmInfo.context);
|
|
121
|
+
} else if (realmInfo.sandbox === UTILITY_WORLD_NAME) {
|
|
122
|
+
worldName = 'utility';
|
|
123
|
+
} else {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const context = new dom.FrameExecutionContext(delegate, frame, worldName);
|
|
127
|
+
context[contextDelegateSymbol] = delegate;
|
|
128
|
+
frame._contextCreated(worldName, context);
|
|
129
|
+
this._realmToContext.set(realmInfo.realm, context);
|
|
130
|
+
}
|
|
131
|
+
async _touchUtilityWorld(context) {
|
|
132
|
+
await this._session.sendMayFail('script.evaluate', {
|
|
133
|
+
expression: '1 + 1',
|
|
134
|
+
target: {
|
|
135
|
+
context,
|
|
136
|
+
sandbox: UTILITY_WORLD_NAME
|
|
137
|
+
},
|
|
138
|
+
serializationOptions: {
|
|
139
|
+
maxObjectDepth: 10,
|
|
140
|
+
maxDomDepth: 10
|
|
141
|
+
},
|
|
142
|
+
awaitPromise: true,
|
|
143
|
+
userActivation: true
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
_onRealmDestroyed(params) {
|
|
147
|
+
const context = this._realmToContext.get(params.realm);
|
|
148
|
+
if (!context) return false;
|
|
149
|
+
this._realmToContext.delete(params.realm);
|
|
150
|
+
context.frame._contextDestroyed(context);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// TODO: route the message directly to the browser
|
|
155
|
+
_onBrowsingContextDestroyed(params) {
|
|
156
|
+
this._browserContext._browser._onBrowsingContextDestroyed(params);
|
|
157
|
+
}
|
|
158
|
+
_onNavigationStarted(params) {
|
|
159
|
+
const frameId = params.context;
|
|
160
|
+
this._page._frameManager.frameRequestedNavigation(frameId, params.navigation);
|
|
161
|
+
const url = params.url.toLowerCase();
|
|
162
|
+
if (url.startsWith('file:') || url.startsWith('data:') || url === 'about:blank') {
|
|
163
|
+
// Navigation to file urls doesn't emit network events, so we fire 'commit' event right when navigation is started.
|
|
164
|
+
// Doing it in domcontentload would be too late as we'd clear frame tree.
|
|
165
|
+
const frame = this._page._frameManager.frame(frameId);
|
|
166
|
+
if (frame) this._page._frameManager.frameCommittedNewDocumentNavigation(frameId, params.url, '', params.navigation, /* initial */false);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// TODO: there is no separate event for committed navigation, so we approximate it with responseStarted.
|
|
171
|
+
_onNavigationResponseStarted(params) {
|
|
172
|
+
const frameId = params.context;
|
|
173
|
+
const frame = this._page._frameManager.frame(frameId);
|
|
174
|
+
(0, _utils.assert)(frame);
|
|
175
|
+
this._page._frameManager.frameCommittedNewDocumentNavigation(frameId, params.response.url, '', params.navigation, /* initial */false);
|
|
176
|
+
// if (!initial)
|
|
177
|
+
// this._firstNonInitialNavigationCommittedFulfill();
|
|
178
|
+
}
|
|
179
|
+
_onDomContentLoaded(params) {
|
|
180
|
+
const frameId = params.context;
|
|
181
|
+
this._page._frameManager.frameLifecycleEvent(frameId, 'domcontentloaded');
|
|
182
|
+
}
|
|
183
|
+
_onLoad(params) {
|
|
184
|
+
this._page._frameManager.frameLifecycleEvent(params.context, 'load');
|
|
185
|
+
}
|
|
186
|
+
_onNavigationAborted(params) {
|
|
187
|
+
this._page._frameManager.frameAbortedNavigation(params.context, 'Navigation aborted', params.navigation || undefined);
|
|
188
|
+
}
|
|
189
|
+
_onNavigationFailed(params) {
|
|
190
|
+
this._page._frameManager.frameAbortedNavigation(params.context, 'Navigation failed', params.navigation || undefined);
|
|
191
|
+
}
|
|
192
|
+
_onFragmentNavigated(params) {
|
|
193
|
+
this._page._frameManager.frameCommittedSameDocumentNavigation(params.context, params.url);
|
|
194
|
+
}
|
|
195
|
+
_onUserPromptOpened(event) {
|
|
196
|
+
this._page.emitOnContext(_browserContext.BrowserContext.Events.Dialog, new dialog.Dialog(this._page, event.type, event.message, async (accept, userText) => {
|
|
197
|
+
await this._session.send('browsingContext.handleUserPrompt', {
|
|
198
|
+
context: event.context,
|
|
199
|
+
accept,
|
|
200
|
+
userText
|
|
201
|
+
});
|
|
202
|
+
}, event.defaultValue));
|
|
203
|
+
}
|
|
204
|
+
_onLogEntryAdded(params) {
|
|
205
|
+
var _params$stackTrace;
|
|
206
|
+
if (params.type !== 'console') return;
|
|
207
|
+
const entry = params;
|
|
208
|
+
const context = this._realmToContext.get(params.source.realm);
|
|
209
|
+
if (!context) return;
|
|
210
|
+
const callFrame = (_params$stackTrace = params.stackTrace) === null || _params$stackTrace === void 0 ? void 0 : _params$stackTrace.callFrames[0];
|
|
211
|
+
const location = callFrame !== null && callFrame !== void 0 ? callFrame : {
|
|
212
|
+
url: '',
|
|
213
|
+
lineNumber: 1,
|
|
214
|
+
columnNumber: 1
|
|
215
|
+
};
|
|
216
|
+
this._page._addConsoleMessage(entry.method, entry.args.map(arg => context.createHandle({
|
|
217
|
+
objectId: arg.handle,
|
|
218
|
+
...arg
|
|
219
|
+
})), location, params.text || undefined);
|
|
220
|
+
}
|
|
221
|
+
async navigateFrame(frame, url, referrer) {
|
|
222
|
+
const {
|
|
223
|
+
navigation
|
|
224
|
+
} = await this._session.send('browsingContext.navigate', {
|
|
225
|
+
context: frame._id,
|
|
226
|
+
url
|
|
227
|
+
});
|
|
228
|
+
return {
|
|
229
|
+
newDocumentId: navigation || undefined
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
async updateExtraHTTPHeaders() {}
|
|
233
|
+
async updateEmulateMedia() {}
|
|
234
|
+
async updateEmulatedViewportSize() {
|
|
235
|
+
await this._updateViewport();
|
|
236
|
+
}
|
|
237
|
+
async updateUserAgent() {}
|
|
238
|
+
async bringToFront() {
|
|
239
|
+
await this._session.send('browsingContext.activate', {
|
|
240
|
+
context: this._session.sessionId
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
async _updateViewport() {
|
|
244
|
+
const options = this._browserContext._options;
|
|
245
|
+
const deviceSize = this._page.emulatedSize();
|
|
246
|
+
if (deviceSize === null) return;
|
|
247
|
+
const viewportSize = deviceSize.viewport;
|
|
248
|
+
await this._session.send('browsingContext.setViewport', {
|
|
249
|
+
context: this._session.sessionId,
|
|
250
|
+
viewport: {
|
|
251
|
+
width: viewportSize.width,
|
|
252
|
+
height: viewportSize.height
|
|
253
|
+
},
|
|
254
|
+
devicePixelRatio: options.deviceScaleFactor || 1
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async updateRequestInterception() {
|
|
258
|
+
await this._networkManager.setRequestInterception(this._page.needsRequestInterception());
|
|
259
|
+
}
|
|
260
|
+
async updateOffline() {}
|
|
261
|
+
async updateHttpCredentials() {
|
|
262
|
+
await this._networkManager.setCredentials(this._browserContext._options.httpCredentials);
|
|
263
|
+
}
|
|
264
|
+
async updateFileChooserInterception() {}
|
|
265
|
+
async reload() {
|
|
266
|
+
await this._session.send('browsingContext.reload', {
|
|
267
|
+
context: this._session.sessionId,
|
|
268
|
+
// ignoreCache: true,
|
|
269
|
+
wait: bidi.BrowsingContext.ReadinessState.Interactive
|
|
270
|
+
});
|
|
271
|
+
}
|
|
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);
|
|
283
|
+
}
|
|
284
|
+
async requestGC() {
|
|
285
|
+
throw new Error('Method not implemented.');
|
|
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
|
+
}
|
|
321
|
+
async addInitScript(initScript) {
|
|
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);
|
|
331
|
+
}
|
|
332
|
+
async removeInitScripts() {
|
|
333
|
+
const promises = this._initScriptIds.map(script => this._session.send('script.removePreloadScript', {
|
|
334
|
+
script
|
|
335
|
+
}));
|
|
336
|
+
this._initScriptIds = [];
|
|
337
|
+
await Promise.all(promises);
|
|
338
|
+
}
|
|
339
|
+
async closePage(runBeforeUnload) {
|
|
340
|
+
await this._session.send('browsingContext.close', {
|
|
341
|
+
context: this._session.sessionId,
|
|
342
|
+
promptUnload: runBeforeUnload
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
async setBackgroundColor(color) {}
|
|
346
|
+
async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
|
|
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');
|
|
363
|
+
}
|
|
364
|
+
async getContentFrame(handle) {
|
|
365
|
+
const executionContext = toBidiExecutionContext(handle._context);
|
|
366
|
+
const contentWindow = await executionContext.rawCallFunction('e => e.contentWindow', {
|
|
367
|
+
handle: handle._objectId
|
|
368
|
+
});
|
|
369
|
+
if (contentWindow.type === 'window') {
|
|
370
|
+
const frameId = contentWindow.value.context;
|
|
371
|
+
const result = this._page._frameManager.frame(frameId);
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
async getOwnerFrame(handle) {
|
|
377
|
+
throw new Error('Method not implemented.');
|
|
378
|
+
}
|
|
379
|
+
isElementHandle(remoteObject) {
|
|
380
|
+
return remoteObject.type === 'node';
|
|
381
|
+
}
|
|
382
|
+
async getBoundingBox(handle) {
|
|
383
|
+
const box = await handle.evaluate(element => {
|
|
384
|
+
if (!(element instanceof Element)) return null;
|
|
385
|
+
const rect = element.getBoundingClientRect();
|
|
386
|
+
return {
|
|
387
|
+
x: rect.x,
|
|
388
|
+
y: rect.y,
|
|
389
|
+
width: rect.width,
|
|
390
|
+
height: rect.height
|
|
391
|
+
};
|
|
392
|
+
});
|
|
393
|
+
if (!box) return null;
|
|
394
|
+
const position = await this._framePosition(handle._frame);
|
|
395
|
+
if (!position) return null;
|
|
396
|
+
box.x += position.x;
|
|
397
|
+
box.y += position.y;
|
|
398
|
+
return box;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// TODO: move to Frame.
|
|
402
|
+
async _framePosition(frame) {
|
|
403
|
+
if (frame === this._page.mainFrame()) return {
|
|
404
|
+
x: 0,
|
|
405
|
+
y: 0
|
|
406
|
+
};
|
|
407
|
+
const element = await frame.frameElement();
|
|
408
|
+
const box = await element.boundingBox();
|
|
409
|
+
if (!box) return null;
|
|
410
|
+
const style = await element.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch(e => 'error:notconnected');
|
|
411
|
+
if (style === 'error:notconnected' || style === 'transformed') return null;
|
|
412
|
+
// Content box is offset by border and padding widths.
|
|
413
|
+
box.x += style.left;
|
|
414
|
+
box.y += style.top;
|
|
415
|
+
return box;
|
|
416
|
+
}
|
|
417
|
+
async scrollRectIntoViewIfNeeded(handle, rect) {
|
|
418
|
+
return await handle.evaluateInUtility(([injected, node]) => {
|
|
419
|
+
node.scrollIntoView({
|
|
420
|
+
block: 'center',
|
|
421
|
+
inline: 'center',
|
|
422
|
+
behavior: 'instant'
|
|
423
|
+
});
|
|
424
|
+
}, null).then(() => 'done').catch(e => {
|
|
425
|
+
if (e instanceof Error && e.message.includes('Node is detached from document')) return 'error:notconnected';
|
|
426
|
+
if (e instanceof Error && e.message.includes('Node does not have a layout object')) return 'error:notvisible';
|
|
427
|
+
throw e;
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
async setScreencastOptions(options) {}
|
|
431
|
+
rafCountForStablePosition() {
|
|
432
|
+
return 1;
|
|
433
|
+
}
|
|
434
|
+
async getContentQuads(handle) {
|
|
435
|
+
const quads = await handle.evaluateInUtility(([injected, node]) => {
|
|
436
|
+
if (!node.isConnected) return 'error:notconnected';
|
|
437
|
+
const rects = node.getClientRects();
|
|
438
|
+
if (!rects) return null;
|
|
439
|
+
return [...rects].map(rect => [{
|
|
440
|
+
x: rect.left,
|
|
441
|
+
y: rect.top
|
|
442
|
+
}, {
|
|
443
|
+
x: rect.right,
|
|
444
|
+
y: rect.top
|
|
445
|
+
}, {
|
|
446
|
+
x: rect.right,
|
|
447
|
+
y: rect.bottom
|
|
448
|
+
}, {
|
|
449
|
+
x: rect.left,
|
|
450
|
+
y: rect.bottom
|
|
451
|
+
}]);
|
|
452
|
+
}, null);
|
|
453
|
+
if (!quads || quads === 'error:notconnected') return quads;
|
|
454
|
+
// TODO: consider transforming quads to support clicks in iframes.
|
|
455
|
+
const position = await this._framePosition(handle._frame);
|
|
456
|
+
if (!position) return null;
|
|
457
|
+
quads.forEach(quad => quad.forEach(point => {
|
|
458
|
+
point.x += position.x;
|
|
459
|
+
point.y += position.y;
|
|
460
|
+
}));
|
|
461
|
+
return quads;
|
|
462
|
+
}
|
|
463
|
+
async setInputFiles(handle, files) {
|
|
464
|
+
throw new Error('Method not implemented.');
|
|
465
|
+
}
|
|
466
|
+
async setInputFilePaths(handle, paths) {
|
|
467
|
+
throw new Error('Method not implemented.');
|
|
468
|
+
}
|
|
469
|
+
async adoptElementHandle(handle, to) {
|
|
470
|
+
const fromContext = toBidiExecutionContext(handle._context);
|
|
471
|
+
const shared = await fromContext.rawCallFunction('x => x', {
|
|
472
|
+
handle: handle._objectId
|
|
473
|
+
});
|
|
474
|
+
// TODO: store sharedId in the handle.
|
|
475
|
+
if (!('sharedId' in shared)) throw new Error('Element is not a node');
|
|
476
|
+
const sharedId = shared.sharedId;
|
|
477
|
+
const executionContext = toBidiExecutionContext(to);
|
|
478
|
+
const result = await executionContext.rawCallFunction('x => x', {
|
|
479
|
+
sharedId
|
|
480
|
+
});
|
|
481
|
+
if ('handle' in result) return to.createHandle({
|
|
482
|
+
objectId: result.handle,
|
|
483
|
+
...result
|
|
484
|
+
});
|
|
485
|
+
throw new Error('Failed to adopt element handle.');
|
|
486
|
+
}
|
|
487
|
+
async getAccessibilityTree(needle) {
|
|
488
|
+
throw new Error('Method not implemented.');
|
|
489
|
+
}
|
|
490
|
+
async inputActionEpilogue() {}
|
|
491
|
+
async resetForReuse() {}
|
|
492
|
+
async pdf(options) {
|
|
493
|
+
return this._pdf.generate(options);
|
|
494
|
+
}
|
|
495
|
+
async getFrameElement(frame) {
|
|
496
|
+
const parent = frame.parentFrame();
|
|
497
|
+
if (!parent) throw new Error('Frame has been detached.');
|
|
498
|
+
const parentContext = await parent._mainContext();
|
|
499
|
+
const list = await parentContext.evaluateHandle(() => {
|
|
500
|
+
return [...document.querySelectorAll('iframe,frame')];
|
|
501
|
+
});
|
|
502
|
+
const length = await list.evaluate(list => list.length);
|
|
503
|
+
let foundElement = null;
|
|
504
|
+
for (let i = 0; i < length; i++) {
|
|
505
|
+
const element = await list.evaluateHandle((list, i) => list[i], i);
|
|
506
|
+
const candidate = await element.contentFrame();
|
|
507
|
+
if (frame === candidate) {
|
|
508
|
+
foundElement = element;
|
|
509
|
+
break;
|
|
510
|
+
} else {
|
|
511
|
+
element.dispose();
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
list.dispose();
|
|
515
|
+
if (!foundElement) throw new Error('Frame has been detached.');
|
|
516
|
+
return foundElement;
|
|
517
|
+
}
|
|
518
|
+
shouldToggleStyleSheetToSyncAnimations() {
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
exports.BidiPage = BidiPage;
|
|
523
|
+
function addMainBinding(callback) {
|
|
524
|
+
globalThis['__playwright__binding__'] = callback;
|
|
525
|
+
}
|
|
526
|
+
function toBidiExecutionContext(executionContext) {
|
|
527
|
+
return executionContext[contextDelegateSymbol];
|
|
528
|
+
}
|
|
529
|
+
const contextDelegateSymbol = Symbol('delegate');
|
|
@@ -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;
|