patchright-core 1.51.3 → 1.52.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/browsers.json +15 -13
- package/lib/androidServerImpl.js +42 -48
- package/lib/browserServerImpl.js +54 -67
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +312 -328
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +141 -228
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +57 -61
- package/lib/client/browserContext.js +297 -326
- package/lib/client/browserType.js +92 -106
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +82 -95
- package/lib/client/clientHelper.js +46 -38
- package/lib/client/clientInstrumentation.js +40 -37
- package/lib/client/clientStackTrace.js +41 -37
- package/lib/client/clock.js +36 -36
- package/lib/client/connection.js +190 -212
- package/lib/client/consoleMessage.js +31 -28
- package/lib/client/coverage.js +25 -22
- package/lib/client/dialog.js +30 -31
- package/lib/client/download.js +25 -25
- package/lib/client/electron.js +73 -75
- package/lib/client/elementHandle.js +111 -147
- package/lib/client/errors.js +53 -53
- package/lib/client/eventEmitter.js +124 -121
- package/lib/client/events.js +72 -68
- package/lib/client/fetch.js +135 -158
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +187 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +40 -69
- package/lib/client/jsHandle.js +54 -69
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -28
- package/lib/client/locator.js +161 -245
- package/lib/client/network.js +277 -295
- package/lib/client/page.js +270 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -66
- package/lib/client/selectors.js +48 -46
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +49 -39
- package/lib/client/tracing.js +48 -84
- package/lib/client/types.js +26 -22
- package/lib/client/video.js +35 -27
- package/lib/client/waiter.js +69 -88
- package/lib/client/webError.js +25 -23
- package/lib/client/webSocket.js +61 -56
- package/lib/client/worker.js +48 -58
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/clockSource.js +26 -5
- package/lib/generated/consoleApiSource.js +26 -5
- package/lib/generated/injectedScriptSource.js +26 -5
- package/lib/generated/pollingRecorderSource.js +26 -5
- package/lib/generated/utilityScriptSource.js +26 -5
- package/lib/generated/webSocketMockSource.js +375 -4
- package/lib/inProcessFactory.js +53 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +53 -46
- package/lib/protocol/debug.js +209 -25
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2714 -2714
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +140 -157
- package/lib/remote/playwrightServer.js +99 -84
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +216 -209
- package/lib/server/android/backendAdb.js +89 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +221 -155
- package/lib/server/bidi/bidiChromium.js +106 -79
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +128 -113
- package/lib/server/bidi/bidiFirefox.js +76 -69
- package/lib/server/bidi/bidiInput.js +86 -97
- package/lib/server/bidi/bidiNetworkManager.js +137 -154
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +247 -219
- package/lib/server/bidi/bidiPdf.js +52 -86
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
- package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
- package/lib/server/bidi/third_party/bidiProtocol.js +144 -131
- package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
- package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
- package/lib/server/browser.js +76 -84
- package/lib/server/browserContext.js +321 -346
- package/lib/server/browserType.js +169 -182
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +212 -190
- package/lib/server/chromium/chromiumSwitches.js +86 -64
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +253 -273
- package/lib/server/chromium/crConnection.js +91 -116
- package/lib/server/chromium/crCoverage.js +113 -127
- package/lib/server/chromium/crDevTools.js +59 -51
- package/lib/server/chromium/crDragDrop.js +62 -79
- package/lib/server/chromium/crExecutionContext.js +88 -83
- package/lib/server/chromium/crInput.js +97 -95
- package/lib/server/chromium/crNetworkManager.js +284 -404
- package/lib/server/chromium/crPage.js +522 -608
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +82 -67
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +65 -99
- package/lib/server/clock.js +62 -50
- package/lib/server/codegen/csharp.js +185 -160
- package/lib/server/codegen/java.js +155 -128
- package/lib/server/codegen/javascript.js +163 -148
- package/lib/server/codegen/jsonl.js +32 -28
- package/lib/server/codegen/language.js +75 -52
- package/lib/server/codegen/languages.js +65 -27
- package/lib/server/codegen/python.js +140 -125
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +105 -86
- package/lib/server/debugController.js +97 -124
- package/lib/server/debugger.js +82 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dialog.js +36 -35
- package/lib/server/dispatchers/androidDispatcher.js +196 -107
- package/lib/server/dispatchers/artifactDispatcher.js +62 -62
- package/lib/server/dispatchers/browserContextDispatcher.js +176 -205
- package/lib/server/dispatchers/browserDispatcher.js +78 -97
- package/lib/server/dispatchers/browserTypeDispatcher.js +35 -35
- package/lib/server/dispatchers/cdpSessionDispatcher.js +32 -36
- package/lib/server/dispatchers/debugControllerDispatcher.js +48 -66
- package/lib/server/dispatchers/dialogDispatcher.js +30 -27
- package/lib/server/dispatchers/dispatcher.js +169 -220
- package/lib/server/dispatchers/electronDispatcher.js +54 -57
- package/lib/server/dispatchers/elementHandlerDispatcher.js +77 -119
- package/lib/server/dispatchers/frameDispatcher.js +99 -163
- package/lib/server/dispatchers/jsHandleDispatcher.js +49 -66
- package/lib/server/dispatchers/jsonPipeDispatcher.js +35 -36
- package/lib/server/dispatchers/localUtilsDispatcher.js +95 -80
- package/lib/server/dispatchers/networkDispatchers.js +90 -107
- package/lib/server/dispatchers/pageDispatcher.js +128 -169
- package/lib/server/dispatchers/playwrightDispatcher.js +69 -76
- package/lib/server/dispatchers/selectorsDispatcher.js +28 -24
- package/lib/server/dispatchers/streamDispatcher.js +42 -45
- package/lib/server/dispatchers/tracingDispatcher.js +36 -41
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +96 -131
- package/lib/server/dispatchers/writableStreamDispatcher.js +54 -38
- package/lib/server/dom.js +413 -443
- package/lib/server/download.js +45 -35
- package/lib/server/electron/electron.js +156 -176
- package/lib/server/electron/loader.js +8 -36
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +289 -323
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +65 -59
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +213 -277
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +91 -73
- package/lib/server/firefox/ffInput.js +67 -69
- package/lib/server/firefox/ffNetworkManager.js +131 -110
- package/lib/server/firefox/ffPage.js +236 -273
- package/lib/server/firefox/firefox.js +76 -67
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +77 -111
- package/lib/server/frames.js +730 -894
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +287 -222
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +56 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +134 -163
- package/lib/server/instrumentation.js +49 -44
- package/lib/server/javascript.js +143 -134
- package/lib/server/launchApp.js +92 -73
- package/lib/server/localUtils.js +130 -122
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +262 -296
- package/lib/server/page.js +329 -426
- package/lib/server/pageBinding.js +88 -0
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +60 -67
- package/lib/server/progress.js +56 -51
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/contextRecorder.js +134 -138
- package/lib/server/recorder/recorderApp.js +127 -136
- package/lib/server/recorder/recorderCollection.js +56 -44
- package/lib/server/recorder/recorderFrontend.js +15 -4
- package/lib/server/recorder/recorderRunner.js +79 -103
- package/lib/server/recorder/recorderUtils.js +56 -45
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +177 -186
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +904 -792
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +166 -182
- package/lib/server/selectors.js +85 -46
- package/lib/server/socksClientCertificatesInterceptor.js +166 -185
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/storageScript.js +94 -100
- package/lib/server/timeoutSettings.js +58 -43
- package/lib/server/trace/recorder/snapshotter.js +70 -89
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +321 -333
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +168 -146
- package/lib/server/transport.js +124 -133
- package/lib/server/types.js +26 -22
- package/lib/server/usKeyboardLayout.js +135 -545
- package/lib/server/utils/ascii.js +39 -26
- package/lib/server/utils/comparators.js +105 -103
- package/lib/server/utils/crypto.js +157 -112
- package/lib/server/utils/debug.js +37 -28
- package/lib/server/utils/debugLogger.js +69 -48
- package/lib/server/utils/env.js +52 -37
- package/lib/server/utils/eventsHelper.js +29 -28
- package/lib/server/utils/expectUtils.js +31 -26
- package/lib/server/utils/fileUtils.js +123 -136
- package/lib/server/utils/happyEyeballs.js +138 -123
- package/lib/server/utils/hostPlatform.js +84 -120
- package/lib/server/utils/httpServer.js +106 -121
- package/lib/server/utils/image_tools/colorUtils.js +42 -51
- package/lib/server/utils/image_tools/compare.js +44 -43
- package/lib/server/utils/image_tools/imageChannel.js +38 -30
- package/lib/server/utils/image_tools/stats.js +40 -40
- package/lib/server/utils/linuxUtils.js +50 -37
- package/lib/server/utils/network.js +143 -86
- package/lib/server/utils/nodePlatform.js +87 -79
- package/lib/server/utils/pipeTransport.js +44 -42
- package/lib/server/utils/processLauncher.js +111 -121
- package/lib/server/utils/profiler.js +52 -39
- package/lib/server/utils/socksProxy.js +280 -339
- package/lib/server/utils/spawnAsync.js +37 -41
- package/lib/server/utils/task.js +31 -38
- package/lib/server/utils/userAgent.js +73 -66
- package/lib/server/utils/wsServer.js +73 -69
- package/lib/server/utils/zipFile.js +36 -37
- package/lib/server/utils/zones.js +37 -34
- package/lib/server/webkit/protocol.d.js +16 -0
- package/lib/server/webkit/webkit.js +76 -63
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +159 -176
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +84 -70
- package/lib/server/webkit/wkInput.js +82 -80
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +525 -619
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +77 -77
- package/lib/utils/isomorphic/ariaSnapshot.js +144 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/builtins.js +90 -0
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +121 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +340 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +47 -39
- package/lib/utils/isomorphic/mimeType.js +448 -25
- package/lib/utils/isomorphic/multimap.js +35 -27
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +183 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +113 -106
- package/lib/utils/isomorphic/time.js +41 -22
- package/lib/utils/isomorphic/timeoutRunner.js +55 -54
- package/lib/utils/isomorphic/traceUtils.js +38 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +112 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
- package/lib/utils.js +97 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/vite/htmlReport/index.html +21 -15
- package/lib/vite/recorder/assets/{codeMirrorModule-B9YMkrwa.js → codeMirrorModule-DVQi6prl.js} +1 -1
- package/lib/vite/recorder/assets/index-97EUAAbk.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-1DiydmYA.js → codeMirrorModule-dvXVzLxY.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-BjymbO6M.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.ChIUCJnj.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/vite/traceViewer/uiMode.jUCiCtdp.js +5 -0
- package/lib/zipBundle.js +32 -23
- package/package.json +1 -1
- package/types/protocol.d.ts +436 -17
- package/types/types.d.ts +35 -16
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-l0TyP_G8.js +0 -259
- package/lib/vite/traceViewer/index.BqUZLSro.js +0 -2
- package/lib/vite/traceViewer/uiMode.C1d2m5sF.js +0 -5
|
@@ -1,115 +1,109 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty
|
|
4
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var crBrowser_exports = {};
|
|
30
|
+
__export(crBrowser_exports, {
|
|
31
|
+
CRBrowser: () => CRBrowser,
|
|
32
|
+
CRBrowserContext: () => CRBrowserContext
|
|
5
33
|
});
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var network =
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class CRBrowser extends _browser.Browser {
|
|
34
|
+
module.exports = __toCommonJS(crBrowser_exports);
|
|
35
|
+
var import_path = __toESM(require("path"));
|
|
36
|
+
var import_assert = require("../../utils/isomorphic/assert");
|
|
37
|
+
var import_crypto = require("../utils/crypto");
|
|
38
|
+
var import_artifact = require("../artifact");
|
|
39
|
+
var import_browser = require("../browser");
|
|
40
|
+
var import_browserContext = require("../browserContext");
|
|
41
|
+
var import_frames = require("../frames");
|
|
42
|
+
var network = __toESM(require("../network"));
|
|
43
|
+
var import_page = require("../page");
|
|
44
|
+
var import_crConnection = require("./crConnection");
|
|
45
|
+
var import_crPage = require("./crPage");
|
|
46
|
+
var import_crProtocolHelper = require("./crProtocolHelper");
|
|
47
|
+
var import_crServiceWorker = require("./crServiceWorker");
|
|
48
|
+
class CRBrowser extends import_browser.Browser {
|
|
49
|
+
constructor(parent, connection, options) {
|
|
50
|
+
super(parent, options);
|
|
51
|
+
this._clientRootSessionPromise = null;
|
|
52
|
+
this._contexts = /* @__PURE__ */ new Map();
|
|
53
|
+
this._crPages = /* @__PURE__ */ new Map();
|
|
54
|
+
this._backgroundPages = /* @__PURE__ */ new Map();
|
|
55
|
+
this._serviceWorkers = /* @__PURE__ */ new Map();
|
|
56
|
+
this._version = "";
|
|
57
|
+
this._tracingRecording = false;
|
|
58
|
+
this._userAgent = "";
|
|
59
|
+
this._connection = connection;
|
|
60
|
+
this._session = this._connection.rootSession;
|
|
61
|
+
this._connection.on(import_crConnection.ConnectionEvents.Disconnected, () => this._didDisconnect());
|
|
62
|
+
this._session.on("Target.attachedToTarget", this._onAttachedToTarget.bind(this));
|
|
63
|
+
this._session.on("Target.detachedFromTarget", this._onDetachedFromTarget.bind(this));
|
|
64
|
+
this._session.on("Browser.downloadWillBegin", this._onDownloadWillBegin.bind(this));
|
|
65
|
+
this._session.on("Browser.downloadProgress", this._onDownloadProgress.bind(this));
|
|
66
|
+
}
|
|
41
67
|
static async connect(parent, transport, options, devtools) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
...options
|
|
45
|
-
};
|
|
46
|
-
const connection = new _crConnection.CRConnection(transport, options.protocolLogger, options.browserLogsCollector);
|
|
68
|
+
options = { ...options };
|
|
69
|
+
const connection = new import_crConnection.CRConnection(transport, options.protocolLogger, options.browserLogsCollector);
|
|
47
70
|
const browser = new CRBrowser(parent, connection, options);
|
|
48
71
|
browser._devtools = devtools;
|
|
49
|
-
if (browser.isClank())
|
|
72
|
+
if (browser.isClank())
|
|
73
|
+
browser._isCollocatedWithServer = false;
|
|
50
74
|
const session = connection.rootSession;
|
|
51
|
-
if (options.__testHookOnConnectToBrowser)
|
|
52
|
-
|
|
53
|
-
|
|
75
|
+
if (options.__testHookOnConnectToBrowser)
|
|
76
|
+
await options.__testHookOnConnectToBrowser();
|
|
77
|
+
const version = await session.send("Browser.getVersion");
|
|
78
|
+
browser._version = version.product.substring(version.product.indexOf("/") + 1);
|
|
54
79
|
browser._userAgent = version.userAgent;
|
|
55
|
-
|
|
56
|
-
// may have been launched with different options.
|
|
57
|
-
browser.options.headful = !version.userAgent.includes('Headless');
|
|
80
|
+
browser.options.headful = !version.userAgent.includes("Headless");
|
|
58
81
|
if (!options.persistent) {
|
|
59
|
-
await session.send(
|
|
60
|
-
autoAttach: true,
|
|
61
|
-
waitForDebuggerOnStart: true,
|
|
62
|
-
flatten: true
|
|
63
|
-
});
|
|
82
|
+
await session.send("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true });
|
|
64
83
|
return browser;
|
|
65
84
|
}
|
|
66
|
-
browser._defaultContext = new CRBrowserContext(browser,
|
|
67
|
-
await Promise.all([
|
|
68
|
-
autoAttach: true,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// However making a dummy call afterwards fixes this.
|
|
74
|
-
// This can be removed after https://chromium-review.googlesource.com/c/chromium/src/+/2885888 lands in stable.
|
|
75
|
-
await session.send('Target.getTargetInfo');
|
|
76
|
-
}), browser._defaultContext._initialize()]);
|
|
85
|
+
browser._defaultContext = new CRBrowserContext(browser, void 0, options.persistent);
|
|
86
|
+
await Promise.all([
|
|
87
|
+
session.send("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }).then(async () => {
|
|
88
|
+
await session.send("Target.getTargetInfo");
|
|
89
|
+
}),
|
|
90
|
+
browser._defaultContext._initialize()
|
|
91
|
+
]);
|
|
77
92
|
await browser._waitForAllPagesToBeInitialized();
|
|
78
93
|
return browser;
|
|
79
94
|
}
|
|
80
|
-
constructor(parent, connection, options) {
|
|
81
|
-
super(parent, options);
|
|
82
|
-
this._connection = void 0;
|
|
83
|
-
this._session = void 0;
|
|
84
|
-
this._clientRootSessionPromise = null;
|
|
85
|
-
this._contexts = new Map();
|
|
86
|
-
this._crPages = new Map();
|
|
87
|
-
this._backgroundPages = new Map();
|
|
88
|
-
this._serviceWorkers = new Map();
|
|
89
|
-
this._devtools = void 0;
|
|
90
|
-
this._version = '';
|
|
91
|
-
this._tracingRecording = false;
|
|
92
|
-
this._tracingClient = void 0;
|
|
93
|
-
this._userAgent = '';
|
|
94
|
-
this._connection = connection;
|
|
95
|
-
this._session = this._connection.rootSession;
|
|
96
|
-
this._connection.on(_crConnection.ConnectionEvents.Disconnected, () => this._didDisconnect());
|
|
97
|
-
this._session.on('Target.attachedToTarget', this._onAttachedToTarget.bind(this));
|
|
98
|
-
this._session.on('Target.detachedFromTarget', this._onDetachedFromTarget.bind(this));
|
|
99
|
-
this._session.on('Browser.downloadWillBegin', this._onDownloadWillBegin.bind(this));
|
|
100
|
-
this._session.on('Browser.downloadProgress', this._onDownloadProgress.bind(this));
|
|
101
|
-
}
|
|
102
95
|
async doCreateNewContext(options) {
|
|
103
96
|
const proxy = options.proxyOverride || options.proxy;
|
|
104
|
-
let proxyBypassList =
|
|
97
|
+
let proxyBypassList = void 0;
|
|
105
98
|
if (proxy) {
|
|
106
|
-
if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK)
|
|
99
|
+
if (process.env.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK)
|
|
100
|
+
proxyBypassList = proxy.bypass;
|
|
101
|
+
else
|
|
102
|
+
proxyBypassList = "<-loopback>" + (proxy.bypass ? `,${proxy.bypass}` : "");
|
|
107
103
|
}
|
|
108
|
-
const {
|
|
109
|
-
browserContextId
|
|
110
|
-
} = await this._session.send('Target.createBrowserContext', {
|
|
104
|
+
const { browserContextId } = await this._session.send("Target.createBrowserContext", {
|
|
111
105
|
disposeOnDetach: true,
|
|
112
|
-
proxyServer: proxy ? proxy.server :
|
|
106
|
+
proxyServer: proxy ? proxy.server : void 0,
|
|
113
107
|
proxyBypassList
|
|
114
108
|
});
|
|
115
109
|
const context = new CRBrowserContext(this, browserContextId, options);
|
|
@@ -127,72 +121,59 @@ class CRBrowser extends _browser.Browser {
|
|
|
127
121
|
return this._userAgent;
|
|
128
122
|
}
|
|
129
123
|
_platform() {
|
|
130
|
-
if (this._userAgent.includes(
|
|
131
|
-
|
|
132
|
-
|
|
124
|
+
if (this._userAgent.includes("Windows"))
|
|
125
|
+
return "win";
|
|
126
|
+
if (this._userAgent.includes("Macintosh"))
|
|
127
|
+
return "mac";
|
|
128
|
+
return "linux";
|
|
133
129
|
}
|
|
134
130
|
isClank() {
|
|
135
|
-
return this.options.name ===
|
|
131
|
+
return this.options.name === "clank";
|
|
136
132
|
}
|
|
137
133
|
async _waitForAllPagesToBeInitialized() {
|
|
138
|
-
await Promise.all([...this._crPages.values()].map(crPage => crPage._page.waitForInitializedOrError()));
|
|
139
|
-
}
|
|
140
|
-
_onAttachedToTarget({
|
|
141
|
-
targetInfo
|
|
142
|
-
|
|
143
|
-
waitingForDebugger
|
|
144
|
-
}) {
|
|
145
|
-
if (targetInfo.type === 'browser') return;
|
|
134
|
+
await Promise.all([...this._crPages.values()].map((crPage) => crPage._page.waitForInitializedOrError()));
|
|
135
|
+
}
|
|
136
|
+
_onAttachedToTarget({ targetInfo, sessionId, waitingForDebugger }) {
|
|
137
|
+
if (targetInfo.type === "browser")
|
|
138
|
+
return;
|
|
146
139
|
const session = this._session.createChildSession(sessionId);
|
|
147
|
-
(0,
|
|
140
|
+
(0, import_assert.assert)(targetInfo.browserContextId, "targetInfo: " + JSON.stringify(targetInfo, null, 2));
|
|
148
141
|
let context = this._contexts.get(targetInfo.browserContextId) || null;
|
|
149
142
|
if (!context) {
|
|
150
|
-
// TODO: auto attach only to pages from our contexts.
|
|
151
|
-
// assert(this._defaultContext);
|
|
152
143
|
context = this._defaultContext;
|
|
153
144
|
}
|
|
154
|
-
if (targetInfo.type ===
|
|
145
|
+
if (targetInfo.type === "other" && targetInfo.url.startsWith("devtools://devtools") && this._devtools) {
|
|
155
146
|
this._devtools.install(session);
|
|
156
147
|
return;
|
|
157
148
|
}
|
|
158
|
-
const treatOtherAsPage = targetInfo.type ===
|
|
159
|
-
if (!context || targetInfo.type ===
|
|
160
|
-
session.detach().catch(() => {
|
|
149
|
+
const treatOtherAsPage = targetInfo.type === "other" && process.env.PW_CHROMIUM_ATTACH_TO_OTHER;
|
|
150
|
+
if (!context || targetInfo.type === "other" && !treatOtherAsPage) {
|
|
151
|
+
session.detach().catch(() => {
|
|
152
|
+
});
|
|
161
153
|
return;
|
|
162
154
|
}
|
|
163
|
-
(0,
|
|
164
|
-
(0,
|
|
165
|
-
(0,
|
|
166
|
-
if (targetInfo.type ===
|
|
167
|
-
const backgroundPage = new
|
|
168
|
-
hasUIWindow: false,
|
|
169
|
-
isBackgroundPage: true
|
|
170
|
-
});
|
|
155
|
+
(0, import_assert.assert)(!this._crPages.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId);
|
|
156
|
+
(0, import_assert.assert)(!this._backgroundPages.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId);
|
|
157
|
+
(0, import_assert.assert)(!this._serviceWorkers.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId);
|
|
158
|
+
if (targetInfo.type === "background_page") {
|
|
159
|
+
const backgroundPage = new import_crPage.CRPage(session, targetInfo.targetId, context, null, { hasUIWindow: false, isBackgroundPage: true });
|
|
171
160
|
this._backgroundPages.set(targetInfo.targetId, backgroundPage);
|
|
172
161
|
return;
|
|
173
162
|
}
|
|
174
|
-
if (targetInfo.type ===
|
|
163
|
+
if (targetInfo.type === "page" || treatOtherAsPage) {
|
|
175
164
|
const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null;
|
|
176
|
-
const crPage = new
|
|
177
|
-
hasUIWindow: targetInfo.type === 'page',
|
|
178
|
-
isBackgroundPage: false
|
|
179
|
-
});
|
|
165
|
+
const crPage = new import_crPage.CRPage(session, targetInfo.targetId, context, opener, { hasUIWindow: targetInfo.type === "page", isBackgroundPage: false });
|
|
180
166
|
this._crPages.set(targetInfo.targetId, crPage);
|
|
181
167
|
return;
|
|
182
168
|
}
|
|
183
|
-
if (targetInfo.type ===
|
|
184
|
-
const serviceWorker = new
|
|
169
|
+
if (targetInfo.type === "service_worker") {
|
|
170
|
+
const serviceWorker = new import_crServiceWorker.CRServiceWorker(context, session, targetInfo.url);
|
|
185
171
|
this._serviceWorkers.set(targetInfo.targetId, serviceWorker);
|
|
186
172
|
context.emit(CRBrowserContext.CREvents.ServiceWorker, serviceWorker);
|
|
187
173
|
return;
|
|
188
174
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
//
|
|
192
|
-
// One example of a side effect: upon shared worker restart, we receive
|
|
193
|
-
// Inspector.targetReloadedAfterCrash and backend waits for Runtime.runIfWaitingForDebugger
|
|
194
|
-
// from any attached client. If we do not resume, shared worker will stall.
|
|
195
|
-
session.detach().catch(() => {});
|
|
175
|
+
session.detach().catch(() => {
|
|
176
|
+
});
|
|
196
177
|
}
|
|
197
178
|
_onDetachedFromTarget(payload) {
|
|
198
179
|
const targetId = payload.targetId;
|
|
@@ -216,70 +197,89 @@ class CRBrowser extends _browser.Browser {
|
|
|
216
197
|
}
|
|
217
198
|
}
|
|
218
199
|
_didDisconnect() {
|
|
219
|
-
for (const crPage of this._crPages.values())
|
|
200
|
+
for (const crPage of this._crPages.values())
|
|
201
|
+
crPage.didClose();
|
|
220
202
|
this._crPages.clear();
|
|
221
|
-
for (const backgroundPage of this._backgroundPages.values())
|
|
203
|
+
for (const backgroundPage of this._backgroundPages.values())
|
|
204
|
+
backgroundPage.didClose();
|
|
222
205
|
this._backgroundPages.clear();
|
|
223
|
-
for (const serviceWorker of this._serviceWorkers.values())
|
|
206
|
+
for (const serviceWorker of this._serviceWorkers.values())
|
|
207
|
+
serviceWorker.didClose();
|
|
224
208
|
this._serviceWorkers.clear();
|
|
225
209
|
this._didClose();
|
|
226
210
|
}
|
|
227
211
|
_findOwningPage(frameId) {
|
|
228
212
|
for (const crPage of this._crPages.values()) {
|
|
229
213
|
const frame = crPage._page._frameManager.frame(frameId);
|
|
230
|
-
if (frame)
|
|
214
|
+
if (frame)
|
|
215
|
+
return crPage;
|
|
231
216
|
}
|
|
232
217
|
return null;
|
|
233
218
|
}
|
|
234
219
|
_onDownloadWillBegin(payload) {
|
|
235
220
|
const page = this._findOwningPage(payload.frameId);
|
|
236
221
|
if (!page) {
|
|
237
|
-
// There might be no page when download originates from something unusual, like
|
|
238
|
-
// a DevTools window or maybe an extension page.
|
|
239
|
-
// See https://github.com/microsoft/playwright/issues/22551.
|
|
240
222
|
return;
|
|
241
223
|
}
|
|
242
224
|
page.willBeginDownload();
|
|
243
225
|
let originPage = page._page.initializedOrUndefined();
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (!originPage)
|
|
226
|
+
if (!originPage && page._opener)
|
|
227
|
+
originPage = page._opener._page.initializedOrUndefined();
|
|
228
|
+
if (!originPage)
|
|
229
|
+
return;
|
|
247
230
|
this._downloadCreated(originPage, payload.guid, payload.url, payload.suggestedFilename);
|
|
248
231
|
}
|
|
249
232
|
_onDownloadProgress(payload) {
|
|
250
|
-
if (payload.state ===
|
|
251
|
-
|
|
233
|
+
if (payload.state === "completed")
|
|
234
|
+
this._downloadFinished(payload.guid, "");
|
|
235
|
+
if (payload.state === "canceled")
|
|
236
|
+
this._downloadFinished(payload.guid, this._closeReason || "canceled");
|
|
252
237
|
}
|
|
253
238
|
async _closePage(crPage) {
|
|
254
|
-
await this._session.send(
|
|
255
|
-
targetId: crPage._targetId
|
|
256
|
-
});
|
|
239
|
+
await this._session.send("Target.closeTarget", { targetId: crPage._targetId });
|
|
257
240
|
}
|
|
258
241
|
async newBrowserCDPSession() {
|
|
259
242
|
return await this._connection.createBrowserSession();
|
|
260
243
|
}
|
|
261
244
|
async startTracing(page, options = {}) {
|
|
262
|
-
(0,
|
|
245
|
+
(0, import_assert.assert)(!this._tracingRecording, "Cannot start recording trace while already recording trace.");
|
|
263
246
|
this._tracingClient = page ? page._delegate._mainFrameSession._client : this._session;
|
|
264
|
-
const defaultCategories = [
|
|
247
|
+
const defaultCategories = [
|
|
248
|
+
"-*",
|
|
249
|
+
"devtools.timeline",
|
|
250
|
+
"v8.execute",
|
|
251
|
+
"disabled-by-default-devtools.timeline",
|
|
252
|
+
"disabled-by-default-devtools.timeline.frame",
|
|
253
|
+
"toplevel",
|
|
254
|
+
"blink.console",
|
|
255
|
+
"blink.user_timing",
|
|
256
|
+
"latencyInfo",
|
|
257
|
+
"disabled-by-default-devtools.timeline.stack",
|
|
258
|
+
"disabled-by-default-v8.cpu_profiler",
|
|
259
|
+
"disabled-by-default-v8.cpu_profiler.hires"
|
|
260
|
+
];
|
|
265
261
|
const {
|
|
266
262
|
screenshots = false,
|
|
267
263
|
categories = defaultCategories
|
|
268
264
|
} = options;
|
|
269
|
-
if (screenshots)
|
|
265
|
+
if (screenshots)
|
|
266
|
+
categories.push("disabled-by-default-devtools.screenshot");
|
|
270
267
|
this._tracingRecording = true;
|
|
271
|
-
await this._tracingClient.send(
|
|
272
|
-
transferMode:
|
|
273
|
-
categories: categories.join(
|
|
268
|
+
await this._tracingClient.send("Tracing.start", {
|
|
269
|
+
transferMode: "ReturnAsStream",
|
|
270
|
+
categories: categories.join(",")
|
|
274
271
|
});
|
|
275
272
|
}
|
|
276
273
|
async stopTracing() {
|
|
277
|
-
(0,
|
|
278
|
-
const [event] = await Promise.all([
|
|
279
|
-
|
|
280
|
-
|
|
274
|
+
(0, import_assert.assert)(this._tracingClient, "Tracing was not started.");
|
|
275
|
+
const [event] = await Promise.all([
|
|
276
|
+
new Promise((f) => this._tracingClient.once("Tracing.tracingComplete", f)),
|
|
277
|
+
this._tracingClient.send("Tracing.end")
|
|
278
|
+
]);
|
|
279
|
+
const tracingPath = import_path.default.join(this.options.artifactsDir, (0, import_crypto.createGuid)() + ".crtrace");
|
|
280
|
+
await (0, import_crProtocolHelper.saveProtocolStream)(this._tracingClient, event.stream, tracingPath);
|
|
281
281
|
this._tracingRecording = false;
|
|
282
|
-
const artifact = new
|
|
282
|
+
const artifact = new import_artifact.Artifact(this, tracingPath);
|
|
283
283
|
artifact.reportFinished();
|
|
284
284
|
return artifact;
|
|
285
285
|
}
|
|
@@ -287,22 +287,28 @@ class CRBrowser extends _browser.Browser {
|
|
|
287
287
|
return !this._connection._closed;
|
|
288
288
|
}
|
|
289
289
|
async _clientRootSession() {
|
|
290
|
-
if (!this._clientRootSessionPromise)
|
|
290
|
+
if (!this._clientRootSessionPromise)
|
|
291
|
+
this._clientRootSessionPromise = this._connection.createBrowserSession();
|
|
291
292
|
return this._clientRootSessionPromise;
|
|
292
293
|
}
|
|
293
294
|
}
|
|
294
|
-
|
|
295
|
-
|
|
295
|
+
class CRBrowserContext extends import_browserContext.BrowserContext {
|
|
296
|
+
static {
|
|
297
|
+
this.CREvents = {
|
|
298
|
+
BackgroundPage: "backgroundpage",
|
|
299
|
+
ServiceWorker: "serviceworker"
|
|
300
|
+
};
|
|
301
|
+
}
|
|
296
302
|
constructor(browser, browserContextId, options) {
|
|
297
303
|
super(browser, options, browserContextId);
|
|
298
304
|
this._authenticateProxyViaCredentials();
|
|
299
305
|
}
|
|
300
306
|
async _initialize() {
|
|
301
|
-
(0,
|
|
307
|
+
(0, import_assert.assert)(!Array.from(this._browser._crPages.values()).some((page) => page._browserContext === this));
|
|
302
308
|
const promises = [super._initialize()];
|
|
303
|
-
if (this._browser.options.name !==
|
|
304
|
-
promises.push(this._browser._session.send(
|
|
305
|
-
behavior: this._options.acceptDownloads ===
|
|
309
|
+
if (this._browser.options.name !== "clank" && this._options.acceptDownloads !== "internal-browser-default") {
|
|
310
|
+
promises.push(this._browser._session.send("Browser.setDownloadBehavior", {
|
|
311
|
+
behavior: this._options.acceptDownloads === "accept" ? "allowAndName" : "deny",
|
|
306
312
|
browserContextId: this._browserContextId,
|
|
307
313
|
downloadPath: this._browser.options.downloadsPath,
|
|
308
314
|
eventsEnabled: true
|
|
@@ -311,47 +317,20 @@ class CRBrowserContext extends _browserContext.BrowserContext {
|
|
|
311
317
|
await Promise.all(promises);
|
|
312
318
|
}
|
|
313
319
|
_crPages() {
|
|
314
|
-
return [...this._browser._crPages.values()].filter(crPage => crPage._browserContext === this);
|
|
320
|
+
return [...this._browser._crPages.values()].filter((crPage) => crPage._browserContext === this);
|
|
315
321
|
}
|
|
316
322
|
possiblyUninitializedPages() {
|
|
317
|
-
return this._crPages().map(crPage => crPage._page);
|
|
323
|
+
return this._crPages().map((crPage) => crPage._page);
|
|
318
324
|
}
|
|
319
325
|
async doCreateNewPage() {
|
|
320
|
-
(0,
|
|
321
|
-
const
|
|
322
|
-
let {
|
|
323
|
-
targetId
|
|
324
|
-
} = await this._browser._session.send('Target.createTarget', {
|
|
325
|
-
url: 'about:blank',
|
|
326
|
-
browserContextId: this._browserContextId
|
|
327
|
-
});
|
|
328
|
-
if (oldKeys) {
|
|
329
|
-
// Chrome for Android returns tab ids (1, 2, 3, 4, 5) instead of content target ids here, work around it via the
|
|
330
|
-
// heuristic assuming that there is only one page created at a time.
|
|
331
|
-
const newKeys = new Set(this._browser._crPages.keys());
|
|
332
|
-
// Remove old keys.
|
|
333
|
-
for (const key of oldKeys) newKeys.delete(key);
|
|
334
|
-
// Remove potential concurrent popups.
|
|
335
|
-
for (const key of newKeys) {
|
|
336
|
-
const page = this._browser._crPages.get(key);
|
|
337
|
-
if (page._opener) newKeys.delete(key);
|
|
338
|
-
}
|
|
339
|
-
(0, _assert.assert)(newKeys.size === 1);
|
|
340
|
-
[targetId] = [...newKeys];
|
|
341
|
-
}
|
|
326
|
+
(0, import_browserContext.assertBrowserContextIsNotOwned)(this);
|
|
327
|
+
const { targetId } = await this._browser._session.send("Target.createTarget", { url: "about:blank", browserContextId: this._browserContextId });
|
|
342
328
|
return this._browser._crPages.get(targetId)._page;
|
|
343
329
|
}
|
|
344
330
|
async doGetCookies(urls) {
|
|
345
|
-
const {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
browserContextId: this._browserContextId
|
|
349
|
-
});
|
|
350
|
-
return network.filterCookies(cookies.map(c => {
|
|
351
|
-
const copy = {
|
|
352
|
-
sameSite: 'Lax',
|
|
353
|
-
...c
|
|
354
|
-
};
|
|
331
|
+
const { cookies } = await this._browser._session.send("Storage.getCookies", { browserContextId: this._browserContextId });
|
|
332
|
+
return network.filterCookies(cookies.map((c) => {
|
|
333
|
+
const copy = { sameSite: "Lax", ...c };
|
|
355
334
|
delete copy.size;
|
|
356
335
|
delete copy.priority;
|
|
357
336
|
delete copy.session;
|
|
@@ -362,107 +341,108 @@ class CRBrowserContext extends _browserContext.BrowserContext {
|
|
|
362
341
|
}), urls);
|
|
363
342
|
}
|
|
364
343
|
async addCookies(cookies) {
|
|
365
|
-
await this._browser._session.send(
|
|
366
|
-
cookies: network.rewriteCookies(cookies),
|
|
367
|
-
browserContextId: this._browserContextId
|
|
368
|
-
});
|
|
344
|
+
await this._browser._session.send("Storage.setCookies", { cookies: network.rewriteCookies(cookies), browserContextId: this._browserContextId });
|
|
369
345
|
}
|
|
370
346
|
async doClearCookies() {
|
|
371
|
-
await this._browser._session.send(
|
|
372
|
-
browserContextId: this._browserContextId
|
|
373
|
-
});
|
|
347
|
+
await this._browser._session.send("Storage.clearCookies", { browserContextId: this._browserContextId });
|
|
374
348
|
}
|
|
375
349
|
async doGrantPermissions(origin, permissions) {
|
|
376
|
-
const webPermissionToProtocol = new Map([
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
350
|
+
const webPermissionToProtocol = /* @__PURE__ */ new Map([
|
|
351
|
+
["geolocation", "geolocation"],
|
|
352
|
+
["midi", "midi"],
|
|
353
|
+
["notifications", "notifications"],
|
|
354
|
+
["camera", "videoCapture"],
|
|
355
|
+
["microphone", "audioCapture"],
|
|
356
|
+
["background-sync", "backgroundSync"],
|
|
357
|
+
["ambient-light-sensor", "sensors"],
|
|
358
|
+
["accelerometer", "sensors"],
|
|
359
|
+
["gyroscope", "sensors"],
|
|
360
|
+
["magnetometer", "sensors"],
|
|
361
|
+
["clipboard-read", "clipboardReadWrite"],
|
|
362
|
+
["clipboard-write", "clipboardSanitizedWrite"],
|
|
363
|
+
["payment-handler", "paymentHandler"],
|
|
364
|
+
// chrome-specific permissions we have.
|
|
365
|
+
["midi-sysex", "midiSysex"],
|
|
366
|
+
["storage-access", "storageAccess"]
|
|
367
|
+
]);
|
|
368
|
+
const filtered = permissions.map((permission) => {
|
|
380
369
|
const protocolPermission = webPermissionToProtocol.get(permission);
|
|
381
|
-
if (!protocolPermission)
|
|
370
|
+
if (!protocolPermission)
|
|
371
|
+
throw new Error("Unknown permission: " + permission);
|
|
382
372
|
return protocolPermission;
|
|
383
373
|
});
|
|
384
|
-
await this._browser._session.send(
|
|
385
|
-
origin: origin === '*' ? undefined : origin,
|
|
386
|
-
browserContextId: this._browserContextId,
|
|
387
|
-
permissions: filtered
|
|
388
|
-
});
|
|
374
|
+
await this._browser._session.send("Browser.grantPermissions", { origin: origin === "*" ? void 0 : origin, browserContextId: this._browserContextId, permissions: filtered });
|
|
389
375
|
}
|
|
390
376
|
async doClearPermissions() {
|
|
391
|
-
await this._browser._session.send(
|
|
392
|
-
browserContextId: this._browserContextId
|
|
393
|
-
});
|
|
377
|
+
await this._browser._session.send("Browser.resetPermissions", { browserContextId: this._browserContextId });
|
|
394
378
|
}
|
|
395
379
|
async setGeolocation(geolocation) {
|
|
396
|
-
(0,
|
|
380
|
+
(0, import_browserContext.verifyGeolocation)(geolocation);
|
|
397
381
|
this._options.geolocation = geolocation;
|
|
398
|
-
for (const page of this.pages())
|
|
382
|
+
for (const page of this.pages())
|
|
383
|
+
await page._delegate.updateGeolocation();
|
|
399
384
|
}
|
|
400
385
|
async setExtraHTTPHeaders(headers) {
|
|
401
386
|
this._options.extraHTTPHeaders = headers;
|
|
402
|
-
for (const page of this.pages())
|
|
403
|
-
|
|
387
|
+
for (const page of this.pages())
|
|
388
|
+
await page._delegate.updateExtraHTTPHeaders();
|
|
389
|
+
for (const sw of this.serviceWorkers())
|
|
390
|
+
await sw.updateExtraHTTPHeaders();
|
|
404
391
|
}
|
|
405
392
|
async setUserAgent(userAgent) {
|
|
406
393
|
this._options.userAgent = userAgent;
|
|
407
|
-
for (const page of this.pages())
|
|
408
|
-
|
|
394
|
+
for (const page of this.pages())
|
|
395
|
+
await page._delegate.updateUserAgent();
|
|
409
396
|
}
|
|
410
397
|
async setOffline(offline) {
|
|
411
398
|
this._options.offline = offline;
|
|
412
|
-
for (const page of this.pages())
|
|
413
|
-
|
|
399
|
+
for (const page of this.pages())
|
|
400
|
+
await page._delegate.updateOffline();
|
|
401
|
+
for (const sw of this.serviceWorkers())
|
|
402
|
+
await sw.updateOffline();
|
|
414
403
|
}
|
|
415
404
|
async doSetHTTPCredentials(httpCredentials) {
|
|
416
405
|
this._options.httpCredentials = httpCredentials;
|
|
417
|
-
for (const page of this.pages())
|
|
418
|
-
|
|
406
|
+
for (const page of this.pages())
|
|
407
|
+
await page._delegate.updateHttpCredentials();
|
|
408
|
+
for (const sw of this.serviceWorkers())
|
|
409
|
+
await sw.updateHttpCredentials();
|
|
419
410
|
}
|
|
420
411
|
async doAddInitScript(initScript) {
|
|
421
|
-
for (const page of this.pages())
|
|
412
|
+
for (const page of this.pages())
|
|
413
|
+
await page._delegate.addInitScript(initScript);
|
|
422
414
|
}
|
|
423
415
|
async doUpdateRequestInterception() {
|
|
424
|
-
for (const page of this.pages())
|
|
425
|
-
|
|
416
|
+
for (const page of this.pages())
|
|
417
|
+
await page._delegate.updateRequestInterception();
|
|
418
|
+
for (const sw of this.serviceWorkers())
|
|
419
|
+
await sw.updateRequestInterception();
|
|
426
420
|
}
|
|
427
421
|
async doClose(reason) {
|
|
428
|
-
// Headful chrome cannot dispose browser context with opened 'beforeunload'
|
|
429
|
-
// dialogs, so we should close all that are currently opened.
|
|
430
|
-
// We also won't get new ones since `Target.disposeBrowserContext` does not trigger
|
|
431
|
-
// beforeunload.
|
|
432
422
|
const openedBeforeUnloadDialogs = [];
|
|
433
423
|
for (const crPage of this._crPages()) {
|
|
434
|
-
const dialogs = [...crPage._page._frameManager._openedDialogs].filter(dialog => dialog.type() ===
|
|
424
|
+
const dialogs = [...crPage._page._frameManager._openedDialogs].filter((dialog) => dialog.type() === "beforeunload");
|
|
435
425
|
openedBeforeUnloadDialogs.push(...dialogs);
|
|
436
426
|
}
|
|
437
|
-
await Promise.all(openedBeforeUnloadDialogs.map(dialog => dialog.dismiss()));
|
|
427
|
+
await Promise.all(openedBeforeUnloadDialogs.map((dialog) => dialog.dismiss()));
|
|
438
428
|
if (!this._browserContextId) {
|
|
439
429
|
await this.stopVideoRecording();
|
|
440
|
-
|
|
441
|
-
await this._browser.close({
|
|
442
|
-
reason
|
|
443
|
-
});
|
|
430
|
+
await this._browser.close({ reason });
|
|
444
431
|
return;
|
|
445
432
|
}
|
|
446
|
-
await this._browser._session.send(
|
|
447
|
-
browserContextId: this._browserContextId
|
|
448
|
-
});
|
|
433
|
+
await this._browser._session.send("Target.disposeBrowserContext", { browserContextId: this._browserContextId });
|
|
449
434
|
this._browser._contexts.delete(this._browserContextId);
|
|
450
435
|
for (const [targetId, serviceWorker] of this._browser._serviceWorkers) {
|
|
451
|
-
if (serviceWorker._browserContext !== this)
|
|
452
|
-
|
|
453
|
-
// asynchronously and we get detached from them later.
|
|
454
|
-
// To avoid the wrong order of notifications, we manually fire
|
|
455
|
-
// "close" event here and forget about the service worker.
|
|
436
|
+
if (serviceWorker._browserContext !== this)
|
|
437
|
+
continue;
|
|
456
438
|
serviceWorker.didClose();
|
|
457
439
|
this._browser._serviceWorkers.delete(targetId);
|
|
458
440
|
}
|
|
459
441
|
}
|
|
460
442
|
async stopVideoRecording() {
|
|
461
|
-
await Promise.all(this._crPages().map(crPage => crPage._mainFrameSession._stopVideoRecording()));
|
|
443
|
+
await Promise.all(this._crPages().map((crPage) => crPage._mainFrameSession._stopVideoRecording()));
|
|
462
444
|
}
|
|
463
445
|
onClosePersistent() {
|
|
464
|
-
// When persistent context is closed, we do not necessary get Target.detachedFromTarget
|
|
465
|
-
// for all the background pages.
|
|
466
446
|
for (const [targetId, backgroundPage] of this._browser._backgroundPages.entries()) {
|
|
467
447
|
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined()) {
|
|
468
448
|
backgroundPage.didClose();
|
|
@@ -471,37 +451,37 @@ class CRBrowserContext extends _browserContext.BrowserContext {
|
|
|
471
451
|
}
|
|
472
452
|
}
|
|
473
453
|
async clearCache() {
|
|
474
|
-
for (const page of this._crPages())
|
|
454
|
+
for (const page of this._crPages())
|
|
455
|
+
await page._networkManager.clearCache();
|
|
475
456
|
}
|
|
476
457
|
async cancelDownload(guid) {
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
// cancellation (finished, cancelled, etc.) or the guid is invalid at all.
|
|
480
|
-
await this._browser._session.send('Browser.cancelDownload', {
|
|
481
|
-
guid: guid,
|
|
458
|
+
await this._browser._session.send("Browser.cancelDownload", {
|
|
459
|
+
guid,
|
|
482
460
|
browserContextId: this._browserContextId
|
|
483
461
|
});
|
|
484
462
|
}
|
|
485
463
|
backgroundPages() {
|
|
486
464
|
const result = [];
|
|
487
465
|
for (const backgroundPage of this._browser._backgroundPages.values()) {
|
|
488
|
-
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined())
|
|
466
|
+
if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined())
|
|
467
|
+
result.push(backgroundPage._page);
|
|
489
468
|
}
|
|
490
469
|
return result;
|
|
491
470
|
}
|
|
492
471
|
serviceWorkers() {
|
|
493
|
-
return Array.from(this._browser._serviceWorkers.values()).filter(serviceWorker => serviceWorker._browserContext === this);
|
|
472
|
+
return Array.from(this._browser._serviceWorkers.values()).filter((serviceWorker) => serviceWorker._browserContext === this);
|
|
494
473
|
}
|
|
495
474
|
async newCDPSession(page) {
|
|
496
475
|
let targetId = null;
|
|
497
|
-
if (page instanceof
|
|
476
|
+
if (page instanceof import_page.Page) {
|
|
498
477
|
targetId = page._delegate._targetId;
|
|
499
|
-
} else if (page instanceof
|
|
478
|
+
} else if (page instanceof import_frames.Frame) {
|
|
500
479
|
const session = page._page._delegate._sessions.get(page._id);
|
|
501
|
-
if (!session)
|
|
480
|
+
if (!session)
|
|
481
|
+
throw new Error(`This frame does not have a separate CDP session, it is a part of the parent frame's session`);
|
|
502
482
|
targetId = session._targetId;
|
|
503
483
|
} else {
|
|
504
|
-
throw new Error(
|
|
484
|
+
throw new Error("page: expected Page or Frame");
|
|
505
485
|
}
|
|
506
486
|
const rootSession = await this._browser._clientRootSession();
|
|
507
487
|
return rootSession.attachToTarget(targetId);
|
|
@@ -516,8 +496,8 @@ class CRBrowserContext extends _browserContext.BrowserContext {
|
|
|
516
496
|
for (const page of this.pages()) await page._delegate.removeExposedBindings();
|
|
517
497
|
}
|
|
518
498
|
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
};
|
|
499
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
500
|
+
0 && (module.exports = {
|
|
501
|
+
CRBrowser,
|
|
502
|
+
CRBrowserContext
|
|
503
|
+
});
|