patchright-core 1.50.1 → 1.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ThirdPartyNotices.txt +1 -43
- package/browsers.json +22 -10
- package/index.js +0 -1
- package/lib/androidServerImpl.js +4 -4
- package/lib/browserServerImpl.js +18 -9
- package/lib/cli/driver.js +6 -6
- package/lib/cli/program.js +9 -9
- package/lib/cli/programWithTestStub.js +2 -1
- package/lib/client/android.js +37 -58
- package/lib/client/artifact.js +4 -7
- package/lib/client/browser.js +10 -15
- package/lib/client/browserContext.js +77 -73
- package/lib/client/browserType.js +30 -64
- package/lib/client/channelOwner.js +23 -20
- package/lib/client/clientHelper.js +5 -7
- package/lib/client/clientStackTrace.js +65 -0
- package/lib/client/connection.js +46 -39
- package/lib/client/consoleMessage.js +4 -7
- package/lib/client/electron.js +10 -10
- package/lib/client/elementHandle.js +32 -33
- package/lib/client/errors.js +2 -2
- package/lib/client/eventEmitter.js +5 -8
- package/lib/client/fetch.js +60 -61
- package/lib/client/fileUtils.js +31 -0
- package/lib/client/frame.js +30 -29
- package/lib/client/harRouter.js +7 -9
- package/lib/client/jsHandle.js +3 -4
- package/lib/client/localUtils.js +24 -0
- package/lib/client/locator.js +37 -18
- package/lib/client/network.js +40 -40
- package/lib/client/page.js +59 -55
- package/lib/client/platform.js +71 -0
- package/lib/client/playwright.js +21 -1
- package/lib/client/selectors.js +8 -2
- package/lib/client/stream.js +2 -21
- package/lib/client/timeoutSettings.js +65 -0
- package/lib/client/tracing.js +10 -7
- package/lib/client/video.js +2 -2
- package/lib/client/waiter.js +5 -6
- package/lib/client/webSocket.js +106 -0
- package/lib/client/worker.js +12 -10
- package/lib/client/writableStream.js +2 -21
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/inProcessFactory.js +6 -3
- package/lib/outofprocess.js +12 -8
- package/lib/protocol/validator.js +64 -13
- package/lib/protocol/validatorPrimitives.js +1 -2
- package/lib/remote/playwrightConnection.js +18 -10
- package/lib/remote/playwrightServer.js +20 -7
- package/lib/server/android/android.js +17 -14
- package/lib/server/android/backendAdb.js +14 -14
- package/lib/server/artifact.js +3 -3
- package/lib/server/bidi/bidiBrowser.js +2 -2
- package/lib/server/bidi/bidiChromium.js +4 -3
- package/lib/server/bidi/bidiConnection.js +1 -1
- package/lib/server/bidi/bidiExecutionContext.js +70 -40
- package/lib/server/bidi/bidiFirefox.js +4 -3
- package/lib/server/bidi/bidiInput.js +5 -8
- package/lib/server/bidi/bidiNetworkManager.js +3 -3
- package/lib/server/bidi/bidiOverCdp.js +2 -2
- package/lib/server/bidi/bidiPage.js +30 -46
- package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
- package/lib/server/browser.js +2 -2
- package/lib/server/browserContext.js +37 -40
- package/lib/server/browserType.js +18 -17
- package/lib/{utils/sequence.js → server/callLog.js} +18 -3
- package/lib/server/chromium/chromium.js +14 -14
- package/lib/server/chromium/chromiumSwitches.js +32 -1
- package/lib/server/chromium/crBrowser.js +15 -14
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crCoverage.js +1 -1
- package/lib/server/chromium/crDevTools.js +1 -1
- package/lib/server/chromium/crDragDrop.js +1 -1
- package/lib/server/chromium/crExecutionContext.js +25 -17
- package/lib/server/chromium/crInput.js +2 -2
- package/lib/server/chromium/crNetworkManager.js +73 -26
- package/lib/server/chromium/crPage.js +22 -23
- package/lib/server/chromium/crPdf.js +1 -1
- package/lib/server/chromium/crProtocolHelper.js +3 -3
- package/lib/server/chromium/crServiceWorker.js +2 -2
- package/lib/server/chromium/videoRecorder.js +2 -2
- package/lib/server/clock.js +1 -1
- package/lib/server/codegen/javascript.js +1 -1
- package/lib/server/codegen/languages.js +2 -2
- package/lib/server/debugController.js +3 -3
- package/lib/server/deviceDescriptors.js +1 -1
- package/lib/server/deviceDescriptorsSource.json +131 -131
- package/lib/server/dispatchers/androidDispatcher.js +1 -1
- package/lib/server/dispatchers/artifactDispatcher.js +3 -3
- package/lib/server/dispatchers/browserContextDispatcher.js +19 -19
- package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
- package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
- package/lib/server/dispatchers/dispatcher.js +27 -25
- package/lib/server/dispatchers/electronDispatcher.js +3 -3
- package/lib/server/dispatchers/elementHandlerDispatcher.js +7 -2
- package/lib/server/dispatchers/frameDispatcher.js +4 -4
- package/lib/server/dispatchers/jsHandleDispatcher.js +2 -2
- package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
- package/lib/server/dispatchers/localUtilsDispatcher.js +25 -298
- package/lib/server/dispatchers/networkDispatchers.js +3 -3
- package/lib/server/dispatchers/pageDispatcher.js +11 -9
- package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
- package/lib/server/dispatchers/streamDispatcher.js +4 -3
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +8 -7
- package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
- package/lib/server/dom.js +18 -12
- package/lib/server/download.js +1 -1
- package/lib/server/electron/electron.js +17 -16
- package/lib/server/errors.js +1 -1
- package/lib/server/fetch.js +36 -25
- package/lib/server/fileUploadUtils.js +7 -4
- package/lib/server/firefox/ffBrowser.js +8 -2
- package/lib/server/firefox/ffConnection.js +1 -1
- package/lib/server/firefox/ffExecutionContext.js +25 -17
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +15 -21
- package/lib/server/firefox/firefox.js +7 -9
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +366 -209
- package/lib/server/har/harRecorder.js +4 -4
- package/lib/server/har/harTracer.js +7 -8
- package/lib/server/harBackend.js +157 -0
- package/lib/server/helper.js +2 -2
- package/lib/server/index.js +1 -8
- package/lib/server/input.js +1 -1
- package/lib/server/instrumentation.js +2 -2
- package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
- package/lib/server/javascript.js +46 -33
- package/lib/server/launchApp.js +2 -2
- package/lib/server/localUtils.js +203 -0
- package/lib/server/network.js +3 -3
- package/lib/server/page.js +41 -22
- package/lib/server/pipeTransport.js +1 -1
- package/lib/server/playwright.js +5 -5
- package/lib/server/progress.js +1 -1
- package/lib/server/protocolError.js +1 -1
- package/lib/server/recorder/contextRecorder.js +3 -3
- package/lib/server/recorder/recorderApp.js +18 -12
- package/lib/server/recorder/recorderCollection.js +3 -3
- package/lib/server/recorder/throttledFile.js +3 -4
- package/lib/server/recorder.js +7 -5
- package/lib/server/registry/browserFetcher.js +9 -7
- package/lib/server/registry/dependencies.js +15 -15
- package/lib/server/registry/index.js +38 -44
- package/lib/server/registry/oopDownloadBrowserMain.js +3 -3
- package/lib/server/screenshotter.js +1 -1
- package/lib/server/selectors.js +3 -3
- package/lib/server/socksClientCertificatesInterceptor.js +8 -8
- package/lib/server/socksInterceptor.js +8 -5
- package/lib/server/storageScript.js +160 -0
- package/lib/{common → server}/timeoutSettings.js +6 -5
- package/lib/server/trace/recorder/snapshotter.js +9 -8
- package/lib/server/trace/recorder/tracing.js +40 -31
- package/lib/server/trace/test/inMemorySnapshotter.js +4 -4
- package/lib/server/trace/viewer/traceViewer.js +13 -5
- package/lib/server/transport.js +2 -2
- package/lib/{utils → server/utils}/comparators.js +4 -4
- package/lib/{utils → server/utils}/crypto.js +4 -4
- package/lib/{utils → server/utils}/debug.js +4 -12
- package/lib/{utils → server/utils}/debugLogger.js +2 -2
- package/lib/{utils → server/utils}/env.js +4 -0
- package/lib/{utils → server/utils}/expectUtils.js +1 -1
- package/lib/{utils → server/utils}/fileUtils.js +4 -5
- package/lib/{utils/happy-eyeballs.js → server/utils/happyEyeballs.js} +22 -24
- package/lib/{utils → server/utils}/hostPlatform.js +1 -1
- package/lib/{utils → server/utils}/httpServer.js +8 -8
- package/lib/{utils → server/utils}/linuxUtils.js +3 -23
- package/lib/{utils → server/utils}/network.js +4 -4
- package/lib/server/utils/nodePlatform.js +140 -0
- package/lib/{protocol/transport.js → server/utils/pipeTransport.js} +2 -2
- package/lib/{utils → server/utils}/processLauncher.js +5 -5
- package/lib/{utils → server/utils}/profiler.js +5 -6
- package/lib/{common → server/utils}/socksProxy.js +10 -9
- package/lib/{utils → server/utils}/userAgent.js +2 -16
- package/lib/{utils → server/utils}/wsServer.js +3 -3
- package/lib/{utils → server/utils}/zipFile.js +1 -1
- package/lib/{utils → server/utils}/zones.js +9 -24
- package/lib/server/webkit/webkit.js +4 -4
- package/lib/server/webkit/wkBrowser.js +4 -4
- package/lib/server/webkit/wkConnection.js +1 -1
- package/lib/server/webkit/wkExecutionContext.js +25 -17
- package/lib/server/webkit/wkInput.js +2 -2
- package/lib/server/webkit/wkInterceptableRequest.js +2 -2
- package/lib/server/webkit/wkPage.js +41 -40
- package/lib/server/webkit/wkProvisionalPage.js +1 -1
- package/lib/server/webkit/wkWorkers.js +2 -2
- package/lib/utils/isomorphic/ariaSnapshot.js +2 -1
- package/lib/utils/isomorphic/assert.js +25 -0
- package/lib/utils/isomorphic/colors.js +65 -0
- package/lib/utils/isomorphic/cssParser.js +1 -1
- package/lib/utils/isomorphic/locatorGenerators.js +13 -1
- package/lib/utils/isomorphic/locatorParser.js +2 -2
- package/lib/utils/{manualPromise.js → isomorphic/manualPromise.js} +3 -5
- package/lib/utils/isomorphic/mimeType.js +11 -3
- package/lib/utils/{multimap.js → isomorphic/multimap.js} +1 -3
- package/lib/utils/{rtti.js → isomorphic/rtti.js} +2 -5
- package/lib/utils/isomorphic/stackTrace.js +169 -0
- package/lib/utils/isomorphic/stringUtils.js +1 -1
- package/lib/utils/{time.js → isomorphic/time.js} +1 -13
- package/lib/utils/{timeoutRunner.js → isomorphic/timeoutRunner.js} +4 -4
- package/lib/utils/isomorphic/traceUtils.js +23 -0
- package/lib/{utils/index.js → utils.js} +200 -121
- package/lib/utilsBundle.js +1 -25
- package/lib/utilsBundleImpl/index.js +114 -116
- package/lib/vite/htmlReport/index.html +20 -20
- package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-DpJ-EmBQ.js +24 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-DTenqiGw.js +259 -0
- package/lib/vite/traceViewer/assets/{xtermModule-c-SNdYZy.js → xtermModule-BoAIEibi.js} +7 -7
- package/lib/vite/traceViewer/defaultSettingsView.5fN5lw10.css +1 -0
- package/lib/vite/traceViewer/index.CUq7VgrV.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.CHJSAD7F.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/zipBundleImpl.js +4 -4
- package/package.json +7 -7
- package/types/protocol.d.ts +123 -99
- package/types/types.d.ts +91 -37
- package/lib/utils/stackTrace.js +0 -134
- package/lib/utils/traceUtils.js +0 -44
- package/lib/vite/recorder/assets/codeMirrorModule-CNAqJrkA.js +0 -24
- package/lib/vite/recorder/assets/index-DGS0JLxS.js +0 -184
- package/lib/vite/traceViewer/assets/codeMirrorModule-D55P_UuL.js +0 -24
- package/lib/vite/traceViewer/assets/defaultSettingsView-B-uNoFsX.js +0 -243
- package/lib/vite/traceViewer/defaultSettingsView.2xeEXCXv.css +0 -1
- package/lib/vite/traceViewer/index.BfvuujqP.js +0 -2
- package/lib/vite/traceViewer/uiMode.CStJu6jo.js +0 -5
- /package/lib/{utils → server/utils}/ascii.js +0 -0
- /package/lib/{utils → server/utils}/eventsHelper.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/colorUtils.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/compare.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/imageChannel.js +0 -0
- /package/lib/{image_tools → server/utils/image_tools}/stats.js +0 -0
- /package/lib/{utils → server/utils}/spawnAsync.js +0 -0
- /package/lib/{utils → server/utils}/task.js +0 -0
- /package/lib/utils/{headers.js → isomorphic/headers.js} +0 -0
- /package/lib/utils/{semaphore.js → isomorphic/semaphore.js} +0 -0
- /package/lib/{common → utils/isomorphic}/types.js +0 -0
|
@@ -11,19 +11,19 @@ exports.transformCommandsForRoot = transformCommandsForRoot;
|
|
|
11
11
|
exports.validateDependenciesLinux = validateDependenciesLinux;
|
|
12
12
|
exports.validateDependenciesWindows = validateDependenciesWindows;
|
|
13
13
|
exports.writeDockerVersion = writeDockerVersion;
|
|
14
|
+
var childProcess = _interopRequireWildcard(require("child_process"));
|
|
14
15
|
var _fs = _interopRequireDefault(require("fs"));
|
|
16
|
+
var _os = _interopRequireDefault(require("os"));
|
|
15
17
|
var _path = _interopRequireDefault(require("path"));
|
|
16
|
-
var os = _interopRequireWildcard(require("os"));
|
|
17
|
-
var _child_process = _interopRequireDefault(require("child_process"));
|
|
18
|
-
var utils = _interopRequireWildcard(require("../../utils"));
|
|
19
|
-
var _spawnAsync = require("../../utils/spawnAsync");
|
|
20
|
-
var _hostPlatform = require("../../utils/hostPlatform");
|
|
21
|
-
var _ = require(".");
|
|
22
18
|
var _nativeDeps = require("./nativeDeps");
|
|
23
|
-
var
|
|
19
|
+
var _ascii = require("../utils/ascii");
|
|
20
|
+
var _hostPlatform = require("../utils/hostPlatform");
|
|
21
|
+
var _spawnAsync = require("../utils/spawnAsync");
|
|
22
|
+
var _userAgent = require("../utils/userAgent");
|
|
23
|
+
var _ = require(".");
|
|
24
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
24
25
|
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); }
|
|
25
|
-
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 &&
|
|
26
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
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 && {}.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
27
|
/**
|
|
28
28
|
* Copyright (c) Microsoft Corporation.
|
|
29
29
|
*
|
|
@@ -73,8 +73,8 @@ const checkExecutable = filePath => {
|
|
|
73
73
|
return _fs.default.promises.access(filePath, _fs.default.constants.X_OK).then(() => true).catch(() => false);
|
|
74
74
|
};
|
|
75
75
|
function isSupportedWindowsVersion() {
|
|
76
|
-
if (
|
|
77
|
-
const [major, minor] =
|
|
76
|
+
if (_os.default.platform() !== 'win32' || _os.default.arch() !== 'x64') return false;
|
|
77
|
+
const [major, minor] = _os.default.release().split('.').map(token => parseInt(token, 10));
|
|
78
78
|
// This is based on: https://stackoverflow.com/questions/42524606/how-to-get-windows-version-using-node-js/44916050#44916050
|
|
79
79
|
// The table with versions is taken from: https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexw#remarks
|
|
80
80
|
// Windows 7 is not supported and is encoded as `6.1`.
|
|
@@ -124,7 +124,7 @@ async function installDependenciesLinux(targets, dryRun) {
|
|
|
124
124
|
return;
|
|
125
125
|
}
|
|
126
126
|
if (elevatedPermissions) console.log('Switching to root user to install dependencies...'); // eslint-disable-line no-console
|
|
127
|
-
const child =
|
|
127
|
+
const child = childProcess.spawn(command, args, {
|
|
128
128
|
stdio: 'inherit'
|
|
129
129
|
});
|
|
130
130
|
await new Promise((resolve, reject) => {
|
|
@@ -192,7 +192,7 @@ async function validateDependenciesLinux(sdkLanguage, linuxLddDirectories, dlOpe
|
|
|
192
192
|
missingDeps.delete(missingDep);
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
const maybeSudo = (_process$getuid = (_process = process).getuid) !== null && _process$getuid !== void 0 && _process$getuid.call(_process) &&
|
|
195
|
+
const maybeSudo = (_process$getuid = (_process = process).getuid) !== null && _process$getuid !== void 0 && _process$getuid.call(_process) && _os.default.platform() !== 'win32' ? 'sudo ' : '';
|
|
196
196
|
const dockerInfo = readDockerVersionSync();
|
|
197
197
|
const errorLines = [`Host system is missing dependencies to run browsers.`];
|
|
198
198
|
// Ignore patch versions when comparing docker container version and Playwright version:
|
|
@@ -213,10 +213,10 @@ async function validateDependenciesLinux(sdkLanguage, linuxLddDirectories, dlOpe
|
|
|
213
213
|
// Print missing libraries only:
|
|
214
214
|
errorLines.push(...[`Missing libraries:`, ...[...allMissingDeps].map(dep => ' ' + dep)]);
|
|
215
215
|
}
|
|
216
|
-
throw new Error('\n' +
|
|
216
|
+
throw new Error('\n' + (0, _ascii.wrapInASCIIBox)(errorLines.join('\n'), 1));
|
|
217
217
|
}
|
|
218
218
|
function isSharedLib(basename) {
|
|
219
|
-
switch (
|
|
219
|
+
switch (_os.default.platform()) {
|
|
220
220
|
case 'linux':
|
|
221
221
|
return basename.endsWith('.so') || basename.includes('.so.');
|
|
222
222
|
case 'win32':
|
|
@@ -15,23 +15,24 @@ Object.defineProperty(exports, "writeDockerVersion", {
|
|
|
15
15
|
return _dependencies.writeDockerVersion;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
|
-
var
|
|
18
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
19
|
+
var _os = _interopRequireDefault(require("os"));
|
|
19
20
|
var _path = _interopRequireDefault(require("path"));
|
|
20
21
|
var util = _interopRequireWildcard(require("util"));
|
|
21
|
-
var fs = _interopRequireWildcard(require("fs"));
|
|
22
|
-
var _utilsBundle = require("../../utilsBundle");
|
|
23
|
-
var _network = require("../../utils/network");
|
|
24
|
-
var _userAgent = require("../../utils/userAgent");
|
|
25
|
-
var _utils = require("../../utils");
|
|
26
|
-
var _fileUtils = require("../../utils/fileUtils");
|
|
27
|
-
var _hostPlatform = require("../../utils/hostPlatform");
|
|
28
|
-
var _spawnAsync = require("../../utils/spawnAsync");
|
|
29
|
-
var _dependencies = require("./dependencies");
|
|
30
22
|
var _browserFetcher = require("./browserFetcher");
|
|
31
|
-
var
|
|
32
|
-
|
|
23
|
+
var _dependencies = require("./dependencies");
|
|
24
|
+
var _utils = require("../../utils");
|
|
25
|
+
var _ascii = require("../utils/ascii");
|
|
26
|
+
var _debugLogger = require("../utils/debugLogger");
|
|
27
|
+
var _hostPlatform = require("../utils/hostPlatform");
|
|
28
|
+
var _network = require("../utils/network");
|
|
29
|
+
var _spawnAsync = require("../utils/spawnAsync");
|
|
30
|
+
var _userAgent = require("../utils/userAgent");
|
|
31
|
+
var _utilsBundle = require("../../utilsBundle");
|
|
32
|
+
var _fileUtils = require("../utils/fileUtils");
|
|
33
33
|
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); }
|
|
34
|
-
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 &&
|
|
34
|
+
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; }
|
|
35
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
35
36
|
/**
|
|
36
37
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
37
38
|
* Modifications copyright (c) Microsoft Corporation.
|
|
@@ -402,7 +403,7 @@ const registryDirectory = exports.registryDirectory = (() => {
|
|
|
402
403
|
result = envDefined;
|
|
403
404
|
} else {
|
|
404
405
|
let cacheDirectory;
|
|
405
|
-
if (process.platform === 'linux') cacheDirectory = process.env.XDG_CACHE_HOME || _path.default.join(
|
|
406
|
+
if (process.platform === 'linux') cacheDirectory = process.env.XDG_CACHE_HOME || _path.default.join(_os.default.homedir(), '.cache');else if (process.platform === 'darwin') cacheDirectory = _path.default.join(_os.default.homedir(), 'Library', 'Caches');else if (process.platform === 'win32') cacheDirectory = process.env.LOCALAPPDATA || _path.default.join(_os.default.homedir(), 'AppData', 'Local');else throw new Error('Unsupported platform: ' + process.platform);
|
|
406
407
|
result = _path.default.join(cacheDirectory, 'ms-playwright');
|
|
407
408
|
}
|
|
408
409
|
if (!_path.default.isAbsolute(result)) {
|
|
@@ -423,14 +424,7 @@ function isBrowserDirectory(browserDirectory) {
|
|
|
423
424
|
return false;
|
|
424
425
|
}
|
|
425
426
|
function readDescriptors(browsersJSON) {
|
|
426
|
-
|
|
427
|
-
for (const browserName of ['chromium', 'chromium-tip-of-tree']) {
|
|
428
|
-
headlessShells.push({
|
|
429
|
-
...browsersJSON.browsers.find(browser => browser.name === browserName),
|
|
430
|
-
name: `${browserName}-headless-shell`
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
return [...browsersJSON.browsers, ...headlessShells].map(obj => {
|
|
427
|
+
return browsersJSON['browsers'].map(obj => {
|
|
434
428
|
const name = obj.name;
|
|
435
429
|
const revisionOverride = (obj.revisionOverrides || {})[_hostPlatform.hostPlatform];
|
|
436
430
|
const revision = revisionOverride || obj.revision;
|
|
@@ -470,7 +464,7 @@ class Registry {
|
|
|
470
464
|
const preferredDockerVersion = currentDockerVersion ? (0, _dependencies.dockerVersion)(currentDockerVersion.dockerImageNameTemplate) : null;
|
|
471
465
|
const isOutdatedDockerImage = currentDockerVersion && preferredDockerVersion && currentDockerVersion.dockerImageName !== preferredDockerVersion.dockerImageName;
|
|
472
466
|
const prettyMessage = isOutdatedDockerImage ? [`Looks like ${sdkLanguage === 'javascript' ? 'Playwright Test or ' : ''}Playwright was just updated to ${preferredDockerVersion.driverVersion}.`, `Please update docker image as well.`, `- current: ${currentDockerVersion.dockerImageName}`, `- required: ${preferredDockerVersion.dockerImageName}`, ``, `<3 Playwright Team`].join('\n') : [`Looks like ${sdkLanguage === 'javascript' ? 'Playwright Test or ' : ''}Playwright was just installed or updated.`, `Please run the following command to download new browser${installByDefault ? 's' : ''}:`, ``, ` ${installCommand}`, ``, `<3 Playwright Team`].join('\n');
|
|
473
|
-
throw new Error(`Executable doesn't exist at ${e}\n${(0,
|
|
467
|
+
throw new Error(`Executable doesn't exist at ${e}\n${(0, _ascii.wrapInASCIIBox)(prettyMessage, 1)}`);
|
|
474
468
|
}
|
|
475
469
|
return e;
|
|
476
470
|
};
|
|
@@ -797,7 +791,7 @@ class Registry {
|
|
|
797
791
|
const folder = _path.default.resolve('firefox');
|
|
798
792
|
let channelName = 'stable';
|
|
799
793
|
if (name.includes('beta')) channelName = 'beta';else if (name.includes('nightly')) channelName = 'nightly';
|
|
800
|
-
const installedVersions =
|
|
794
|
+
const installedVersions = _fs.default.readdirSync(folder);
|
|
801
795
|
const found = installedVersions.filter(e => e.includes(channelName));
|
|
802
796
|
if (found.length === 1) return _path.default.join(folder, found[0], suffix);
|
|
803
797
|
if (found.length > 1) {
|
|
@@ -862,8 +856,8 @@ class Registry {
|
|
|
862
856
|
return Array.from(new Set(executables));
|
|
863
857
|
}
|
|
864
858
|
async _validateHostRequirements(sdkLanguage, browserDirectory, linuxLddDirectories, dlOpenLibraries, windowsExeAndDllDirectories) {
|
|
865
|
-
if (
|
|
866
|
-
if (
|
|
859
|
+
if (_os.default.platform() === 'linux') return await (0, _dependencies.validateDependenciesLinux)(sdkLanguage, linuxLddDirectories.map(d => _path.default.join(browserDirectory, d)), dlOpenLibraries);
|
|
860
|
+
if (_os.default.platform() === 'win32' && _os.default.arch() === 'x64') return await (0, _dependencies.validateDependenciesWindows)(sdkLanguage, windowsExeAndDllDirectories.map(d => _path.default.join(browserDirectory, d)));
|
|
867
861
|
}
|
|
868
862
|
async installDeps(executablesToInstallDeps, dryRun) {
|
|
869
863
|
const executables = this._dedupe(executablesToInstallDeps);
|
|
@@ -872,12 +866,12 @@ class Registry {
|
|
|
872
866
|
if (executable._dependencyGroup) targets.add(executable._dependencyGroup);
|
|
873
867
|
}
|
|
874
868
|
targets.add('tools');
|
|
875
|
-
if (
|
|
876
|
-
if (
|
|
869
|
+
if (_os.default.platform() === 'win32') return await (0, _dependencies.installDependenciesWindows)(targets, dryRun);
|
|
870
|
+
if (_os.default.platform() === 'linux') return await (0, _dependencies.installDependenciesLinux)(targets, dryRun);
|
|
877
871
|
}
|
|
878
872
|
async install(executablesToInstall, forceReinstall) {
|
|
879
873
|
const executables = this._dedupe(executablesToInstall);
|
|
880
|
-
await
|
|
874
|
+
await _fs.default.promises.mkdir(registryDirectory, {
|
|
881
875
|
recursive: true
|
|
882
876
|
});
|
|
883
877
|
const lockfilePath = _path.default.join(registryDirectory, '__dirlock');
|
|
@@ -898,10 +892,10 @@ class Registry {
|
|
|
898
892
|
lockfilePath
|
|
899
893
|
});
|
|
900
894
|
// Create a link first, so that cache validation does not remove our own browsers.
|
|
901
|
-
await
|
|
895
|
+
await _fs.default.promises.mkdir(linksDir, {
|
|
902
896
|
recursive: true
|
|
903
897
|
});
|
|
904
|
-
await
|
|
898
|
+
await _fs.default.promises.writeFile(_path.default.join(linksDir, (0, _utils.calculateSha1)(PACKAGE_PATH)), PACKAGE_PATH);
|
|
905
899
|
|
|
906
900
|
// Remove stale browsers.
|
|
907
901
|
await this._validateInstallationCache(linksDir);
|
|
@@ -914,14 +908,14 @@ class Registry {
|
|
|
914
908
|
} = (0, _userAgent.getEmbedderName)();
|
|
915
909
|
if (!(0, _utils.getAsBooleanFromENV)('CI') && !executable._isHermeticInstallation && !forceReinstall && executable.executablePath(embedderName)) {
|
|
916
910
|
const command = buildPlaywrightCLICommand(embedderName, 'install --force ' + executable.name);
|
|
917
|
-
throw new Error('\n' + (0,
|
|
911
|
+
throw new Error('\n' + (0, _ascii.wrapInASCIIBox)([`ATTENTION: "${executable.name}" is already installed on the system!`, ``, `"${executable.name}" installation is not hermetic; installing newer version`, `requires *removal* of a current installation first.`, ``, `To *uninstall* current version and re-install latest "${executable.name}":`, ``, `- Close all running instances of "${executable.name}", if any`, `- Use "--force" to install browser:`, ``, ` ${command}`, ``, `<3 Playwright Team`].join('\n'), 1));
|
|
918
912
|
}
|
|
919
913
|
await executable._install();
|
|
920
914
|
}
|
|
921
915
|
} catch (e) {
|
|
922
916
|
if (e.code === 'ELOCKED') {
|
|
923
917
|
const rmCommand = process.platform === 'win32' ? 'rm -R' : 'rm -rf';
|
|
924
|
-
throw new Error('\n' + (0,
|
|
918
|
+
throw new Error('\n' + (0, _ascii.wrapInASCIIBox)([`An active lockfile is found at:`, ``, ` ${lockfilePath}`, ``, `Either:`, `- wait a few minutes if other Playwright is installing browsers in parallel`, `- remove lock manually with:`, ``, ` ${rmCommand} ${lockfilePath}`, ``, `<3 Playwright Team`].join('\n'), 1));
|
|
925
919
|
} else {
|
|
926
920
|
throw e;
|
|
927
921
|
}
|
|
@@ -932,16 +926,16 @@ class Registry {
|
|
|
932
926
|
async uninstall(all) {
|
|
933
927
|
const linksDir = _path.default.join(registryDirectory, '.links');
|
|
934
928
|
if (all) {
|
|
935
|
-
const links = await
|
|
936
|
-
for (const link of links) await
|
|
929
|
+
const links = await _fs.default.promises.readdir(linksDir).catch(() => []);
|
|
930
|
+
for (const link of links) await _fs.default.promises.unlink(_path.default.join(linksDir, link));
|
|
937
931
|
} else {
|
|
938
|
-
await
|
|
932
|
+
await _fs.default.promises.unlink(_path.default.join(linksDir, (0, _utils.calculateSha1)(PACKAGE_PATH))).catch(() => {});
|
|
939
933
|
}
|
|
940
934
|
|
|
941
935
|
// Remove stale browsers.
|
|
942
936
|
await this._validateInstallationCache(linksDir);
|
|
943
937
|
return {
|
|
944
|
-
numberOfBrowsersLeft: (await
|
|
938
|
+
numberOfBrowsersLeft: (await _fs.default.promises.readdir(registryDirectory).catch(() => [])).filter(browserDirectory => isBrowserDirectory(browserDirectory)).length
|
|
945
939
|
};
|
|
946
940
|
}
|
|
947
941
|
async validateHostRequirementsForExecutablesIfNeeded(executables, sdkLanguage) {
|
|
@@ -957,7 +951,7 @@ class Registry {
|
|
|
957
951
|
if (!executable.directory) return;
|
|
958
952
|
const markerFile = _path.default.join(executable.directory, 'DEPENDENCIES_VALIDATED');
|
|
959
953
|
// Executable is already validated.
|
|
960
|
-
if (await
|
|
954
|
+
if (await _fs.default.promises.stat(markerFile).then(stat => Date.now() - stat.mtime.getTime() < kMaximumReValidationPeriod).catch(() => false)) return;
|
|
961
955
|
_debugLogger.debugLogger.log('install', `validating host requirements for "${executable.name}"`);
|
|
962
956
|
try {
|
|
963
957
|
await executable._validateHostRequirements(sdkLanguage);
|
|
@@ -966,7 +960,7 @@ class Registry {
|
|
|
966
960
|
_debugLogger.debugLogger.log('install', `validation failed for ${executable.name}`);
|
|
967
961
|
throw error;
|
|
968
962
|
}
|
|
969
|
-
await
|
|
963
|
+
await _fs.default.promises.writeFile(markerFile, '').catch(() => {});
|
|
970
964
|
}
|
|
971
965
|
_downloadURLs(descriptor) {
|
|
972
966
|
const paths = DOWNLOAD_PATHS[descriptor.name];
|
|
@@ -1063,11 +1057,11 @@ class Registry {
|
|
|
1063
1057
|
async _validateInstallationCache(linksDir) {
|
|
1064
1058
|
// 1. Collect used downloads and package descriptors.
|
|
1065
1059
|
const usedBrowserPaths = new Set();
|
|
1066
|
-
for (const fileName of await
|
|
1060
|
+
for (const fileName of await _fs.default.promises.readdir(linksDir)) {
|
|
1067
1061
|
const linkPath = _path.default.join(linksDir, fileName);
|
|
1068
1062
|
let linkTarget = '';
|
|
1069
1063
|
try {
|
|
1070
|
-
linkTarget = (await
|
|
1064
|
+
linkTarget = (await _fs.default.promises.readFile(linkPath)).toString();
|
|
1071
1065
|
const browsersJSON = require(_path.default.join(linkTarget, 'browsers.json'));
|
|
1072
1066
|
const descriptors = readDescriptors(browsersJSON);
|
|
1073
1067
|
for (const browserName of allDownloadable) {
|
|
@@ -1088,13 +1082,13 @@ class Registry {
|
|
|
1088
1082
|
if (!shouldHaveMarkerFile || (await (0, _fileUtils.existsAsync)(browserDirectoryToMarkerFilePath(usedBrowserPath)))) usedBrowserPaths.add(usedBrowserPath);
|
|
1089
1083
|
}
|
|
1090
1084
|
} catch (e) {
|
|
1091
|
-
await
|
|
1085
|
+
await _fs.default.promises.unlink(linkPath).catch(e => {});
|
|
1092
1086
|
}
|
|
1093
1087
|
}
|
|
1094
1088
|
|
|
1095
1089
|
// 2. Delete all unused browsers.
|
|
1096
1090
|
if (!(0, _utils.getAsBooleanFromENV)('PLAYWRIGHT_SKIP_BROWSER_GC')) {
|
|
1097
|
-
let downloadedBrowsers = (await
|
|
1091
|
+
let downloadedBrowsers = (await _fs.default.promises.readdir(registryDirectory)).map(file => _path.default.join(registryDirectory, file));
|
|
1098
1092
|
downloadedBrowsers = downloadedBrowsers.filter(file => isBrowserDirectory(file));
|
|
1099
1093
|
const directories = new Set(downloadedBrowsers);
|
|
1100
1094
|
for (const browserDirectory of usedBrowserPaths) directories.delete(browserDirectory);
|
|
@@ -1151,7 +1145,7 @@ function findChromiumChannel(sdkLanguage) {
|
|
|
1151
1145
|
if (channel === null) {
|
|
1152
1146
|
const installCommand = buildPlaywrightCLICommand(sdkLanguage, `install chromium`);
|
|
1153
1147
|
const prettyMessage = [`No chromium-based browser found on the system.`, `Please run the following command to download one:`, ``, ` ${installCommand}`, ``, `<3 Playwright Team`].join('\n');
|
|
1154
|
-
throw new Error('\n' + (0,
|
|
1148
|
+
throw new Error('\n' + (0, _ascii.wrapInASCIIBox)(prettyMessage, 1));
|
|
1155
1149
|
}
|
|
1156
1150
|
return channel;
|
|
1157
1151
|
}
|
|
@@ -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
|
+
}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.TimeoutSettings = exports.DEFAULT_TIMEOUT = exports.DEFAULT_LAUNCH_TIMEOUT = void 0;
|
|
7
|
-
var
|
|
7
|
+
var _debug = require("./utils/debug");
|
|
8
8
|
/**
|
|
9
9
|
* Copyright 2019 Google Inc. All rights reserved.
|
|
10
10
|
* Modifications copyright (c) Microsoft Corporation.
|
|
@@ -22,6 +22,7 @@ var _utils = require("../utils");
|
|
|
22
22
|
* limitations under the License.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
// Keep in sync with client.
|
|
25
26
|
const DEFAULT_TIMEOUT = exports.DEFAULT_TIMEOUT = 30000;
|
|
26
27
|
const DEFAULT_LAUNCH_TIMEOUT = exports.DEFAULT_LAUNCH_TIMEOUT = 3 * 60 * 1000; // 3 minutes
|
|
27
28
|
|
|
@@ -47,26 +48,26 @@ class TimeoutSettings {
|
|
|
47
48
|
navigationTimeout(options) {
|
|
48
49
|
if (typeof options.timeout === 'number') return options.timeout;
|
|
49
50
|
if (this._defaultNavigationTimeout !== undefined) return this._defaultNavigationTimeout;
|
|
50
|
-
if ((0,
|
|
51
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
51
52
|
if (this._defaultTimeout !== undefined) return this._defaultTimeout;
|
|
52
53
|
if (this._parent) return this._parent.navigationTimeout(options);
|
|
53
54
|
return DEFAULT_TIMEOUT;
|
|
54
55
|
}
|
|
55
56
|
timeout(options) {
|
|
56
57
|
if (typeof options.timeout === 'number') return options.timeout;
|
|
57
|
-
if ((0,
|
|
58
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
58
59
|
if (this._defaultTimeout !== undefined) return this._defaultTimeout;
|
|
59
60
|
if (this._parent) return this._parent.timeout(options);
|
|
60
61
|
return DEFAULT_TIMEOUT;
|
|
61
62
|
}
|
|
62
63
|
static timeout(options) {
|
|
63
64
|
if (typeof options.timeout === 'number') return options.timeout;
|
|
64
|
-
if ((0,
|
|
65
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
65
66
|
return DEFAULT_TIMEOUT;
|
|
66
67
|
}
|
|
67
68
|
static launchTimeout(options) {
|
|
68
69
|
if (typeof options.timeout === 'number') return options.timeout;
|
|
69
|
-
if ((0,
|
|
70
|
+
if ((0, _debug.debugMode)()) return 0;
|
|
70
71
|
return DEFAULT_LAUNCH_TIMEOUT;
|
|
71
72
|
}
|
|
72
73
|
}
|