patchright-core 1.50.1 → 1.51.1
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
package/lib/server/frames.js
CHANGED
|
@@ -8,26 +8,27 @@ var _crExecutionContext = require("./chromium/crExecutionContext");
|
|
|
8
8
|
var _dom = _interopRequireWildcard(require("./dom"));
|
|
9
9
|
var dom = _dom;
|
|
10
10
|
var _crypto = _interopRequireDefault(require("crypto"));
|
|
11
|
+
var _browserContext = require("./browserContext");
|
|
12
|
+
var _errors = require("./errors");
|
|
13
|
+
var _fileUploadUtils = require("./fileUploadUtils");
|
|
14
|
+
var _frameSelectors = require("./frameSelectors");
|
|
11
15
|
var _helper = require("./helper");
|
|
12
|
-
var
|
|
16
|
+
var _instrumentation = require("./instrumentation");
|
|
13
17
|
var js = _interopRequireWildcard(require("./javascript"));
|
|
14
18
|
var network = _interopRequireWildcard(require("./network"));
|
|
15
19
|
var _page = require("./page");
|
|
16
|
-
var types = _interopRequireWildcard(require("./types"));
|
|
17
|
-
var _browserContext = require("./browserContext");
|
|
18
20
|
var _progress = require("./progress");
|
|
21
|
+
var types = _interopRequireWildcard(require("./types"));
|
|
19
22
|
var _utils = require("../utils");
|
|
20
|
-
var
|
|
21
|
-
var _debugLogger = require("
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
var _fileUploadUtils = require("./fileUploadUtils");
|
|
28
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
+
var _protocolError2 = require("./protocolError");
|
|
24
|
+
var _debugLogger = require("./utils/debugLogger");
|
|
25
|
+
var _eventsHelper = require("./utils/eventsHelper");
|
|
26
|
+
var _selectorParser2 = require("../utils/isomorphic/selectorParser");
|
|
27
|
+
var _manualPromise = require("../utils/isomorphic/manualPromise");
|
|
28
|
+
var _callLog = require("./callLog");
|
|
29
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
29
30
|
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); }
|
|
30
|
-
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 &&
|
|
31
|
+
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; }
|
|
31
32
|
// undetected-undetected_playwright-patch - custom imports
|
|
32
33
|
|
|
33
34
|
/**
|
|
@@ -735,49 +736,28 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
735
736
|
const {
|
|
736
737
|
state = 'visible'
|
|
737
738
|
} = options;
|
|
738
|
-
const promise = this.
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
} else if (element) {
|
|
759
|
-
log = ` locator resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`;
|
|
739
|
+
const promise = this._retryWithProgressIfNotConnected(progress, selector, options.strict, true, async handle => {
|
|
740
|
+
const attached = !!handle;
|
|
741
|
+
var visible = false;
|
|
742
|
+
if (attached) {
|
|
743
|
+
if (handle.parentNode.constructor.name == "ElementHandle") {
|
|
744
|
+
visible = await handle.parentNode.evaluateInUtility(([injected, node, {
|
|
745
|
+
handle
|
|
746
|
+
}]) => {
|
|
747
|
+
return handle ? injected.utils.isElementVisible(handle) : false;
|
|
748
|
+
}, {
|
|
749
|
+
handle
|
|
750
|
+
});
|
|
751
|
+
} else {
|
|
752
|
+
visible = await handle.parentNode.evaluate((injected, {
|
|
753
|
+
handle
|
|
754
|
+
}) => {
|
|
755
|
+
return handle ? injected.utils.isElementVisible(handle) : false;
|
|
756
|
+
}, {
|
|
757
|
+
handle
|
|
758
|
+
});
|
|
760
759
|
}
|
|
761
|
-
|
|
762
|
-
log,
|
|
763
|
-
element,
|
|
764
|
-
visible,
|
|
765
|
-
attached: !!element
|
|
766
|
-
};
|
|
767
|
-
}, {
|
|
768
|
-
info: resolved.info,
|
|
769
|
-
root: resolved.frame === this ? scope : undefined
|
|
770
|
-
});
|
|
771
|
-
const {
|
|
772
|
-
log,
|
|
773
|
-
visible,
|
|
774
|
-
attached
|
|
775
|
-
} = await result.evaluate(r => ({
|
|
776
|
-
log: r.log,
|
|
777
|
-
visible: r.visible,
|
|
778
|
-
attached: r.attached
|
|
779
|
-
}));
|
|
780
|
-
if (log) progress.log(log);
|
|
760
|
+
}
|
|
781
761
|
const success = {
|
|
782
762
|
attached,
|
|
783
763
|
detached: !attached,
|
|
@@ -785,23 +765,20 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
785
765
|
hidden: !visible
|
|
786
766
|
}[state];
|
|
787
767
|
if (!success) {
|
|
788
|
-
|
|
789
|
-
return continuePolling;
|
|
768
|
+
return "internal:continuepolling";
|
|
790
769
|
}
|
|
791
770
|
if (options.omitReturnValue) {
|
|
792
|
-
result.dispose();
|
|
793
771
|
return null;
|
|
794
772
|
}
|
|
795
|
-
const element = state === 'attached' || state === 'visible' ?
|
|
796
|
-
result.dispose();
|
|
773
|
+
const element = state === 'attached' || state === 'visible' ? handle : null;
|
|
797
774
|
if (!element) return null;
|
|
798
775
|
if (options.__testHookBeforeAdoptNode) await options.__testHookBeforeAdoptNode();
|
|
799
776
|
try {
|
|
800
|
-
return
|
|
777
|
+
return element;
|
|
801
778
|
} catch (e) {
|
|
802
|
-
return
|
|
779
|
+
return "internal:continuepolling";
|
|
803
780
|
}
|
|
804
|
-
});
|
|
781
|
+
}, 'returnOnNotResolved');
|
|
805
782
|
return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
|
|
806
783
|
}
|
|
807
784
|
async dispatchEvent(metadata, selector, type, eventInit = {}, options = {}, scope) {
|
|
@@ -863,7 +840,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
863
840
|
return retVal;
|
|
864
841
|
});
|
|
865
842
|
} catch (e) {
|
|
866
|
-
if (js.isJavaScriptErrorInEvaluate(e) || (0,
|
|
843
|
+
if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError2.isSessionClosedError)(e)) throw e;
|
|
867
844
|
throw new Error(`Unable to retrieve content because the page is navigating and changing the content.`);
|
|
868
845
|
}
|
|
869
846
|
}
|
|
@@ -1053,70 +1030,78 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1053
1030
|
}
|
|
1054
1031
|
_isErrorThatCannotBeRetried(e) {
|
|
1055
1032
|
// Always fail on JavaScript errors or when the main connection is closed.
|
|
1056
|
-
if (js.isJavaScriptErrorInEvaluate(e) || (0,
|
|
1033
|
+
if (js.isJavaScriptErrorInEvaluate(e) || (0, _protocolError2.isSessionClosedError)(e)) return true;
|
|
1057
1034
|
// Certain errors opt-out of the retries, throw.
|
|
1058
|
-
if (dom.isNonRecoverableDOMError(e) || (0,
|
|
1035
|
+
if (dom.isNonRecoverableDOMError(e) || (0, _selectorParser2.isInvalidSelectorError)(e)) return true;
|
|
1059
1036
|
// If the call is made on the detached frame - throw.
|
|
1060
1037
|
if (this.isDetached()) return true;
|
|
1061
1038
|
// Retry upon all other errors.
|
|
1062
1039
|
return false;
|
|
1063
1040
|
}
|
|
1064
|
-
async _retryWithProgressIfNotConnected(progress, selector, strict, performActionPreChecks, action) {
|
|
1065
|
-
progress.log(
|
|
1041
|
+
async _retryWithProgressIfNotConnected(progress, selector, strict, performActionPreChecks, action, returnAction) {
|
|
1042
|
+
progress.log("waiting for " + this._asLocator(selector));
|
|
1066
1043
|
return this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
|
|
1067
1044
|
if (performActionPreChecks) await this._page.performActionPreChecks(progress);
|
|
1068
1045
|
const resolved = await this.selectors.resolveInjectedForSelector(selector, {
|
|
1069
1046
|
strict
|
|
1070
1047
|
});
|
|
1071
1048
|
progress.throwIfAborted();
|
|
1072
|
-
if (!resolved)
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
log,
|
|
1089
|
-
success: !!element,
|
|
1090
|
-
element
|
|
1091
|
-
};
|
|
1092
|
-
}, {
|
|
1093
|
-
info: resolved.info,
|
|
1094
|
-
callId: progress.metadata.id
|
|
1049
|
+
if (!resolved) {
|
|
1050
|
+
if (returnAction === 'returnOnNotResolved' || returnAction === 'returnAll') return null;
|
|
1051
|
+
return continuePolling;
|
|
1052
|
+
}
|
|
1053
|
+
try {
|
|
1054
|
+
var client = this._page._delegate._sessionForFrame(resolved.frame)._client;
|
|
1055
|
+
} catch (e) {
|
|
1056
|
+
var client = this._page._delegate._mainFrameSession._client;
|
|
1057
|
+
}
|
|
1058
|
+
var context = await resolved.frame._context("main");
|
|
1059
|
+
const documentNode = await client.send('Runtime.evaluate', {
|
|
1060
|
+
expression: "document",
|
|
1061
|
+
serializationOptions: {
|
|
1062
|
+
serialization: "idOnly"
|
|
1063
|
+
},
|
|
1064
|
+
contextId: context.delegate._contextId
|
|
1095
1065
|
});
|
|
1096
|
-
const
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
success: r.success
|
|
1102
|
-
}));
|
|
1103
|
-
if (log) progress.log(log);
|
|
1104
|
-
if (!success) {
|
|
1105
|
-
result.dispose();
|
|
1066
|
+
const documentScope = new dom.ElementHandle(context, documentNode.result.objectId);
|
|
1067
|
+
const currentScopingElements = await this._customFindElementsByParsed(resolved, client, context, documentScope, progress, resolved.info.parsed);
|
|
1068
|
+
if (currentScopingElements.length == 0) {
|
|
1069
|
+
// TODO: Dispose?
|
|
1070
|
+
if (returnAction === 'returnOnNotResolved' || returnAction === 'returnAll') return null;
|
|
1106
1071
|
return continuePolling;
|
|
1107
1072
|
}
|
|
1108
|
-
const
|
|
1109
|
-
|
|
1073
|
+
const resultElement = currentScopingElements[0];
|
|
1074
|
+
if (currentScopingElements.length > 1) {
|
|
1075
|
+
if (resolved.info.strict) {
|
|
1076
|
+
await resolved.injected.evaluateHandle((injected, {
|
|
1077
|
+
info,
|
|
1078
|
+
elements
|
|
1079
|
+
}) => {
|
|
1080
|
+
throw injected.strictModeViolationError(info.parsed, elements);
|
|
1081
|
+
}, {
|
|
1082
|
+
info: resolved.info,
|
|
1083
|
+
elements: currentScopingElements
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
progress.log(" locator resolved to " + currentScopingElements.length + " elements. Proceeding with the first one: " + resultElement.preview());
|
|
1087
|
+
} else if (resultElement) {
|
|
1088
|
+
progress.log(" locator resolved to " + resultElement.preview());
|
|
1089
|
+
}
|
|
1110
1090
|
try {
|
|
1111
|
-
|
|
1091
|
+
var result = null;
|
|
1092
|
+
if (returnAction === 'returnAll') {
|
|
1093
|
+
result = await action([resultElement, currentScopingElements]);
|
|
1094
|
+
} else {
|
|
1095
|
+
result = await action(resultElement);
|
|
1096
|
+
}
|
|
1112
1097
|
if (result === 'error:notconnected') {
|
|
1113
1098
|
progress.log('element was detached from the DOM, retrying');
|
|
1114
1099
|
return continuePolling;
|
|
1100
|
+
} else if (result === 'internal:continuepolling') {
|
|
1101
|
+
return continuePolling;
|
|
1115
1102
|
}
|
|
1116
1103
|
return result;
|
|
1117
|
-
} finally {
|
|
1118
|
-
element === null || element === void 0 || element.dispose();
|
|
1119
|
-
}
|
|
1104
|
+
} finally {}
|
|
1120
1105
|
});
|
|
1121
1106
|
}
|
|
1122
1107
|
async rafrafTimeoutScreenshotElementWithProgress(progress, selector, timeout, options) {
|
|
@@ -1255,22 +1240,42 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1255
1240
|
}
|
|
1256
1241
|
async isVisibleInternal(selector, options = {}, scope) {
|
|
1257
1242
|
try {
|
|
1258
|
-
const
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
const
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1243
|
+
const custom_metadata = {
|
|
1244
|
+
"internal": false,
|
|
1245
|
+
"log": []
|
|
1246
|
+
};
|
|
1247
|
+
const controller = new _progress.ProgressController(custom_metadata, this);
|
|
1248
|
+
return await controller.run(async progress => {
|
|
1249
|
+
progress.log("waiting for " + this._asLocator(selector));
|
|
1250
|
+
const promise = this._retryWithProgressIfNotConnected(progress, selector, options.strict, false, async handle => {
|
|
1251
|
+
if (handle.parentNode.constructor.name == "ElementHandle") {
|
|
1252
|
+
return await handle.parentNode.evaluateInUtility(([injected, node, {
|
|
1253
|
+
handle
|
|
1254
|
+
}]) => {
|
|
1255
|
+
const state = handle ? injected.elementState(handle, 'visible') : {
|
|
1256
|
+
matches: false,
|
|
1257
|
+
received: 'error:notconnected'
|
|
1258
|
+
};
|
|
1259
|
+
return state.matches;
|
|
1260
|
+
}, {
|
|
1261
|
+
handle
|
|
1262
|
+
});
|
|
1263
|
+
} else {
|
|
1264
|
+
return await handle.parentNode.evaluate((injected, {
|
|
1265
|
+
handle
|
|
1266
|
+
}) => {
|
|
1267
|
+
const state = handle ? injected.elementState(handle, 'visible') : {
|
|
1268
|
+
matches: false,
|
|
1269
|
+
received: 'error:notconnected'
|
|
1270
|
+
};
|
|
1271
|
+
return state.matches;
|
|
1272
|
+
}, {
|
|
1273
|
+
handle
|
|
1274
|
+
});
|
|
1275
|
+
}
|
|
1276
|
+
});
|
|
1277
|
+
return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
|
|
1278
|
+
}, 100); // A bit geeky but its okay :D
|
|
1274
1279
|
} catch (e) {
|
|
1275
1280
|
if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e) || (0, _protocolError.isSessionClosedError)(e)) throw e;
|
|
1276
1281
|
return false;
|
|
@@ -1343,7 +1348,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1343
1348
|
async ariaSnapshot(metadata, selector, options = {}) {
|
|
1344
1349
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1345
1350
|
return controller.run(async progress => {
|
|
1346
|
-
return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /* performActionPreChecks */, handle => handle.ariaSnapshot());
|
|
1351
|
+
return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /* performActionPreChecks */, handle => handle.ariaSnapshot(options));
|
|
1347
1352
|
}, this._page._timeoutSettings.timeout(options));
|
|
1348
1353
|
}
|
|
1349
1354
|
async expect(metadata, selector, options) {
|
|
@@ -1381,7 +1386,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1381
1386
|
});
|
|
1382
1387
|
if (resultOneShot.matches !== options.isNot) return resultOneShot;
|
|
1383
1388
|
} catch (e) {
|
|
1384
|
-
if (js.isJavaScriptErrorInEvaluate(e) || (0,
|
|
1389
|
+
if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser2.isInvalidSelectorError)(e)) throw e;
|
|
1385
1390
|
// Ignore any other errors from one-shot, we'll handle them during retries.
|
|
1386
1391
|
}
|
|
1387
1392
|
if (timeout > 0) {
|
|
@@ -1390,7 +1395,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1390
1395
|
}
|
|
1391
1396
|
if (timeout < 0) return {
|
|
1392
1397
|
matches: options.isNot,
|
|
1393
|
-
log: (0,
|
|
1398
|
+
log: (0, _callLog.compressCallLog)(metadata.log),
|
|
1394
1399
|
timedOut: true,
|
|
1395
1400
|
received: lastIntermediateResult.received
|
|
1396
1401
|
};
|
|
@@ -1418,10 +1423,10 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1418
1423
|
} catch (e) {
|
|
1419
1424
|
// Q: Why not throw upon isSessionClosedError(e) as in other places?
|
|
1420
1425
|
// A: We want user to receive a friendly message containing the last intermediate result.
|
|
1421
|
-
if (js.isJavaScriptErrorInEvaluate(e) || (0,
|
|
1426
|
+
if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser2.isInvalidSelectorError)(e)) throw e;
|
|
1422
1427
|
const result = {
|
|
1423
1428
|
matches: options.isNot,
|
|
1424
|
-
log: (0,
|
|
1429
|
+
log: (0, _callLog.compressCallLog)(metadata.log)
|
|
1425
1430
|
};
|
|
1426
1431
|
if (lastIntermediateResult.isSet) result.received = lastIntermediateResult.received;
|
|
1427
1432
|
if (e instanceof _errors.TimeoutError) result.timedOut = true;
|
|
@@ -1429,52 +1434,55 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1429
1434
|
}
|
|
1430
1435
|
}
|
|
1431
1436
|
async _expectInternal(progress, selector, options, lastIntermediateResult) {
|
|
1432
|
-
|
|
1433
|
-
const
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
if (
|
|
1473
|
-
|
|
1437
|
+
progress.log("waiting for " + this._asLocator(selector));
|
|
1438
|
+
const isArray = options.expression === 'to.have.count' || options.expression.endsWith('.array');
|
|
1439
|
+
const promise = await this._retryWithProgressIfNotConnected(progress, selector, !isArray, false, async result => {
|
|
1440
|
+
const handle = result[0];
|
|
1441
|
+
const handles = result[1];
|
|
1442
|
+
if (handle.parentNode.constructor.name == "ElementHandle") {
|
|
1443
|
+
return await handle.parentNode.evaluateInUtility(async ([injected, node, {
|
|
1444
|
+
handle,
|
|
1445
|
+
options,
|
|
1446
|
+
handles
|
|
1447
|
+
}]) => {
|
|
1448
|
+
return await injected.expect(handle, options, handles);
|
|
1449
|
+
}, {
|
|
1450
|
+
handle,
|
|
1451
|
+
options,
|
|
1452
|
+
handles
|
|
1453
|
+
});
|
|
1454
|
+
} else {
|
|
1455
|
+
return await handle.parentNode.evaluate(async (injected, {
|
|
1456
|
+
handle,
|
|
1457
|
+
options,
|
|
1458
|
+
handles
|
|
1459
|
+
}) => {
|
|
1460
|
+
return await injected.expect(handle, options, handles);
|
|
1461
|
+
}, {
|
|
1462
|
+
handle,
|
|
1463
|
+
options,
|
|
1464
|
+
handles
|
|
1465
|
+
});
|
|
1466
|
+
}
|
|
1467
|
+
}, 'returnAll');
|
|
1468
|
+
|
|
1469
|
+
// Default Values, if no Elements found
|
|
1470
|
+
var matches = false;
|
|
1471
|
+
var received = 0;
|
|
1472
|
+
var missingReceived = null;
|
|
1473
|
+
if (promise) {
|
|
1474
|
+
matches = promise.matches;
|
|
1475
|
+
received = promise.received;
|
|
1476
|
+
missingReceived = promise.missingReceived;
|
|
1477
|
+
} else if (options.expectedNumber === 0) {
|
|
1478
|
+
matches = true;
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
// Note: missingReceived avoids unexpected value "undefined" when element was not found.
|
|
1474
1482
|
if (matches === options.isNot) {
|
|
1475
1483
|
lastIntermediateResult.received = missingReceived ? '<element(s) not found>' : received;
|
|
1476
1484
|
lastIntermediateResult.isSet = true;
|
|
1477
|
-
if (!missingReceived && !Array.isArray(received)) progress.log(
|
|
1485
|
+
if (!missingReceived && !Array.isArray(received)) progress.log(' unexpected value "' + renderUnexpectedValue(options.expression, received) + '"');
|
|
1478
1486
|
}
|
|
1479
1487
|
return {
|
|
1480
1488
|
matches,
|
|
@@ -1589,44 +1597,35 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1589
1597
|
const callbackText = body.toString();
|
|
1590
1598
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1591
1599
|
return controller.run(async progress => {
|
|
1592
|
-
progress.log(
|
|
1593
|
-
const promise = this.
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
}
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
}
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
};
|
|
1620
|
-
}
|
|
1621
|
-
info: resolved.info,
|
|
1622
|
-
callbackText,
|
|
1623
|
-
taskData,
|
|
1624
|
-
callId: progress.metadata.id,
|
|
1625
|
-
root: resolved.frame === this ? scope : undefined
|
|
1626
|
-
});
|
|
1627
|
-
if (log) progress.log(log);
|
|
1628
|
-
if (!success) return continuePolling;
|
|
1629
|
-
return value;
|
|
1600
|
+
progress.log("waiting for " + this._asLocator(selector));
|
|
1601
|
+
const promise = this._retryWithProgressIfNotConnected(progress, selector, false, false, async handle => {
|
|
1602
|
+
if (handle.parentNode.constructor.name == "ElementHandle") {
|
|
1603
|
+
return await handle.parentNode.evaluateInUtility(([injected, node, {
|
|
1604
|
+
callbackText,
|
|
1605
|
+
handle,
|
|
1606
|
+
taskData
|
|
1607
|
+
}]) => {
|
|
1608
|
+
const callback = injected.eval(callbackText);
|
|
1609
|
+
return callback(injected, handle, taskData);
|
|
1610
|
+
}, {
|
|
1611
|
+
callbackText,
|
|
1612
|
+
handle,
|
|
1613
|
+
taskData
|
|
1614
|
+
});
|
|
1615
|
+
} else {
|
|
1616
|
+
return await handle.parentNode.evaluate((injected, {
|
|
1617
|
+
callbackText,
|
|
1618
|
+
handle,
|
|
1619
|
+
taskData
|
|
1620
|
+
}) => {
|
|
1621
|
+
const callback = injected.eval(callbackText);
|
|
1622
|
+
return callback(injected, handle, taskData);
|
|
1623
|
+
}, {
|
|
1624
|
+
callbackText,
|
|
1625
|
+
handle,
|
|
1626
|
+
taskData
|
|
1627
|
+
});
|
|
1628
|
+
}
|
|
1630
1629
|
});
|
|
1631
1630
|
return scope ? scope._context._raceAgainstContextDestroyed(promise) : promise;
|
|
1632
1631
|
}, this._page._timeoutSettings.timeout(options));
|
|
@@ -1741,6 +1740,164 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1741
1740
|
} catch (e) {}
|
|
1742
1741
|
return 0;
|
|
1743
1742
|
}
|
|
1743
|
+
async _customFindElementsByParsed(resolved, client, context, documentScope, progress, parsed) {
|
|
1744
|
+
var parsedEdits = {
|
|
1745
|
+
...parsed
|
|
1746
|
+
};
|
|
1747
|
+
// Note: We start scoping at document level
|
|
1748
|
+
var currentScopingElements = [documentScope];
|
|
1749
|
+
while (parsed.parts.length > 0) {
|
|
1750
|
+
var part = parsed.parts.shift();
|
|
1751
|
+
parsedEdits.parts = [part];
|
|
1752
|
+
var isUsingXPath = false;
|
|
1753
|
+
// Getting All Elements
|
|
1754
|
+
var elements = [];
|
|
1755
|
+
var elementsIndexes = [];
|
|
1756
|
+
if (part.name == "xpath") {
|
|
1757
|
+
isUsingXPath = true;
|
|
1758
|
+
} else if (part.name == "nth") {
|
|
1759
|
+
const partNth = Number(part.body);
|
|
1760
|
+
if (partNth > currentScopingElements.length || partNth < -currentScopingElements.length) {
|
|
1761
|
+
return continuePolling;
|
|
1762
|
+
} else {
|
|
1763
|
+
currentScopingElements = [currentScopingElements.at(partNth)];
|
|
1764
|
+
continue;
|
|
1765
|
+
}
|
|
1766
|
+
} else if (part.name == "internal:or") {
|
|
1767
|
+
var orredElements = await this._customFindElementsByParsed(resolved, client, context, documentScope, progress, part.body.parsed);
|
|
1768
|
+
elements = currentScopingElements.concat(orredElements);
|
|
1769
|
+
} else if (part.name == "internal:and") {
|
|
1770
|
+
var andedElements = await this._customFindElementsByParsed(resolved, client, context, documentScope, progress, part.body.parsed);
|
|
1771
|
+
const backendNodeIds = new Set(andedElements.map(item => item.backendNodeId));
|
|
1772
|
+
elements = currentScopingElements.filter(item => backendNodeIds.has(item.backendNodeId));
|
|
1773
|
+
} else {
|
|
1774
|
+
for (const scope of currentScopingElements) {
|
|
1775
|
+
const describedScope = await client.send('DOM.describeNode', {
|
|
1776
|
+
objectId: scope._objectId,
|
|
1777
|
+
depth: -1,
|
|
1778
|
+
pierce: true
|
|
1779
|
+
});
|
|
1780
|
+
|
|
1781
|
+
// Elements Queryed in the "current round"
|
|
1782
|
+
var queryingElements = [];
|
|
1783
|
+
if (!isUsingXPath) {
|
|
1784
|
+
function findClosedShadowRoots(node, results = []) {
|
|
1785
|
+
if (!node || typeof node !== 'object') return results;
|
|
1786
|
+
if (node.shadowRoots && Array.isArray(node.shadowRoots)) {
|
|
1787
|
+
for (const shadowRoot of node.shadowRoots) {
|
|
1788
|
+
if (shadowRoot.shadowRootType === 'closed' && shadowRoot.backendNodeId) {
|
|
1789
|
+
results.push(shadowRoot.backendNodeId);
|
|
1790
|
+
}
|
|
1791
|
+
findClosedShadowRoots(shadowRoot, results);
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
if (node.nodeName !== 'IFRAME' && node.children && Array.isArray(node.children)) {
|
|
1795
|
+
for (const child of node.children) {
|
|
1796
|
+
findClosedShadowRoots(child, results);
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1799
|
+
return results;
|
|
1800
|
+
}
|
|
1801
|
+
var shadowRootBackendIds = findClosedShadowRoots(describedScope.node);
|
|
1802
|
+
var shadowRoots = [];
|
|
1803
|
+
for (var shadowRootBackendId of shadowRootBackendIds) {
|
|
1804
|
+
var resolvedShadowRoot = await client.send('DOM.resolveNode', {
|
|
1805
|
+
backendNodeId: shadowRootBackendId,
|
|
1806
|
+
contextId: context.delegate._contextId
|
|
1807
|
+
});
|
|
1808
|
+
shadowRoots.push(new dom.ElementHandle(context, resolvedShadowRoot.object.objectId));
|
|
1809
|
+
}
|
|
1810
|
+
for (var shadowRoot of shadowRoots) {
|
|
1811
|
+
const shadowElements = await shadowRoot.evaluateHandleInUtility(([injected, node, {
|
|
1812
|
+
parsed,
|
|
1813
|
+
callId
|
|
1814
|
+
}]) => {
|
|
1815
|
+
const elements = injected.querySelectorAll(parsed, node);
|
|
1816
|
+
if (callId) injected.markTargetElements(new Set(elements), callId);
|
|
1817
|
+
return elements;
|
|
1818
|
+
}, {
|
|
1819
|
+
parsed: parsedEdits,
|
|
1820
|
+
callId: progress.metadata.id
|
|
1821
|
+
});
|
|
1822
|
+
const shadowElementsAmount = await shadowElements.getProperty("length");
|
|
1823
|
+
queryingElements.push([shadowElements, shadowElementsAmount, shadowRoot]);
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
// Document Root Elements (not in CSR)
|
|
1828
|
+
const rootElements = await scope.evaluateHandleInUtility(([injected, node, {
|
|
1829
|
+
parsed,
|
|
1830
|
+
callId
|
|
1831
|
+
}]) => {
|
|
1832
|
+
const elements = injected.querySelectorAll(parsed, node);
|
|
1833
|
+
if (callId) injected.markTargetElements(new Set(elements), callId);
|
|
1834
|
+
return elements;
|
|
1835
|
+
}, {
|
|
1836
|
+
parsed: parsedEdits,
|
|
1837
|
+
callId: progress.metadata.id
|
|
1838
|
+
});
|
|
1839
|
+
const rootElementsAmount = await rootElements.getProperty("length");
|
|
1840
|
+
queryingElements.push([rootElements, rootElementsAmount, resolved.injected]);
|
|
1841
|
+
|
|
1842
|
+
// Querying and Sorting the elements by their backendNodeId
|
|
1843
|
+
for (var queryedElement of queryingElements) {
|
|
1844
|
+
var elementsToCheck = queryedElement[0];
|
|
1845
|
+
var elementsAmount = await queryedElement[1].jsonValue();
|
|
1846
|
+
var parentNode = queryedElement[2];
|
|
1847
|
+
for (var i = 0; i < elementsAmount; i++) {
|
|
1848
|
+
if (parentNode.constructor.name == "ElementHandle") {
|
|
1849
|
+
var elementToCheck = await parentNode.evaluateHandleInUtility(([injected, node, {
|
|
1850
|
+
index,
|
|
1851
|
+
elementsToCheck
|
|
1852
|
+
}]) => {
|
|
1853
|
+
return elementsToCheck[index];
|
|
1854
|
+
}, {
|
|
1855
|
+
index: i,
|
|
1856
|
+
elementsToCheck: elementsToCheck
|
|
1857
|
+
});
|
|
1858
|
+
} else {
|
|
1859
|
+
var elementToCheck = await parentNode.evaluateHandle((injected, {
|
|
1860
|
+
index,
|
|
1861
|
+
elementsToCheck
|
|
1862
|
+
}) => {
|
|
1863
|
+
return elementsToCheck[index];
|
|
1864
|
+
}, {
|
|
1865
|
+
index: i,
|
|
1866
|
+
elementsToCheck: elementsToCheck
|
|
1867
|
+
});
|
|
1868
|
+
}
|
|
1869
|
+
// For other Functions/Utilities
|
|
1870
|
+
elementToCheck.parentNode = parentNode;
|
|
1871
|
+
var resolvedElement = await client.send('DOM.describeNode', {
|
|
1872
|
+
objectId: elementToCheck._objectId,
|
|
1873
|
+
depth: -1
|
|
1874
|
+
});
|
|
1875
|
+
// Note: Possible Bug, Maybe well actually have to check the Documents Node Position instead of using the backendNodeId
|
|
1876
|
+
elementToCheck.backendNodeId = resolvedElement.node.backendNodeId;
|
|
1877
|
+
elements.push(elementToCheck);
|
|
1878
|
+
}
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
}
|
|
1882
|
+
// Setting currentScopingElements to the elements we just queried
|
|
1883
|
+
currentScopingElements = [];
|
|
1884
|
+
for (var element of elements) {
|
|
1885
|
+
var elemIndex = element.backendNodeId;
|
|
1886
|
+
// Sorting the Elements by their occourance in the DOM
|
|
1887
|
+
var elemPos = elementsIndexes.findIndex(index => index > elemIndex);
|
|
1888
|
+
|
|
1889
|
+
// Sort the elements by their backendNodeId
|
|
1890
|
+
if (elemPos === -1) {
|
|
1891
|
+
currentScopingElements.push(element);
|
|
1892
|
+
elementsIndexes.push(elemIndex);
|
|
1893
|
+
} else {
|
|
1894
|
+
currentScopingElements.splice(elemPos, 0, element);
|
|
1895
|
+
elementsIndexes.splice(elemPos, 0, elemIndex);
|
|
1896
|
+
}
|
|
1897
|
+
}
|
|
1898
|
+
}
|
|
1899
|
+
return currentScopingElements;
|
|
1900
|
+
}
|
|
1744
1901
|
}
|
|
1745
1902
|
exports.Frame = Frame;
|
|
1746
1903
|
Frame.Events = {
|