patchright-core 1.50.1 → 1.51.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/ThirdPartyNotices.txt +1 -43
- package/browsers.json +22 -10
- package/index.js +0 -1
- package/lib/androidServerImpl.js +4 -4
- package/lib/browserServerImpl.js +18 -9
- package/lib/cli/driver.js +6 -6
- package/lib/cli/program.js +9 -9
- package/lib/cli/programWithTestStub.js +2 -1
- package/lib/client/android.js +37 -58
- package/lib/client/artifact.js +4 -7
- package/lib/client/browser.js +10 -15
- package/lib/client/browserContext.js +77 -73
- package/lib/client/browserType.js +30 -64
- package/lib/client/channelOwner.js +23 -20
- package/lib/client/clientHelper.js +5 -7
- package/lib/client/clientStackTrace.js +65 -0
- package/lib/client/connection.js +46 -39
- package/lib/client/consoleMessage.js +4 -7
- package/lib/client/electron.js +10 -10
- package/lib/client/elementHandle.js +32 -33
- package/lib/client/errors.js +2 -2
- package/lib/client/eventEmitter.js +5 -8
- package/lib/client/fetch.js +60 -61
- package/lib/client/fileUtils.js +31 -0
- package/lib/client/frame.js +30 -29
- package/lib/client/harRouter.js +7 -9
- package/lib/client/jsHandle.js +3 -4
- package/lib/client/localUtils.js +24 -0
- package/lib/client/locator.js +37 -18
- package/lib/client/network.js +40 -40
- package/lib/client/page.js +59 -55
- package/lib/client/platform.js +71 -0
- package/lib/client/playwright.js +21 -1
- package/lib/client/selectors.js +8 -2
- package/lib/client/stream.js +2 -21
- package/lib/client/timeoutSettings.js +65 -0
- package/lib/client/tracing.js +10 -7
- package/lib/client/video.js +2 -2
- package/lib/client/waiter.js +5 -6
- package/lib/client/webSocket.js +106 -0
- package/lib/client/worker.js +12 -10
- package/lib/client/writableStream.js +2 -21
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/inProcessFactory.js +6 -3
- package/lib/outofprocess.js +12 -8
- package/lib/protocol/validator.js +64 -13
- package/lib/protocol/validatorPrimitives.js +1 -2
- package/lib/remote/playwrightConnection.js +18 -10
- package/lib/remote/playwrightServer.js +20 -7
- package/lib/server/android/android.js +17 -14
- package/lib/server/android/backendAdb.js +14 -14
- package/lib/server/artifact.js +3 -3
- package/lib/server/bidi/bidiBrowser.js +2 -2
- package/lib/server/bidi/bidiChromium.js +4 -3
- package/lib/server/bidi/bidiConnection.js +1 -1
- package/lib/server/bidi/bidiExecutionContext.js +70 -40
- package/lib/server/bidi/bidiFirefox.js +4 -3
- package/lib/server/bidi/bidiInput.js +5 -8
- package/lib/server/bidi/bidiNetworkManager.js +3 -3
- package/lib/server/bidi/bidiOverCdp.js +2 -2
- package/lib/server/bidi/bidiPage.js +30 -46
- package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
- package/lib/server/browser.js +2 -2
- package/lib/server/browserContext.js +37 -40
- package/lib/server/browserType.js +18 -17
- package/lib/{utils/sequence.js → server/callLog.js} +18 -3
- package/lib/server/chromium/chromium.js +14 -14
- package/lib/server/chromium/chromiumSwitches.js +32 -1
- package/lib/server/chromium/crBrowser.js +15 -14
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crCoverage.js +1 -1
- package/lib/server/chromium/crDevTools.js +1 -1
- package/lib/server/chromium/crDragDrop.js +1 -1
- package/lib/server/chromium/crExecutionContext.js +25 -17
- package/lib/server/chromium/crInput.js +2 -2
- package/lib/server/chromium/crNetworkManager.js +73 -26
- package/lib/server/chromium/crPage.js +22 -23
- package/lib/server/chromium/crPdf.js +1 -1
- package/lib/server/chromium/crProtocolHelper.js +3 -3
- package/lib/server/chromium/crServiceWorker.js +2 -2
- package/lib/server/chromium/videoRecorder.js +2 -2
- package/lib/server/clock.js +1 -1
- package/lib/server/codegen/javascript.js +1 -1
- package/lib/server/codegen/languages.js +2 -2
- package/lib/server/debugController.js +3 -3
- package/lib/server/deviceDescriptors.js +1 -1
- package/lib/server/deviceDescriptorsSource.json +131 -131
- package/lib/server/dispatchers/androidDispatcher.js +1 -1
- package/lib/server/dispatchers/artifactDispatcher.js +3 -3
- package/lib/server/dispatchers/browserContextDispatcher.js +19 -19
- package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
- package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
- package/lib/server/dispatchers/dispatcher.js +27 -25
- package/lib/server/dispatchers/electronDispatcher.js +3 -3
- package/lib/server/dispatchers/elementHandlerDispatcher.js +7 -2
- package/lib/server/dispatchers/frameDispatcher.js +4 -4
- package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
- package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
- package/lib/server/dispatchers/localUtilsDispatcher.js +25 -298
- package/lib/server/dispatchers/networkDispatchers.js +3 -3
- package/lib/server/dispatchers/pageDispatcher.js +11 -9
- package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
- package/lib/server/dispatchers/streamDispatcher.js +4 -3
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +8 -7
- package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
- package/lib/server/dom.js +18 -12
- package/lib/server/download.js +1 -1
- package/lib/server/electron/electron.js +17 -16
- package/lib/server/errors.js +1 -1
- package/lib/server/fetch.js +36 -25
- package/lib/server/fileUploadUtils.js +7 -4
- package/lib/server/firefox/ffBrowser.js +8 -2
- package/lib/server/firefox/ffConnection.js +1 -1
- package/lib/server/firefox/ffExecutionContext.js +25 -17
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +15 -21
- package/lib/server/firefox/firefox.js +7 -9
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +366 -209
- package/lib/server/har/harRecorder.js +4 -4
- package/lib/server/har/harTracer.js +7 -8
- package/lib/server/harBackend.js +157 -0
- package/lib/server/helper.js +2 -2
- package/lib/server/index.js +1 -8
- package/lib/server/input.js +1 -1
- package/lib/server/instrumentation.js +2 -2
- package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
- package/lib/server/javascript.js +46 -33
- package/lib/server/launchApp.js +2 -2
- package/lib/server/localUtils.js +203 -0
- package/lib/server/network.js +3 -3
- package/lib/server/page.js +41 -22
- package/lib/server/pipeTransport.js +1 -1
- package/lib/server/playwright.js +5 -5
- package/lib/server/progress.js +1 -1
- package/lib/server/protocolError.js +1 -1
- package/lib/server/recorder/contextRecorder.js +3 -3
- package/lib/server/recorder/recorderApp.js +18 -12
- package/lib/server/recorder/recorderCollection.js +3 -3
- package/lib/server/recorder/throttledFile.js +3 -4
- package/lib/server/recorder.js +7 -5
- package/lib/server/registry/browserFetcher.js +9 -7
- package/lib/server/registry/dependencies.js +15 -15
- package/lib/server/registry/index.js +38 -44
- package/lib/server/registry/oopDownloadBrowserMain.js +3 -3
- package/lib/server/screenshotter.js +1 -1
- package/lib/server/selectors.js +3 -3
- package/lib/server/socksClientCertificatesInterceptor.js +8 -8
- package/lib/server/socksInterceptor.js +8 -5
- package/lib/server/storageScript.js +160 -0
- package/lib/{common → server}/timeoutSettings.js +6 -5
- package/lib/server/trace/recorder/snapshotter.js +9 -8
- package/lib/server/trace/recorder/tracing.js +40 -31
- package/lib/server/trace/test/inMemorySnapshotter.js +4 -4
- package/lib/server/trace/viewer/traceViewer.js +13 -5
- package/lib/server/transport.js +2 -2
- package/lib/{utils → server/utils}/comparators.js +4 -4
- package/lib/{utils → server/utils}/crypto.js +4 -4
- package/lib/{utils → server/utils}/debug.js +4 -12
- package/lib/{utils → server/utils}/debugLogger.js +2 -2
- package/lib/{utils → server/utils}/env.js +4 -0
- package/lib/{utils → server/utils}/expectUtils.js +1 -1
- package/lib/{utils → server/utils}/fileUtils.js +4 -5
- package/lib/{utils/happy-eyeballs.js → server/utils/happyEyeballs.js} +22 -24
- package/lib/{utils → server/utils}/hostPlatform.js +1 -1
- package/lib/{utils → server/utils}/httpServer.js +8 -8
- package/lib/{utils → server/utils}/linuxUtils.js +3 -23
- package/lib/{utils → server/utils}/network.js +4 -4
- package/lib/server/utils/nodePlatform.js +140 -0
- package/lib/{protocol/transport.js → server/utils/pipeTransport.js} +2 -2
- package/lib/{utils → server/utils}/processLauncher.js +5 -5
- package/lib/{utils → server/utils}/profiler.js +5 -6
- package/lib/{common → server/utils}/socksProxy.js +10 -9
- package/lib/{utils → server/utils}/userAgent.js +2 -16
- package/lib/{utils → server/utils}/wsServer.js +3 -3
- package/lib/{utils → server/utils}/zipFile.js +1 -1
- package/lib/{utils → server/utils}/zones.js +9 -24
- package/lib/server/webkit/webkit.js +4 -4
- package/lib/server/webkit/wkBrowser.js +4 -4
- package/lib/server/webkit/wkConnection.js +1 -1
- package/lib/server/webkit/wkExecutionContext.js +25 -17
- package/lib/server/webkit/wkInput.js +2 -2
- package/lib/server/webkit/wkInterceptableRequest.js +2 -2
- package/lib/server/webkit/wkPage.js +41 -40
- package/lib/server/webkit/wkProvisionalPage.js +1 -1
- package/lib/server/webkit/wkWorkers.js +2 -2
- package/lib/utils/isomorphic/ariaSnapshot.js +2 -1
- package/lib/utils/isomorphic/assert.js +25 -0
- package/lib/utils/isomorphic/colors.js +65 -0
- package/lib/utils/isomorphic/cssParser.js +1 -1
- package/lib/utils/isomorphic/locatorGenerators.js +13 -1
- package/lib/utils/isomorphic/locatorParser.js +2 -2
- package/lib/utils/{manualPromise.js → isomorphic/manualPromise.js} +3 -5
- package/lib/utils/isomorphic/mimeType.js +11 -3
- package/lib/utils/{multimap.js → isomorphic/multimap.js} +1 -3
- package/lib/utils/{rtti.js → isomorphic/rtti.js} +2 -5
- package/lib/utils/isomorphic/stackTrace.js +169 -0
- package/lib/utils/isomorphic/stringUtils.js +1 -1
- package/lib/utils/{time.js → isomorphic/time.js} +1 -13
- package/lib/utils/{timeoutRunner.js → isomorphic/timeoutRunner.js} +4 -4
- package/lib/utils/isomorphic/traceUtils.js +23 -0
- package/lib/{utils/index.js → utils.js} +200 -121
- package/lib/utilsBundle.js +1 -25
- package/lib/utilsBundleImpl/index.js +114 -116
- package/lib/vite/htmlReport/index.html +20 -20
- package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-DpJ-EmBQ.js +24 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-DTenqiGw.js +259 -0
- package/lib/vite/traceViewer/assets/{xtermModule-c-SNdYZy.js → xtermModule-BoAIEibi.js} +7 -7
- package/lib/vite/traceViewer/defaultSettingsView.5fN5lw10.css +1 -0
- package/lib/vite/traceViewer/index.CUq7VgrV.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.CHJSAD7F.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/zipBundleImpl.js +4 -4
- package/package.json +7 -7
- package/types/protocol.d.ts +123 -99
- package/types/types.d.ts +91 -37
- package/lib/utils/stackTrace.js +0 -134
- package/lib/utils/traceUtils.js +0 -44
- package/lib/vite/recorder/assets/codeMirrorModule-CNAqJrkA.js +0 -24
- package/lib/vite/recorder/assets/index-DGS0JLxS.js +0 -184
- package/lib/vite/traceViewer/assets/codeMirrorModule-D55P_UuL.js +0 -24
- package/lib/vite/traceViewer/assets/defaultSettingsView-B-uNoFsX.js +0 -243
- package/lib/vite/traceViewer/defaultSettingsView.2xeEXCXv.css +0 -1
- package/lib/vite/traceViewer/index.BfvuujqP.js +0 -2
- package/lib/vite/traceViewer/uiMode.CStJu6jo.js +0 -5
- /package/lib/{utils → server/utils}/ascii.js +0 -0
- /package/lib/{utils → server/utils}/eventsHelper.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/colorUtils.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/compare.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/imageChannel.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/stats.js +0 -0
- /package/lib/{utils → server/utils}/spawnAsync.js +0 -0
- /package/lib/{utils → server/utils}/task.js +0 -0
- /package/lib/utils/{headers.js → isomorphic/headers.js} +0 -0
- /package/lib/utils/{semaphore.js → isomorphic/semaphore.js} +0 -0
- /package/lib/{common → utils/isomorphic}/types.js +0 -0
|
@@ -6,31 +6,33 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.BrowserContext = void 0;
|
|
7
7
|
exports.prepareBrowserContextParams = prepareBrowserContextParams;
|
|
8
8
|
exports.toClientCertificatesProtocol = toClientCertificatesProtocol;
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
13
|
-
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _artifact = require("./artifact");
|
|
10
|
+
var _browser = require("./browser");
|
|
11
|
+
var _cdpSession = require("./cdpSession");
|
|
14
12
|
var _channelOwner = require("./channelOwner");
|
|
15
13
|
var _clientHelper = require("./clientHelper");
|
|
16
|
-
var
|
|
17
|
-
var
|
|
14
|
+
var _clock = require("./clock");
|
|
15
|
+
var _consoleMessage = require("./consoleMessage");
|
|
16
|
+
var _dialog = require("./dialog");
|
|
17
|
+
var _errors = require("./errors");
|
|
18
18
|
var _events = require("./events");
|
|
19
|
-
var _timeoutSettings = require("../common/timeoutSettings");
|
|
20
|
-
var _waiter = require("./waiter");
|
|
21
|
-
var _utils = require("../utils");
|
|
22
|
-
var _cdpSession = require("./cdpSession");
|
|
23
|
-
var _tracing = require("./tracing");
|
|
24
|
-
var _artifact = require("./artifact");
|
|
25
19
|
var _fetch = require("./fetch");
|
|
26
|
-
var
|
|
20
|
+
var _frame = require("./frame");
|
|
27
21
|
var _harRouter = require("./harRouter");
|
|
28
|
-
var
|
|
29
|
-
var
|
|
22
|
+
var network = _interopRequireWildcard(require("./network"));
|
|
23
|
+
var _page = require("./page");
|
|
24
|
+
var _tracing = require("./tracing");
|
|
25
|
+
var _waiter = require("./waiter");
|
|
30
26
|
var _webError = require("./webError");
|
|
31
|
-
var
|
|
32
|
-
var
|
|
33
|
-
|
|
27
|
+
var _worker = require("./worker");
|
|
28
|
+
var _timeoutSettings = require("./timeoutSettings");
|
|
29
|
+
var _fileUtils = require("./fileUtils");
|
|
30
|
+
var _headers = require("../utils/isomorphic/headers");
|
|
31
|
+
var _urlMatch = require("../utils/isomorphic/urlMatch");
|
|
32
|
+
var _rtti = require("../utils/isomorphic/rtti");
|
|
33
|
+
var _stackTrace = require("../utils/isomorphic/stackTrace");
|
|
34
|
+
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); }
|
|
35
|
+
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 && {}.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; }
|
|
34
36
|
/**
|
|
35
37
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
36
38
|
* Modifications copyright (c) Microsoft Corporation.
|
|
@@ -47,10 +49,7 @@ let _Symbol$asyncDispose;
|
|
|
47
49
|
* See the License for the specific language governing permissions and
|
|
48
50
|
* limitations under the License.
|
|
49
51
|
*/
|
|
50
|
-
|
|
51
|
-
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); }
|
|
52
|
-
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; }
|
|
53
|
-
_Symbol$asyncDispose = Symbol.asyncDispose;
|
|
52
|
+
|
|
54
53
|
class BrowserContext extends _channelOwner.ChannelOwner {
|
|
55
54
|
static from(context) {
|
|
56
55
|
return context._object;
|
|
@@ -67,7 +66,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
67
66
|
this._browser = null;
|
|
68
67
|
this._browserType = void 0;
|
|
69
68
|
this._bindings = new Map();
|
|
70
|
-
this._timeoutSettings =
|
|
69
|
+
this._timeoutSettings = void 0;
|
|
71
70
|
this._ownerPage = void 0;
|
|
72
71
|
this._closedPromise = void 0;
|
|
73
72
|
this._options = {};
|
|
@@ -82,6 +81,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
82
81
|
this._closeReason = void 0;
|
|
83
82
|
this._harRouters = [];
|
|
84
83
|
this.routeInjecting = false;
|
|
84
|
+
this._timeoutSettings = new _timeoutSettings.TimeoutSettings(this._platform);
|
|
85
85
|
if (parent instanceof _browser.Browser) this._browser = parent;
|
|
86
86
|
(_this$_browser = this._browser) === null || _this$_browser === void 0 || _this$_browser._contexts.add(this);
|
|
87
87
|
this._isChromium = ((_this$_browser2 = this._browser) === null || _this$_browser2 === void 0 ? void 0 : _this$_browser2._name) === 'chromium';
|
|
@@ -117,7 +117,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
117
117
|
this.emit(_events.Events.BrowserContext.ServiceWorker, serviceWorker);
|
|
118
118
|
});
|
|
119
119
|
this._channel.on('console', event => {
|
|
120
|
-
const consoleMessage = new _consoleMessage.ConsoleMessage(event);
|
|
120
|
+
const consoleMessage = new _consoleMessage.ConsoleMessage(this._platform, event);
|
|
121
121
|
this.emit(_events.Events.BrowserContext.Console, consoleMessage);
|
|
122
122
|
const page = consoleMessage.page();
|
|
123
123
|
if (page) page.emit(_events.Events.Page.Console, consoleMessage);
|
|
@@ -234,18 +234,18 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
234
234
|
setDefaultNavigationTimeout(timeout) {
|
|
235
235
|
this._timeoutSettings.setDefaultNavigationTimeout(timeout);
|
|
236
236
|
this._wrapApiCall(async () => {
|
|
237
|
-
this._channel.setDefaultNavigationTimeoutNoReply({
|
|
237
|
+
await this._channel.setDefaultNavigationTimeoutNoReply({
|
|
238
238
|
timeout
|
|
239
|
-
})
|
|
240
|
-
}, true);
|
|
239
|
+
});
|
|
240
|
+
}, true).catch(() => {});
|
|
241
241
|
}
|
|
242
242
|
setDefaultTimeout(timeout) {
|
|
243
243
|
this._timeoutSettings.setDefaultTimeout(timeout);
|
|
244
244
|
this._wrapApiCall(async () => {
|
|
245
|
-
this._channel.setDefaultTimeoutNoReply({
|
|
245
|
+
await this._channel.setDefaultTimeoutNoReply({
|
|
246
246
|
timeout
|
|
247
|
-
})
|
|
248
|
-
}, true);
|
|
247
|
+
});
|
|
248
|
+
}, true).catch(() => {});
|
|
249
249
|
}
|
|
250
250
|
browser() {
|
|
251
251
|
return this._browser;
|
|
@@ -271,15 +271,15 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
271
271
|
}
|
|
272
272
|
async clearCookies(options = {}) {
|
|
273
273
|
await this._channel.clearCookies({
|
|
274
|
-
name: (0,
|
|
275
|
-
nameRegexSource: (0,
|
|
276
|
-
nameRegexFlags: (0,
|
|
277
|
-
domain: (0,
|
|
278
|
-
domainRegexSource: (0,
|
|
279
|
-
domainRegexFlags: (0,
|
|
280
|
-
path: (0,
|
|
281
|
-
pathRegexSource: (0,
|
|
282
|
-
pathRegexFlags: (0,
|
|
274
|
+
name: (0, _rtti.isString)(options.name) ? options.name : undefined,
|
|
275
|
+
nameRegexSource: (0, _rtti.isRegExp)(options.name) ? options.name.source : undefined,
|
|
276
|
+
nameRegexFlags: (0, _rtti.isRegExp)(options.name) ? options.name.flags : undefined,
|
|
277
|
+
domain: (0, _rtti.isString)(options.domain) ? options.domain : undefined,
|
|
278
|
+
domainRegexSource: (0, _rtti.isRegExp)(options.domain) ? options.domain.source : undefined,
|
|
279
|
+
domainRegexFlags: (0, _rtti.isRegExp)(options.domain) ? options.domain.flags : undefined,
|
|
280
|
+
path: (0, _rtti.isString)(options.path) ? options.path : undefined,
|
|
281
|
+
pathRegexSource: (0, _rtti.isRegExp)(options.path) ? options.path.source : undefined,
|
|
282
|
+
pathRegexFlags: (0, _rtti.isRegExp)(options.path) ? options.path.flags : undefined
|
|
283
283
|
});
|
|
284
284
|
}
|
|
285
285
|
async grantPermissions(permissions, options) {
|
|
@@ -299,7 +299,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
299
299
|
async setExtraHTTPHeaders(headers) {
|
|
300
300
|
network.validateHeaders(headers);
|
|
301
301
|
await this._channel.setExtraHTTPHeaders({
|
|
302
|
-
headers: (0,
|
|
302
|
+
headers: (0, _headers.headersObjectToArray)(headers)
|
|
303
303
|
});
|
|
304
304
|
}
|
|
305
305
|
async setOffline(offline) {
|
|
@@ -314,7 +314,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
314
314
|
}
|
|
315
315
|
async addInitScript(script, arg) {
|
|
316
316
|
await this.installInjectRoute();
|
|
317
|
-
const source = await (0, _clientHelper.evaluationScript)(script, arg);
|
|
317
|
+
const source = await (0, _clientHelper.evaluationScript)(this._platform, script, arg);
|
|
318
318
|
await this._channel.addInitScript({
|
|
319
319
|
source
|
|
320
320
|
});
|
|
@@ -336,7 +336,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
336
336
|
this._bindings.set(name, binding);
|
|
337
337
|
}
|
|
338
338
|
async route(url, handler, options = {}) {
|
|
339
|
-
this._routes.unshift(new network.RouteHandler(this._options.baseURL, url, handler, options.times));
|
|
339
|
+
this._routes.unshift(new network.RouteHandler(this._platform, this._options.baseURL, url, handler, options.times));
|
|
340
340
|
await this._updateInterceptionPatterns();
|
|
341
341
|
}
|
|
342
342
|
async routeWebSocket(url, handler) {
|
|
@@ -362,11 +362,13 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
362
362
|
});
|
|
363
363
|
}
|
|
364
364
|
async routeFromHAR(har, options = {}) {
|
|
365
|
+
const localUtils = this._connection.localUtils();
|
|
366
|
+
if (!localUtils) throw new Error('Route from har is not supported in thin clients');
|
|
365
367
|
if (options.update) {
|
|
366
368
|
await this._recordIntoHAR(har, null, options);
|
|
367
369
|
return;
|
|
368
370
|
}
|
|
369
|
-
const harRouter = await _harRouter.HarRouter.create(
|
|
371
|
+
const harRouter = await _harRouter.HarRouter.create(localUtils, har, options.notFound || 'abort', {
|
|
370
372
|
urlMatch: options.url
|
|
371
373
|
});
|
|
372
374
|
this._harRouters.push(harRouter);
|
|
@@ -384,7 +386,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
384
386
|
const removed = [];
|
|
385
387
|
const remaining = [];
|
|
386
388
|
for (const route of this._routes) {
|
|
387
|
-
if ((0,
|
|
389
|
+
if ((0, _urlMatch.urlMatchesEqual)(route.url, url) && (!handler || route.handler === handler)) removed.push(route);else remaining.push(route);
|
|
388
390
|
}
|
|
389
391
|
await this._unrouteInternal(removed, remaining, 'default');
|
|
390
392
|
}
|
|
@@ -424,10 +426,12 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
424
426
|
});
|
|
425
427
|
}
|
|
426
428
|
async storageState(options = {}) {
|
|
427
|
-
const state = await this._channel.storageState(
|
|
429
|
+
const state = await this._channel.storageState({
|
|
430
|
+
indexedDB: options.indexedDB
|
|
431
|
+
});
|
|
428
432
|
if (options.path) {
|
|
429
|
-
await (0,
|
|
430
|
-
await
|
|
433
|
+
await (0, _fileUtils.mkdirIfNeeded)(this._platform, options.path);
|
|
434
|
+
await this._platform.fs().promises.writeFile(options.path, JSON.stringify(state, undefined, 2), 'utf8');
|
|
431
435
|
}
|
|
432
436
|
return state;
|
|
433
437
|
}
|
|
@@ -455,7 +459,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
455
459
|
this.tracing._resetStackCounter();
|
|
456
460
|
this.emit(_events.Events.BrowserContext.Close, this);
|
|
457
461
|
}
|
|
458
|
-
async [
|
|
462
|
+
async [Symbol.asyncDispose]() {
|
|
459
463
|
await this.close();
|
|
460
464
|
}
|
|
461
465
|
async close(options = {}) {
|
|
@@ -477,8 +481,10 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
477
481
|
const isCompressed = harParams.content === 'attach' || harParams.path.endsWith('.zip');
|
|
478
482
|
const needCompressed = harParams.path.endsWith('.zip');
|
|
479
483
|
if (isCompressed && !needCompressed) {
|
|
484
|
+
const localUtils = this._connection.localUtils();
|
|
485
|
+
if (!localUtils) throw new Error('Uncompressed har is not supported in thin clients');
|
|
480
486
|
await artifact.saveAs(harParams.path + '.tmp');
|
|
481
|
-
await
|
|
487
|
+
await localUtils.harUnzip({
|
|
482
488
|
zipFile: harParams.path + '.tmp',
|
|
483
489
|
harFile: harParams.path
|
|
484
490
|
});
|
|
@@ -495,31 +501,28 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
495
501
|
await this._channel.enableRecorder(params);
|
|
496
502
|
}
|
|
497
503
|
async installInjectRoute() {
|
|
498
|
-
if (this.routeInjecting) return;
|
|
504
|
+
if (this.routeInjecting || this.context().routeInjecting) return;
|
|
499
505
|
await this.route('**/*', async route => {
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
const
|
|
503
|
-
|
|
506
|
+
try {
|
|
507
|
+
if (route.request().resourceType() === 'document' && route.request().url().startsWith('http')) {
|
|
508
|
+
const protocol = route.request().url().split(':')[0];
|
|
509
|
+
await route.continue({
|
|
510
|
+
url: protocol + '://patchright-init-script-inject.internal/'
|
|
504
511
|
});
|
|
505
|
-
|
|
506
|
-
response: response
|
|
507
|
-
});
|
|
508
|
-
} catch (e) {
|
|
512
|
+
} else {
|
|
509
513
|
await route.continue();
|
|
510
514
|
}
|
|
511
|
-
}
|
|
515
|
+
} catch (error) {
|
|
512
516
|
await route.continue();
|
|
513
517
|
}
|
|
514
518
|
});
|
|
515
|
-
this.routeInjecting = true;
|
|
516
519
|
}
|
|
517
520
|
}
|
|
518
521
|
exports.BrowserContext = BrowserContext;
|
|
519
|
-
async function prepareStorageState(options) {
|
|
522
|
+
async function prepareStorageState(platform, options) {
|
|
520
523
|
if (typeof options.storageState !== 'string') return options.storageState;
|
|
521
524
|
try {
|
|
522
|
-
return JSON.parse(await
|
|
525
|
+
return JSON.parse(await platform.fs().promises.readFile(options.storageState, 'utf8'));
|
|
523
526
|
} catch (e) {
|
|
524
527
|
(0, _stackTrace.rewriteErrorMessage)(e, `Error reading storage state from ${options.storageState}:\n` + e.message);
|
|
525
528
|
throw e;
|
|
@@ -530,28 +533,29 @@ function prepareRecordHarOptions(options) {
|
|
|
530
533
|
return {
|
|
531
534
|
path: options.path,
|
|
532
535
|
content: options.content || (options.omitContent ? 'omit' : undefined),
|
|
533
|
-
urlGlob: (0,
|
|
534
|
-
urlRegexSource: (0,
|
|
535
|
-
urlRegexFlags: (0,
|
|
536
|
+
urlGlob: (0, _rtti.isString)(options.urlFilter) ? options.urlFilter : undefined,
|
|
537
|
+
urlRegexSource: (0, _rtti.isRegExp)(options.urlFilter) ? options.urlFilter.source : undefined,
|
|
538
|
+
urlRegexFlags: (0, _rtti.isRegExp)(options.urlFilter) ? options.urlFilter.flags : undefined,
|
|
536
539
|
mode: options.mode
|
|
537
540
|
};
|
|
538
541
|
}
|
|
539
|
-
async function prepareBrowserContextParams(options) {
|
|
542
|
+
async function prepareBrowserContextParams(platform, options) {
|
|
540
543
|
if (options.videoSize && !options.videosPath) throw new Error(`"videoSize" option requires "videosPath" to be specified`);
|
|
541
544
|
if (options.extraHTTPHeaders) network.validateHeaders(options.extraHTTPHeaders);
|
|
542
545
|
const contextParams = {
|
|
543
546
|
...options,
|
|
544
547
|
viewport: options.viewport === null ? undefined : options.viewport,
|
|
545
548
|
noDefaultViewport: options.viewport === null,
|
|
546
|
-
extraHTTPHeaders: options.extraHTTPHeaders ? (0,
|
|
547
|
-
storageState: await prepareStorageState(options),
|
|
549
|
+
extraHTTPHeaders: options.extraHTTPHeaders ? (0, _headers.headersObjectToArray)(options.extraHTTPHeaders) : undefined,
|
|
550
|
+
storageState: await prepareStorageState(platform, options),
|
|
548
551
|
serviceWorkers: options.serviceWorkers,
|
|
549
552
|
recordHar: prepareRecordHarOptions(options.recordHar),
|
|
550
553
|
colorScheme: options.colorScheme === null ? 'no-override' : options.colorScheme,
|
|
551
554
|
reducedMotion: options.reducedMotion === null ? 'no-override' : options.reducedMotion,
|
|
552
555
|
forcedColors: options.forcedColors === null ? 'no-override' : options.forcedColors,
|
|
556
|
+
contrast: options.contrast === null ? 'no-override' : options.contrast,
|
|
553
557
|
acceptDownloads: toAcceptDownloadsProtocol(options.acceptDownloads),
|
|
554
|
-
clientCertificates: await toClientCertificatesProtocol(options.clientCertificates)
|
|
558
|
+
clientCertificates: await toClientCertificatesProtocol(platform, options.clientCertificates)
|
|
555
559
|
};
|
|
556
560
|
if (!contextParams.recordVideo && options.videosPath) {
|
|
557
561
|
contextParams.recordVideo = {
|
|
@@ -559,7 +563,7 @@ async function prepareBrowserContextParams(options) {
|
|
|
559
563
|
size: options.videoSize
|
|
560
564
|
};
|
|
561
565
|
}
|
|
562
|
-
if (contextParams.recordVideo && contextParams.recordVideo.dir) contextParams.recordVideo.dir =
|
|
566
|
+
if (contextParams.recordVideo && contextParams.recordVideo.dir) contextParams.recordVideo.dir = platform.path().resolve(contextParams.recordVideo.dir);
|
|
563
567
|
return contextParams;
|
|
564
568
|
}
|
|
565
569
|
function toAcceptDownloadsProtocol(acceptDownloads) {
|
|
@@ -567,11 +571,11 @@ function toAcceptDownloadsProtocol(acceptDownloads) {
|
|
|
567
571
|
if (acceptDownloads) return 'accept';
|
|
568
572
|
return 'deny';
|
|
569
573
|
}
|
|
570
|
-
async function toClientCertificatesProtocol(certs) {
|
|
574
|
+
async function toClientCertificatesProtocol(platform, certs) {
|
|
571
575
|
if (!certs) return undefined;
|
|
572
576
|
const bufferizeContent = async (value, path) => {
|
|
573
577
|
if (value) return value;
|
|
574
|
-
if (path) return await
|
|
578
|
+
if (path) return await platform.fs().promises.readFile(path);
|
|
575
579
|
};
|
|
576
580
|
return await Promise.all(certs.map(async cert => ({
|
|
577
581
|
origin: cert.origin,
|
|
@@ -7,11 +7,13 @@ exports.BrowserType = void 0;
|
|
|
7
7
|
var _browser3 = require("./browser");
|
|
8
8
|
var _browserContext = require("./browserContext");
|
|
9
9
|
var _channelOwner = require("./channelOwner");
|
|
10
|
-
var _connection = require("./connection");
|
|
11
|
-
var _events = require("./events");
|
|
12
10
|
var _clientHelper = require("./clientHelper");
|
|
13
|
-
var
|
|
14
|
-
var
|
|
11
|
+
var _events = require("./events");
|
|
12
|
+
var _assert = require("../utils/isomorphic/assert");
|
|
13
|
+
var _headers = require("../utils/isomorphic/headers");
|
|
14
|
+
var _time = require("../utils/isomorphic/time");
|
|
15
|
+
var _timeoutRunner = require("../utils/isomorphic/timeoutRunner");
|
|
16
|
+
var _webSocket = require("./webSocket");
|
|
15
17
|
/**
|
|
16
18
|
* Copyright (c) Microsoft Corporation.
|
|
17
19
|
*
|
|
@@ -36,11 +38,6 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
36
38
|
this._serverLauncher = void 0;
|
|
37
39
|
this._contexts = new Set();
|
|
38
40
|
this._playwright = void 0;
|
|
39
|
-
// Instrumentation.
|
|
40
|
-
this._defaultContextOptions = void 0;
|
|
41
|
-
this._defaultContextTimeout = void 0;
|
|
42
|
-
this._defaultContextNavigationTimeout = void 0;
|
|
43
|
-
this._defaultLaunchOptions = void 0;
|
|
44
41
|
}
|
|
45
42
|
static from(browserType) {
|
|
46
43
|
return browserType._object;
|
|
@@ -53,12 +50,12 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
53
50
|
return this._initializer.name;
|
|
54
51
|
}
|
|
55
52
|
async launch(options = {}) {
|
|
56
|
-
var _this$
|
|
57
|
-
(0,
|
|
58
|
-
(0,
|
|
59
|
-
const logger = options.logger || ((_this$
|
|
53
|
+
var _this$_playwright$_de;
|
|
54
|
+
(0, _assert.assert)(!options.userDataDir, 'userDataDir option is not supported in `browserType.launch`. Use `browserType.launchPersistentContext` instead');
|
|
55
|
+
(0, _assert.assert)(!options.port, 'Cannot specify a port without launching as a server.');
|
|
56
|
+
const logger = options.logger || ((_this$_playwright$_de = this._playwright._defaultLaunchOptions) === null || _this$_playwright$_de === void 0 ? void 0 : _this$_playwright$_de.logger);
|
|
60
57
|
options = {
|
|
61
|
-
...this._defaultLaunchOptions,
|
|
58
|
+
...this._playwright._defaultLaunchOptions,
|
|
62
59
|
...options
|
|
63
60
|
};
|
|
64
61
|
const launchOptions = {
|
|
@@ -76,28 +73,28 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
76
73
|
async launchServer(options = {}) {
|
|
77
74
|
if (!this._serverLauncher) throw new Error('Launching server is not supported');
|
|
78
75
|
options = {
|
|
79
|
-
...this._defaultLaunchOptions,
|
|
76
|
+
...this._playwright._defaultLaunchOptions,
|
|
80
77
|
...options
|
|
81
78
|
};
|
|
82
79
|
return await this._serverLauncher.launchServer(options);
|
|
83
80
|
}
|
|
84
81
|
async launchPersistentContext(userDataDir, options = {}) {
|
|
85
|
-
var _this$
|
|
86
|
-
const logger = options.logger || ((_this$
|
|
87
|
-
(0,
|
|
82
|
+
var _this$_playwright$_de2;
|
|
83
|
+
const logger = options.logger || ((_this$_playwright$_de2 = this._playwright._defaultLaunchOptions) === null || _this$_playwright$_de2 === void 0 ? void 0 : _this$_playwright$_de2.logger);
|
|
84
|
+
(0, _assert.assert)(!options.port, 'Cannot specify a port without launching as a server.');
|
|
88
85
|
options = {
|
|
89
|
-
...this._defaultLaunchOptions,
|
|
90
|
-
...this._defaultContextOptions,
|
|
86
|
+
...this._playwright._defaultLaunchOptions,
|
|
87
|
+
...this._playwright._defaultContextOptions,
|
|
91
88
|
...options
|
|
92
89
|
};
|
|
93
|
-
const contextParams = await (0, _browserContext.prepareBrowserContextParams)(options);
|
|
90
|
+
const contextParams = await (0, _browserContext.prepareBrowserContextParams)(this._platform, options);
|
|
94
91
|
const persistentParams = {
|
|
95
92
|
...contextParams,
|
|
96
93
|
ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined,
|
|
97
94
|
ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
|
|
98
95
|
env: options.env ? (0, _clientHelper.envObjectToArray)(options.env) : undefined,
|
|
99
96
|
channel: options.channel,
|
|
100
|
-
userDataDir
|
|
97
|
+
userDataDir: this._platform.path().isAbsolute(userDataDir) || !userDataDir ? userDataDir : this._platform.path().resolve(userDataDir)
|
|
101
98
|
};
|
|
102
99
|
return await this._wrapApiCall(async () => {
|
|
103
100
|
const result = await this._channel.launchPersistentContext(persistentParams);
|
|
@@ -111,19 +108,18 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
111
108
|
...options,
|
|
112
109
|
wsEndpoint: optionsOrWsEndpoint
|
|
113
110
|
});
|
|
114
|
-
(0,
|
|
111
|
+
(0, _assert.assert)(optionsOrWsEndpoint.wsEndpoint, 'options.wsEndpoint is required');
|
|
115
112
|
return await this._connect(optionsOrWsEndpoint);
|
|
116
113
|
}
|
|
117
114
|
async _connect(params) {
|
|
118
115
|
const logger = params.logger;
|
|
119
116
|
return await this._wrapApiCall(async () => {
|
|
120
117
|
var _params$exposeNetwork;
|
|
121
|
-
const deadline = params.timeout ? (0,
|
|
118
|
+
const deadline = params.timeout ? (0, _time.monotonicTime)() + params.timeout : 0;
|
|
122
119
|
const headers = {
|
|
123
120
|
'x-playwright-browser': this.name(),
|
|
124
121
|
...params.headers
|
|
125
122
|
};
|
|
126
|
-
const localUtils = this._connection.localUtils();
|
|
127
123
|
const connectParams = {
|
|
128
124
|
wsEndpoint: params.wsEndpoint,
|
|
129
125
|
headers,
|
|
@@ -132,69 +128,39 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
132
128
|
timeout: params.timeout
|
|
133
129
|
};
|
|
134
130
|
if (params.__testHookRedirectPortForwarding) connectParams.socksProxyRedirectPortForTest = params.__testHookRedirectPortForwarding;
|
|
135
|
-
const
|
|
136
|
-
pipe,
|
|
137
|
-
headers: connectHeaders
|
|
138
|
-
} = await localUtils._channel.connect(connectParams);
|
|
139
|
-
const closePipe = () => pipe.close().catch(() => {});
|
|
140
|
-
const connection = new _connection.Connection(localUtils, this._instrumentation);
|
|
141
|
-
connection.markAsRemote();
|
|
142
|
-
connection.on('close', closePipe);
|
|
131
|
+
const connection = await (0, _webSocket.connectOverWebSocket)(this._connection, connectParams);
|
|
143
132
|
let browser;
|
|
144
|
-
|
|
145
|
-
const onPipeClosed = reason => {
|
|
133
|
+
connection.on('close', () => {
|
|
146
134
|
// Emulate all pages, contexts and the browser closing upon disconnect.
|
|
147
135
|
for (const context of ((_browser = browser) === null || _browser === void 0 ? void 0 : _browser.contexts()) || []) {
|
|
148
136
|
var _browser;
|
|
149
137
|
for (const page of context.pages()) page._onClose();
|
|
150
138
|
context._onClose();
|
|
151
139
|
}
|
|
152
|
-
connection.close(reason || closeError);
|
|
153
|
-
// Give a chance to any API call promises to reject upon page/context closure.
|
|
154
|
-
// This happens naturally when we receive page.onClose and browser.onClose from the server
|
|
155
|
-
// in separate tasks. However, upon pipe closure we used to dispatch them all synchronously
|
|
156
|
-
// here and promises did not have a chance to reject.
|
|
157
|
-
// The order of rejects vs closure is a part of the API contract and our test runner
|
|
158
|
-
// relies on it to attribute rejections to the right test.
|
|
159
140
|
setTimeout(() => {
|
|
160
141
|
var _browser2;
|
|
161
142
|
return (_browser2 = browser) === null || _browser2 === void 0 ? void 0 : _browser2._didClose();
|
|
162
143
|
}, 0);
|
|
163
|
-
};
|
|
164
|
-
pipe.on('closed', params => onPipeClosed(params.reason));
|
|
165
|
-
connection.onmessage = message => this._wrapApiCall(() => pipe.send({
|
|
166
|
-
message
|
|
167
|
-
}).catch(() => onPipeClosed()), /* isInternal */true);
|
|
168
|
-
pipe.on('message', ({
|
|
169
|
-
message
|
|
170
|
-
}) => {
|
|
171
|
-
try {
|
|
172
|
-
connection.dispatch(message);
|
|
173
|
-
} catch (e) {
|
|
174
|
-
closeError = String(e);
|
|
175
|
-
closePipe();
|
|
176
|
-
}
|
|
177
144
|
});
|
|
178
145
|
const result = await (0, _timeoutRunner.raceAgainstDeadline)(async () => {
|
|
179
146
|
// For tests.
|
|
180
147
|
if (params.__testHookBeforeCreateBrowser) await params.__testHookBeforeCreateBrowser();
|
|
181
148
|
const playwright = await connection.initializePlaywright();
|
|
182
149
|
if (!playwright._initializer.preLaunchedBrowser) {
|
|
183
|
-
|
|
150
|
+
connection.close();
|
|
184
151
|
throw new Error('Malformed endpoint. Did you use BrowserType.launchServer method?');
|
|
185
152
|
}
|
|
186
153
|
playwright._setSelectors(this._playwright.selectors);
|
|
187
154
|
browser = _browser3.Browser.from(playwright._initializer.preLaunchedBrowser);
|
|
188
155
|
this._didLaunchBrowser(browser, {}, logger);
|
|
189
156
|
browser._shouldCloseConnectionOnClose = true;
|
|
190
|
-
browser.
|
|
191
|
-
browser.on(_events.Events.Browser.Disconnected, () => this._wrapApiCall(() => closePipe(), /* isInternal */true));
|
|
157
|
+
browser.on(_events.Events.Browser.Disconnected, () => connection.close());
|
|
192
158
|
return browser;
|
|
193
159
|
}, deadline);
|
|
194
160
|
if (!result.timedOut) {
|
|
195
161
|
return result.result;
|
|
196
162
|
} else {
|
|
197
|
-
|
|
163
|
+
connection.close();
|
|
198
164
|
throw new Error(`Timeout ${params.timeout}ms exceeded`);
|
|
199
165
|
}
|
|
200
166
|
});
|
|
@@ -202,12 +168,12 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
202
168
|
async connectOverCDP(endpointURLOrOptions, options) {
|
|
203
169
|
if (typeof endpointURLOrOptions === 'string') return await this._connectOverCDP(endpointURLOrOptions, options);
|
|
204
170
|
const endpointURL = 'endpointURL' in endpointURLOrOptions ? endpointURLOrOptions.endpointURL : endpointURLOrOptions.wsEndpoint;
|
|
205
|
-
(0,
|
|
171
|
+
(0, _assert.assert)(endpointURL, 'Cannot connect over CDP without wsEndpoint.');
|
|
206
172
|
return await this.connectOverCDP(endpointURL, endpointURLOrOptions);
|
|
207
173
|
}
|
|
208
174
|
async _connectOverCDP(endpointURL, params = {}) {
|
|
209
175
|
if (this.name() !== 'chromium') throw new Error('Connecting over CDP is only supported in Chromium.');
|
|
210
|
-
const headers = params.headers ? (0,
|
|
176
|
+
const headers = params.headers ? (0, _headers.headersObjectToArray)(params.headers) : undefined;
|
|
211
177
|
const result = await this._channel.connectOverCDP({
|
|
212
178
|
endpointURL,
|
|
213
179
|
headers,
|
|
@@ -229,8 +195,8 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
229
195
|
context._browserType = this;
|
|
230
196
|
this._contexts.add(context);
|
|
231
197
|
context._setOptions(contextOptions, browserOptions);
|
|
232
|
-
if (this._defaultContextTimeout !== undefined) context.setDefaultTimeout(this._defaultContextTimeout);
|
|
233
|
-
if (this._defaultContextNavigationTimeout !== undefined) context.setDefaultNavigationTimeout(this._defaultContextNavigationTimeout);
|
|
198
|
+
if (this._playwright._defaultContextTimeout !== undefined) context.setDefaultTimeout(this._playwright._defaultContextTimeout);
|
|
199
|
+
if (this._playwright._defaultContextNavigationTimeout !== undefined) context.setDefaultNavigationTimeout(this._playwright._defaultContextNavigationTimeout);
|
|
234
200
|
await this._instrumentation.runAfterCreateBrowserContext(context);
|
|
235
201
|
}
|
|
236
202
|
async _willCloseContext(context) {
|
|
@@ -6,10 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.ChannelOwner = void 0;
|
|
7
7
|
var _eventEmitter = require("./eventEmitter");
|
|
8
8
|
var _validator = require("../protocol/validator");
|
|
9
|
-
var
|
|
10
|
-
var _stackTrace = require("../utils/stackTrace");
|
|
11
|
-
var _utils = require("../utils");
|
|
12
|
-
var _zones = require("../utils/zones");
|
|
9
|
+
var _clientStackTrace = require("./clientStackTrace");
|
|
10
|
+
var _stackTrace = require("../utils/isomorphic/stackTrace");
|
|
13
11
|
/**
|
|
14
12
|
* Copyright (c) Microsoft Corporation.
|
|
15
13
|
*
|
|
@@ -28,7 +26,8 @@ var _zones = require("../utils/zones");
|
|
|
28
26
|
|
|
29
27
|
class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
30
28
|
constructor(parent, type, guid, initializer) {
|
|
31
|
-
|
|
29
|
+
const connection = parent instanceof ChannelOwner ? parent._connection : parent;
|
|
30
|
+
super(connection._platform);
|
|
32
31
|
this._connection = void 0;
|
|
33
32
|
this._parent = void 0;
|
|
34
33
|
this._objects = new Map();
|
|
@@ -42,7 +41,7 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
|
42
41
|
this._isInternalType = false;
|
|
43
42
|
this._wasCollected = false;
|
|
44
43
|
this.setMaxListeners(0);
|
|
45
|
-
this._connection =
|
|
44
|
+
this._connection = connection;
|
|
46
45
|
this._type = type;
|
|
47
46
|
this._guid = guid;
|
|
48
47
|
this._parent = parent instanceof ChannelOwner ? parent : undefined;
|
|
@@ -52,7 +51,7 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
|
52
51
|
this._parent._objects.set(guid, this);
|
|
53
52
|
this._logger = this._parent._logger;
|
|
54
53
|
}
|
|
55
|
-
this._channel = this._createChannel(new _eventEmitter.EventEmitter());
|
|
54
|
+
this._channel = this._createChannel(new _eventEmitter.EventEmitter(connection._platform));
|
|
56
55
|
this._initializer = initializer;
|
|
57
56
|
}
|
|
58
57
|
markAsInternalType() {
|
|
@@ -118,6 +117,13 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
|
118
117
|
objects: Array.from(this._objects.values()).map(o => o._debugScopeState())
|
|
119
118
|
};
|
|
120
119
|
}
|
|
120
|
+
_validatorToWireContext() {
|
|
121
|
+
return {
|
|
122
|
+
tChannelImpl: tChannelImplToWire,
|
|
123
|
+
binary: this._connection.rawBuffers() ? 'buffer' : 'toBase64',
|
|
124
|
+
isUnderTest: () => this._platform.isUnderTest()
|
|
125
|
+
};
|
|
126
|
+
}
|
|
121
127
|
_createChannel(base) {
|
|
122
128
|
const channel = new Proxy(base, {
|
|
123
129
|
get: (obj, prop) => {
|
|
@@ -126,16 +132,13 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
|
126
132
|
if (validator) {
|
|
127
133
|
return async params => {
|
|
128
134
|
return await this._wrapApiCall(async apiZone => {
|
|
129
|
-
const validatedParams = validator(params, '',
|
|
130
|
-
tChannelImpl: tChannelImplToWire,
|
|
131
|
-
binary: this._connection.rawBuffers() ? 'buffer' : 'toBase64'
|
|
132
|
-
});
|
|
135
|
+
const validatedParams = validator(params, '', this._validatorToWireContext());
|
|
133
136
|
if (!apiZone.isInternal && !apiZone.reported) {
|
|
134
137
|
// Reporting/tracing/logging this api call for the first time.
|
|
135
138
|
apiZone.params = params;
|
|
136
139
|
apiZone.reported = true;
|
|
137
140
|
this._instrumentation.onApiCallBegin(apiZone);
|
|
138
|
-
logApiCall(this._logger, `=> ${apiZone.apiName} started`);
|
|
141
|
+
logApiCall(this._platform, this._logger, `=> ${apiZone.apiName} started`);
|
|
139
142
|
return await this._connection.sendMessageToServer(this, prop, validatedParams, apiZone.apiName, apiZone.frames, apiZone.stepId);
|
|
140
143
|
}
|
|
141
144
|
// Since this api call is either internal, or has already been reported/traced once,
|
|
@@ -153,10 +156,10 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
|
153
156
|
}
|
|
154
157
|
async _wrapApiCall(func, isInternal) {
|
|
155
158
|
const logger = this._logger;
|
|
156
|
-
const existingApiZone =
|
|
159
|
+
const existingApiZone = this._platform.zones.current().data();
|
|
157
160
|
if (existingApiZone) return await func(existingApiZone);
|
|
158
161
|
if (isInternal === undefined) isInternal = this._isInternalType;
|
|
159
|
-
const stackTrace = (0,
|
|
162
|
+
const stackTrace = (0, _clientStackTrace.captureLibraryStackTrace)(this._platform);
|
|
160
163
|
const apiZone = {
|
|
161
164
|
apiName: stackTrace.apiName,
|
|
162
165
|
frames: stackTrace.frames,
|
|
@@ -166,20 +169,20 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
|
166
169
|
stepId: undefined
|
|
167
170
|
};
|
|
168
171
|
try {
|
|
169
|
-
const result = await
|
|
172
|
+
const result = await this._platform.zones.current().push(apiZone).run(async () => await func(apiZone));
|
|
170
173
|
if (!isInternal) {
|
|
171
|
-
logApiCall(logger, `<= ${apiZone.apiName} succeeded`);
|
|
174
|
+
logApiCall(this._platform, logger, `<= ${apiZone.apiName} succeeded`);
|
|
172
175
|
this._instrumentation.onApiCallEnd(apiZone);
|
|
173
176
|
}
|
|
174
177
|
return result;
|
|
175
178
|
} catch (e) {
|
|
176
|
-
const innerError = (
|
|
179
|
+
const innerError = (this._platform.showInternalStackFrames() || this._platform.isUnderTest()) && e.stack ? '\n<inner error>\n' + e.stack : '';
|
|
177
180
|
if (apiZone.apiName && !apiZone.apiName.includes('<anonymous>')) e.message = apiZone.apiName + ': ' + e.message;
|
|
178
181
|
const stackFrames = '\n' + (0, _stackTrace.stringifyStackFrames)(stackTrace.frames).join('\n') + innerError;
|
|
179
182
|
if (stackFrames.trim()) e.stack = e.message + stackFrames;else e.stack = '';
|
|
180
183
|
if (!isInternal) {
|
|
181
184
|
apiZone.error = e;
|
|
182
|
-
logApiCall(logger, `<= ${apiZone.apiName} failed`);
|
|
185
|
+
logApiCall(this._platform, logger, `<= ${apiZone.apiName} failed`);
|
|
183
186
|
this._instrumentation.onApiCallEnd(apiZone);
|
|
184
187
|
}
|
|
185
188
|
throw e;
|
|
@@ -201,11 +204,11 @@ class ChannelOwner extends _eventEmitter.EventEmitter {
|
|
|
201
204
|
}
|
|
202
205
|
}
|
|
203
206
|
exports.ChannelOwner = ChannelOwner;
|
|
204
|
-
function logApiCall(logger, message) {
|
|
207
|
+
function logApiCall(platform, logger, message) {
|
|
205
208
|
if (logger && logger.isEnabled('api', 'info')) logger.log('api', 'info', message, [], {
|
|
206
209
|
color: 'cyan'
|
|
207
210
|
});
|
|
208
|
-
|
|
211
|
+
platform.log('api', message);
|
|
209
212
|
}
|
|
210
213
|
function tChannelImplToWire(names, arg, path, context) {
|
|
211
214
|
if (arg._object instanceof ChannelOwner && (names === '*' || names.includes(arg._object._type))) return {
|