@checkly/playwright-core 1.48.22 → 1.51.11-beta.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 +60 -48
- package/bin/reinstall_chrome_beta_linux.sh +10 -8
- package/bin/reinstall_chrome_stable_linux.sh +10 -8
- package/bin/reinstall_msedge_beta_linux.sh +17 -9
- package/bin/reinstall_msedge_dev_linux.sh +17 -9
- package/bin/reinstall_msedge_stable_linux.sh +17 -9
- package/browsers.json +33 -12
- package/index.js +0 -1
- package/lib/androidServerImpl.js +5 -5
- package/lib/browserServerImpl.js +18 -9
- package/lib/checkly/secretsFilter.js +1 -1
- package/lib/cli/driver.js +6 -6
- package/lib/cli/program.js +38 -43
- 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 +69 -62
- package/lib/client/browserType.js +30 -64
- package/lib/client/channelOwner.js +53 -68
- package/lib/client/clientHelper.js +4 -6
- package/lib/client/clientInstrumentation.js +2 -0
- package/lib/client/clientStackTrace.js +65 -0
- package/lib/client/connection.js +48 -41
- 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 +61 -62
- package/lib/client/fileUtils.js +31 -0
- package/lib/client/frame.js +22 -23
- 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 +27 -13
- package/lib/client/network.js +44 -37
- package/lib/client/page.js +50 -41
- 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 +29 -7
- package/lib/client/video.js +2 -2
- package/lib/client/waiter.js +19 -16
- package/lib/client/webSocket.js +106 -0
- package/lib/client/worker.js +4 -4
- package/lib/client/writableStream.js +2 -21
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/generated/recorderSource.js +7 -0
- package/lib/generated/webSocketMockSource.js +1 -1
- package/lib/inProcessFactory.js +8 -3
- package/lib/outofprocess.js +12 -8
- package/lib/protocol/debug.js +1 -1
- package/lib/protocol/validator.js +77 -11
- package/lib/protocol/validatorPrimitives.js +1 -2
- package/lib/remote/playwrightConnection.js +21 -12
- package/lib/remote/playwrightServer.js +22 -8
- 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 +11 -8
- package/lib/server/bidi/bidiChromium.js +5 -4
- package/lib/server/bidi/bidiConnection.js +1 -3
- package/lib/server/bidi/bidiExecutionContext.js +71 -25
- package/lib/server/bidi/bidiFirefox.js +4 -3
- package/lib/server/bidi/bidiInput.js +11 -12
- package/lib/server/bidi/bidiNetworkManager.js +11 -12
- package/lib/server/bidi/bidiOverCdp.js +2 -2
- package/lib/server/bidi/bidiPage.js +39 -66
- package/lib/server/bidi/third_party/bidiKeyboard.js +9 -7
- package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
- package/lib/server/browser.js +2 -2
- package/lib/server/browserContext.js +60 -55
- package/lib/server/browserType.js +22 -18
- package/lib/server/callLog.js +79 -0
- package/lib/server/chromium/chromium.js +20 -16
- package/lib/server/chromium/chromiumSwitches.js +32 -9
- package/lib/server/chromium/crBrowser.js +25 -24
- 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 +26 -35
- package/lib/server/chromium/crInput.js +17 -6
- package/lib/server/chromium/crNetworkManager.js +3 -3
- package/lib/server/chromium/crPage.js +43 -55
- 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/csharp.js +21 -16
- package/lib/server/codegen/java.js +17 -9
- package/lib/server/codegen/javascript.js +37 -7
- package/lib/server/codegen/jsonl.js +1 -1
- package/lib/server/codegen/languages.js +2 -2
- package/lib/server/codegen/python.js +14 -17
- package/lib/server/debugController.js +23 -45
- package/lib/server/debugger.js +1 -1
- package/lib/server/deviceDescriptors.js +1 -1
- package/lib/server/deviceDescriptorsSource.json +131 -131
- package/lib/server/dispatchers/androidDispatcher.js +14 -3
- package/lib/server/dispatchers/artifactDispatcher.js +3 -3
- package/lib/server/dispatchers/browserContextDispatcher.js +21 -32
- package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
- package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
- package/lib/server/dispatchers/debugControllerDispatcher.js +5 -3
- 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 +9 -3
- package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
- package/lib/server/dispatchers/localUtilsDispatcher.js +25 -291
- package/lib/server/dispatchers/networkDispatchers.js +3 -3
- package/lib/server/dispatchers/pageDispatcher.js +10 -8
- package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
- package/lib/server/dispatchers/streamDispatcher.js +4 -3
- package/lib/server/dispatchers/tracingDispatcher.js +10 -0
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +18 -18
- package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
- package/lib/server/dom.js +102 -48
- 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 +49 -33
- package/lib/server/fileUploadUtils.js +7 -4
- package/lib/server/firefox/ffBrowser.js +17 -9
- package/lib/server/firefox/ffConnection.js +1 -1
- package/lib/server/firefox/ffExecutionContext.js +25 -29
- package/lib/server/firefox/ffInput.js +15 -4
- package/lib/server/firefox/ffNetworkManager.js +3 -3
- package/lib/server/firefox/ffPage.js +29 -50
- package/lib/server/firefox/firefox.js +7 -9
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +65 -55
- package/lib/server/har/harRecorder.js +4 -4
- package/lib/server/har/harTracer.js +8 -9
- package/lib/server/harBackend.js +157 -0
- package/lib/server/helper.js +2 -2
- package/lib/server/index.js +1 -14
- package/lib/server/input.js +3 -4
- package/lib/server/instrumentation.js +2 -2
- package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
- package/lib/server/javascript.js +26 -33
- package/lib/server/launchApp.js +7 -7
- package/lib/server/localUtils.js +203 -0
- package/lib/server/network.js +5 -5
- package/lib/server/page.js +76 -37
- package/lib/server/pipeTransport.js +1 -1
- package/lib/server/playwright.js +5 -5
- package/lib/server/progress.js +1 -4
- package/lib/server/protocolError.js +1 -1
- package/lib/server/recorder/chat.js +177 -0
- package/lib/server/recorder/codeGenerator.js +154 -0
- package/lib/server/recorder/contextRecorder.js +9 -18
- package/lib/server/recorder/csharp.js +311 -0
- package/lib/server/recorder/java.js +249 -0
- package/lib/server/recorder/javascript.js +230 -0
- package/lib/server/recorder/jsonl.js +48 -0
- package/lib/server/recorder/language.js +45 -0
- package/lib/server/recorder/python.js +276 -0
- package/lib/server/recorder/recorderActions.js +6 -0
- package/lib/server/recorder/recorderApp.js +25 -28
- package/lib/server/recorder/recorderCollection.js +9 -21
- package/lib/server/recorder/recorderInTraceViewer.js +1 -1
- package/lib/server/recorder/recorderRunner.js +7 -3
- package/lib/server/recorder/recorderUtils.js +5 -28
- package/lib/server/recorder/throttledFile.js +3 -4
- package/lib/server/recorder/utils.js +46 -0
- package/lib/server/recorder.js +83 -43
- package/lib/server/registry/browserFetcher.js +10 -8
- package/lib/server/registry/dependencies.js +20 -20
- package/lib/server/registry/index.js +215 -61
- package/lib/server/registry/nativeDeps.js +10 -4
- 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/server/timeoutSettings.js +74 -0
- package/lib/server/trace/recorder/snapshotter.js +10 -20
- package/lib/server/trace/recorder/snapshotterInjected.js +26 -1
- package/lib/server/trace/recorder/tracing.js +108 -45
- package/lib/server/trace/test/inMemorySnapshotter.js +6 -6
- package/lib/server/trace/viewer/traceViewer.js +21 -7
- package/lib/server/transport.js +3 -2
- package/lib/server/utils/ascii.js +31 -0
- package/lib/server/utils/comparators.js +159 -0
- package/lib/server/utils/crypto.js +171 -0
- package/lib/server/utils/debug.js +38 -0
- package/lib/server/utils/debugLogger.js +93 -0
- package/lib/server/utils/env.js +53 -0
- package/lib/server/utils/eventsHelper.js +38 -0
- package/lib/server/utils/expectUtils.js +33 -0
- package/lib/server/utils/fileUtils.js +204 -0
- package/lib/server/utils/happyEyeballs.js +207 -0
- package/lib/server/utils/hostPlatform.js +145 -0
- package/lib/server/utils/httpServer.js +233 -0
- package/lib/server/utils/image_tools/colorUtils.js +98 -0
- package/lib/server/utils/image_tools/compare.js +108 -0
- package/lib/server/utils/image_tools/imageChannel.js +70 -0
- package/lib/server/utils/image_tools/stats.js +102 -0
- package/lib/server/utils/linuxUtils.js +58 -0
- package/lib/server/utils/network.js +160 -0
- package/lib/server/utils/nodePlatform.js +140 -0
- package/lib/server/utils/pipeTransport.js +82 -0
- package/lib/server/utils/processLauncher.js +248 -0
- package/lib/server/utils/profiler.js +52 -0
- package/lib/server/utils/socksProxy.js +570 -0
- package/lib/server/utils/spawnAsync.js +45 -0
- package/lib/server/utils/task.js +58 -0
- package/lib/server/utils/userAgent.js +91 -0
- package/lib/server/utils/wsServer.js +128 -0
- package/lib/server/utils/zipFile.js +75 -0
- package/lib/server/utils/zones.js +54 -0
- package/lib/server/webkit/webkit.js +4 -4
- package/lib/server/webkit/wkBrowser.js +10 -10
- package/lib/server/webkit/wkConnection.js +1 -1
- package/lib/server/webkit/wkExecutionContext.js +26 -30
- package/lib/server/webkit/wkInput.js +17 -7
- package/lib/server/webkit/wkInterceptableRequest.js +2 -2
- package/lib/server/webkit/wkPage.js +80 -66
- package/lib/server/webkit/wkProvisionalPage.js +1 -1
- package/lib/server/webkit/wkWorkers.js +2 -2
- package/lib/utils/fileUtils.js +1 -1
- package/lib/utils/glob.js +84 -0
- package/lib/utils/isomorphic/ariaSnapshot.js +392 -0
- package/lib/utils/isomorphic/assert.js +25 -0
- package/lib/utils/isomorphic/colors.js +65 -0
- package/lib/utils/isomorphic/cssParser.js +5 -5
- package/lib/utils/isomorphic/headers.js +52 -0
- package/lib/utils/isomorphic/locatorGenerators.js +38 -8
- package/lib/utils/isomorphic/locatorParser.js +19 -13
- package/lib/utils/isomorphic/manualPromise.js +107 -0
- package/lib/utils/isomorphic/mimeType.js +11 -3
- package/lib/utils/isomorphic/multimap.js +73 -0
- package/lib/utils/isomorphic/rtti.js +41 -0
- package/lib/utils/isomorphic/semaphore.js +51 -0
- package/lib/utils/isomorphic/stackTrace.js +169 -0
- package/lib/utils/isomorphic/stringUtils.js +31 -1
- package/lib/utils/isomorphic/time.js +25 -0
- package/lib/utils/isomorphic/timeoutRunner.js +66 -0
- package/lib/utils/isomorphic/traceUtils.js +23 -0
- package/lib/utils/isomorphic/types.js +5 -0
- package/lib/utils/isomorphic/urlMatch.js +7 -5
- package/lib/utils/mimeType.js +30 -0
- package/lib/utils/stackTrace.js +1 -1
- package/lib/utils.js +447 -0
- package/lib/utilsBundle.js +4 -29
- package/lib/utilsBundleImpl/index.js +188 -33
- package/lib/vite/htmlReport/index.html +20 -17
- package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
- package/lib/vite/recorder/assets/{index-BW-aOBcL.css → index-eHBmevrY.css} +1 -1
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-gU1OOCQO.js +24 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-B5n_FjMx.js +1 -0
- package/lib/vite/traceViewer/assets/inspectorTab-6Tru8Mn_.js +235 -0
- package/lib/vite/traceViewer/assets/workbench-B_Nj4NA2.js +25 -0
- package/lib/vite/traceViewer/assets/{xtermModule-BeNbaIVa.js → xtermModule-BoAIEibi.js} +7 -7
- package/lib/vite/traceViewer/defaultSettingsView.CO3FR0CX.css +1 -0
- package/lib/vite/traceViewer/{embedded.BkvOrz5Z.js → embedded.DpNPH6mk.js} +2 -2
- package/lib/vite/traceViewer/embedded.html +6 -6
- package/lib/vite/traceViewer/index.CuE3SYGw.js +2 -0
- package/lib/vite/traceViewer/index.html +27 -9
- package/lib/vite/traceViewer/inspectorTab.CXDulcFG.css +1 -0
- package/lib/vite/traceViewer/{recorder.DNMfnSiu.js → recorder.BD-uZJs7.js} +2 -2
- package/lib/vite/traceViewer/recorder.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/{uiMode.CAYqod-m.css → uiMode.BatfzHMG.css} +1 -1
- package/lib/vite/traceViewer/uiMode.DHrNgddz.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +8 -7
- package/lib/vite/traceViewer/workbench.B9vIAzH9.css +1 -0
- package/lib/zipBundleImpl.js +4 -4
- package/package.json +7 -7
- package/types/protocol.d.ts +820 -153
- package/types/types.d.ts +285 -82
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +0 -2
- package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +0 -24
- package/lib/vite/recorder/assets/index-Bxxcmxlu.js +0 -42
- package/lib/vite/traceViewer/assets/codeMirrorModule-pBPtArIT.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-tzBrK1V4.js +0 -24
- package/lib/vite/traceViewer/assets/inspectorTab-BuJ3wAX_.js +0 -64
- package/lib/vite/traceViewer/assets/inspectorTab-Soeeuvzv.js +0 -64
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +0 -1
- package/lib/vite/traceViewer/assets/workbench-DdmJ9AJV.js +0 -9
- package/lib/vite/traceViewer/assets/workbench-lypYlf00.js +0 -9
- package/lib/vite/traceViewer/embedded.DInvAijy.js +0 -2
- package/lib/vite/traceViewer/index.Dha3cgqs.js +0 -2
- package/lib/vite/traceViewer/index._Iolt-uE.js +0 -2
- package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +0 -1
- package/lib/vite/traceViewer/recorder.DTSaNaly.js +0 -2
- package/lib/vite/traceViewer/uiMode.BM7yhjzl.js +0 -5
- package/lib/vite/traceViewer/uiMode.Cr1tvTWS.js +0 -5
- package/lib/vite/traceViewer/workbench.DlsCx8k5.css +0 -1
- /package/lib/vite/recorder/assets/{codeMirrorModule-ez37Vkbh.css → codeMirrorModule-C3UTv-Ge.css} +0 -0
- /package/lib/vite/traceViewer/{codeMirrorModule.ez37Vkbh.css → codeMirrorModule.C3UTv-Ge.css} +0 -0
- /package/lib/vite/traceViewer/{embedded.w7WN2u1R.css → embedded.mLhjB5IF.css} +0 -0
- /package/lib/vite/traceViewer/{index.CrbWWHbf.css → index.CFOW-Ezb.css} +0 -0
- /package/lib/vite/traceViewer/{recorder.B_SY1GJM.css → recorder.tn0RQdqM.css} +0 -0
- /package/lib/vite/traceViewer/{xtermModule.DSXBckUd.css → xtermModule.Beg8tuEN.css} +0 -0
|
@@ -4,22 +4,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.UTILITY_WORLD_NAME = exports.FFPage = void 0;
|
|
7
|
+
var _eventsHelper = require("../utils/eventsHelper");
|
|
7
8
|
var dialog = _interopRequireWildcard(require("../dialog"));
|
|
8
9
|
var dom = _interopRequireWildcard(require("../dom"));
|
|
9
|
-
var _eventsHelper = require("../../utils/eventsHelper");
|
|
10
10
|
var _page = require("../page");
|
|
11
11
|
var _ffAccessibility = require("./ffAccessibility");
|
|
12
12
|
var _ffConnection = require("./ffConnection");
|
|
13
13
|
var _ffExecutionContext = require("./ffExecutionContext");
|
|
14
14
|
var _ffInput = require("./ffInput");
|
|
15
15
|
var _ffNetworkManager = require("./ffNetworkManager");
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var _manualPromise = require("../../utils/manualPromise");
|
|
16
|
+
var _debugLogger = require("../utils/debugLogger");
|
|
17
|
+
var _stackTrace = require("../../utils/isomorphic/stackTrace");
|
|
19
18
|
var _browserContext = require("../browserContext");
|
|
20
19
|
var _errors = require("../errors");
|
|
21
20
|
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); }
|
|
22
|
-
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 &&
|
|
21
|
+
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; }
|
|
23
22
|
/**
|
|
24
23
|
* Copyright 2019 Google Inc. All rights reserved.
|
|
25
24
|
* Modifications copyright (c) Microsoft Corporation.
|
|
@@ -48,9 +47,7 @@ class FFPage {
|
|
|
48
47
|
this._page = void 0;
|
|
49
48
|
this._networkManager = void 0;
|
|
50
49
|
this._browserContext = void 0;
|
|
51
|
-
this.
|
|
52
|
-
this._initializedPage = null;
|
|
53
|
-
this._initializationFailed = false;
|
|
50
|
+
this._reportedAsNew = false;
|
|
54
51
|
this._opener = void 0;
|
|
55
52
|
this._contextIdToContext = void 0;
|
|
56
53
|
this._eventListeners = void 0;
|
|
@@ -70,34 +67,22 @@ class FFPage {
|
|
|
70
67
|
this._page.on(_page.Page.Events.FrameDetached, frame => this._removeContextsForFrame(frame));
|
|
71
68
|
// TODO: remove Page.willOpenNewWindowAsynchronously from the protocol.
|
|
72
69
|
this._eventListeners = [_eventsHelper.eventsHelper.addEventListener(this._session, 'Page.eventFired', this._onEventFired.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameAttached', this._onFrameAttached.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.frameDetached', this._onFrameDetached.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.navigationAborted', this._onNavigationAborted.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.navigationCommitted', this._onNavigationCommitted.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.navigationStarted', this._onNavigationStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.sameDocumentNavigation', this._onSameDocumentNavigation.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Runtime.executionContextCreated', this._onExecutionContextCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Runtime.executionContextDestroyed', this._onExecutionContextDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.linkClicked', event => this._onLinkClicked(event.phase)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.uncaughtError', this._onUncaughtError.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Runtime.console', this._onConsole.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.dialogOpened', this._onDialogOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.bindingCalled', this._onBindingCalled.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.fileChooserOpened', this._onFileChooserOpened.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.workerCreated', this._onWorkerCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.workerDestroyed', this._onWorkerDestroyed.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.dispatchMessageFromWorker', this._onDispatchMessageFromWorker.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.crashed', this._onCrashed.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.videoRecordingStarted', this._onVideoRecordingStarted.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.webSocketCreated', this._onWebSocketCreated.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.webSocketClosed', this._onWebSocketClosed.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.webSocketFrameReceived', this._onWebSocketFrameReceived.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.webSocketFrameSent', this._onWebSocketFrameSent.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._session, 'Page.screencastFrame', this._onScreencastFrame.bind(this))];
|
|
73
|
-
this._session.once('Page.ready',
|
|
74
|
-
|
|
75
|
-
if (this.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
this._initializedPage = this._page;
|
|
79
|
-
this._page.reportAsNew();
|
|
80
|
-
this._pagePromise.resolve(this._page);
|
|
70
|
+
this._session.once('Page.ready', () => {
|
|
71
|
+
var _this$_opener;
|
|
72
|
+
if (this._reportedAsNew) return;
|
|
73
|
+
this._reportedAsNew = true;
|
|
74
|
+
this._page.reportAsNew((_this$_opener = this._opener) === null || _this$_opener === void 0 ? void 0 : _this$_opener._page);
|
|
81
75
|
});
|
|
82
76
|
// Ideally, we somehow ensure that utility world is created before Page.ready arrives, but currently it is racy.
|
|
83
77
|
// Therefore, we can end up with an initialized page without utility world, although very unlikely.
|
|
84
78
|
this.addInitScript(new _page.InitScript('', true), UTILITY_WORLD_NAME).catch(e => this._markAsError(e));
|
|
85
79
|
}
|
|
86
|
-
potentiallyUninitializedPage() {
|
|
87
|
-
return this._page;
|
|
88
|
-
}
|
|
89
80
|
async _markAsError(error) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
this.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
this._page.reportAsNew(error);
|
|
96
|
-
this._pagePromise.resolve(error);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
async pageOrError() {
|
|
100
|
-
return this._pagePromise;
|
|
81
|
+
var _this$_opener2;
|
|
82
|
+
// Same error may be reported twice: channel disconnected and session.send fails.
|
|
83
|
+
if (this._reportedAsNew) return;
|
|
84
|
+
this._reportedAsNew = true;
|
|
85
|
+
this._page.reportAsNew((_this$_opener2 = this._opener) === null || _this$_opener2 === void 0 ? void 0 : _this$_opener2._page, error);
|
|
101
86
|
}
|
|
102
87
|
_onWebSocketCreated(event) {
|
|
103
88
|
this._page._frameManager.onWebSocketCreated(webSocketId(event.frameId, event.wsid), event.requestURL);
|
|
@@ -124,8 +109,7 @@ class FFPage {
|
|
|
124
109
|
let worldName;
|
|
125
110
|
if (auxData.name === UTILITY_WORLD_NAME) worldName = 'utility';else if (!auxData.name) worldName = 'main';else return;
|
|
126
111
|
const context = new dom.FrameExecutionContext(delegate, frame, worldName);
|
|
127
|
-
|
|
128
|
-
frame._contextCreated(worldName, context);
|
|
112
|
+
if (worldName) frame._contextCreated(worldName, context);
|
|
129
113
|
this._contextIdToContext.set(executionContextId, context);
|
|
130
114
|
}
|
|
131
115
|
_onExecutionContextDestroyed(payload) {
|
|
@@ -201,7 +185,7 @@ class FFPage {
|
|
|
201
185
|
const context = this._contextIdToContext.get(executionContextId);
|
|
202
186
|
if (!context) return;
|
|
203
187
|
// Juggler reports 'warn' for some internal messages generated by the browser.
|
|
204
|
-
this._page._addConsoleMessage(type === 'warn' ? 'warning' : type, args.map(arg =>
|
|
188
|
+
this._page._addConsoleMessage(type === 'warn' ? 'warning' : type, args.map(arg => (0, _ffExecutionContext.createHandle)(context, arg)), location);
|
|
205
189
|
}
|
|
206
190
|
_onDialogOpened(params) {
|
|
207
191
|
this._page.emitOnContext(_browserContext.BrowserContext.Events.Dialog, new dialog.Dialog(this._page, params.type, params.message, async (accept, promptText) => {
|
|
@@ -213,7 +197,7 @@ class FFPage {
|
|
|
213
197
|
}, params.defaultValue));
|
|
214
198
|
}
|
|
215
199
|
async _onBindingCalled(event) {
|
|
216
|
-
const pageOrError = await this.
|
|
200
|
+
const pageOrError = await this._page.waitForInitializedOrError();
|
|
217
201
|
if (!(pageOrError instanceof Error)) {
|
|
218
202
|
const context = this._contextIdToContext.get(event.executionContextId);
|
|
219
203
|
if (context) await this._page._onBindingCalled(event.payload, context);
|
|
@@ -226,7 +210,7 @@ class FFPage {
|
|
|
226
210
|
} = payload;
|
|
227
211
|
const context = this._contextIdToContext.get(executionContextId);
|
|
228
212
|
if (!context) return;
|
|
229
|
-
const handle =
|
|
213
|
+
const handle = (0, _ffExecutionContext.createHandle)(context, element).asElement();
|
|
230
214
|
await this._page._onFileChooserOpened(handle);
|
|
231
215
|
}
|
|
232
216
|
async _onWorkerCreated(event) {
|
|
@@ -264,7 +248,7 @@ class FFPage {
|
|
|
264
248
|
location
|
|
265
249
|
} = event;
|
|
266
250
|
const context = worker._existingExecutionContext;
|
|
267
|
-
this._page._addConsoleMessage(type, args.map(arg =>
|
|
251
|
+
this._page._addConsoleMessage(type, args.map(arg => (0, _ffExecutionContext.createHandle)(context, arg)), location);
|
|
268
252
|
});
|
|
269
253
|
// Note: we receive worker exceptions directly from the page.
|
|
270
254
|
}
|
|
@@ -286,7 +270,7 @@ class FFPage {
|
|
|
286
270
|
this._page._didCrash();
|
|
287
271
|
}
|
|
288
272
|
_onVideoRecordingStarted(event) {
|
|
289
|
-
this._browserContext._browser._videoStarted(this._browserContext, event.screencastId, event.file, this.
|
|
273
|
+
this._browserContext._browser._videoStarted(this._browserContext, event.screencastId, event.file, this._page.waitForInitializedOrError());
|
|
290
274
|
}
|
|
291
275
|
didClose() {
|
|
292
276
|
this._markAsError(new _errors.TargetClosedError());
|
|
@@ -324,12 +308,14 @@ class FFPage {
|
|
|
324
308
|
const colorScheme = emulatedMedia.colorScheme === 'no-override' ? undefined : emulatedMedia.colorScheme;
|
|
325
309
|
const reducedMotion = emulatedMedia.reducedMotion === 'no-override' ? undefined : emulatedMedia.reducedMotion;
|
|
326
310
|
const forcedColors = emulatedMedia.forcedColors === 'no-override' ? undefined : emulatedMedia.forcedColors;
|
|
311
|
+
const contrast = emulatedMedia.contrast === 'no-override' ? undefined : emulatedMedia.contrast;
|
|
327
312
|
await this._session.send('Page.setEmulatedMedia', {
|
|
328
313
|
// Empty string means reset.
|
|
329
314
|
type: emulatedMedia.media === 'no-override' ? '' : emulatedMedia.media,
|
|
330
315
|
colorScheme,
|
|
331
316
|
reducedMotion,
|
|
332
|
-
forcedColors
|
|
317
|
+
forcedColors,
|
|
318
|
+
contrast
|
|
333
319
|
});
|
|
334
320
|
}
|
|
335
321
|
async updateRequestInterception() {
|
|
@@ -435,9 +421,6 @@ class FFPage {
|
|
|
435
421
|
});
|
|
436
422
|
return ownerFrameId || null;
|
|
437
423
|
}
|
|
438
|
-
isElementHandle(remoteObject) {
|
|
439
|
-
return remoteObject.subtype === 'node';
|
|
440
|
-
}
|
|
441
424
|
async getBoundingBox(handle) {
|
|
442
425
|
const quads = await this.getContentQuads(handle);
|
|
443
426
|
if (!quads || !quads.length) return null;
|
|
@@ -507,9 +490,6 @@ class FFPage {
|
|
|
507
490
|
if (!result) return null;
|
|
508
491
|
return result.quads.map(quad => [quad.p1, quad.p2, quad.p3, quad.p4]);
|
|
509
492
|
}
|
|
510
|
-
async setInputFiles(handle, files) {
|
|
511
|
-
await handle.evaluateInUtility(([injected, node, files]) => injected.setInputFiles(node, files), files);
|
|
512
|
-
}
|
|
513
493
|
async setInputFilePaths(handle, files) {
|
|
514
494
|
await this._session.send('Page.setFileInputFiles', {
|
|
515
495
|
frameId: handle._context.frame._id,
|
|
@@ -521,10 +501,10 @@ class FFPage {
|
|
|
521
501
|
const result = await this._session.send('Page.adoptNode', {
|
|
522
502
|
frameId: handle._context.frame._id,
|
|
523
503
|
objectId: handle._objectId,
|
|
524
|
-
executionContextId: to
|
|
504
|
+
executionContextId: to.delegate._executionContextId
|
|
525
505
|
});
|
|
526
506
|
if (!result.remoteObject) throw new Error(dom.kUnableToAdoptErrorMessage);
|
|
527
|
-
return
|
|
507
|
+
return (0, _ffExecutionContext.createHandle)(to, result.remoteObject);
|
|
528
508
|
}
|
|
529
509
|
async getAccessibilityTree(needle) {
|
|
530
510
|
return (0, _ffAccessibility.getAccessibilityTree)(this._session, needle);
|
|
@@ -543,10 +523,10 @@ class FFPage {
|
|
|
543
523
|
const context = await parent._mainContext();
|
|
544
524
|
const result = await this._session.send('Page.adoptNode', {
|
|
545
525
|
frameId: frame._id,
|
|
546
|
-
executionContextId: context
|
|
526
|
+
executionContextId: context.delegate._executionContextId
|
|
547
527
|
});
|
|
548
528
|
if (!result.remoteObject) throw new Error('Frame has been detached.');
|
|
549
|
-
return
|
|
529
|
+
return (0, _ffExecutionContext.createHandle)(context, result.remoteObject);
|
|
550
530
|
}
|
|
551
531
|
shouldToggleStyleSheetToSyncAnimations() {
|
|
552
532
|
return false;
|
|
@@ -555,5 +535,4 @@ class FFPage {
|
|
|
555
535
|
exports.FFPage = FFPage;
|
|
556
536
|
function webSocketId(frameId, wsid) {
|
|
557
537
|
return `${frameId}---${wsid}`;
|
|
558
|
-
}
|
|
559
|
-
const contextDelegateSymbol = Symbol('delegate');
|
|
538
|
+
}
|
|
@@ -4,15 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.Firefox = void 0;
|
|
7
|
-
var
|
|
7
|
+
var _os = _interopRequireDefault(require("os"));
|
|
8
8
|
var _path = _interopRequireDefault(require("path"));
|
|
9
9
|
var _ffBrowser = require("./ffBrowser");
|
|
10
10
|
var _ffConnection = require("./ffConnection");
|
|
11
|
+
var _ascii = require("../utils/ascii");
|
|
11
12
|
var _browserType = require("../browserType");
|
|
12
|
-
|
|
13
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
-
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); }
|
|
15
|
-
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; }
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
14
|
/**
|
|
17
15
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
18
16
|
* Modifications copyright (c) Microsoft Corporation.
|
|
@@ -40,13 +38,13 @@ class Firefox extends _browserType.BrowserType {
|
|
|
40
38
|
doRewriteStartupLog(error) {
|
|
41
39
|
if (!error.logs) return error;
|
|
42
40
|
// https://github.com/microsoft/playwright/issues/6500
|
|
43
|
-
if (error.logs.includes(`as root in a regular user's session is not supported.`)) error.logs = '\n' + (0,
|
|
44
|
-
if (error.logs.includes('no DISPLAY environment variable specified')) error.logs = '\n' + (0,
|
|
41
|
+
if (error.logs.includes(`as root in a regular user's session is not supported.`)) error.logs = '\n' + (0, _ascii.wrapInASCIIBox)(`Firefox is unable to launch if the $HOME folder isn't owned by the current user.\nWorkaround: Set the HOME=/root environment variable${process.env.GITHUB_ACTION ? ' in your GitHub Actions workflow file' : ''} when running Playwright.`, 1);
|
|
42
|
+
if (error.logs.includes('no DISPLAY environment variable specified')) error.logs = '\n' + (0, _ascii.wrapInASCIIBox)(_browserType.kNoXServerRunningError, 1);
|
|
45
43
|
return error;
|
|
46
44
|
}
|
|
47
45
|
amendEnvironment(env, userDataDir, executable, browserArguments) {
|
|
48
|
-
if (!_path.default.isAbsolute(
|
|
49
|
-
if (
|
|
46
|
+
if (!_path.default.isAbsolute(_os.default.homedir())) throw new Error(`Cannot launch Firefox with relative home directory. Did you set ${_os.default.platform() === 'win32' ? 'USERPROFILE' : 'HOME'} to a relative path?`);
|
|
47
|
+
if (_os.default.platform() === 'linux') {
|
|
50
48
|
// Always remove SNAP_NAME and SNAP_INSTANCE_NAME env variables since they
|
|
51
49
|
// confuse Firefox: in our case, builds never come from SNAP.
|
|
52
50
|
// See https://github.com/microsoft/playwright/issues/20555
|
|
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.FrameSelectors = void 0;
|
|
7
|
-
var _selectorParser = require("../utils/isomorphic/selectorParser");
|
|
8
7
|
var _utils = require("../utils");
|
|
8
|
+
var _selectorParser = require("../utils/isomorphic/selectorParser");
|
|
9
9
|
/**
|
|
10
10
|
* Copyright (c) Microsoft Corporation.
|
|
11
11
|
*
|
package/lib/server/frames.js
CHANGED
|
@@ -4,26 +4,27 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.NavigationAbortedError = exports.FrameManager = exports.Frame = void 0;
|
|
7
|
+
var _browserContext = require("./browserContext");
|
|
7
8
|
var dom = _interopRequireWildcard(require("./dom"));
|
|
9
|
+
var _errors = require("./errors");
|
|
10
|
+
var _fileUploadUtils = require("./fileUploadUtils");
|
|
11
|
+
var _frameSelectors = require("./frameSelectors");
|
|
8
12
|
var _helper = require("./helper");
|
|
9
|
-
var
|
|
13
|
+
var _instrumentation = require("./instrumentation");
|
|
10
14
|
var js = _interopRequireWildcard(require("./javascript"));
|
|
11
15
|
var network = _interopRequireWildcard(require("./network"));
|
|
12
16
|
var _page = require("./page");
|
|
13
|
-
var types = _interopRequireWildcard(require("./types"));
|
|
14
|
-
var _browserContext = require("./browserContext");
|
|
15
17
|
var _progress = require("./progress");
|
|
18
|
+
var types = _interopRequireWildcard(require("./types"));
|
|
16
19
|
var _utils = require("../utils");
|
|
17
|
-
var _manualPromise = require("../utils/manualPromise");
|
|
18
|
-
var _debugLogger = require("../utils/debugLogger");
|
|
19
|
-
var _instrumentation = require("./instrumentation");
|
|
20
20
|
var _protocolError = require("./protocolError");
|
|
21
|
+
var _debugLogger = require("./utils/debugLogger");
|
|
22
|
+
var _eventsHelper = require("./utils/eventsHelper");
|
|
21
23
|
var _selectorParser = require("../utils/isomorphic/selectorParser");
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var _fileUploadUtils = require("./fileUploadUtils");
|
|
24
|
+
var _manualPromise = require("../utils/isomorphic/manualPromise");
|
|
25
|
+
var _callLog = require("./callLog");
|
|
25
26
|
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); }
|
|
26
|
-
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 &&
|
|
27
|
+
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; }
|
|
27
28
|
/**
|
|
28
29
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
29
30
|
* Modifications copyright (c) Microsoft Corporation.
|
|
@@ -195,6 +196,11 @@ class FrameManager {
|
|
|
195
196
|
frameCommittedSameDocumentNavigation(frameId, url) {
|
|
196
197
|
const frame = this._frames.get(frameId);
|
|
197
198
|
if (!frame) return;
|
|
199
|
+
const pending = frame.pendingDocument();
|
|
200
|
+
if (pending && pending.documentId === undefined && pending.request === undefined) {
|
|
201
|
+
// WebKit has notified about the same-document navigation being requested, so clear it.
|
|
202
|
+
frame.setPendingDocument(undefined);
|
|
203
|
+
}
|
|
198
204
|
frame._url = url;
|
|
199
205
|
const navigationEvent = {
|
|
200
206
|
url,
|
|
@@ -237,9 +243,8 @@ class FrameManager {
|
|
|
237
243
|
request
|
|
238
244
|
});
|
|
239
245
|
if (request._isFavicon) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}).catch(() => {});
|
|
246
|
+
// Abort favicon requests to avoid network access in case of interception.
|
|
247
|
+
route === null || route === void 0 || route.abort('aborted').catch(() => {});
|
|
243
248
|
return;
|
|
244
249
|
}
|
|
245
250
|
this._page.emitOnContext(_browserContext.BrowserContext.Events.Request, request);
|
|
@@ -626,12 +631,12 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
626
631
|
return await this.waitForSelectorInternal(progress, selector, true, options, scope);
|
|
627
632
|
}, this._page._timeoutSettings.timeout(options));
|
|
628
633
|
}
|
|
629
|
-
async waitForSelectorInternal(progress, selector,
|
|
634
|
+
async waitForSelectorInternal(progress, selector, performActionPreChecks, options, scope) {
|
|
630
635
|
const {
|
|
631
636
|
state = 'visible'
|
|
632
637
|
} = options;
|
|
633
638
|
const promise = this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
|
|
634
|
-
if (
|
|
639
|
+
if (performActionPreChecks) await this._page.performActionPreChecks(progress);
|
|
635
640
|
const resolved = await this.selectors.resolveInjectedForSelector(selector, options, scope);
|
|
636
641
|
progress.throwIfAborted();
|
|
637
642
|
if (!resolved) {
|
|
@@ -642,6 +647,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
642
647
|
info,
|
|
643
648
|
root
|
|
644
649
|
}) => {
|
|
650
|
+
if (root && !root.isConnected) throw injected.createStacklessError('Element is not attached to the DOM');
|
|
645
651
|
const elements = injected.querySelectorAll(info.parsed, root || document);
|
|
646
652
|
const element = elements[0];
|
|
647
653
|
const visible = element ? injected.utils.isElementVisible(element) : false;
|
|
@@ -801,9 +807,9 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
801
807
|
return this._url;
|
|
802
808
|
}
|
|
803
809
|
origin() {
|
|
804
|
-
var _network$
|
|
810
|
+
var _network$parseURL;
|
|
805
811
|
if (!this._url.startsWith('http')) return;
|
|
806
|
-
return (_network$
|
|
812
|
+
return (_network$parseURL = network.parseURL(this._url)) === null || _network$parseURL === void 0 ? void 0 : _network$parseURL.origin;
|
|
807
813
|
}
|
|
808
814
|
parentFrame() {
|
|
809
815
|
return this._parentFrame;
|
|
@@ -948,19 +954,21 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
948
954
|
// Retry upon all other errors.
|
|
949
955
|
return false;
|
|
950
956
|
}
|
|
951
|
-
async _retryWithProgressIfNotConnected(progress, selector, strict,
|
|
957
|
+
async _retryWithProgressIfNotConnected(progress, selector, strict, performActionPreChecks, action) {
|
|
952
958
|
progress.log(`waiting for ${this._asLocator(selector)}`);
|
|
953
959
|
return this.retryWithProgressAndTimeouts(progress, [0, 20, 50, 100, 100, 500], async continuePolling => {
|
|
954
|
-
if (
|
|
960
|
+
if (performActionPreChecks) await this._page.performActionPreChecks(progress);
|
|
955
961
|
const resolved = await this.selectors.resolveInjectedForSelector(selector, {
|
|
956
962
|
strict
|
|
957
963
|
});
|
|
958
964
|
progress.throwIfAborted();
|
|
959
965
|
if (!resolved) return continuePolling;
|
|
960
966
|
const result = await resolved.injected.evaluateHandle((injected, {
|
|
961
|
-
info
|
|
967
|
+
info,
|
|
968
|
+
callId
|
|
962
969
|
}) => {
|
|
963
970
|
const elements = injected.querySelectorAll(info.parsed, document);
|
|
971
|
+
if (callId) injected.markTargetElements(new Set(elements), callId);
|
|
964
972
|
const element = elements[0];
|
|
965
973
|
let log = '';
|
|
966
974
|
if (elements.length > 1) {
|
|
@@ -975,7 +983,8 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
975
983
|
element
|
|
976
984
|
};
|
|
977
985
|
}, {
|
|
978
|
-
info: resolved.info
|
|
986
|
+
info: resolved.info,
|
|
987
|
+
callId: progress.metadata.id
|
|
979
988
|
});
|
|
980
989
|
const {
|
|
981
990
|
log,
|
|
@@ -1004,7 +1013,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1004
1013
|
});
|
|
1005
1014
|
}
|
|
1006
1015
|
async rafrafTimeoutScreenshotElementWithProgress(progress, selector, timeout, options) {
|
|
1007
|
-
return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /*
|
|
1016
|
+
return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /* performActionPreChecks */, async handle => {
|
|
1008
1017
|
await handle._frame.rafrafTimeout(timeout);
|
|
1009
1018
|
return await this._page._screenshotter.screenshotElement(progress, handle, options);
|
|
1010
1019
|
});
|
|
@@ -1012,7 +1021,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1012
1021
|
async click(metadata, selector, options) {
|
|
1013
1022
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1014
1023
|
return controller.run(async progress => {
|
|
1015
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1024
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._click(progress, {
|
|
1016
1025
|
...options,
|
|
1017
1026
|
waitAfter: !options.noWaitAfter
|
|
1018
1027
|
})));
|
|
@@ -1021,13 +1030,13 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1021
1030
|
async dblclick(metadata, selector, options = {}) {
|
|
1022
1031
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1023
1032
|
return controller.run(async progress => {
|
|
1024
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1033
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._dblclick(progress, options)));
|
|
1025
1034
|
}, this._page._timeoutSettings.timeout(options));
|
|
1026
1035
|
}
|
|
1027
1036
|
async dragAndDrop(metadata, source, target, options = {}) {
|
|
1028
1037
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1029
1038
|
await controller.run(async progress => {
|
|
1030
|
-
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, source, options.strict, !options.force /*
|
|
1039
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, source, options.strict, !options.force /* performActionPreChecks */, async handle => {
|
|
1031
1040
|
return handle._retryPointerAction(progress, 'move and down', false, async point => {
|
|
1032
1041
|
await this._page.mouse.move(point.x, point.y);
|
|
1033
1042
|
await this._page.mouse.down();
|
|
@@ -1039,7 +1048,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1039
1048
|
});
|
|
1040
1049
|
}));
|
|
1041
1050
|
// Note: do not perform locator handlers checkpoint to avoid moving the mouse in the middle of a drag operation.
|
|
1042
|
-
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, target, options.strict, false /*
|
|
1051
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, target, options.strict, false /* performActionPreChecks */, async handle => {
|
|
1043
1052
|
return handle._retryPointerAction(progress, 'move and up', false, async point => {
|
|
1044
1053
|
await this._page.mouse.move(point.x, point.y);
|
|
1045
1054
|
await this._page.mouse.up();
|
|
@@ -1056,25 +1065,25 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1056
1065
|
if (!this._page._browserContext._options.hasTouch) throw new Error('The page does not support tap. Use hasTouch context option to enable touch support.');
|
|
1057
1066
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1058
1067
|
return controller.run(async progress => {
|
|
1059
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1068
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._tap(progress, options)));
|
|
1060
1069
|
}, this._page._timeoutSettings.timeout(options));
|
|
1061
1070
|
}
|
|
1062
1071
|
async fill(metadata, selector, value, options) {
|
|
1063
1072
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1064
1073
|
return controller.run(async progress => {
|
|
1065
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1074
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._fill(progress, value, options)));
|
|
1066
1075
|
}, this._page._timeoutSettings.timeout(options));
|
|
1067
1076
|
}
|
|
1068
1077
|
async focus(metadata, selector, options = {}) {
|
|
1069
1078
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1070
1079
|
await controller.run(async progress => {
|
|
1071
|
-
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /*
|
|
1080
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performActionPreChecks */, handle => handle._focus(progress)));
|
|
1072
1081
|
}, this._page._timeoutSettings.timeout(options));
|
|
1073
1082
|
}
|
|
1074
1083
|
async blur(metadata, selector, options = {}) {
|
|
1075
1084
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1076
1085
|
await controller.run(async progress => {
|
|
1077
|
-
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /*
|
|
1086
|
+
dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performActionPreChecks */, handle => handle._blur(progress)));
|
|
1078
1087
|
}, this._page._timeoutSettings.timeout(options));
|
|
1079
1088
|
}
|
|
1080
1089
|
async textContent(metadata, selector, options = {}, scope) {
|
|
@@ -1127,7 +1136,8 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1127
1136
|
}, {
|
|
1128
1137
|
state
|
|
1129
1138
|
}, options, scope);
|
|
1130
|
-
|
|
1139
|
+
if (result.received === 'error:notconnected') dom.throwElementIsNotAttached();
|
|
1140
|
+
return result.matches;
|
|
1131
1141
|
}
|
|
1132
1142
|
async isVisible(metadata, selector, options = {}, scope) {
|
|
1133
1143
|
const controller = new _progress.ProgressController(metadata, this);
|
|
@@ -1145,8 +1155,11 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1145
1155
|
root
|
|
1146
1156
|
}) => {
|
|
1147
1157
|
const element = injected.querySelector(info.parsed, root || document, info.strict);
|
|
1148
|
-
const state = element ? injected.elementState(element, 'visible') :
|
|
1149
|
-
|
|
1158
|
+
const state = element ? injected.elementState(element, 'visible') : {
|
|
1159
|
+
matches: false,
|
|
1160
|
+
received: 'error:notconnected'
|
|
1161
|
+
};
|
|
1162
|
+
return state.matches;
|
|
1150
1163
|
}, {
|
|
1151
1164
|
info: resolved.info,
|
|
1152
1165
|
root: resolved.frame === this ? scope : undefined
|
|
@@ -1174,44 +1187,44 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1174
1187
|
async hover(metadata, selector, options = {}) {
|
|
1175
1188
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1176
1189
|
return controller.run(async progress => {
|
|
1177
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1190
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._hover(progress, options)));
|
|
1178
1191
|
}, this._page._timeoutSettings.timeout(options));
|
|
1179
1192
|
}
|
|
1180
1193
|
async selectOption(metadata, selector, elements, values, options = {}) {
|
|
1181
1194
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1182
1195
|
return controller.run(async progress => {
|
|
1183
|
-
return await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1196
|
+
return await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._selectOption(progress, elements, values, options));
|
|
1184
1197
|
}, this._page._timeoutSettings.timeout(options));
|
|
1185
1198
|
}
|
|
1186
1199
|
async setInputFiles(metadata, selector, params) {
|
|
1187
1200
|
const inputFileItems = await (0, _fileUploadUtils.prepareFilesForUpload)(this, params);
|
|
1188
1201
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1189
1202
|
return controller.run(async progress => {
|
|
1190
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, true /*
|
|
1203
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, params.strict, true /* performActionPreChecks */, handle => handle._setInputFiles(progress, inputFileItems)));
|
|
1191
1204
|
}, this._page._timeoutSettings.timeout(params));
|
|
1192
1205
|
}
|
|
1193
1206
|
async type(metadata, selector, text, options = {}) {
|
|
1194
1207
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1195
1208
|
return controller.run(async progress => {
|
|
1196
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /*
|
|
1209
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performActionPreChecks */, handle => handle._type(progress, text, options)));
|
|
1197
1210
|
}, this._page._timeoutSettings.timeout(options));
|
|
1198
1211
|
}
|
|
1199
1212
|
async press(metadata, selector, key, options = {}) {
|
|
1200
1213
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1201
1214
|
return controller.run(async progress => {
|
|
1202
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /*
|
|
1215
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, true /* performActionPreChecks */, handle => handle._press(progress, key, options)));
|
|
1203
1216
|
}, this._page._timeoutSettings.timeout(options));
|
|
1204
1217
|
}
|
|
1205
1218
|
async check(metadata, selector, options = {}) {
|
|
1206
1219
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1207
1220
|
return controller.run(async progress => {
|
|
1208
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1221
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._setChecked(progress, true, options)));
|
|
1209
1222
|
}, this._page._timeoutSettings.timeout(options));
|
|
1210
1223
|
}
|
|
1211
1224
|
async uncheck(metadata, selector, options = {}) {
|
|
1212
1225
|
const controller = new _progress.ProgressController(metadata, this);
|
|
1213
1226
|
return controller.run(async progress => {
|
|
1214
|
-
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /*
|
|
1227
|
+
return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options.strict, !options.force /* performActionPreChecks */, handle => handle._setChecked(progress, false, options)));
|
|
1215
1228
|
}, this._page._timeoutSettings.timeout(options));
|
|
1216
1229
|
}
|
|
1217
1230
|
async waitForTimeout(metadata, timeout) {
|
|
@@ -1220,6 +1233,12 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1220
1233
|
await new Promise(resolve => setTimeout(resolve, timeout));
|
|
1221
1234
|
});
|
|
1222
1235
|
}
|
|
1236
|
+
async ariaSnapshot(metadata, selector, options = {}) {
|
|
1237
|
+
const controller = new _progress.ProgressController(metadata, this);
|
|
1238
|
+
return controller.run(async progress => {
|
|
1239
|
+
return await this._retryWithProgressIfNotConnected(progress, selector, true /* strict */, true /* performActionPreChecks */, handle => handle.ariaSnapshot(options));
|
|
1240
|
+
}, this._page._timeoutSettings.timeout(options));
|
|
1241
|
+
}
|
|
1223
1242
|
async expect(metadata, selector, options) {
|
|
1224
1243
|
const result = await this._expectImpl(metadata, selector, options);
|
|
1225
1244
|
// Library mode special case for the expect errors which are return values, not exceptions.
|
|
@@ -1243,7 +1262,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1243
1262
|
await new _progress.ProgressController(metadata, this).run(async progress => {
|
|
1244
1263
|
progress.log(`${metadata.apiName}${timeout ? ` with timeout ${timeout}ms` : ''}`);
|
|
1245
1264
|
progress.log(`waiting for ${this._asLocator(selector)}`);
|
|
1246
|
-
await this._page.
|
|
1265
|
+
await this._page.performActionPreChecks(progress);
|
|
1247
1266
|
}, timeout);
|
|
1248
1267
|
|
|
1249
1268
|
// Step 2: perform one-shot expect check without a timeout.
|
|
@@ -1264,7 +1283,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1264
1283
|
}
|
|
1265
1284
|
if (timeout < 0) return {
|
|
1266
1285
|
matches: options.isNot,
|
|
1267
|
-
log: metadata.log,
|
|
1286
|
+
log: (0, _callLog.compressCallLog)(metadata.log),
|
|
1268
1287
|
timedOut: true,
|
|
1269
1288
|
received: lastIntermediateResult.received
|
|
1270
1289
|
};
|
|
@@ -1272,7 +1291,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1272
1291
|
// Step 3: auto-retry expect with increasing timeouts. Bounded by the total remaining time.
|
|
1273
1292
|
return await new _progress.ProgressController(metadata, this).run(async progress => {
|
|
1274
1293
|
return await this.retryWithProgressAndTimeouts(progress, [100, 250, 500, 1000], async continuePolling => {
|
|
1275
|
-
await this._page.
|
|
1294
|
+
await this._page.performActionPreChecks(progress);
|
|
1276
1295
|
const {
|
|
1277
1296
|
matches,
|
|
1278
1297
|
received
|
|
@@ -1295,7 +1314,7 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1295
1314
|
if (js.isJavaScriptErrorInEvaluate(e) || (0, _selectorParser.isInvalidSelectorError)(e)) throw e;
|
|
1296
1315
|
const result = {
|
|
1297
1316
|
matches: options.isNot,
|
|
1298
|
-
log: metadata.log
|
|
1317
|
+
log: (0, _callLog.compressCallLog)(metadata.log)
|
|
1299
1318
|
};
|
|
1300
1319
|
if (lastIntermediateResult.isSet) result.received = lastIntermediateResult.received;
|
|
1301
1320
|
if (e instanceof _errors.TimeoutError) result.timedOut = true;
|
|
@@ -1330,10 +1349,10 @@ class Frame extends _instrumentation.SdkObject {
|
|
|
1330
1349
|
callId
|
|
1331
1350
|
}) => {
|
|
1332
1351
|
const elements = info ? injected.querySelectorAll(info.parsed, document) : [];
|
|
1352
|
+
if (callId) injected.markTargetElements(new Set(elements), callId);
|
|
1333
1353
|
const isArray = options.expression === 'to.have.count' || options.expression.endsWith('.array');
|
|
1334
1354
|
let log = '';
|
|
1335
1355
|
if (isArray) log = ` locator resolved to ${elements.length} element${elements.length === 1 ? '' : 's'}`;else if (elements.length > 1) throw injected.strictModeViolationError(info.parsed, elements);else if (elements.length) log = ` locator resolved to ${injected.previewNode(elements[0])}`;
|
|
1336
|
-
if (callId) injected.markTargetElements(new Set(elements), callId);
|
|
1337
1356
|
return {
|
|
1338
1357
|
log,
|
|
1339
1358
|
...(await injected.expect(elements[0], options, elements))
|
|
@@ -1641,15 +1660,6 @@ function verifyLifecycle(name, waitUntil) {
|
|
|
1641
1660
|
return waitUntil;
|
|
1642
1661
|
}
|
|
1643
1662
|
function renderUnexpectedValue(expression, received) {
|
|
1644
|
-
if (expression === 'to.
|
|
1645
|
-
if (expression === 'to.be.unchecked') return received ? 'unchecked' : 'checked';
|
|
1646
|
-
if (expression === 'to.be.visible') return received ? 'visible' : 'hidden';
|
|
1647
|
-
if (expression === 'to.be.hidden') return received ? 'hidden' : 'visible';
|
|
1648
|
-
if (expression === 'to.be.enabled') return received ? 'enabled' : 'disabled';
|
|
1649
|
-
if (expression === 'to.be.disabled') return received ? 'disabled' : 'enabled';
|
|
1650
|
-
if (expression === 'to.be.editable') return received ? 'editable' : 'readonly';
|
|
1651
|
-
if (expression === 'to.be.readonly') return received ? 'readonly' : 'editable';
|
|
1652
|
-
if (expression === 'to.be.empty') return received ? 'empty' : 'not empty';
|
|
1653
|
-
if (expression === 'to.be.focused') return received ? 'focused' : 'not focused';
|
|
1663
|
+
if (expression === 'to.match.aria') return received ? received.raw : received;
|
|
1654
1664
|
return received;
|
|
1655
1665
|
}
|