@checkly/playwright-core 1.48.22 → 1.51.11-beta.2
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 +7888 -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
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var _fs = _interopRequireDefault(require("fs"));
|
|
4
4
|
var _path = _interopRequireDefault(require("path"));
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var _manualPromise = require("../../utils/isomorphic/manualPromise");
|
|
6
|
+
var _network = require("../utils/network");
|
|
7
7
|
var _zipBundle = require("../../zipBundle");
|
|
8
|
-
function _interopRequireDefault(
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
9
|
/**
|
|
10
10
|
* Copyright (c) Microsoft Corporation.
|
|
11
11
|
*
|
|
@@ -7,7 +7,7 @@ exports.Screenshotter = void 0;
|
|
|
7
7
|
exports.validateScreenshotOptions = validateScreenshotOptions;
|
|
8
8
|
var _helper = require("./helper");
|
|
9
9
|
var _utils = require("../utils");
|
|
10
|
-
var _multimap = require("../utils/multimap");
|
|
10
|
+
var _multimap = require("../utils/isomorphic/multimap");
|
|
11
11
|
/**
|
|
12
12
|
* Copyright 2019 Google Inc. All rights reserved.
|
|
13
13
|
* Modifications copyright (c) Microsoft Corporation.
|
package/lib/server/selectors.js
CHANGED
|
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.Selectors = void 0;
|
|
7
|
+
var _crypto = require("./utils/crypto");
|
|
7
8
|
var _selectorParser = require("../utils/isomorphic/selectorParser");
|
|
8
|
-
var _utils = require("../utils");
|
|
9
9
|
/**
|
|
10
10
|
* Copyright (c) Microsoft Corporation.
|
|
11
11
|
*
|
|
@@ -27,10 +27,10 @@ class Selectors {
|
|
|
27
27
|
this._builtinEngines = void 0;
|
|
28
28
|
this._builtinEnginesInMainWorld = void 0;
|
|
29
29
|
this._engines = void 0;
|
|
30
|
-
this.guid = `selectors@${(0,
|
|
30
|
+
this.guid = `selectors@${(0, _crypto.createGuid)()}`;
|
|
31
31
|
this._testIdAttributeName = 'data-testid';
|
|
32
32
|
// Note: keep in sync with InjectedScript class.
|
|
33
|
-
this._builtinEngines = new Set(['css', 'css:light', 'xpath', 'xpath:light', '_react', '_vue', 'text', 'text:light', 'id', 'id:light', 'data-testid', 'data-testid:light', 'data-test-id', 'data-test-id:light', 'data-test', 'data-test:light', 'nth', 'visible', 'internal:control', 'internal:has', 'internal:has-not', 'internal:has-text', 'internal:has-not-text', 'internal:and', 'internal:or', 'internal:chain', 'role', 'internal:attr', 'internal:label', 'internal:text', 'internal:role', 'internal:testid']);
|
|
33
|
+
this._builtinEngines = new Set(['css', 'css:light', 'xpath', 'xpath:light', '_react', '_vue', 'text', 'text:light', 'id', 'id:light', 'data-testid', 'data-testid:light', 'data-test-id', 'data-test-id:light', 'data-test', 'data-test:light', 'nth', 'visible', 'internal:control', 'internal:has', 'internal:has-not', 'internal:has-text', 'internal:has-not-text', 'internal:and', 'internal:or', 'internal:chain', 'role', 'internal:attr', 'internal:label', 'internal:text', 'internal:role', 'internal:testid', 'internal:aria-id']);
|
|
34
34
|
this._builtinEnginesInMainWorld = new Set(['_react', '_vue']);
|
|
35
35
|
this._engines = new Map();
|
|
36
36
|
}
|
|
@@ -6,18 +6,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.ClientCertificatesProxy = void 0;
|
|
7
7
|
exports.getMatchingTLSOptionsForOrigin = getMatchingTLSOptionsForOrigin;
|
|
8
8
|
exports.rewriteOpenSSLErrorIfNeeded = rewriteOpenSSLErrorIfNeeded;
|
|
9
|
-
var
|
|
9
|
+
var _events = require("events");
|
|
10
10
|
var _http = _interopRequireDefault(require("http2"));
|
|
11
|
-
var
|
|
11
|
+
var _net = _interopRequireDefault(require("net"));
|
|
12
12
|
var _stream = _interopRequireDefault(require("stream"));
|
|
13
|
-
var
|
|
13
|
+
var _tls = _interopRequireDefault(require("tls"));
|
|
14
|
+
var _socksProxy = require("./utils/socksProxy");
|
|
14
15
|
var _utils = require("../utils");
|
|
15
|
-
var _socksProxy = require("../common/socksProxy");
|
|
16
|
-
var _debugLogger = require("../utils/debugLogger");
|
|
17
|
-
var _fetch = require("./fetch");
|
|
18
|
-
var _events = require("events");
|
|
19
16
|
var _browserContext = require("./browserContext");
|
|
20
|
-
|
|
17
|
+
var _fetch = require("./fetch");
|
|
18
|
+
var _debugLogger = require("./utils/debugLogger");
|
|
19
|
+
var _happyEyeballs = require("./utils/happyEyeballs");
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
21
|
/**
|
|
22
22
|
* Copyright (c) Microsoft Corporation.
|
|
23
23
|
*
|
|
@@ -4,12 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.SocksInterceptor = void 0;
|
|
7
|
-
var socks = _interopRequireWildcard(require("../common/socksProxy"));
|
|
8
7
|
var _events = _interopRequireDefault(require("events"));
|
|
8
|
+
var socks = _interopRequireWildcard(require("./utils/socksProxy"));
|
|
9
9
|
var _validator = require("../protocol/validator");
|
|
10
|
-
|
|
10
|
+
var _debug = require("./utils/debug");
|
|
11
11
|
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); }
|
|
12
|
-
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 &&
|
|
12
|
+
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; }
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
14
|
/**
|
|
14
15
|
* Copyright (c) Microsoft Corporation.
|
|
15
16
|
*
|
|
@@ -44,7 +45,8 @@ class SocksInterceptor {
|
|
|
44
45
|
const validator = (0, _validator.findValidator)('SocksSupport', prop, 'Params');
|
|
45
46
|
params = validator(params, '', {
|
|
46
47
|
tChannelImpl: tChannelForSocks,
|
|
47
|
-
binary: 'toBase64'
|
|
48
|
+
binary: 'toBase64',
|
|
49
|
+
isUnderTest: _debug.isUnderTest
|
|
48
50
|
});
|
|
49
51
|
transport.send({
|
|
50
52
|
id,
|
|
@@ -86,7 +88,8 @@ class SocksInterceptor {
|
|
|
86
88
|
const validator = (0, _validator.findValidator)('SocksSupport', message.method, 'Event');
|
|
87
89
|
const params = validator(message.params, '', {
|
|
88
90
|
tChannelImpl: tChannelForSocks,
|
|
89
|
-
binary: 'fromBase64'
|
|
91
|
+
binary: 'fromBase64',
|
|
92
|
+
isUnderTest: _debug.isUnderTest
|
|
90
93
|
});
|
|
91
94
|
this._channel.emit(message.method, params);
|
|
92
95
|
return true;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.collect = collect;
|
|
7
|
+
exports.restore = restore;
|
|
8
|
+
/**
|
|
9
|
+
* Copyright (c) Microsoft Corporation.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
* you may not use this file except in compliance with the License.
|
|
13
|
+
* You may obtain a copy of the License at
|
|
14
|
+
*
|
|
15
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
*
|
|
17
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
* See the License for the specific language governing permissions and
|
|
21
|
+
* limitations under the License.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
async function collect(serializers, isFirefox, recordIndexedDB) {
|
|
25
|
+
async function collectDB(dbInfo) {
|
|
26
|
+
if (!dbInfo.name) throw new Error('Database name is empty');
|
|
27
|
+
if (!dbInfo.version) throw new Error('Database version is unset');
|
|
28
|
+
function idbRequestToPromise(request) {
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
request.addEventListener('success', () => resolve(request.result));
|
|
31
|
+
request.addEventListener('error', () => reject(request.error));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function isPlainObject(v) {
|
|
35
|
+
const ctor = v === null || v === void 0 ? void 0 : v.constructor;
|
|
36
|
+
if (isFirefox) {
|
|
37
|
+
const constructorImpl = ctor === null || ctor === void 0 ? void 0 : ctor.toString();
|
|
38
|
+
if (constructorImpl.startsWith('function Object() {') && constructorImpl.includes('[native code]')) return true;
|
|
39
|
+
}
|
|
40
|
+
return ctor === Object;
|
|
41
|
+
}
|
|
42
|
+
function trySerialize(value) {
|
|
43
|
+
let trivial = true;
|
|
44
|
+
const encoded = serializers.serializeAsCallArgument(value, v => {
|
|
45
|
+
const isTrivial = isPlainObject(v) || Array.isArray(v) || typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean' || Object.is(v, null);
|
|
46
|
+
if (!isTrivial) trivial = false;
|
|
47
|
+
return {
|
|
48
|
+
fallThrough: v
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
if (trivial) return {
|
|
52
|
+
trivial: value
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
encoded
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const db = await idbRequestToPromise(indexedDB.open(dbInfo.name));
|
|
59
|
+
const transaction = db.transaction(db.objectStoreNames, 'readonly');
|
|
60
|
+
const stores = await Promise.all([...db.objectStoreNames].map(async storeName => {
|
|
61
|
+
const objectStore = transaction.objectStore(storeName);
|
|
62
|
+
const keys = await idbRequestToPromise(objectStore.getAllKeys());
|
|
63
|
+
const records = await Promise.all(keys.map(async key => {
|
|
64
|
+
const record = {};
|
|
65
|
+
if (objectStore.keyPath === null) {
|
|
66
|
+
const {
|
|
67
|
+
encoded,
|
|
68
|
+
trivial
|
|
69
|
+
} = trySerialize(key);
|
|
70
|
+
if (trivial) record.key = trivial;else record.keyEncoded = encoded;
|
|
71
|
+
}
|
|
72
|
+
const value = await idbRequestToPromise(objectStore.get(key));
|
|
73
|
+
const {
|
|
74
|
+
encoded,
|
|
75
|
+
trivial
|
|
76
|
+
} = trySerialize(value);
|
|
77
|
+
if (trivial) record.value = trivial;else record.valueEncoded = encoded;
|
|
78
|
+
return record;
|
|
79
|
+
}));
|
|
80
|
+
const indexes = [...objectStore.indexNames].map(indexName => {
|
|
81
|
+
const index = objectStore.index(indexName);
|
|
82
|
+
return {
|
|
83
|
+
name: index.name,
|
|
84
|
+
keyPath: typeof index.keyPath === 'string' ? index.keyPath : undefined,
|
|
85
|
+
keyPathArray: Array.isArray(index.keyPath) ? index.keyPath : undefined,
|
|
86
|
+
multiEntry: index.multiEntry,
|
|
87
|
+
unique: index.unique
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
name: storeName,
|
|
92
|
+
records: records,
|
|
93
|
+
indexes,
|
|
94
|
+
autoIncrement: objectStore.autoIncrement,
|
|
95
|
+
keyPath: typeof objectStore.keyPath === 'string' ? objectStore.keyPath : undefined,
|
|
96
|
+
keyPathArray: Array.isArray(objectStore.keyPath) ? objectStore.keyPath : undefined
|
|
97
|
+
};
|
|
98
|
+
}));
|
|
99
|
+
return {
|
|
100
|
+
name: dbInfo.name,
|
|
101
|
+
version: dbInfo.version,
|
|
102
|
+
stores
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
localStorage: Object.keys(localStorage).map(name => ({
|
|
107
|
+
name,
|
|
108
|
+
value: localStorage.getItem(name)
|
|
109
|
+
})),
|
|
110
|
+
indexedDB: recordIndexedDB ? await Promise.all((await indexedDB.databases()).map(collectDB)).catch(e => {
|
|
111
|
+
throw new Error('Unable to serialize IndexedDB: ' + e.message);
|
|
112
|
+
}) : undefined
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async function restore(originState, serializers) {
|
|
116
|
+
var _originState$indexedD;
|
|
117
|
+
for (const {
|
|
118
|
+
name,
|
|
119
|
+
value
|
|
120
|
+
} of originState.localStorage || []) localStorage.setItem(name, value);
|
|
121
|
+
await Promise.all(((_originState$indexedD = originState.indexedDB) !== null && _originState$indexedD !== void 0 ? _originState$indexedD : []).map(async dbInfo => {
|
|
122
|
+
const openRequest = indexedDB.open(dbInfo.name, dbInfo.version);
|
|
123
|
+
openRequest.addEventListener('upgradeneeded', () => {
|
|
124
|
+
const db = openRequest.result;
|
|
125
|
+
for (const store of dbInfo.stores) {
|
|
126
|
+
var _store$keyPathArray;
|
|
127
|
+
const objectStore = db.createObjectStore(store.name, {
|
|
128
|
+
autoIncrement: store.autoIncrement,
|
|
129
|
+
keyPath: (_store$keyPathArray = store.keyPathArray) !== null && _store$keyPathArray !== void 0 ? _store$keyPathArray : store.keyPath
|
|
130
|
+
});
|
|
131
|
+
for (const index of store.indexes) {
|
|
132
|
+
var _index$keyPathArray;
|
|
133
|
+
objectStore.createIndex(index.name, (_index$keyPathArray = index.keyPathArray) !== null && _index$keyPathArray !== void 0 ? _index$keyPathArray : index.keyPath, {
|
|
134
|
+
unique: index.unique,
|
|
135
|
+
multiEntry: index.multiEntry
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
function idbRequestToPromise(request) {
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
request.addEventListener('success', () => resolve(request.result));
|
|
143
|
+
request.addEventListener('error', () => reject(request.error));
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// after `upgradeneeded` finishes, `success` event is fired.
|
|
148
|
+
const db = await idbRequestToPromise(openRequest);
|
|
149
|
+
const transaction = db.transaction(db.objectStoreNames, 'readwrite');
|
|
150
|
+
await Promise.all(dbInfo.stores.map(async store => {
|
|
151
|
+
const objectStore = transaction.objectStore(store.name);
|
|
152
|
+
await Promise.all(store.records.map(async record => {
|
|
153
|
+
var _record$value, _record$key;
|
|
154
|
+
await idbRequestToPromise(objectStore.add((_record$value = record.value) !== null && _record$value !== void 0 ? _record$value : serializers.parseEvaluationResultValue(record.valueEncoded), (_record$key = record.key) !== null && _record$key !== void 0 ? _record$key : serializers.parseEvaluationResultValue(record.keyEncoded)));
|
|
155
|
+
}));
|
|
156
|
+
}));
|
|
157
|
+
})).catch(e => {
|
|
158
|
+
throw new Error('Unable to restore IndexedDB: ' + e.message);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.TimeoutSettings = exports.DEFAULT_TIMEOUT = exports.DEFAULT_LAUNCH_TIMEOUT = void 0;
|
|
7
|
+
var _debug = require("./utils/debug");
|
|
8
|
+
/**
|
|
9
|
+
* Copyright 2019 Google Inc. All rights reserved.
|
|
10
|
+
* Modifications copyright (c) Microsoft Corporation.
|
|
11
|
+
*
|
|
12
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
+
* you may not use this file except in compliance with the License.
|
|
14
|
+
* You may obtain a copy of the License at
|
|
15
|
+
*
|
|
16
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
+
*
|
|
18
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
+
* See the License for the specific language governing permissions and
|
|
22
|
+
* limitations under the License.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// Keep in sync with client.
|
|
26
|
+
const DEFAULT_TIMEOUT = exports.DEFAULT_TIMEOUT = 30000;
|
|
27
|
+
const DEFAULT_LAUNCH_TIMEOUT = exports.DEFAULT_LAUNCH_TIMEOUT = 3 * 60 * 1000; // 3 minutes
|
|
28
|
+
|
|
29
|
+
class TimeoutSettings {
|
|
30
|
+
constructor(parent) {
|
|
31
|
+
this._parent = void 0;
|
|
32
|
+
this._defaultTimeout = void 0;
|
|
33
|
+
this._defaultNavigationTimeout = void 0;
|
|
34
|
+
this._parent = parent;
|
|
35
|
+
}
|
|
36
|
+
setDefaultTimeout(timeout) {
|
|
37
|
+
this._defaultTimeout = timeout;
|
|
38
|
+
}
|
|
39
|
+
setDefaultNavigationTimeout(timeout) {
|
|
40
|
+
this._defaultNavigationTimeout = timeout;
|
|
41
|
+
}
|
|
42
|
+
defaultNavigationTimeout() {
|
|
43
|
+
return this._defaultNavigationTimeout;
|
|
44
|
+
}
|
|
45
|
+
defaultTimeout() {
|
|
46
|
+
return this._defaultTimeout;
|
|
47
|
+
}
|
|
48
|
+
navigationTimeout(options) {
|
|
49
|
+
if (typeof options.timeout === 'number') return options.timeout;
|
|
50
|
+
if (this._defaultNavigationTimeout !== undefined) return this._defaultNavigationTimeout;
|
|
51
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
52
|
+
if (this._defaultTimeout !== undefined) return this._defaultTimeout;
|
|
53
|
+
if (this._parent) return this._parent.navigationTimeout(options);
|
|
54
|
+
return DEFAULT_TIMEOUT;
|
|
55
|
+
}
|
|
56
|
+
timeout(options) {
|
|
57
|
+
if (typeof options.timeout === 'number') return options.timeout;
|
|
58
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
59
|
+
if (this._defaultTimeout !== undefined) return this._defaultTimeout;
|
|
60
|
+
if (this._parent) return this._parent.timeout(options);
|
|
61
|
+
return DEFAULT_TIMEOUT;
|
|
62
|
+
}
|
|
63
|
+
static timeout(options) {
|
|
64
|
+
if (typeof options.timeout === 'number') return options.timeout;
|
|
65
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
66
|
+
return DEFAULT_TIMEOUT;
|
|
67
|
+
}
|
|
68
|
+
static launchTimeout(options) {
|
|
69
|
+
if (typeof options.timeout === 'number') return options.timeout;
|
|
70
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
71
|
+
return DEFAULT_LAUNCH_TIMEOUT;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.TimeoutSettings = TimeoutSettings;
|
|
@@ -4,13 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.Snapshotter = void 0;
|
|
7
|
-
var _browserContext = require("../../browserContext");
|
|
8
|
-
var _page = require("../../page");
|
|
9
|
-
var _eventsHelper = require("../../../utils/eventsHelper");
|
|
10
|
-
var _debugLogger = require("../../../utils/debugLogger");
|
|
11
7
|
var _snapshotterInjected = require("./snapshotterInjected");
|
|
12
|
-
var
|
|
8
|
+
var _time = require("../../../utils/isomorphic/time");
|
|
9
|
+
var _crypto = require("../../utils/crypto");
|
|
10
|
+
var _debugLogger = require("../../utils/debugLogger");
|
|
11
|
+
var _eventsHelper = require("../../utils/eventsHelper");
|
|
13
12
|
var _utilsBundle = require("../../../utilsBundle");
|
|
13
|
+
var _browserContext = require("../../browserContext");
|
|
14
|
+
var _page = require("../../page");
|
|
14
15
|
/**
|
|
15
16
|
* Copyright (c) Microsoft Corporation.
|
|
16
17
|
*
|
|
@@ -37,7 +38,7 @@ class Snapshotter {
|
|
|
37
38
|
this._started = false;
|
|
38
39
|
this._context = context;
|
|
39
40
|
this._delegate = delegate;
|
|
40
|
-
const guid = (0,
|
|
41
|
+
const guid = (0, _crypto.createGuid)();
|
|
41
42
|
this._snapshotStreamer = '__playwright_snapshot_streamer_' + guid;
|
|
42
43
|
}
|
|
43
44
|
started() {
|
|
@@ -81,21 +82,10 @@ class Snapshotter {
|
|
|
81
82
|
dispose() {
|
|
82
83
|
_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
83
84
|
}
|
|
84
|
-
async captureSnapshot(page, callId, snapshotName
|
|
85
|
+
async captureSnapshot(page, callId, snapshotName) {
|
|
85
86
|
// Prepare expression synchronously.
|
|
86
87
|
const expression = `window["${this._snapshotStreamer}"].captureSnapshot(${JSON.stringify(snapshotName)})`;
|
|
87
88
|
|
|
88
|
-
// In a best-effort manner, without waiting for it, mark target element.
|
|
89
|
-
element === null || element === void 0 || element.callFunctionNoReply((element, callId) => {
|
|
90
|
-
const customEvent = new CustomEvent('__playwright_target__', {
|
|
91
|
-
bubbles: true,
|
|
92
|
-
cancelable: true,
|
|
93
|
-
detail: callId,
|
|
94
|
-
composed: true
|
|
95
|
-
});
|
|
96
|
-
element.dispatchEvent(customEvent);
|
|
97
|
-
}, callId);
|
|
98
|
-
|
|
99
89
|
// In each frame, in a non-stalling manner, capture the snapshots.
|
|
100
90
|
const snapshots = page.frames().map(async frame => {
|
|
101
91
|
const data = await frame.nonStallingRawEvaluateInExistingMainContext(expression).catch(e => _debugLogger.debugLogger.log('error', e));
|
|
@@ -110,7 +100,7 @@ class Snapshotter {
|
|
|
110
100
|
doctype: data.doctype,
|
|
111
101
|
html: data.html,
|
|
112
102
|
viewport: data.viewport,
|
|
113
|
-
timestamp: (0,
|
|
103
|
+
timestamp: (0, _time.monotonicTime)(),
|
|
114
104
|
wallTime: data.wallTime,
|
|
115
105
|
collectionTime: data.collectionTime,
|
|
116
106
|
resourceOverrides: [],
|
|
@@ -123,7 +113,7 @@ class Snapshotter {
|
|
|
123
113
|
} of data.resourceOverrides) {
|
|
124
114
|
if (typeof content === 'string') {
|
|
125
115
|
const buffer = Buffer.from(content);
|
|
126
|
-
const sha1 = (0,
|
|
116
|
+
const sha1 = (0, _crypto.calculateSha1)(buffer) + '.' + (_utilsBundle.mime.getExtension(contentType) || 'dat');
|
|
127
117
|
this._delegate.onSnapshotterBlob({
|
|
128
118
|
sha1,
|
|
129
119
|
buffer
|
|
@@ -35,6 +35,8 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
35
35
|
const kTargetAttribute = '__playwright_target__';
|
|
36
36
|
const kCustomElementsAttribute = '__playwright_custom_elements__';
|
|
37
37
|
const kCurrentSrcAttribute = '__playwright_current_src__';
|
|
38
|
+
const kBoundingRectAttribute = '__playwright_bounding_rect__';
|
|
39
|
+
const kPopoverOpenAttribute = '__playwright_popover_open_';
|
|
38
40
|
|
|
39
41
|
// Symbols for our own info on Nodes/StyleSheets.
|
|
40
42
|
const kSnapshotFrameId = Symbol('__playwright_snapshot_frameid_');
|
|
@@ -112,11 +114,16 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
112
114
|
});
|
|
113
115
|
}
|
|
114
116
|
_refreshListeners() {
|
|
115
|
-
document.addEventListener('
|
|
117
|
+
document.addEventListener('__playwright_mark_target__', event => {
|
|
116
118
|
if (!event.detail) return;
|
|
117
119
|
const callId = event.detail;
|
|
118
120
|
event.composedPath()[0].__playwright_target__ = callId;
|
|
119
121
|
});
|
|
122
|
+
document.addEventListener('__playwright_unmark_target__', event => {
|
|
123
|
+
if (!event.detail) return;
|
|
124
|
+
const callId = event.detail;
|
|
125
|
+
if (event.composedPath()[0].__playwright_target__ === callId) delete event.composedPath()[0].__playwright_target__;
|
|
126
|
+
});
|
|
120
127
|
}
|
|
121
128
|
_interceptNativeMethod(obj, method, cb) {
|
|
122
129
|
const native = obj[method];
|
|
@@ -348,6 +355,24 @@ function frameSnapshotStreamer(snapshotStreamer, removeNoScript) {
|
|
|
348
355
|
expectValue(value);
|
|
349
356
|
attrs[kSelectedAttribute] = value;
|
|
350
357
|
}
|
|
358
|
+
if (nodeName === 'CANVAS' || nodeName === 'IFRAME' || nodeName === 'FRAME') {
|
|
359
|
+
const boundingRect = element.getBoundingClientRect();
|
|
360
|
+
const value = JSON.stringify({
|
|
361
|
+
left: boundingRect.left,
|
|
362
|
+
top: boundingRect.top,
|
|
363
|
+
right: boundingRect.right,
|
|
364
|
+
bottom: boundingRect.bottom
|
|
365
|
+
});
|
|
366
|
+
expectValue(kBoundingRectAttribute);
|
|
367
|
+
expectValue(value);
|
|
368
|
+
attrs[kBoundingRectAttribute] = value;
|
|
369
|
+
}
|
|
370
|
+
if (element.popover && element.matches && element.matches(':popover-open')) {
|
|
371
|
+
const value = 'true';
|
|
372
|
+
expectValue(kPopoverOpenAttribute);
|
|
373
|
+
expectValue(value);
|
|
374
|
+
attrs[kPopoverOpenAttribute] = value;
|
|
375
|
+
}
|
|
351
376
|
if (element.scrollTop) {
|
|
352
377
|
expectValue(kScrollTopAttribute);
|
|
353
378
|
expectValue(element.scrollTop);
|