@checkly/playwright-core 1.41.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +3 -0
- package/ThirdPartyNotices.txt +1513 -0
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +2 -0
- package/bin/install_media_pack.ps1 +5 -0
- package/bin/reinstall_chrome_beta_linux.sh +40 -0
- package/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/bin/reinstall_chrome_beta_win.ps1 +23 -0
- package/bin/reinstall_chrome_stable_linux.sh +40 -0
- package/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/bin/reinstall_chrome_stable_win.ps1 +23 -0
- package/bin/reinstall_msedge_beta_linux.sh +40 -0
- package/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/bin/reinstall_msedge_beta_win.ps1 +22 -0
- package/bin/reinstall_msedge_dev_linux.sh +40 -0
- package/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/bin/reinstall_msedge_dev_win.ps1 +22 -0
- package/bin/reinstall_msedge_stable_linux.sh +40 -0
- package/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/bin/reinstall_msedge_stable_win.ps1 +23 -0
- package/browsers.json +64 -0
- package/cli.js +17 -0
- package/index.d.ts +17 -0
- package/index.js +33 -0
- package/index.mjs +28 -0
- package/lib/androidServerImpl.js +69 -0
- package/lib/browserServerImpl.js +92 -0
- package/lib/cli/driver.js +97 -0
- package/lib/cli/program.js +582 -0
- package/lib/cli/programWithTestStub.js +67 -0
- package/lib/client/accessibility.js +50 -0
- package/lib/client/android.js +473 -0
- package/lib/client/api.js +272 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +509 -0
- package/lib/client/browserType.js +233 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +229 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +40 -0
- package/lib/client/connection.js +327 -0
- package/lib/client/consoleMessage.js +55 -0
- package/lib/client/coverage.js +41 -0
- package/lib/client/dialog.js +57 -0
- package/lib/client/download.js +62 -0
- package/lib/client/electron.js +130 -0
- package/lib/client/elementHandle.js +291 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/events.js +93 -0
- package/lib/client/fetch.js +343 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +506 -0
- package/lib/client/harRouter.js +93 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +123 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +35 -0
- package/lib/client/locator.js +432 -0
- package/lib/client/network.js +601 -0
- package/lib/client/page.js +707 -0
- package/lib/client/playwright.js +74 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +135 -0
- package/lib/client/types.js +24 -0
- package/lib/client/video.js +51 -0
- package/lib/client/waiter.js +158 -0
- package/lib/client/webError.js +37 -0
- package/lib/client/worker.js +71 -0
- package/lib/client/writableStream.js +54 -0
- package/lib/common/socksProxy.js +569 -0
- package/lib/common/timeoutSettings.js +73 -0
- package/lib/common/types.js +5 -0
- package/lib/generated/consoleApiSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +7 -0
- package/lib/generated/recorderSource.js +7 -0
- package/lib/generated/utilityScriptSource.js +7 -0
- package/lib/image_tools/colorUtils.js +98 -0
- package/lib/image_tools/compare.js +108 -0
- package/lib/image_tools/imageChannel.js +70 -0
- package/lib/image_tools/stats.js +102 -0
- package/lib/inProcessFactory.js +54 -0
- package/lib/inprocess.js +20 -0
- package/lib/outofprocess.js +67 -0
- package/lib/protocol/debug.js +27 -0
- package/lib/protocol/serializers.js +172 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2599 -0
- package/lib/protocol/validatorPrimitives.js +139 -0
- package/lib/remote/playwrightConnection.js +274 -0
- package/lib/remote/playwrightServer.js +110 -0
- package/lib/server/accessibility.js +62 -0
- package/lib/server/android/android.js +441 -0
- package/lib/server/android/backendAdb.js +172 -0
- package/lib/server/artifact.js +104 -0
- package/lib/server/browser.js +129 -0
- package/lib/server/browserContext.js +609 -0
- package/lib/server/browserType.js +300 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +346 -0
- package/lib/server/chromium/chromiumSwitches.js +41 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +521 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +104 -0
- package/lib/server/chromium/crDragDrop.js +144 -0
- package/lib/server/chromium/crExecutionContext.js +156 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +723 -0
- package/lib/server/chromium/crPage.js +1173 -0
- package/lib/server/chromium/crPdf.js +147 -0
- package/lib/server/chromium/crProtocolHelper.js +131 -0
- package/lib/server/chromium/crServiceWorker.js +115 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/console.js +59 -0
- package/lib/server/cookieStore.js +112 -0
- package/lib/server/debugController.js +236 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +21 -0
- package/lib/server/deviceDescriptorsSource.json +1549 -0
- package/lib/server/dialog.js +70 -0
- package/lib/server/dispatchers/androidDispatcher.js +193 -0
- package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
- package/lib/server/dispatchers/browserDispatcher.js +170 -0
- package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- package/lib/server/dispatchers/dispatcher.js +400 -0
- package/lib/server/dispatchers/electronDispatcher.js +80 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +287 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +363 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
- package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- package/lib/server/dispatchers/streamDispatcher.js +62 -0
- package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
- package/lib/server/dom.js +808 -0
- package/lib/server/download.js +53 -0
- package/lib/server/electron/electron.js +254 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +611 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +71 -0
- package/lib/server/firefox/ffAccessibility.js +215 -0
- package/lib/server/firefox/ffBrowser.js +447 -0
- package/lib/server/firefox/ffConnection.js +168 -0
- package/lib/server/firefox/ffExecutionContext.js +138 -0
- package/lib/server/firefox/ffInput.js +150 -0
- package/lib/server/firefox/ffNetworkManager.js +231 -0
- package/lib/server/firefox/ffPage.js +558 -0
- package/lib/server/firefox/firefox.js +91 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1597 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +539 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +96 -0
- package/lib/server/input.js +301 -0
- package/lib/server/instrumentation.js +74 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
- package/lib/server/javascript.js +305 -0
- package/lib/server/launchApp.js +90 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +607 -0
- package/lib/server/page.js +793 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +82 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/codeGenerator.js +153 -0
- package/lib/server/recorder/csharp.js +310 -0
- package/lib/server/recorder/java.js +216 -0
- package/lib/server/recorder/javascript.js +229 -0
- package/lib/server/recorder/jsonl.js +47 -0
- package/lib/server/recorder/language.js +44 -0
- package/lib/server/recorder/python.js +275 -0
- package/lib/server/recorder/recorderActions.js +5 -0
- package/lib/server/recorder/recorderApp.js +181 -0
- package/lib/server/recorder/recorderUtils.js +48 -0
- package/lib/server/recorder/utils.js +45 -0
- package/lib/server/recorder.js +700 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +925 -0
- package/lib/server/registry/nativeDeps.js +383 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +354 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +168 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +552 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +229 -0
- package/lib/server/transport.js +191 -0
- package/lib/server/types.js +24 -0
- package/lib/server/usKeyboardLayout.js +555 -0
- package/lib/server/webkit/webkit.js +87 -0
- package/lib/server/webkit/wkAccessibility.js +194 -0
- package/lib/server/webkit/wkBrowser.js +328 -0
- package/lib/server/webkit/wkConnection.js +173 -0
- package/lib/server/webkit/wkExecutionContext.js +146 -0
- package/lib/server/webkit/wkInput.js +169 -0
- package/lib/server/webkit/wkInterceptableRequest.js +158 -0
- package/lib/server/webkit/wkPage.js +1198 -0
- package/lib/server/webkit/wkProvisionalPage.js +59 -0
- package/lib/server/webkit/wkWorkers.js +104 -0
- package/lib/third_party/diff_match_patch.js +2222 -0
- package/lib/third_party/pixelmatch.js +255 -0
- package/lib/utils/ascii.js +31 -0
- package/lib/utils/comparators.js +171 -0
- package/lib/utils/crypto.js +33 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +89 -0
- package/lib/utils/env.js +47 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/fileUtils.js +66 -0
- package/lib/utils/glob.js +83 -0
- package/lib/utils/happy-eyeballs.js +154 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +124 -0
- package/lib/utils/httpServer.js +195 -0
- package/lib/utils/index.js +324 -0
- package/lib/utils/isomorphic/cssParser.js +250 -0
- package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- package/lib/utils/isomorphic/locatorGenerators.js +651 -0
- package/lib/utils/isomorphic/locatorParser.js +179 -0
- package/lib/utils/isomorphic/locatorUtils.js +62 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +107 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/mimeType.js +29 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +189 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +41 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +123 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +131 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +125 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +99 -0
- package/lib/utilsBundle.js +81 -0
- package/lib/utilsBundleImpl/index.js +51 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
- package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
- package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
- package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
- package/lib/vite/recorder/index.html +29 -0
- package/lib/vite/recorder/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
- package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
- package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
- package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
- package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
- package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
- package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
- package/lib/vite/traceViewer/index.html +26 -0
- package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
- package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/snapshot.html +21 -0
- package/lib/vite/traceViewer/sw.bundle.js +4 -0
- package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
- package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
- package/lib/vite/traceViewer/uiMode.html +17 -0
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
- package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
- package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
- package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +43 -0
- package/types/protocol.d.ts +20304 -0
- package/types/structs.d.ts +45 -0
- package/types/types.d.ts +20626 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CRBrowserContext = exports.CRBrowser = void 0;
|
|
7
|
+
var _path = _interopRequireDefault(require("path"));
|
|
8
|
+
var _browser = require("../browser");
|
|
9
|
+
var _browserContext = require("../browserContext");
|
|
10
|
+
var _utils = require("../../utils");
|
|
11
|
+
var network = _interopRequireWildcard(require("../network"));
|
|
12
|
+
var _page = require("../page");
|
|
13
|
+
var _frames = require("../frames");
|
|
14
|
+
var _crConnection = require("./crConnection");
|
|
15
|
+
var _crPage = require("./crPage");
|
|
16
|
+
var _crProtocolHelper = require("./crProtocolHelper");
|
|
17
|
+
var _crServiceWorker = require("./crServiceWorker");
|
|
18
|
+
var _artifact = require("../artifact");
|
|
19
|
+
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); }
|
|
20
|
+
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; }
|
|
21
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
22
|
+
/**
|
|
23
|
+
* Copyright 2017 Google Inc. All rights reserved.
|
|
24
|
+
* Modifications copyright (c) Microsoft Corporation.
|
|
25
|
+
*
|
|
26
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
27
|
+
* you may not use this file except in compliance with the License.
|
|
28
|
+
* You may obtain a copy of the License at
|
|
29
|
+
*
|
|
30
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
31
|
+
*
|
|
32
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
33
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
34
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
35
|
+
* See the License for the specific language governing permissions and
|
|
36
|
+
* limitations under the License.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
class CRBrowser extends _browser.Browser {
|
|
40
|
+
static async connect(parent, transport, options, devtools) {
|
|
41
|
+
// Make a copy in case we need to update `headful` property below.
|
|
42
|
+
options = {
|
|
43
|
+
...options
|
|
44
|
+
};
|
|
45
|
+
const connection = new _crConnection.CRConnection(transport, options.protocolLogger, options.browserLogsCollector);
|
|
46
|
+
const browser = new CRBrowser(parent, connection, options);
|
|
47
|
+
browser._devtools = devtools;
|
|
48
|
+
if (browser.isClank()) browser._isCollocatedWithServer = false;
|
|
49
|
+
const session = connection.rootSession;
|
|
50
|
+
if (options.__testHookOnConnectToBrowser) await options.__testHookOnConnectToBrowser();
|
|
51
|
+
const version = await session.send('Browser.getVersion');
|
|
52
|
+
browser._version = version.product.substring(version.product.indexOf('/') + 1);
|
|
53
|
+
browser._userAgent = version.userAgent;
|
|
54
|
+
// We don't trust the option as it may lie in case of connectOverCDP where remote browser
|
|
55
|
+
// may have been launched with different options.
|
|
56
|
+
browser.options.headful = !version.userAgent.includes('Headless');
|
|
57
|
+
if (!options.persistent) {
|
|
58
|
+
await session.send('Target.setAutoAttach', {
|
|
59
|
+
autoAttach: true,
|
|
60
|
+
waitForDebuggerOnStart: true,
|
|
61
|
+
flatten: true
|
|
62
|
+
});
|
|
63
|
+
return browser;
|
|
64
|
+
}
|
|
65
|
+
browser._defaultContext = new CRBrowserContext(browser, undefined, options.persistent);
|
|
66
|
+
await Promise.all([session.send('Target.setAutoAttach', {
|
|
67
|
+
autoAttach: true,
|
|
68
|
+
waitForDebuggerOnStart: true,
|
|
69
|
+
flatten: true
|
|
70
|
+
}).then(async () => {
|
|
71
|
+
// Target.setAutoAttach has a bug where it does not wait for new Targets being attached.
|
|
72
|
+
// However making a dummy call afterwards fixes this.
|
|
73
|
+
// This can be removed after https://chromium-review.googlesource.com/c/chromium/src/+/2885888 lands in stable.
|
|
74
|
+
await session.send('Target.getTargetInfo');
|
|
75
|
+
}), browser._defaultContext._initialize()]);
|
|
76
|
+
await browser._waitForAllPagesToBeInitialized();
|
|
77
|
+
return browser;
|
|
78
|
+
}
|
|
79
|
+
constructor(parent, connection, options) {
|
|
80
|
+
super(parent, options);
|
|
81
|
+
this._connection = void 0;
|
|
82
|
+
this._session = void 0;
|
|
83
|
+
this._clientRootSessionPromise = null;
|
|
84
|
+
this._contexts = new Map();
|
|
85
|
+
this._crPages = new Map();
|
|
86
|
+
this._backgroundPages = new Map();
|
|
87
|
+
this._serviceWorkers = new Map();
|
|
88
|
+
this._devtools = void 0;
|
|
89
|
+
this._version = '';
|
|
90
|
+
this._tracingRecording = false;
|
|
91
|
+
this._tracingClient = void 0;
|
|
92
|
+
this._userAgent = '';
|
|
93
|
+
this._connection = connection;
|
|
94
|
+
this._session = this._connection.rootSession;
|
|
95
|
+
this._connection.on(_crConnection.ConnectionEvents.Disconnected, () => this._didDisconnect());
|
|
96
|
+
this._session.on('Target.attachedToTarget', this._onAttachedToTarget.bind(this));
|
|
97
|
+
this._session.on('Target.detachedFromTarget', this._onDetachedFromTarget.bind(this));
|
|
98
|
+
this._session.on('Browser.downloadWillBegin', this._onDownloadWillBegin.bind(this));
|
|
99
|
+
this._session.on('Browser.downloadProgress', this._onDownloadProgress.bind(this));
|
|
100
|
+
}
|
|
101
|
+
async doCreateNewContext(options) {
|
|
102
|
+
let proxyBypassList = undefined;
|
|
103
|
+
if (options.proxy) {
|
|
104
|
+
if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK) proxyBypassList = options.proxy.bypass;else proxyBypassList = '<-loopback>' + (options.proxy.bypass ? `,${options.proxy.bypass}` : '');
|
|
105
|
+
}
|
|
106
|
+
const {
|
|
107
|
+
browserContextId
|
|
108
|
+
} = await this._session.send('Target.createBrowserContext', {
|
|
109
|
+
disposeOnDetach: true,
|
|
110
|
+
proxyServer: options.proxy ? options.proxy.server : undefined,
|
|
111
|
+
proxyBypassList
|
|
112
|
+
});
|
|
113
|
+
const context = new CRBrowserContext(this, browserContextId, options);
|
|
114
|
+
await context._initialize();
|
|
115
|
+
this._contexts.set(browserContextId, context);
|
|
116
|
+
return context;
|
|
117
|
+
}
|
|
118
|
+
contexts() {
|
|
119
|
+
return Array.from(this._contexts.values());
|
|
120
|
+
}
|
|
121
|
+
version() {
|
|
122
|
+
return this._version;
|
|
123
|
+
}
|
|
124
|
+
userAgent() {
|
|
125
|
+
return this._userAgent;
|
|
126
|
+
}
|
|
127
|
+
_platform() {
|
|
128
|
+
if (this._userAgent.includes('Windows')) return 'win';
|
|
129
|
+
if (this._userAgent.includes('Macintosh')) return 'mac';
|
|
130
|
+
return 'linux';
|
|
131
|
+
}
|
|
132
|
+
isClank() {
|
|
133
|
+
return this.options.name === 'clank';
|
|
134
|
+
}
|
|
135
|
+
async _waitForAllPagesToBeInitialized() {
|
|
136
|
+
await Promise.all([...this._crPages.values()].map(page => page.pageOrError()));
|
|
137
|
+
}
|
|
138
|
+
_onAttachedToTarget({
|
|
139
|
+
targetInfo,
|
|
140
|
+
sessionId,
|
|
141
|
+
waitingForDebugger
|
|
142
|
+
}) {
|
|
143
|
+
if (targetInfo.type === 'browser') return;
|
|
144
|
+
const session = this._session.createChildSession(sessionId);
|
|
145
|
+
(0, _utils.assert)(targetInfo.browserContextId, 'targetInfo: ' + JSON.stringify(targetInfo, null, 2));
|
|
146
|
+
let context = this._contexts.get(targetInfo.browserContextId) || null;
|
|
147
|
+
if (!context) {
|
|
148
|
+
// TODO: auto attach only to pages from our contexts.
|
|
149
|
+
// assert(this._defaultContext);
|
|
150
|
+
context = this._defaultContext;
|
|
151
|
+
}
|
|
152
|
+
if (targetInfo.type === 'other' && targetInfo.url.startsWith('devtools://devtools') && this._devtools) {
|
|
153
|
+
this._devtools.install(session);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const treatOtherAsPage = targetInfo.type === 'other' && process.env.PW_CHROMIUM_ATTACH_TO_OTHER;
|
|
157
|
+
if (!context || targetInfo.type === 'other' && !treatOtherAsPage) {
|
|
158
|
+
session.detach().catch(() => {});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
(0, _utils.assert)(!this._crPages.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
|
|
162
|
+
(0, _utils.assert)(!this._backgroundPages.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
|
|
163
|
+
(0, _utils.assert)(!this._serviceWorkers.has(targetInfo.targetId), 'Duplicate target ' + targetInfo.targetId);
|
|
164
|
+
if (targetInfo.type === 'background_page') {
|
|
165
|
+
const backgroundPage = new _crPage.CRPage(session, targetInfo.targetId, context, null, {
|
|
166
|
+
hasUIWindow: false,
|
|
167
|
+
isBackgroundPage: true
|
|
168
|
+
});
|
|
169
|
+
this._backgroundPages.set(targetInfo.targetId, backgroundPage);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (targetInfo.type === 'page' || treatOtherAsPage) {
|
|
173
|
+
const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null;
|
|
174
|
+
const crPage = new _crPage.CRPage(session, targetInfo.targetId, context, opener, {
|
|
175
|
+
hasUIWindow: targetInfo.type === 'page',
|
|
176
|
+
isBackgroundPage: false
|
|
177
|
+
});
|
|
178
|
+
this._crPages.set(targetInfo.targetId, crPage);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (targetInfo.type === 'service_worker') {
|
|
182
|
+
const serviceWorker = new _crServiceWorker.CRServiceWorker(context, session, targetInfo.url);
|
|
183
|
+
this._serviceWorkers.set(targetInfo.targetId, serviceWorker);
|
|
184
|
+
context.emit(CRBrowserContext.CREvents.ServiceWorker, serviceWorker);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Detach from any targets we are not interested in, to avoid side-effects.
|
|
189
|
+
//
|
|
190
|
+
// One example of a side effect: upon shared worker restart, we receive
|
|
191
|
+
// Inspector.targetReloadedAfterCrash and backend waits for Runtime.runIfWaitingForDebugger
|
|
192
|
+
// from any attached client. If we do not resume, shared worker will stall.
|
|
193
|
+
session.detach().catch(() => {});
|
|
194
|
+
}
|
|
195
|
+
_onDetachedFromTarget(payload) {
|
|
196
|
+
const targetId = payload.targetId;
|
|
197
|
+
const crPage = this._crPages.get(targetId);
|
|
198
|
+
if (crPage) {
|
|
199
|
+
this._crPages.delete(targetId);
|
|
200
|
+
crPage.didClose();
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const backgroundPage = this._backgroundPages.get(targetId);
|
|
204
|
+
if (backgroundPage) {
|
|
205
|
+
this._backgroundPages.delete(targetId);
|
|
206
|
+
backgroundPage.didClose();
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const serviceWorker = this._serviceWorkers.get(targetId);
|
|
210
|
+
if (serviceWorker) {
|
|
211
|
+
this._serviceWorkers.delete(targetId);
|
|
212
|
+
serviceWorker.didClose();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
_didDisconnect() {
|
|
217
|
+
for (const crPage of this._crPages.values()) crPage.didClose();
|
|
218
|
+
this._crPages.clear();
|
|
219
|
+
for (const backgroundPage of this._backgroundPages.values()) backgroundPage.didClose();
|
|
220
|
+
this._backgroundPages.clear();
|
|
221
|
+
for (const serviceWorker of this._serviceWorkers.values()) serviceWorker.didClose();
|
|
222
|
+
this._serviceWorkers.clear();
|
|
223
|
+
this._didClose();
|
|
224
|
+
}
|
|
225
|
+
_findOwningPage(frameId) {
|
|
226
|
+
for (const crPage of this._crPages.values()) {
|
|
227
|
+
const frame = crPage._page._frameManager.frame(frameId);
|
|
228
|
+
if (frame) return crPage;
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
_onDownloadWillBegin(payload) {
|
|
233
|
+
const page = this._findOwningPage(payload.frameId);
|
|
234
|
+
if (!page) {
|
|
235
|
+
// There might be no page when download originates from something unusual, like
|
|
236
|
+
// a DevTools window or maybe an extension page.
|
|
237
|
+
// See https://github.com/microsoft/playwright/issues/22551.
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
page.willBeginDownload();
|
|
241
|
+
let originPage = page._initializedPage;
|
|
242
|
+
// If it's a new window download, report it on the opener page.
|
|
243
|
+
if (!originPage && page._opener) originPage = page._opener._initializedPage;
|
|
244
|
+
if (!originPage) return;
|
|
245
|
+
this._downloadCreated(originPage, payload.guid, payload.url, payload.suggestedFilename);
|
|
246
|
+
}
|
|
247
|
+
_onDownloadProgress(payload) {
|
|
248
|
+
if (payload.state === 'completed') this._downloadFinished(payload.guid, '');
|
|
249
|
+
if (payload.state === 'canceled') this._downloadFinished(payload.guid, this._closeReason || 'canceled');
|
|
250
|
+
}
|
|
251
|
+
async _closePage(crPage) {
|
|
252
|
+
await this._session.send('Target.closeTarget', {
|
|
253
|
+
targetId: crPage._targetId
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
async newBrowserCDPSession() {
|
|
257
|
+
return await this._connection.createBrowserSession();
|
|
258
|
+
}
|
|
259
|
+
async startTracing(page, options = {}) {
|
|
260
|
+
(0, _utils.assert)(!this._tracingRecording, 'Cannot start recording trace while already recording trace.');
|
|
261
|
+
this._tracingClient = page ? page._delegate._mainFrameSession._client : this._session;
|
|
262
|
+
const defaultCategories = ['-*', 'devtools.timeline', 'v8.execute', 'disabled-by-default-devtools.timeline', 'disabled-by-default-devtools.timeline.frame', 'toplevel', 'blink.console', 'blink.user_timing', 'latencyInfo', 'disabled-by-default-devtools.timeline.stack', 'disabled-by-default-v8.cpu_profiler', 'disabled-by-default-v8.cpu_profiler.hires'];
|
|
263
|
+
const {
|
|
264
|
+
screenshots = false,
|
|
265
|
+
categories = defaultCategories
|
|
266
|
+
} = options;
|
|
267
|
+
if (screenshots) categories.push('disabled-by-default-devtools.screenshot');
|
|
268
|
+
this._tracingRecording = true;
|
|
269
|
+
await this._tracingClient.send('Tracing.start', {
|
|
270
|
+
transferMode: 'ReturnAsStream',
|
|
271
|
+
categories: categories.join(',')
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
async stopTracing() {
|
|
275
|
+
(0, _utils.assert)(this._tracingClient, 'Tracing was not started.');
|
|
276
|
+
const [event] = await Promise.all([new Promise(f => this._tracingClient.once('Tracing.tracingComplete', f)), this._tracingClient.send('Tracing.end')]);
|
|
277
|
+
const tracingPath = _path.default.join(this.options.artifactsDir, (0, _utils.createGuid)() + '.crtrace');
|
|
278
|
+
await (0, _crProtocolHelper.saveProtocolStream)(this._tracingClient, event.stream, tracingPath);
|
|
279
|
+
this._tracingRecording = false;
|
|
280
|
+
const artifact = new _artifact.Artifact(this, tracingPath);
|
|
281
|
+
artifact.reportFinished();
|
|
282
|
+
return artifact;
|
|
283
|
+
}
|
|
284
|
+
isConnected() {
|
|
285
|
+
return !this._connection._closed;
|
|
286
|
+
}
|
|
287
|
+
async _clientRootSession() {
|
|
288
|
+
if (!this._clientRootSessionPromise) this._clientRootSessionPromise = this._connection.createBrowserSession();
|
|
289
|
+
return this._clientRootSessionPromise;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.CRBrowser = CRBrowser;
|
|
293
|
+
class CRBrowserContext extends _browserContext.BrowserContext {
|
|
294
|
+
constructor(browser, browserContextId, options) {
|
|
295
|
+
super(browser, options, browserContextId);
|
|
296
|
+
this._authenticateProxyViaCredentials();
|
|
297
|
+
}
|
|
298
|
+
async _initialize() {
|
|
299
|
+
(0, _utils.assert)(!Array.from(this._browser._crPages.values()).some(page => page._browserContext === this));
|
|
300
|
+
const promises = [super._initialize()];
|
|
301
|
+
if (this._browser.options.name !== 'electron' && this._browser.options.name !== 'clank' && this._options.acceptDownloads !== 'internal-browser-default') {
|
|
302
|
+
promises.push(this._browser._session.send('Browser.setDownloadBehavior', {
|
|
303
|
+
behavior: this._options.acceptDownloads === 'accept' ? 'allowAndName' : 'deny',
|
|
304
|
+
browserContextId: this._browserContextId,
|
|
305
|
+
downloadPath: this._browser.options.downloadsPath,
|
|
306
|
+
eventsEnabled: true
|
|
307
|
+
}));
|
|
308
|
+
}
|
|
309
|
+
await Promise.all(promises);
|
|
310
|
+
}
|
|
311
|
+
_crPages() {
|
|
312
|
+
return [...this._browser._crPages.values()].filter(crPage => crPage._browserContext === this);
|
|
313
|
+
}
|
|
314
|
+
pages() {
|
|
315
|
+
return this._crPages().map(crPage => crPage._initializedPage).filter(Boolean);
|
|
316
|
+
}
|
|
317
|
+
async newPageDelegate() {
|
|
318
|
+
(0, _browserContext.assertBrowserContextIsNotOwned)(this);
|
|
319
|
+
const oldKeys = this._browser.isClank() ? new Set(this._browser._crPages.keys()) : undefined;
|
|
320
|
+
let {
|
|
321
|
+
targetId
|
|
322
|
+
} = await this._browser._session.send('Target.createTarget', {
|
|
323
|
+
url: 'about:blank',
|
|
324
|
+
browserContextId: this._browserContextId
|
|
325
|
+
});
|
|
326
|
+
if (oldKeys) {
|
|
327
|
+
// Chrome for Android returns tab ids (1, 2, 3, 4, 5) instead of content target ids here, work around it via the
|
|
328
|
+
// heuristic assuming that there is only one page created at a time.
|
|
329
|
+
const newKeys = new Set(this._browser._crPages.keys());
|
|
330
|
+
// Remove old keys.
|
|
331
|
+
for (const key of oldKeys) newKeys.delete(key);
|
|
332
|
+
// Remove potential concurrent popups.
|
|
333
|
+
for (const key of newKeys) {
|
|
334
|
+
const page = this._browser._crPages.get(key);
|
|
335
|
+
if (page._opener) newKeys.delete(key);
|
|
336
|
+
}
|
|
337
|
+
(0, _utils.assert)(newKeys.size === 1);
|
|
338
|
+
[targetId] = [...newKeys];
|
|
339
|
+
}
|
|
340
|
+
return this._browser._crPages.get(targetId);
|
|
341
|
+
}
|
|
342
|
+
async doGetCookies(urls) {
|
|
343
|
+
const {
|
|
344
|
+
cookies
|
|
345
|
+
} = await this._browser._session.send('Storage.getCookies', {
|
|
346
|
+
browserContextId: this._browserContextId
|
|
347
|
+
});
|
|
348
|
+
return network.filterCookies(cookies.map(c => {
|
|
349
|
+
const copy = {
|
|
350
|
+
sameSite: 'Lax',
|
|
351
|
+
...c
|
|
352
|
+
};
|
|
353
|
+
delete copy.size;
|
|
354
|
+
delete copy.priority;
|
|
355
|
+
delete copy.session;
|
|
356
|
+
delete copy.sameParty;
|
|
357
|
+
delete copy.sourceScheme;
|
|
358
|
+
delete copy.sourcePort;
|
|
359
|
+
return copy;
|
|
360
|
+
}), urls);
|
|
361
|
+
}
|
|
362
|
+
async addCookies(cookies) {
|
|
363
|
+
await this._browser._session.send('Storage.setCookies', {
|
|
364
|
+
cookies: network.rewriteCookies(cookies),
|
|
365
|
+
browserContextId: this._browserContextId
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
async clearCookies() {
|
|
369
|
+
await this._browser._session.send('Storage.clearCookies', {
|
|
370
|
+
browserContextId: this._browserContextId
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
async doGrantPermissions(origin, permissions) {
|
|
374
|
+
const webPermissionToProtocol = new Map([['geolocation', 'geolocation'], ['midi', 'midi'], ['notifications', 'notifications'], ['camera', 'videoCapture'], ['microphone', 'audioCapture'], ['background-sync', 'backgroundSync'], ['ambient-light-sensor', 'sensors'], ['accelerometer', 'sensors'], ['gyroscope', 'sensors'], ['magnetometer', 'sensors'], ['accessibility-events', 'accessibilityEvents'], ['clipboard-read', 'clipboardReadWrite'], ['clipboard-write', 'clipboardSanitizedWrite'], ['payment-handler', 'paymentHandler'],
|
|
375
|
+
// chrome-specific permissions we have.
|
|
376
|
+
['midi-sysex', 'midiSysex']]);
|
|
377
|
+
const filtered = permissions.map(permission => {
|
|
378
|
+
const protocolPermission = webPermissionToProtocol.get(permission);
|
|
379
|
+
if (!protocolPermission) throw new Error('Unknown permission: ' + permission);
|
|
380
|
+
return protocolPermission;
|
|
381
|
+
});
|
|
382
|
+
await this._browser._session.send('Browser.grantPermissions', {
|
|
383
|
+
origin: origin === '*' ? undefined : origin,
|
|
384
|
+
browserContextId: this._browserContextId,
|
|
385
|
+
permissions: filtered
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
async doClearPermissions() {
|
|
389
|
+
await this._browser._session.send('Browser.resetPermissions', {
|
|
390
|
+
browserContextId: this._browserContextId
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
async setGeolocation(geolocation) {
|
|
394
|
+
(0, _browserContext.verifyGeolocation)(geolocation);
|
|
395
|
+
this._options.geolocation = geolocation;
|
|
396
|
+
for (const page of this.pages()) await page._delegate.updateGeolocation();
|
|
397
|
+
}
|
|
398
|
+
async setExtraHTTPHeaders(headers) {
|
|
399
|
+
this._options.extraHTTPHeaders = headers;
|
|
400
|
+
for (const page of this.pages()) await page._delegate.updateExtraHTTPHeaders();
|
|
401
|
+
for (const sw of this.serviceWorkers()) await sw.updateExtraHTTPHeaders(false);
|
|
402
|
+
}
|
|
403
|
+
async setUserAgent(userAgent) {
|
|
404
|
+
this._options.userAgent = userAgent;
|
|
405
|
+
for (const page of this.pages()) await page._delegate.updateUserAgent();
|
|
406
|
+
// TODO: service workers don't have Emulation domain?
|
|
407
|
+
}
|
|
408
|
+
async setOffline(offline) {
|
|
409
|
+
this._options.offline = offline;
|
|
410
|
+
for (const page of this.pages()) await page._delegate.updateOffline();
|
|
411
|
+
for (const sw of this.serviceWorkers()) await sw.updateOffline(false);
|
|
412
|
+
}
|
|
413
|
+
async doSetHTTPCredentials(httpCredentials) {
|
|
414
|
+
this._options.httpCredentials = httpCredentials;
|
|
415
|
+
for (const page of this.pages()) await page._delegate.updateHttpCredentials();
|
|
416
|
+
for (const sw of this.serviceWorkers()) await sw.updateHttpCredentials(false);
|
|
417
|
+
}
|
|
418
|
+
async doAddInitScript(source) {
|
|
419
|
+
for (const page of this.pages()) await page._delegate.addInitScript(source);
|
|
420
|
+
}
|
|
421
|
+
async doRemoveInitScripts() {
|
|
422
|
+
for (const page of this.pages()) await page._delegate.removeInitScripts();
|
|
423
|
+
}
|
|
424
|
+
async doExposeBinding(binding) {
|
|
425
|
+
for (const page of this.pages()) await page._delegate.exposeBinding(binding);
|
|
426
|
+
}
|
|
427
|
+
async doRemoveExposedBindings() {
|
|
428
|
+
for (const page of this.pages()) await page._delegate.removeExposedBindings();
|
|
429
|
+
}
|
|
430
|
+
async doUpdateRequestInterception() {
|
|
431
|
+
for (const page of this.pages()) await page._delegate.updateRequestInterception();
|
|
432
|
+
for (const sw of this.serviceWorkers()) await sw.updateRequestInterception();
|
|
433
|
+
}
|
|
434
|
+
async doClose(reason) {
|
|
435
|
+
// Headful chrome cannot dispose browser context with opened 'beforeunload'
|
|
436
|
+
// dialogs, so we should close all that are currently opened.
|
|
437
|
+
// We also won't get new ones since `Target.disposeBrowserContext` does not trigger
|
|
438
|
+
// beforeunload.
|
|
439
|
+
const openedBeforeUnloadDialogs = [];
|
|
440
|
+
for (const crPage of this._crPages()) {
|
|
441
|
+
const dialogs = [...crPage._page._frameManager._openedDialogs].filter(dialog => dialog.type() === 'beforeunload');
|
|
442
|
+
openedBeforeUnloadDialogs.push(...dialogs);
|
|
443
|
+
}
|
|
444
|
+
await Promise.all(openedBeforeUnloadDialogs.map(dialog => dialog.dismiss()));
|
|
445
|
+
if (!this._browserContextId) {
|
|
446
|
+
await this.stopVideoRecording();
|
|
447
|
+
// Closing persistent context should close the browser.
|
|
448
|
+
await this._browser.close({
|
|
449
|
+
reason
|
|
450
|
+
});
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
await this._browser._session.send('Target.disposeBrowserContext', {
|
|
454
|
+
browserContextId: this._browserContextId
|
|
455
|
+
});
|
|
456
|
+
this._browser._contexts.delete(this._browserContextId);
|
|
457
|
+
for (const [targetId, serviceWorker] of this._browser._serviceWorkers) {
|
|
458
|
+
if (serviceWorker._browserContext !== this) continue;
|
|
459
|
+
// When closing a browser context, service workers are shutdown
|
|
460
|
+
// asynchronously and we get detached from them later.
|
|
461
|
+
// To avoid the wrong order of notifications, we manually fire
|
|
462
|
+
// "close" event here and forget about the service worker.
|
|
463
|
+
serviceWorker.didClose();
|
|
464
|
+
this._browser._serviceWorkers.delete(targetId);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
async stopVideoRecording() {
|
|
468
|
+
await Promise.all(this._crPages().map(crPage => crPage._mainFrameSession._stopVideoRecording()));
|
|
469
|
+
}
|
|
470
|
+
onClosePersistent() {
|
|
471
|
+
// When persistent context is closed, we do not necessary get Target.detachedFromTarget
|
|
472
|
+
// for all the background pages.
|
|
473
|
+
for (const [targetId, backgroundPage] of this._browser._backgroundPages.entries()) {
|
|
474
|
+
if (backgroundPage._browserContext === this && backgroundPage._initializedPage) {
|
|
475
|
+
backgroundPage.didClose();
|
|
476
|
+
this._browser._backgroundPages.delete(targetId);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
async clearCache() {
|
|
481
|
+
for (const page of this._crPages()) await page._mainFrameSession._networkManager.clearCache();
|
|
482
|
+
}
|
|
483
|
+
async cancelDownload(guid) {
|
|
484
|
+
// The upstream CDP method is implemented in a way that no explicit error would be given
|
|
485
|
+
// regarding the requested `guid`, even if the download is in a state not suitable for
|
|
486
|
+
// cancellation (finished, cancelled, etc.) or the guid is invalid at all.
|
|
487
|
+
await this._browser._session.send('Browser.cancelDownload', {
|
|
488
|
+
guid: guid,
|
|
489
|
+
browserContextId: this._browserContextId
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
backgroundPages() {
|
|
493
|
+
const result = [];
|
|
494
|
+
for (const backgroundPage of this._browser._backgroundPages.values()) {
|
|
495
|
+
if (backgroundPage._browserContext === this && backgroundPage._initializedPage) result.push(backgroundPage._initializedPage);
|
|
496
|
+
}
|
|
497
|
+
return result;
|
|
498
|
+
}
|
|
499
|
+
serviceWorkers() {
|
|
500
|
+
return Array.from(this._browser._serviceWorkers.values()).filter(serviceWorker => serviceWorker._browserContext === this);
|
|
501
|
+
}
|
|
502
|
+
async newCDPSession(page) {
|
|
503
|
+
let targetId = null;
|
|
504
|
+
if (page instanceof _page.Page) {
|
|
505
|
+
targetId = page._delegate._targetId;
|
|
506
|
+
} else if (page instanceof _frames.Frame) {
|
|
507
|
+
const session = page._page._delegate._sessions.get(page._id);
|
|
508
|
+
if (!session) throw new Error(`This frame does not have a separate CDP session, it is a part of the parent frame's session`);
|
|
509
|
+
targetId = session._targetId;
|
|
510
|
+
} else {
|
|
511
|
+
throw new Error('page: expected Page or Frame');
|
|
512
|
+
}
|
|
513
|
+
const rootSession = await this._browser._clientRootSession();
|
|
514
|
+
return rootSession.attachToTarget(targetId);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
exports.CRBrowserContext = CRBrowserContext;
|
|
518
|
+
CRBrowserContext.CREvents = {
|
|
519
|
+
BackgroundPage: 'backgroundpage',
|
|
520
|
+
ServiceWorker: 'serviceworker'
|
|
521
|
+
};
|