@checkly/playwright-core 1.42.18 → 1.47.11
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 +144 -109
- package/browsers.json +15 -25
- package/lib/androidServerImpl.js +1 -1
- package/lib/browserServerImpl.js +1 -1
- package/lib/cli/driver.js +1 -3
- package/lib/cli/program.js +5 -10
- package/lib/client/android.js +1 -1
- package/lib/client/api.js +7 -0
- package/lib/client/browserContext.js +37 -5
- package/lib/client/browserType.js +19 -11
- package/lib/client/channelOwner.js +19 -16
- package/lib/client/clientInstrumentation.js +17 -7
- package/lib/client/clock.js +68 -0
- package/lib/client/connection.js +9 -6
- package/lib/client/electron.js +7 -5
- package/lib/client/elementHandle.js +44 -14
- package/lib/client/eventEmitter.js +314 -0
- package/lib/client/fetch.js +81 -28
- package/lib/client/frame.js +2 -4
- package/lib/client/jsHandle.js +7 -1
- package/lib/client/locator.js +9 -0
- package/lib/client/network.js +12 -9
- package/lib/client/page.js +45 -23
- package/lib/client/playwright.js +3 -0
- package/lib/client/tracing.js +7 -4
- package/lib/common/socksProxy.js +2 -2
- package/lib/generated/clockSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/recorderSource.js +1 -1
- package/lib/generated/utilityScriptSource.js +1 -1
- package/lib/protocol/serializers.js +12 -11
- package/lib/protocol/validator.js +137 -55
- package/lib/server/bidi/bidiBrowser.js +296 -0
- package/lib/server/bidi/bidiConnection.js +206 -0
- package/lib/server/bidi/bidiExecutionContext.js +162 -0
- package/lib/server/bidi/bidiFirefox.js +110 -0
- package/lib/server/bidi/bidiInput.js +174 -0
- package/lib/server/bidi/bidiNetworkManager.js +304 -0
- package/lib/server/bidi/bidiPage.js +456 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
- package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
- package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
- package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
- package/lib/server/browser.js +9 -1
- package/lib/server/browserContext.js +97 -22
- package/lib/server/browserType.js +27 -20
- package/lib/server/chromium/chromium.js +30 -15
- package/lib/server/chromium/chromiumSwitches.js +6 -3
- package/lib/server/chromium/crBrowser.js +11 -17
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crDragDrop.js +28 -29
- package/lib/server/chromium/crNetworkManager.js +130 -84
- package/lib/server/chromium/crPage.js +34 -79
- package/lib/server/chromium/crProtocolHelper.js +3 -1
- package/lib/server/chromium/crServiceWorker.js +20 -23
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/clock.js +125 -0
- package/lib/server/codegen/csharp.js +299 -0
- package/lib/server/codegen/java.js +235 -0
- package/lib/server/codegen/javascript.js +223 -0
- package/lib/server/codegen/jsonl.js +47 -0
- package/lib/server/codegen/language.js +76 -0
- package/lib/server/codegen/languages.js +30 -0
- package/lib/server/codegen/python.js +265 -0
- package/lib/server/codegen/types.js +5 -0
- package/lib/server/debugController.js +3 -5
- package/lib/server/deviceDescriptors.js +9 -4
- package/lib/server/deviceDescriptorsSource.json +239 -119
- package/lib/server/dispatchers/androidDispatcher.js +1 -1
- package/lib/server/dispatchers/browserContextDispatcher.js +51 -7
- package/lib/server/dispatchers/dispatcher.js +36 -40
- package/lib/server/dispatchers/frameDispatcher.js +1 -2
- package/lib/server/dispatchers/jsHandleDispatcher.js +1 -1
- package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -6
- package/lib/server/dispatchers/localUtilsDispatcher.js +19 -5
- package/lib/server/dispatchers/networkDispatchers.js +2 -2
- package/lib/server/dispatchers/pageDispatcher.js +5 -2
- package/lib/server/dispatchers/playwrightDispatcher.js +1 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +8 -5
- package/lib/server/dom.js +90 -53
- package/lib/server/electron/electron.js +21 -4
- package/lib/server/fetch.js +74 -25
- package/lib/server/fileUploadUtils.js +7 -3
- package/lib/server/firefox/ffBrowser.js +36 -25
- package/lib/server/firefox/ffConnection.js +2 -2
- package/lib/server/firefox/ffNetworkManager.js +6 -4
- package/lib/server/firefox/ffPage.js +22 -24
- package/lib/server/firefox/firefox.js +25 -6
- package/lib/server/frameSelectors.js +2 -2
- package/lib/server/frames.js +205 -159
- package/lib/server/har/harTracer.js +4 -12
- package/lib/server/helper.js +3 -3
- package/lib/server/index.js +18 -0
- package/lib/server/input.js +18 -8
- package/lib/server/instrumentation.js +0 -4
- package/lib/server/isomorphic/utilityScriptSerializers.js +19 -5
- package/lib/server/javascript.js +3 -2
- package/lib/server/launchApp.js +3 -2
- package/lib/server/network.js +14 -4
- package/lib/server/page.js +75 -46
- package/lib/server/playwright.js +5 -2
- package/lib/server/recorder/codeGenerator.js +2 -1
- package/lib/server/recorder/contextRecorder.js +316 -0
- package/lib/server/recorder/csharp.js +2 -1
- package/lib/server/recorder/java.js +2 -1
- package/lib/server/recorder/javascript.js +2 -1
- package/lib/server/recorder/jsonl.js +2 -1
- package/lib/server/recorder/language.js +2 -1
- package/lib/server/recorder/python.js +2 -1
- package/lib/server/recorder/recorderApp.js +14 -5
- package/lib/server/recorder/recorderCollection.js +127 -0
- package/lib/server/recorder/recorderRunner.js +177 -0
- package/lib/server/recorder/recorderUtils.js +23 -0
- package/lib/server/recorder/throttledFile.js +46 -0
- package/lib/server/recorder/utils.js +2 -1
- package/lib/server/recorder.js +42 -418
- package/lib/server/registry/index.js +99 -100
- package/lib/server/registry/nativeDeps.js +107 -0
- package/lib/server/screenshotter.js +6 -12
- package/lib/server/socksClientCertificatesInterceptor.js +328 -0
- package/lib/server/trace/recorder/snapshotter.js +4 -1
- package/lib/server/trace/recorder/tracing.js +27 -96
- package/lib/server/trace/viewer/traceViewer.js +54 -67
- package/lib/server/transport.js +1 -1
- package/lib/server/webkit/webkit.js +5 -5
- package/lib/server/webkit/wkBrowser.js +14 -14
- package/lib/server/webkit/wkConnection.js +3 -3
- package/lib/server/webkit/wkInterceptableRequest.js +8 -4
- package/lib/server/webkit/wkPage.js +52 -34
- package/lib/server/webkit/wkProvisionalPage.js +36 -1
- package/lib/utils/crypto.js +141 -0
- package/lib/utils/debugLogger.js +2 -0
- package/lib/utils/env.js +4 -2
- package/lib/utils/expectUtils.js +33 -0
- package/lib/utils/fileUtils.js +140 -1
- package/lib/utils/glob.js +2 -1
- package/lib/utils/happy-eyeballs.js +29 -2
- package/lib/utils/hostPlatform.js +13 -4
- package/lib/utils/httpServer.js +54 -13
- package/lib/utils/index.js +53 -31
- package/lib/utils/isomorphic/cssTokenizer.js +1 -1
- package/lib/utils/isomorphic/locatorParser.js +1 -1
- package/lib/utils/isomorphic/mimeType.js +29 -0
- package/lib/utils/isomorphic/stringUtils.js +28 -1
- package/lib/utils/isomorphic/urlMatch.js +120 -0
- package/lib/utils/mimeType.js +2 -1
- package/lib/utils/network.js +7 -35
- package/lib/utils/stackTrace.js +2 -4
- package/lib/utils/timeoutRunner.js +11 -76
- package/lib/utils/zones.js +23 -60
- package/lib/utilsBundle.js +2 -1
- package/lib/utilsBundleImpl/index.js +33 -31
- package/lib/vite/htmlReport/index.html +12 -12
- package/lib/vite/recorder/assets/codeMirrorModule-BN0yUF4I.js +24 -0
- package/lib/vite/recorder/assets/{codicon-zGuYmc9o.ttf → codicon-DCmgc-ay.ttf} +0 -0
- package/lib/vite/recorder/assets/index-B-MT5gKo.css +1 -0
- package/lib/vite/recorder/assets/index-DVt3E1Ef.js +47 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
- package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- package/lib/vite/traceViewer/assets/workbench-Bjkiwcr1.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
- package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
- package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
- package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
- package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
- package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
- package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
- package/lib/vite/traceViewer/embedded.BVDVQOzc.js +2 -0
- package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
- package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
- package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
- package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
- package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
- package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
- package/lib/vite/traceViewer/embedded.html +16 -0
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
- package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
- package/lib/vite/traceViewer/index.B8dgQwuN.js +2 -0
- package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
- package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
- package/lib/vite/traceViewer/index.C0EgJ4oW.js +195 -0
- package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
- package/lib/vite/traceViewer/{index.-g_5lMbJ.css → index.CrbWWHbf.css} +1 -1
- package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
- package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
- package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
- package/lib/vite/traceViewer/index.html +5 -4
- package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
- package/lib/vite/traceViewer/snapshot.html +1 -1
- package/lib/vite/traceViewer/sw.bundle.js +3 -4
- package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
- package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
- package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
- package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
- package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +10 -0
- package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
- package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
- package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
- package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
- package/lib/vite/traceViewer/uiMode.html +5 -4
- package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
- package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
- package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
- package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
- package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
- package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
- package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
- package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
- package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
- package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
- package/package.json +2 -2
- package/types/protocol.d.ts +960 -78
- package/types/structs.d.ts +1 -1
- package/types/types.d.ts +3083 -2448
- package/lib/vite/recorder/assets/codeMirrorModule-W69B4LBB.js +0 -24
- package/lib/vite/recorder/assets/index-Ly3PcVUb.js +0 -47
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +0 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
- package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
- package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
- package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
- package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
- package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
- package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
- /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
- /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BidiPage = void 0;
|
|
7
|
+
var _eventsHelper = require("../../utils/eventsHelper");
|
|
8
|
+
var _utils = require("../../utils");
|
|
9
|
+
var dom = _interopRequireWildcard(require("../dom"));
|
|
10
|
+
var dialog = _interopRequireWildcard(require("../dialog"));
|
|
11
|
+
var _page = require("../page");
|
|
12
|
+
var _bidiInput = require("./bidiInput");
|
|
13
|
+
var bidi = _interopRequireWildcard(require("./third_party/bidiProtocol"));
|
|
14
|
+
var _bidiExecutionContext = require("./bidiExecutionContext");
|
|
15
|
+
var _bidiNetworkManager = require("./bidiNetworkManager");
|
|
16
|
+
var _browserContext = require("../browserContext");
|
|
17
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
18
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
19
|
+
/**
|
|
20
|
+
* Copyright (c) Microsoft Corporation.
|
|
21
|
+
*
|
|
22
|
+
* Licensed under the Apache License, Version 2.0 (the 'License');
|
|
23
|
+
* you may not use this file except in compliance with the License.
|
|
24
|
+
* You may obtain a copy of the License at
|
|
25
|
+
*
|
|
26
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
27
|
+
*
|
|
28
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
29
|
+
* distributed under the License is distributed on an 'AS IS' BASIS,
|
|
30
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
31
|
+
* See the License for the specific language governing permissions and
|
|
32
|
+
* limitations under the License.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
const UTILITY_WORLD_NAME = '__playwright_utility_world__';
|
|
36
|
+
class BidiPage {
|
|
37
|
+
constructor(browserContext, bidiSession, opener) {
|
|
38
|
+
this.rawMouse = void 0;
|
|
39
|
+
this.rawKeyboard = void 0;
|
|
40
|
+
this.rawTouchscreen = void 0;
|
|
41
|
+
this._page = void 0;
|
|
42
|
+
this._pagePromise = void 0;
|
|
43
|
+
this._session = void 0;
|
|
44
|
+
this._opener = void 0;
|
|
45
|
+
this._realmToContext = void 0;
|
|
46
|
+
this._sessionListeners = [];
|
|
47
|
+
this._browserContext = void 0;
|
|
48
|
+
this._networkManager = void 0;
|
|
49
|
+
this._initializedPage = null;
|
|
50
|
+
this._session = bidiSession;
|
|
51
|
+
this._opener = opener;
|
|
52
|
+
this.rawKeyboard = new _bidiInput.RawKeyboardImpl(bidiSession);
|
|
53
|
+
this.rawMouse = new _bidiInput.RawMouseImpl(bidiSession);
|
|
54
|
+
this.rawTouchscreen = new _bidiInput.RawTouchscreenImpl(bidiSession);
|
|
55
|
+
this._realmToContext = new Map();
|
|
56
|
+
this._page = new _page.Page(this, browserContext);
|
|
57
|
+
this._browserContext = browserContext;
|
|
58
|
+
this._networkManager = new _bidiNetworkManager.BidiNetworkManager(this._session, this._page, this._onNavigationResponseStarted.bind(this));
|
|
59
|
+
this._page.on(_page.Page.Events.FrameDetached, frame => this._removeContextsForFrame(frame, false));
|
|
60
|
+
this._sessionListeners = [_eventsHelper.eventsHelper.addEventListener(bidiSession, 'script.realmCreated', this._onRealmCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.contextDestroyed', this._onBrowsingContextDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationStarted', this._onNavigationStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationAborted', this._onNavigationAborted.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.navigationFailed', this._onNavigationFailed.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.fragmentNavigated', this._onFragmentNavigated.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.domContentLoaded', this._onDomContentLoaded.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.load', this._onLoad.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'browsingContext.userPromptOpened', this._onUserPromptOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(bidiSession, 'log.entryAdded', this._onLogEntryAdded.bind(this))];
|
|
61
|
+
|
|
62
|
+
// Initialize main frame.
|
|
63
|
+
this._pagePromise = this._initialize().finally(async () => {
|
|
64
|
+
await this._page.initOpener(this._opener);
|
|
65
|
+
}).then(() => {
|
|
66
|
+
this._initializedPage = this._page;
|
|
67
|
+
this._page.reportAsNew();
|
|
68
|
+
return this._page;
|
|
69
|
+
}).catch(e => {
|
|
70
|
+
this._page.reportAsNew(e);
|
|
71
|
+
return e;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async _initialize() {
|
|
75
|
+
const {
|
|
76
|
+
contexts
|
|
77
|
+
} = await this._session.send('browsingContext.getTree', {
|
|
78
|
+
root: this._session.sessionId
|
|
79
|
+
});
|
|
80
|
+
this._handleFrameTree(contexts[0]);
|
|
81
|
+
await Promise.all([this.updateHttpCredentials(), this.updateRequestInterception(), this._updateViewport()]);
|
|
82
|
+
}
|
|
83
|
+
_handleFrameTree(frameTree) {
|
|
84
|
+
this._onFrameAttached(frameTree.context, frameTree.parent || null);
|
|
85
|
+
if (!frameTree.children) return;
|
|
86
|
+
for (const child of frameTree.children) this._handleFrameTree(child);
|
|
87
|
+
}
|
|
88
|
+
potentiallyUninitializedPage() {
|
|
89
|
+
return this._page;
|
|
90
|
+
}
|
|
91
|
+
didClose() {
|
|
92
|
+
this._session.dispose();
|
|
93
|
+
_eventsHelper.eventsHelper.removeEventListeners(this._sessionListeners);
|
|
94
|
+
this._page._didClose();
|
|
95
|
+
}
|
|
96
|
+
async pageOrError() {
|
|
97
|
+
// TODO: Wait for first execution context to be created and maybe about:blank navigated.
|
|
98
|
+
return this._pagePromise;
|
|
99
|
+
}
|
|
100
|
+
_onFrameAttached(frameId, parentFrameId) {
|
|
101
|
+
return this._page._frameManager.frameAttached(frameId, parentFrameId);
|
|
102
|
+
}
|
|
103
|
+
_removeContextsForFrame(frame, notifyFrame) {
|
|
104
|
+
for (const [contextId, context] of this._realmToContext) {
|
|
105
|
+
if (context.frame === frame) {
|
|
106
|
+
this._realmToContext.delete(contextId);
|
|
107
|
+
if (notifyFrame) frame._contextDestroyed(context);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
_onRealmCreated(realmInfo) {
|
|
112
|
+
if (this._realmToContext.has(realmInfo.realm)) return;
|
|
113
|
+
if (realmInfo.type !== 'window') return;
|
|
114
|
+
const frame = this._page._frameManager.frame(realmInfo.context);
|
|
115
|
+
if (!frame) return;
|
|
116
|
+
const delegate = new _bidiExecutionContext.BidiExecutionContext(this._session, realmInfo);
|
|
117
|
+
let worldName;
|
|
118
|
+
if (!realmInfo.sandbox) {
|
|
119
|
+
worldName = 'main';
|
|
120
|
+
// Force creating utility world every time the main world is created (e.g. due to navigation).
|
|
121
|
+
this._touchUtilityWorld(realmInfo.context);
|
|
122
|
+
} else if (realmInfo.sandbox === UTILITY_WORLD_NAME) {
|
|
123
|
+
worldName = 'utility';
|
|
124
|
+
} else {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const context = new dom.FrameExecutionContext(delegate, frame, worldName);
|
|
128
|
+
context[contextDelegateSymbol] = delegate;
|
|
129
|
+
frame._contextCreated(worldName, context);
|
|
130
|
+
this._realmToContext.set(realmInfo.realm, context);
|
|
131
|
+
}
|
|
132
|
+
async _touchUtilityWorld(context) {
|
|
133
|
+
await this._session.sendMayFail('script.evaluate', {
|
|
134
|
+
expression: '1 + 1',
|
|
135
|
+
target: {
|
|
136
|
+
context,
|
|
137
|
+
sandbox: UTILITY_WORLD_NAME
|
|
138
|
+
},
|
|
139
|
+
serializationOptions: {
|
|
140
|
+
maxObjectDepth: 10,
|
|
141
|
+
maxDomDepth: 10
|
|
142
|
+
},
|
|
143
|
+
awaitPromise: true,
|
|
144
|
+
userActivation: true
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
_onRealmDestroyed(params) {
|
|
148
|
+
const context = this._realmToContext.get(params.realm);
|
|
149
|
+
if (!context) return false;
|
|
150
|
+
this._realmToContext.delete(params.realm);
|
|
151
|
+
context.frame._contextDestroyed(context);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// TODO: route the message directly to the browser
|
|
156
|
+
_onBrowsingContextDestroyed(params) {
|
|
157
|
+
this._browserContext._browser._onBrowsingContextDestroyed(params);
|
|
158
|
+
}
|
|
159
|
+
_onNavigationStarted(params) {
|
|
160
|
+
const frameId = params.context;
|
|
161
|
+
this._page._frameManager.frameRequestedNavigation(frameId, params.navigation);
|
|
162
|
+
const url = params.url.toLowerCase();
|
|
163
|
+
if (url.startsWith('file:') || url.startsWith('data:') || url === 'about:blank') {
|
|
164
|
+
// Navigation to file urls doesn't emit network events, so we fire 'commit' event right when navigation is started.
|
|
165
|
+
// Doing it in domcontentload would be too late as we'd clear frame tree.
|
|
166
|
+
const frame = this._page._frameManager.frame(frameId);
|
|
167
|
+
if (frame) this._page._frameManager.frameCommittedNewDocumentNavigation(frameId, params.url, '', params.navigation, /* initial */false);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// TODO: there is no separate event for committed navigation, so we approximate it with responseStarted.
|
|
172
|
+
_onNavigationResponseStarted(params) {
|
|
173
|
+
const frameId = params.context;
|
|
174
|
+
const frame = this._page._frameManager.frame(frameId);
|
|
175
|
+
(0, _utils.assert)(frame);
|
|
176
|
+
this._page._frameManager.frameCommittedNewDocumentNavigation(frameId, params.response.url, '', params.navigation, /* initial */false);
|
|
177
|
+
// if (!initial)
|
|
178
|
+
// this._firstNonInitialNavigationCommittedFulfill();
|
|
179
|
+
}
|
|
180
|
+
_onDomContentLoaded(params) {
|
|
181
|
+
const frameId = params.context;
|
|
182
|
+
this._page._frameManager.frameLifecycleEvent(frameId, 'domcontentloaded');
|
|
183
|
+
}
|
|
184
|
+
_onLoad(params) {
|
|
185
|
+
this._page._frameManager.frameLifecycleEvent(params.context, 'load');
|
|
186
|
+
}
|
|
187
|
+
_onNavigationAborted(params) {
|
|
188
|
+
this._page._frameManager.frameAbortedNavigation(params.context, 'Navigation aborted', params.navigation || undefined);
|
|
189
|
+
}
|
|
190
|
+
_onNavigationFailed(params) {
|
|
191
|
+
this._page._frameManager.frameAbortedNavigation(params.context, 'Navigation failed', params.navigation || undefined);
|
|
192
|
+
}
|
|
193
|
+
_onFragmentNavigated(params) {
|
|
194
|
+
this._page._frameManager.frameCommittedSameDocumentNavigation(params.context, params.url);
|
|
195
|
+
}
|
|
196
|
+
_onUserPromptOpened(event) {
|
|
197
|
+
this._page.emitOnContext(_browserContext.BrowserContext.Events.Dialog, new dialog.Dialog(this._page, event.type, event.message, async (accept, userText) => {
|
|
198
|
+
await this._session.send('browsingContext.handleUserPrompt', {
|
|
199
|
+
context: event.context,
|
|
200
|
+
accept,
|
|
201
|
+
userText
|
|
202
|
+
});
|
|
203
|
+
}, event.defaultValue));
|
|
204
|
+
}
|
|
205
|
+
_onLogEntryAdded(params) {
|
|
206
|
+
var _params$stackTrace;
|
|
207
|
+
if (params.type !== 'console') return;
|
|
208
|
+
const entry = params;
|
|
209
|
+
const context = this._realmToContext.get(params.source.realm);
|
|
210
|
+
if (!context) return;
|
|
211
|
+
const callFrame = (_params$stackTrace = params.stackTrace) === null || _params$stackTrace === void 0 ? void 0 : _params$stackTrace.callFrames[0];
|
|
212
|
+
const location = callFrame !== null && callFrame !== void 0 ? callFrame : {
|
|
213
|
+
url: '',
|
|
214
|
+
lineNumber: 1,
|
|
215
|
+
columnNumber: 1
|
|
216
|
+
};
|
|
217
|
+
this._page._addConsoleMessage(entry.method, entry.args.map(arg => context.createHandle({
|
|
218
|
+
objectId: arg.handle,
|
|
219
|
+
...arg
|
|
220
|
+
})), location, params.text || undefined);
|
|
221
|
+
}
|
|
222
|
+
async navigateFrame(frame, url, referrer) {
|
|
223
|
+
const {
|
|
224
|
+
navigation
|
|
225
|
+
} = await this._session.send('browsingContext.navigate', {
|
|
226
|
+
context: frame._id,
|
|
227
|
+
url
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
newDocumentId: navigation || undefined
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
async updateExtraHTTPHeaders() {}
|
|
234
|
+
async updateEmulateMedia() {}
|
|
235
|
+
async updateEmulatedViewportSize() {
|
|
236
|
+
await this._updateViewport();
|
|
237
|
+
}
|
|
238
|
+
async updateUserAgent() {}
|
|
239
|
+
async bringToFront() {}
|
|
240
|
+
async _updateViewport() {
|
|
241
|
+
const options = this._browserContext._options;
|
|
242
|
+
const deviceSize = this._page.emulatedSize();
|
|
243
|
+
if (deviceSize === null) return;
|
|
244
|
+
const viewportSize = deviceSize.viewport;
|
|
245
|
+
await this._session.send('browsingContext.setViewport', {
|
|
246
|
+
context: this._session.sessionId,
|
|
247
|
+
viewport: {
|
|
248
|
+
width: viewportSize.width,
|
|
249
|
+
height: viewportSize.height
|
|
250
|
+
},
|
|
251
|
+
devicePixelRatio: options.deviceScaleFactor || 1
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async updateRequestInterception() {
|
|
255
|
+
await this._networkManager.setRequestInterception(this._page.needsRequestInterception());
|
|
256
|
+
}
|
|
257
|
+
async updateOffline() {}
|
|
258
|
+
async updateHttpCredentials() {
|
|
259
|
+
await this._networkManager.setCredentials(this._browserContext._options.httpCredentials);
|
|
260
|
+
}
|
|
261
|
+
async updateFileChooserInterception() {}
|
|
262
|
+
async reload() {
|
|
263
|
+
await this._session.send('browsingContext.reload', {
|
|
264
|
+
context: this._session.sessionId,
|
|
265
|
+
// ignoreCache: true,
|
|
266
|
+
wait: bidi.BrowsingContext.ReadinessState.Interactive
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
goBack() {
|
|
270
|
+
throw new Error('Method not implemented.');
|
|
271
|
+
}
|
|
272
|
+
goForward() {
|
|
273
|
+
throw new Error('Method not implemented.');
|
|
274
|
+
}
|
|
275
|
+
async addInitScript(initScript) {
|
|
276
|
+
await this._updateBootstrapScript();
|
|
277
|
+
}
|
|
278
|
+
async removeNonInternalInitScripts() {
|
|
279
|
+
await this._updateBootstrapScript();
|
|
280
|
+
}
|
|
281
|
+
async _updateBootstrapScript() {
|
|
282
|
+
throw new Error('Method not implemented.');
|
|
283
|
+
}
|
|
284
|
+
async closePage(runBeforeUnload) {
|
|
285
|
+
await this._session.send('browsingContext.close', {
|
|
286
|
+
context: this._session.sessionId,
|
|
287
|
+
promptUnload: runBeforeUnload
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
async setBackgroundColor(color) {}
|
|
291
|
+
async takeScreenshot(progress, format, documentRect, viewportRect, quality, fitsViewport, scale) {
|
|
292
|
+
throw new Error('Method not implemented.');
|
|
293
|
+
}
|
|
294
|
+
async getContentFrame(handle) {
|
|
295
|
+
const executionContext = toBidiExecutionContext(handle._context);
|
|
296
|
+
const contentWindow = await executionContext.rawCallFunction('e => e.contentWindow', {
|
|
297
|
+
handle: handle._objectId
|
|
298
|
+
});
|
|
299
|
+
if (contentWindow.type === 'window') {
|
|
300
|
+
const frameId = contentWindow.value.context;
|
|
301
|
+
const result = this._page._frameManager.frame(frameId);
|
|
302
|
+
return result;
|
|
303
|
+
}
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
async getOwnerFrame(handle) {
|
|
307
|
+
throw new Error('Method not implemented.');
|
|
308
|
+
}
|
|
309
|
+
isElementHandle(remoteObject) {
|
|
310
|
+
return remoteObject.type === 'node';
|
|
311
|
+
}
|
|
312
|
+
async getBoundingBox(handle) {
|
|
313
|
+
const box = await handle.evaluate(element => {
|
|
314
|
+
if (!(element instanceof Element)) return null;
|
|
315
|
+
const rect = element.getBoundingClientRect();
|
|
316
|
+
return {
|
|
317
|
+
x: rect.x,
|
|
318
|
+
y: rect.y,
|
|
319
|
+
width: rect.width,
|
|
320
|
+
height: rect.height
|
|
321
|
+
};
|
|
322
|
+
});
|
|
323
|
+
if (!box) return null;
|
|
324
|
+
const position = await this._framePosition(handle._frame);
|
|
325
|
+
if (!position) return null;
|
|
326
|
+
box.x += position.x;
|
|
327
|
+
box.y += position.y;
|
|
328
|
+
return box;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// TODO: move to Frame.
|
|
332
|
+
async _framePosition(frame) {
|
|
333
|
+
if (frame === this._page.mainFrame()) return {
|
|
334
|
+
x: 0,
|
|
335
|
+
y: 0
|
|
336
|
+
};
|
|
337
|
+
const element = await frame.frameElement();
|
|
338
|
+
const box = await element.boundingBox();
|
|
339
|
+
if (!box) return null;
|
|
340
|
+
const style = await element.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch(e => 'error:notconnected');
|
|
341
|
+
if (style === 'error:notconnected' || style === 'transformed') return null;
|
|
342
|
+
// Content box is offset by border and padding widths.
|
|
343
|
+
box.x += style.left;
|
|
344
|
+
box.y += style.top;
|
|
345
|
+
return box;
|
|
346
|
+
}
|
|
347
|
+
async scrollRectIntoViewIfNeeded(handle, rect) {
|
|
348
|
+
return await handle.evaluateInUtility(([injected, node]) => {
|
|
349
|
+
node.scrollIntoView({
|
|
350
|
+
block: 'center',
|
|
351
|
+
inline: 'center',
|
|
352
|
+
behavior: 'instant'
|
|
353
|
+
});
|
|
354
|
+
}, null).then(() => 'done').catch(e => {
|
|
355
|
+
if (e instanceof Error && e.message.includes('Node is detached from document')) return 'error:notconnected';
|
|
356
|
+
if (e instanceof Error && e.message.includes('Node does not have a layout object')) return 'error:notvisible';
|
|
357
|
+
throw e;
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
async setScreencastOptions(options) {}
|
|
361
|
+
rafCountForStablePosition() {
|
|
362
|
+
return 1;
|
|
363
|
+
}
|
|
364
|
+
async getContentQuads(handle) {
|
|
365
|
+
const quads = await handle.evaluateInUtility(([injected, node]) => {
|
|
366
|
+
if (!node.isConnected) return 'error:notconnected';
|
|
367
|
+
const rects = node.getClientRects();
|
|
368
|
+
if (!rects) return null;
|
|
369
|
+
return [...rects].map(rect => [{
|
|
370
|
+
x: rect.left,
|
|
371
|
+
y: rect.top
|
|
372
|
+
}, {
|
|
373
|
+
x: rect.right,
|
|
374
|
+
y: rect.top
|
|
375
|
+
}, {
|
|
376
|
+
x: rect.right,
|
|
377
|
+
y: rect.bottom
|
|
378
|
+
}, {
|
|
379
|
+
x: rect.left,
|
|
380
|
+
y: rect.bottom
|
|
381
|
+
}]);
|
|
382
|
+
}, null);
|
|
383
|
+
if (!quads || quads === 'error:notconnected') return quads;
|
|
384
|
+
// TODO: consider transforming quads to support clicks in iframes.
|
|
385
|
+
const position = await this._framePosition(handle._frame);
|
|
386
|
+
if (!position) return null;
|
|
387
|
+
quads.forEach(quad => quad.forEach(point => {
|
|
388
|
+
point.x += position.x;
|
|
389
|
+
point.y += position.y;
|
|
390
|
+
}));
|
|
391
|
+
return quads;
|
|
392
|
+
}
|
|
393
|
+
async setInputFiles(handle, files) {
|
|
394
|
+
throw new Error('Method not implemented.');
|
|
395
|
+
}
|
|
396
|
+
async setInputFilePaths(handle, paths) {
|
|
397
|
+
throw new Error('Method not implemented.');
|
|
398
|
+
}
|
|
399
|
+
async adoptElementHandle(handle, to) {
|
|
400
|
+
const fromContext = toBidiExecutionContext(handle._context);
|
|
401
|
+
const shared = await fromContext.rawCallFunction('x => x', {
|
|
402
|
+
handle: handle._objectId
|
|
403
|
+
});
|
|
404
|
+
// TODO: store sharedId in the handle.
|
|
405
|
+
if (!('sharedId' in shared)) throw new Error('Element is not a node');
|
|
406
|
+
const sharedId = shared.sharedId;
|
|
407
|
+
const executionContext = toBidiExecutionContext(to);
|
|
408
|
+
const result = await executionContext.rawCallFunction('x => x', {
|
|
409
|
+
sharedId
|
|
410
|
+
});
|
|
411
|
+
if ('handle' in result) return to.createHandle({
|
|
412
|
+
objectId: result.handle,
|
|
413
|
+
...result
|
|
414
|
+
});
|
|
415
|
+
throw new Error('Failed to adopt element handle.');
|
|
416
|
+
}
|
|
417
|
+
async getAccessibilityTree(needle) {
|
|
418
|
+
throw new Error('Method not implemented.');
|
|
419
|
+
}
|
|
420
|
+
async inputActionEpilogue() {}
|
|
421
|
+
async resetForReuse() {}
|
|
422
|
+
async getFrameElement(frame) {
|
|
423
|
+
const parent = frame.parentFrame();
|
|
424
|
+
if (!parent) throw new Error('Frame has been detached.');
|
|
425
|
+
const parentContext = await parent._mainContext();
|
|
426
|
+
const list = await parentContext.evaluateHandle(() => {
|
|
427
|
+
return [...document.querySelectorAll('iframe,frame')];
|
|
428
|
+
});
|
|
429
|
+
const length = await list.evaluate(list => list.length);
|
|
430
|
+
let foundElement = null;
|
|
431
|
+
for (let i = 0; i < length; i++) {
|
|
432
|
+
const element = await list.evaluateHandle((list, i) => list[i], i);
|
|
433
|
+
const candidate = await element.contentFrame();
|
|
434
|
+
if (frame === candidate) {
|
|
435
|
+
foundElement = element;
|
|
436
|
+
break;
|
|
437
|
+
} else {
|
|
438
|
+
element.dispose();
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
list.dispose();
|
|
442
|
+
if (!foundElement) throw new Error('Frame has been detached.');
|
|
443
|
+
return foundElement;
|
|
444
|
+
}
|
|
445
|
+
shouldToggleStyleSheetToSyncAnimations() {
|
|
446
|
+
return true;
|
|
447
|
+
}
|
|
448
|
+
useMainWorldForSetContent() {
|
|
449
|
+
return true;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
exports.BidiPage = BidiPage;
|
|
453
|
+
function toBidiExecutionContext(executionContext) {
|
|
454
|
+
return executionContext[contextDelegateSymbol];
|
|
455
|
+
}
|
|
456
|
+
const contextDelegateSymbol = Symbol('delegate');
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BidiDeserializer = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* @license
|
|
9
|
+
* Copyright 2024 Google Inc.
|
|
10
|
+
* Modifications copyright (c) Microsoft Corporation.
|
|
11
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/* eslint-disable object-curly-spacing */
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
class BidiDeserializer {
|
|
20
|
+
static deserialize(result) {
|
|
21
|
+
var _result$value, _result$value2, _result$value3, _result$value4;
|
|
22
|
+
if (!result) return undefined;
|
|
23
|
+
switch (result.type) {
|
|
24
|
+
case 'array':
|
|
25
|
+
return (_result$value = result.value) === null || _result$value === void 0 ? void 0 : _result$value.map(value => {
|
|
26
|
+
return BidiDeserializer.deserialize(value);
|
|
27
|
+
});
|
|
28
|
+
case 'set':
|
|
29
|
+
return (_result$value2 = result.value) === null || _result$value2 === void 0 ? void 0 : _result$value2.reduce((acc, value) => {
|
|
30
|
+
return acc.add(BidiDeserializer.deserialize(value));
|
|
31
|
+
}, new Set());
|
|
32
|
+
case 'object':
|
|
33
|
+
return (_result$value3 = result.value) === null || _result$value3 === void 0 ? void 0 : _result$value3.reduce((acc, tuple) => {
|
|
34
|
+
const {
|
|
35
|
+
key,
|
|
36
|
+
value
|
|
37
|
+
} = BidiDeserializer._deserializeTuple(tuple);
|
|
38
|
+
acc[key] = value;
|
|
39
|
+
return acc;
|
|
40
|
+
}, {});
|
|
41
|
+
case 'map':
|
|
42
|
+
return (_result$value4 = result.value) === null || _result$value4 === void 0 ? void 0 : _result$value4.reduce((acc, tuple) => {
|
|
43
|
+
const {
|
|
44
|
+
key,
|
|
45
|
+
value
|
|
46
|
+
} = BidiDeserializer._deserializeTuple(tuple);
|
|
47
|
+
return acc.set(key, value);
|
|
48
|
+
}, new Map());
|
|
49
|
+
case 'promise':
|
|
50
|
+
return {};
|
|
51
|
+
case 'regexp':
|
|
52
|
+
return new RegExp(result.value.pattern, result.value.flags);
|
|
53
|
+
case 'date':
|
|
54
|
+
return new Date(result.value);
|
|
55
|
+
case 'undefined':
|
|
56
|
+
return undefined;
|
|
57
|
+
case 'null':
|
|
58
|
+
return null;
|
|
59
|
+
case 'number':
|
|
60
|
+
return BidiDeserializer._deserializeNumber(result.value);
|
|
61
|
+
case 'bigint':
|
|
62
|
+
return BigInt(result.value);
|
|
63
|
+
case 'boolean':
|
|
64
|
+
return Boolean(result.value);
|
|
65
|
+
case 'string':
|
|
66
|
+
return result.value;
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`Deserialization of type ${result.type} not supported.`);
|
|
69
|
+
}
|
|
70
|
+
static _deserializeNumber(value) {
|
|
71
|
+
switch (value) {
|
|
72
|
+
case '-0':
|
|
73
|
+
return -0;
|
|
74
|
+
case 'NaN':
|
|
75
|
+
return NaN;
|
|
76
|
+
case 'Infinity':
|
|
77
|
+
return Infinity;
|
|
78
|
+
case '-Infinity':
|
|
79
|
+
return -Infinity;
|
|
80
|
+
default:
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
static _deserializeTuple([serializedKey, serializedValue]) {
|
|
85
|
+
const key = typeof serializedKey === 'string' ? serializedKey : BidiDeserializer.deserialize(serializedKey);
|
|
86
|
+
const value = BidiDeserializer.deserialize(serializedValue);
|
|
87
|
+
return {
|
|
88
|
+
key,
|
|
89
|
+
value
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.BidiDeserializer = BidiDeserializer;
|