@checkly/playwright-core 1.41.2-beta.0 → 1.41.2-beta.3
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/lib/browserServerImpl.js +1 -1
- package/lib/cli/cli.js +61 -0
- package/lib/cli/driver.js +3 -11
- package/lib/cli/program.js +5 -13
- package/lib/client/android.js +1 -1
- package/lib/client/artifact.js +2 -2
- package/lib/client/browserContext.js +5 -5
- package/lib/client/browserType.js +1 -1
- package/lib/client/channelOwner.js +3 -3
- package/lib/client/clientHelper.js +1 -5
- package/lib/client/connection.js +2 -2
- package/lib/client/consoleMessage.js +2 -2
- package/lib/client/fetch.js +3 -3
- package/lib/client/frame.js +3 -4
- package/lib/client/harRouter.js +1 -1
- package/lib/client/locator.js +2 -2
- package/lib/client/page.js +1 -24
- package/lib/common/debugLogger.js +90 -0
- package/lib/common/socksProxy.js +17 -12
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/recorderSource.js +1 -1
- package/lib/outofprocess.js +3 -3
- package/lib/protocol/validator.js +7 -13
- package/lib/remote/playwrightConnection.js +2 -2
- package/lib/remote/playwrightServer.js +166 -72
- package/lib/server/android/android.js +2 -2
- package/lib/server/android/backendAdb.js +2 -2
- package/lib/server/browser.js +2 -2
- package/lib/server/browserContext.js +9 -8
- package/lib/server/browserType.js +5 -5
- package/lib/server/chromium/chromium.js +1 -1
- package/lib/server/chromium/crBrowser.js +3 -2
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crExecutionContext.js +2 -2
- package/lib/server/chromium/crInput.js +2 -2
- package/lib/server/chromium/crNetworkManager.js +11 -10
- package/lib/server/chromium/crPage.js +7 -48
- package/lib/server/chromium/crServiceWorker.js +3 -2
- package/lib/server/debugController.js +3 -0
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dispatchers/browserContextDispatcher.js +4 -4
- package/lib/server/dispatchers/dispatcher.js +10 -10
- package/lib/server/dispatchers/frameDispatcher.js +6 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +4 -4
- package/lib/server/dispatchers/pageDispatcher.js +0 -12
- package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
- package/lib/server/dispatchers/writableStreamDispatcher.js +2 -2
- package/lib/server/dom.js +170 -133
- package/lib/server/electron/electron.js +4 -5
- package/lib/server/electron/loader.js +2 -4
- package/lib/server/fetch.js +4 -4
- package/lib/server/firefox/ffBrowser.js +3 -3
- package/lib/server/firefox/ffConnection.js +1 -1
- package/lib/server/firefox/ffExecutionContext.js +2 -2
- package/lib/server/firefox/ffNetworkManager.js +7 -7
- package/lib/server/firefox/ffPage.js +5 -3
- package/lib/server/firefox/firefox.js +2 -2
- package/lib/server/frames.js +23 -31
- package/lib/server/har/harTracer.js +6 -6
- package/lib/server/helper.js +1 -1
- package/lib/server/input.js +2 -2
- package/lib/server/isomorphic/utilityScriptSerializers.js +1 -0
- package/lib/server/javascript.js +2 -2
- package/lib/server/page.js +3 -44
- package/lib/server/pipeTransport.js +1 -1
- package/lib/server/playwright.js +1 -1
- package/lib/server/progress.js +14 -5
- package/lib/server/recorder/csharp.js +1 -1
- package/lib/server/recorder/recorderUtils.js +2 -2
- package/lib/server/recorder.js +14 -14
- package/lib/server/registry/browserFetcher.js +2 -1
- package/lib/server/registry/dependencies.js +6 -7
- package/lib/server/registry/index.js +33 -50
- package/lib/server/registry/nativeDeps.js +94 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +2 -2
- package/lib/server/screenshotter.js +1 -0
- package/lib/server/socksInterceptor.js +2 -2
- package/lib/server/trace/recorder/snapshotter.js +2 -2
- package/lib/server/trace/recorder/tracing.js +9 -7
- package/lib/server/trace/test/inMemorySnapshotter.js +1 -1
- package/lib/server/trace/viewer/traceViewer.js +2 -2
- package/lib/server/transport.js +13 -15
- package/lib/server/webkit/wkBrowser.js +3 -3
- package/lib/server/webkit/wkConnection.js +1 -1
- package/lib/server/webkit/wkExecutionContext.js +2 -2
- package/lib/server/webkit/wkInput.js +2 -2
- package/lib/server/webkit/wkInterceptableRequest.js +2 -2
- package/lib/server/webkit/wkPage.js +12 -10
- package/lib/utils/fileUtils.js +0 -4
- package/lib/utils/happy-eyeballs.js +4 -5
- package/lib/utils/hostPlatform.js +1 -1
- package/lib/utils/index.js +0 -11
- package/lib/utils/isomorphic/cssParser.js +2 -2
- package/lib/utils/isomorphic/locatorParser.js +4 -6
- package/lib/utils/isomorphic/selectorParser.js +1 -0
- package/lib/utils/network.js +0 -33
- package/lib/utils/processLauncher.js +2 -9
- package/lib/utils/profiler.js +2 -2
- package/lib/utils/zipFile.js +1 -1
- package/lib/vite/htmlReport/index.html +13 -12
- package/lib/vite/recorder/assets/{codeMirrorModule-I9ks4y7D.js → codeMirrorModule-490993e1.js} +1 -1
- package/lib/vite/recorder/assets/codeMirrorModule-5d0f417c.css +1 -0
- package/lib/vite/recorder/assets/index-40a5e9c7.js +41 -0
- package/lib/vite/recorder/assets/{index-ljsTwXtJ.css → index-64ce22d5.css} +1 -1
- package/lib/vite/recorder/index.html +3 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-56536a77.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-75b0ca4f.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-f333a775.js +24 -0
- package/lib/vite/traceViewer/assets/wsPort-722747dc.js +64 -0
- package/lib/vite/traceViewer/assets/wsPort-762c6840.js +64 -0
- package/lib/vite/traceViewer/assets/wsPort-98e00a94.js +64 -0
- package/lib/vite/traceViewer/assets/xtermModule-443332e6.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.5d0f417c.css +1 -0
- package/lib/vite/traceViewer/codicon.79f233d0.ttf +0 -0
- package/lib/vite/traceViewer/index.1a1fe659.css +1 -0
- package/lib/vite/traceViewer/index.a265fbdb.js +2 -0
- package/lib/vite/traceViewer/index.d05939c9.js +2 -0
- package/lib/vite/traceViewer/index.ed9a3c58.js +2 -0
- package/lib/vite/traceViewer/index.html +5 -4
- package/lib/vite/traceViewer/sw.bundle.js +1 -1
- package/lib/vite/traceViewer/uiMode.08ab2d90.js +4 -0
- package/lib/vite/traceViewer/uiMode.3ff70f7d.js +4 -0
- package/lib/vite/traceViewer/uiMode.8b41a49d.css +1 -0
- package/lib/vite/traceViewer/uiMode.8e0454c4.js +4 -0
- package/lib/vite/traceViewer/uiMode.html +5 -4
- package/lib/vite/traceViewer/wsPort.9c9a6767.css +1 -0
- package/lib/vite/traceViewer/xtermModule.6428296b.css +32 -0
- package/package.json +1 -1
- package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +0 -1
- package/lib/vite/recorder/assets/index-yg8ypzl6.js +0 -47
- /package/lib/vite/recorder/assets/{codicon-zGuYmc9o.ttf → codicon-79f233d0.ttf} +0 -0
package/lib/browserServerImpl.js
CHANGED
|
@@ -77,7 +77,7 @@ class BrowserServerLauncherImpl {
|
|
|
77
77
|
browserServer._disconnectForTest = () => server.close();
|
|
78
78
|
browserServer._userDataDirForTest = browser._userDataDirForTest;
|
|
79
79
|
browser.options.browserProcess.onclose = (exitCode, signal) => {
|
|
80
|
-
socksProxy === null || socksProxy === void 0
|
|
80
|
+
socksProxy === null || socksProxy === void 0 ? void 0 : socksProxy.close().catch(() => {});
|
|
81
81
|
server.close();
|
|
82
82
|
browserServer.emit('close', exitCode, signal);
|
|
83
83
|
};
|
package/lib/cli/cli.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Copyright (c) Microsoft Corporation.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/* eslint-disable no-console */
|
|
20
|
+
"use strict";
|
|
21
|
+
|
|
22
|
+
var _utils = require("../utils");
|
|
23
|
+
var _program = _interopRequireDefault(require("./program"));
|
|
24
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
+
function printPlaywrightTestError(command) {
|
|
26
|
+
const packages = [];
|
|
27
|
+
for (const pkg of ['playwright', 'playwright-chromium', 'playwright-firefox', 'playwright-webkit']) {
|
|
28
|
+
try {
|
|
29
|
+
require.resolve(pkg);
|
|
30
|
+
packages.push(pkg);
|
|
31
|
+
} catch (e) {}
|
|
32
|
+
}
|
|
33
|
+
if (!packages.length) packages.push('playwright');
|
|
34
|
+
const packageManager = (0, _utils.getPackageManager)();
|
|
35
|
+
if (packageManager === 'yarn') {
|
|
36
|
+
console.error(`Please install @playwright/test package before running "yarn playwright ${command}"`);
|
|
37
|
+
console.error(` yarn remove ${packages.join(' ')}`);
|
|
38
|
+
console.error(' yarn add -D @playwright/test');
|
|
39
|
+
} else if (packageManager === 'pnpm') {
|
|
40
|
+
console.error(`Please install @playwright/test package before running "pnpm exec playwright ${command}"`);
|
|
41
|
+
console.error(` pnpm remove ${packages.join(' ')}`);
|
|
42
|
+
console.error(' pnpm add -D @playwright/test');
|
|
43
|
+
} else {
|
|
44
|
+
console.error(`Please install @playwright/test package before running "npx playwright ${command}"`);
|
|
45
|
+
console.error(` npm uninstall ${packages.join(' ')}`);
|
|
46
|
+
console.error(' npm install -D @playwright/test');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const kExternalPlaywrightTestCommands = [['test', 'Run tests with Playwright Test.'], ['show-report', 'Show Playwright Test HTML report.'], ['merge-reports', 'Merge Playwright Test Blob reports']];
|
|
50
|
+
function addExternalPlaywrightTestCommands() {
|
|
51
|
+
for (const [command, description] of kExternalPlaywrightTestCommands) {
|
|
52
|
+
const playwrightTest = _program.default.command(command).allowUnknownOption(true);
|
|
53
|
+
playwrightTest.description(`${description} Available in @playwright/test package.`);
|
|
54
|
+
playwrightTest.action(async () => {
|
|
55
|
+
printPlaywrightTestError(command);
|
|
56
|
+
(0, _utils.gracefullyProcessExitDoNotHang)(1);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!process.env.PW_LANG_NAME) addExternalPlaywrightTestCommands();
|
|
61
|
+
_program.default.parse(process.argv);
|
package/lib/cli/driver.js
CHANGED
|
@@ -13,8 +13,8 @@ var _server = require("../server");
|
|
|
13
13
|
var _transport = require("../protocol/transport");
|
|
14
14
|
var _playwrightServer = require("../remote/playwrightServer");
|
|
15
15
|
var _processLauncher = require("../utils/processLauncher");
|
|
16
|
-
function _getRequireWildcardCache(
|
|
17
|
-
function _interopRequireWildcard(
|
|
16
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
17
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
19
|
/**
|
|
20
20
|
* Copyright (c) Microsoft Corporation.
|
|
@@ -50,15 +50,7 @@ function runDriver() {
|
|
|
50
50
|
});
|
|
51
51
|
const transport = new _transport.PipeTransport(process.stdout, process.stdin);
|
|
52
52
|
transport.onmessage = message => dispatcherConnection.dispatch(JSON.parse(message));
|
|
53
|
-
|
|
54
|
-
const isJavaScriptLanguageBinding = !process.env.PW_LANG_NAME || process.env.PW_LANG_NAME === 'javascript';
|
|
55
|
-
const replacer = !isJavaScriptLanguageBinding && String.prototype.toWellFormed ? (key, value) => {
|
|
56
|
-
if (typeof value === 'string')
|
|
57
|
-
// @ts-expect-error
|
|
58
|
-
return value.toWellFormed();
|
|
59
|
-
return value;
|
|
60
|
-
} : undefined;
|
|
61
|
-
dispatcherConnection.onmessage = message => transport.send(JSON.stringify(message, replacer));
|
|
53
|
+
dispatcherConnection.onmessage = message => transport.send(JSON.stringify(message));
|
|
62
54
|
transport.onclose = () => {
|
|
63
55
|
// Drop any messages during shutdown on the floor.
|
|
64
56
|
dispatcherConnection.onmessage = () => {};
|
package/lib/cli/program.js
CHANGED
|
@@ -3,12 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function () {
|
|
9
|
-
return _utilsBundle.program;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
6
|
+
exports.default = void 0;
|
|
12
7
|
var _fs = _interopRequireDefault(require("fs"));
|
|
13
8
|
var _os = _interopRequireDefault(require("os"));
|
|
14
9
|
var _path = _interopRequireDefault(require("path"));
|
|
@@ -20,8 +15,8 @@ var _child_process = require("child_process");
|
|
|
20
15
|
var _utils = require("../utils");
|
|
21
16
|
var _server = require("../server");
|
|
22
17
|
var _errors = require("../client/errors");
|
|
23
|
-
function _getRequireWildcardCache(
|
|
24
|
-
function _interopRequireWildcard(
|
|
18
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
19
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
26
21
|
/**
|
|
27
22
|
* Copyright (c) Microsoft Corporation.
|
|
@@ -116,10 +111,6 @@ _utilsBundle.program.command('install [browser...]').description('ensure browser
|
|
|
116
111
|
} else {
|
|
117
112
|
const forceReinstall = hasNoArguments ? false : !!options.force;
|
|
118
113
|
await _server.registry.install(executables, forceReinstall);
|
|
119
|
-
await _server.registry.validateHostRequirementsForExecutablesIfNeeded(executables, process.env.PW_LANG_NAME || 'javascript').catch(e => {
|
|
120
|
-
e.name = 'Playwright Host validation warning';
|
|
121
|
-
console.error(e);
|
|
122
|
-
});
|
|
123
114
|
}
|
|
124
115
|
} catch (e) {
|
|
125
116
|
console.log(`Failed to install browsers\n${e}`);
|
|
@@ -579,4 +570,5 @@ function buildBasePlaywrightCLICommand(cliTargetLang) {
|
|
|
579
570
|
return `${packageManagerCommand} playwright`;
|
|
580
571
|
}
|
|
581
572
|
}
|
|
582
|
-
}
|
|
573
|
+
}
|
|
574
|
+
var _default = exports.default = _utilsBundle.program;
|
package/lib/client/android.js
CHANGED
|
@@ -83,7 +83,7 @@ class Android extends _channelOwner.ChannelOwner {
|
|
|
83
83
|
let closeError;
|
|
84
84
|
const onPipeClosed = () => {
|
|
85
85
|
var _device;
|
|
86
|
-
(_device = device) === null || _device === void 0
|
|
86
|
+
(_device = device) === null || _device === void 0 ? void 0 : _device._didClose();
|
|
87
87
|
connection.close(closeError);
|
|
88
88
|
};
|
|
89
89
|
pipe.on('closed', onPipeClosed);
|
package/lib/client/artifact.js
CHANGED
|
@@ -8,8 +8,8 @@ var fs = _interopRequireWildcard(require("fs"));
|
|
|
8
8
|
var _stream = require("./stream");
|
|
9
9
|
var _fileUtils = require("../utils/fileUtils");
|
|
10
10
|
var _channelOwner = require("./channelOwner");
|
|
11
|
-
function _getRequireWildcardCache(
|
|
12
|
-
function _interopRequireWildcard(
|
|
11
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
12
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
13
13
|
/**
|
|
14
14
|
* Copyright (c) Microsoft Corporation.
|
|
15
15
|
*
|
|
@@ -47,8 +47,8 @@ let _Symbol$asyncDispose;
|
|
|
47
47
|
* limitations under the License.
|
|
48
48
|
*/
|
|
49
49
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
50
|
-
function _getRequireWildcardCache(
|
|
51
|
-
function _interopRequireWildcard(
|
|
50
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
51
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
52
52
|
_Symbol$asyncDispose = Symbol.asyncDispose;
|
|
53
53
|
class BrowserContext extends _channelOwner.ChannelOwner {
|
|
54
54
|
static from(context) {
|
|
@@ -79,7 +79,7 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
79
79
|
this._closeReason = void 0;
|
|
80
80
|
this._harRouters = [];
|
|
81
81
|
if (parent instanceof _browser.Browser) this._browser = parent;
|
|
82
|
-
(_this$_browser = this._browser) === null || _this$_browser === void 0
|
|
82
|
+
(_this$_browser = this._browser) === null || _this$_browser === void 0 ? void 0 : _this$_browser._contexts.add(this);
|
|
83
83
|
this._isChromium = ((_this$_browser2 = this._browser) === null || _this$_browser2 === void 0 ? void 0 : _this$_browser2._name) === 'chromium';
|
|
84
84
|
this.tracing = _tracing.Tracing.from(initializer.tracing);
|
|
85
85
|
this.request = _fetch.APIRequestContext.from(initializer.requestContext);
|
|
@@ -413,9 +413,9 @@ class BrowserContext extends _channelOwner.ChannelOwner {
|
|
|
413
413
|
return _cdpSession.CDPSession.from(result.session);
|
|
414
414
|
}
|
|
415
415
|
_onClose() {
|
|
416
|
-
var _this$_browserType;
|
|
416
|
+
var _this$_browserType, _this$_browserType$_c;
|
|
417
417
|
if (this._browser) this._browser._contexts.delete(this);
|
|
418
|
-
(_this$_browserType = this._browserType) === null || _this$_browserType === void 0
|
|
418
|
+
(_this$_browserType = this._browserType) === null || _this$_browserType === void 0 ? void 0 : (_this$_browserType$_c = _this$_browserType._contexts) === null || _this$_browserType$_c === void 0 ? void 0 : _this$_browserType$_c.delete(this);
|
|
419
419
|
this._disposeHarRouters();
|
|
420
420
|
this.emit(_events.Events.BrowserContext.Close, this);
|
|
421
421
|
}
|
|
@@ -150,7 +150,7 @@ class BrowserType extends _channelOwner.ChannelOwner {
|
|
|
150
150
|
for (const page of context.pages()) page._onClose();
|
|
151
151
|
context._onClose();
|
|
152
152
|
}
|
|
153
|
-
(_browser2 = browser) === null || _browser2 === void 0
|
|
153
|
+
(_browser2 = browser) === null || _browser2 === void 0 ? void 0 : _browser2._didClose();
|
|
154
154
|
connection.close(closeError);
|
|
155
155
|
};
|
|
156
156
|
pipe.on('closed', onPipeClosed);
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.ChannelOwner = void 0;
|
|
7
7
|
var _events = require("events");
|
|
8
8
|
var _validator = require("../protocol/validator");
|
|
9
|
-
var _debugLogger = require("../
|
|
9
|
+
var _debugLogger = require("../common/debugLogger");
|
|
10
10
|
var _stackTrace = require("../utils/stackTrace");
|
|
11
11
|
var _utils = require("../utils");
|
|
12
12
|
var _zones = require("../utils/zones");
|
|
@@ -185,7 +185,7 @@ class ChannelOwner extends _events.EventEmitter {
|
|
|
185
185
|
const result = await _zones.zones.run('apiZone', apiZone, async () => {
|
|
186
186
|
return await func(apiZone);
|
|
187
187
|
});
|
|
188
|
-
csi === null || csi === void 0
|
|
188
|
+
csi === null || csi === void 0 ? void 0 : csi.onApiCallEnd(callCookie);
|
|
189
189
|
logApiCall(logger, `<= ${apiName} succeeded`, isInternal);
|
|
190
190
|
return result;
|
|
191
191
|
} catch (e) {
|
|
@@ -193,7 +193,7 @@ class ChannelOwner extends _events.EventEmitter {
|
|
|
193
193
|
if (apiName && !apiName.includes('<anonymous>')) e.message = apiName + ': ' + e.message;
|
|
194
194
|
const stackFrames = '\n' + (0, _stackTrace.stringifyStackFrames)(stackTrace.frames).join('\n') + innerError;
|
|
195
195
|
if (stackFrames.trim()) e.stack = e.message + stackFrames;else e.stack = '';
|
|
196
|
-
csi === null || csi === void 0
|
|
196
|
+
csi === null || csi === void 0 ? void 0 : csi.onApiCallEnd(callCookie, e);
|
|
197
197
|
logApiCall(logger, `<= ${apiName} failed`, isInternal);
|
|
198
198
|
throw e;
|
|
199
199
|
}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.addSourceUrlToScript = addSourceUrlToScript;
|
|
7
6
|
exports.envObjectToArray = envObjectToArray;
|
|
8
7
|
exports.evaluationScript = evaluationScript;
|
|
9
8
|
var _fs = _interopRequireDefault(require("fs"));
|
|
@@ -47,11 +46,8 @@ async function evaluationScript(fun, arg, addSourceUrl = true) {
|
|
|
47
46
|
if (fun.content !== undefined) return fun.content;
|
|
48
47
|
if (fun.path !== undefined) {
|
|
49
48
|
let source = await _fs.default.promises.readFile(fun.path, 'utf8');
|
|
50
|
-
if (addSourceUrl) source =
|
|
49
|
+
if (addSourceUrl) source += '\n//# sourceURL=' + fun.path.replace(/\n/g, '');
|
|
51
50
|
return source;
|
|
52
51
|
}
|
|
53
52
|
throw new Error('Either path or content property must be present');
|
|
54
|
-
}
|
|
55
|
-
function addSourceUrlToScript(source, path) {
|
|
56
|
-
return `${source}\n//# sourceURL=${path.replace(/\n/g, '')}`;
|
|
57
53
|
}
|
package/lib/client/connection.js
CHANGED
|
@@ -21,7 +21,7 @@ var _playwright = require("./playwright");
|
|
|
21
21
|
var _electron = require("./electron");
|
|
22
22
|
var _stream = require("./stream");
|
|
23
23
|
var _writableStream = require("./writableStream");
|
|
24
|
-
var _debugLogger = require("../
|
|
24
|
+
var _debugLogger = require("../common/debugLogger");
|
|
25
25
|
var _selectors = require("./selectors");
|
|
26
26
|
var _android = require("./android");
|
|
27
27
|
var _artifact = require("./artifact");
|
|
@@ -132,7 +132,7 @@ class Connection extends _events.EventEmitter {
|
|
|
132
132
|
location,
|
|
133
133
|
internal: !apiName
|
|
134
134
|
};
|
|
135
|
-
if (this._tracingCount && frames && type !== 'LocalUtils') (_this$_localUtils = this._localUtils) === null || _this$_localUtils === void 0
|
|
135
|
+
if (this._tracingCount && frames && type !== 'LocalUtils') (_this$_localUtils = this._localUtils) === null || _this$_localUtils === void 0 ? void 0 : _this$_localUtils._channel.addStackToTracingNoReply({
|
|
136
136
|
callData: {
|
|
137
137
|
stack: frames,
|
|
138
138
|
id
|
|
@@ -23,8 +23,8 @@ let _util$inspect$custom;
|
|
|
23
23
|
* See the License for the specific language governing permissions and
|
|
24
24
|
* limitations under the License.
|
|
25
25
|
*/
|
|
26
|
-
function _getRequireWildcardCache(
|
|
27
|
-
function _interopRequireWildcard(
|
|
26
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
27
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
28
28
|
_util$inspect$custom = util.inspect.custom;
|
|
29
29
|
class ConsoleMessage {
|
|
30
30
|
constructor(event) {
|
package/lib/client/fetch.js
CHANGED
|
@@ -29,8 +29,8 @@ let _Symbol$asyncDispose, _Symbol$asyncDispose2, _util$inspect$custom;
|
|
|
29
29
|
* See the License for the specific language governing permissions and
|
|
30
30
|
* limitations under the License.
|
|
31
31
|
*/
|
|
32
|
-
function _getRequireWildcardCache(
|
|
33
|
-
function _interopRequireWildcard(
|
|
32
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
33
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
34
34
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
35
35
|
class APIRequest {
|
|
36
36
|
constructor(playwright) {
|
|
@@ -81,7 +81,7 @@ class APIRequestContext extends _channelOwner.ChannelOwner {
|
|
|
81
81
|
var _this$_request;
|
|
82
82
|
await this._instrumentation.onWillCloseRequestContext(this);
|
|
83
83
|
await this._channel.dispose();
|
|
84
|
-
(_this$_request = this._request) === null || _this$_request === void 0
|
|
84
|
+
(_this$_request = this._request) === null || _this$_request === void 0 ? void 0 : _this$_request._contexts.delete(this);
|
|
85
85
|
}
|
|
86
86
|
async delete(url, options) {
|
|
87
87
|
return await this.fetch(url, {
|
package/lib/client/frame.js
CHANGED
|
@@ -18,9 +18,8 @@ var _waiter = require("./waiter");
|
|
|
18
18
|
var _events2 = require("./events");
|
|
19
19
|
var _types = require("./types");
|
|
20
20
|
var _network2 = require("../utils/network");
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
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; }
|
|
21
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
22
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
24
23
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
24
|
/**
|
|
26
25
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
@@ -271,7 +270,7 @@ class Frame extends _channelOwner.ChannelOwner {
|
|
|
271
270
|
};
|
|
272
271
|
if (copy.path) {
|
|
273
272
|
copy.content = (await _fs.default.promises.readFile(copy.path)).toString();
|
|
274
|
-
copy.content =
|
|
273
|
+
copy.content += '//# sourceURL=' + copy.path.replace(/\n/g, '');
|
|
275
274
|
}
|
|
276
275
|
return _elementHandle.ElementHandle.from((await this._channel.addScriptTag({
|
|
277
276
|
...copy
|
package/lib/client/harRouter.js
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.HarRouter = void 0;
|
|
7
|
-
var _debugLogger = require("../
|
|
7
|
+
var _debugLogger = require("../common/debugLogger");
|
|
8
8
|
let _Symbol$asyncDispose;
|
|
9
9
|
/**
|
|
10
10
|
* Copyright (c) Microsoft Corporation.
|
package/lib/client/locator.js
CHANGED
|
@@ -28,8 +28,8 @@ let _util$inspect$custom;
|
|
|
28
28
|
* See the License for the specific language governing permissions and
|
|
29
29
|
* limitations under the License.
|
|
30
30
|
*/
|
|
31
|
-
function _getRequireWildcardCache(
|
|
32
|
-
function _interopRequireWildcard(
|
|
31
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
32
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
33
33
|
_util$inspect$custom = util.inspect.custom;
|
|
34
34
|
class Locator {
|
|
35
35
|
constructor(frame, selector, options) {
|
package/lib/client/page.js
CHANGED
|
@@ -79,7 +79,6 @@ class Page extends _channelOwner.ChannelOwner {
|
|
|
79
79
|
this._closeReason = void 0;
|
|
80
80
|
this._closeWasCalled = false;
|
|
81
81
|
this._harRouters = [];
|
|
82
|
-
this._locatorHandlers = new Map();
|
|
83
82
|
this._browserContext = parent;
|
|
84
83
|
this._timeoutSettings = new _timeoutSettings.TimeoutSettings(this._browserContext._timeoutSettings);
|
|
85
84
|
this.accessibility = new _accessibility.Accessibility(this._channel);
|
|
@@ -116,9 +115,6 @@ class Page extends _channelOwner.ChannelOwner {
|
|
|
116
115
|
this._channel.on('frameDetached', ({
|
|
117
116
|
frame
|
|
118
117
|
}) => this._onFrameDetached(_frame.Frame.from(frame)));
|
|
119
|
-
this._channel.on('locatorHandlerTriggered', ({
|
|
120
|
-
uid
|
|
121
|
-
}) => this._onLocatorHandlerTriggered(uid));
|
|
122
118
|
this._channel.on('route', ({
|
|
123
119
|
route
|
|
124
120
|
}) => this._onRoute(_network2.Route.from(route)));
|
|
@@ -308,25 +304,6 @@ class Page extends _channelOwner.ChannelOwner {
|
|
|
308
304
|
waitUntil
|
|
309
305
|
})).response);
|
|
310
306
|
}
|
|
311
|
-
async handleLocator(locator, handler) {
|
|
312
|
-
if (locator._frame !== this._mainFrame) throw new Error(`Locator must belong to the main frame of this page`);
|
|
313
|
-
const {
|
|
314
|
-
uid
|
|
315
|
-
} = await this._channel.registerLocatorHandler({
|
|
316
|
-
selector: locator._selector
|
|
317
|
-
});
|
|
318
|
-
this._locatorHandlers.set(uid, handler);
|
|
319
|
-
}
|
|
320
|
-
async _onLocatorHandlerTriggered(uid) {
|
|
321
|
-
try {
|
|
322
|
-
const handler = this._locatorHandlers.get(uid);
|
|
323
|
-
await (handler === null || handler === void 0 ? void 0 : handler());
|
|
324
|
-
} finally {
|
|
325
|
-
this._channel.resolveLocatorHandlerNoReply({
|
|
326
|
-
uid
|
|
327
|
-
}).catch(() => {});
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
307
|
async waitForLoadState(state, options) {
|
|
331
308
|
return await this._mainFrame.waitForLoadState(state, options);
|
|
332
309
|
}
|
|
@@ -644,7 +621,7 @@ class Page extends _channelOwner.ChannelOwner {
|
|
|
644
621
|
const defaultTimeout = this._browserContext._timeoutSettings.defaultTimeout();
|
|
645
622
|
this._browserContext.setDefaultNavigationTimeout(0);
|
|
646
623
|
this._browserContext.setDefaultTimeout(0);
|
|
647
|
-
(_this$_instrumentatio = this._instrumentation) === null || _this$_instrumentatio === void 0
|
|
624
|
+
(_this$_instrumentatio = this._instrumentation) === null || _this$_instrumentatio === void 0 ? void 0 : _this$_instrumentatio.onWillPause();
|
|
648
625
|
await this._closedOrCrashedScope.safeRace(this.context()._channel.pause());
|
|
649
626
|
this._browserContext.setDefaultNavigationTimeout(defaultNavigationTimeout);
|
|
650
627
|
this._browserContext.setDefaultTimeout(defaultTimeout);
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.debugLogger = exports.RecentLogsCollector = void 0;
|
|
7
|
+
var _utilsBundle = require("../utilsBundle");
|
|
8
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
/**
|
|
11
|
+
* Copyright (c) Microsoft Corporation.
|
|
12
|
+
*
|
|
13
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
+
* you may not use this file except in compliance with the License.
|
|
15
|
+
* You may obtain a copy of the License at
|
|
16
|
+
*
|
|
17
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
+
*
|
|
19
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
20
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
+
* See the License for the specific language governing permissions and
|
|
23
|
+
* limitations under the License.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const debugLoggerColorMap = {
|
|
27
|
+
'api': 45,
|
|
28
|
+
// cyan
|
|
29
|
+
'protocol': 34,
|
|
30
|
+
// green
|
|
31
|
+
'install': 34,
|
|
32
|
+
// green
|
|
33
|
+
'download': 34,
|
|
34
|
+
// green
|
|
35
|
+
'browser': 0,
|
|
36
|
+
// reset
|
|
37
|
+
'socks': 92,
|
|
38
|
+
// purple
|
|
39
|
+
'error': 160,
|
|
40
|
+
// red,
|
|
41
|
+
'channel': 33,
|
|
42
|
+
// blue
|
|
43
|
+
'server': 45,
|
|
44
|
+
// cyan
|
|
45
|
+
'server:channel': 34,
|
|
46
|
+
// green
|
|
47
|
+
'server:metadata': 33 // blue
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
class DebugLogger {
|
|
51
|
+
constructor() {
|
|
52
|
+
this._debuggers = new Map();
|
|
53
|
+
if (process.env.DEBUG_FILE) {
|
|
54
|
+
const ansiRegex = new RegExp(['[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'].join('|'), 'g');
|
|
55
|
+
const stream = _fs.default.createWriteStream(process.env.DEBUG_FILE);
|
|
56
|
+
_utilsBundle.debug.log = data => {
|
|
57
|
+
stream.write(data.replace(ansiRegex, ''));
|
|
58
|
+
stream.write('\n');
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
log(name, message) {
|
|
63
|
+
let cachedDebugger = this._debuggers.get(name);
|
|
64
|
+
if (!cachedDebugger) {
|
|
65
|
+
cachedDebugger = (0, _utilsBundle.debug)(`pw:${name}`);
|
|
66
|
+
this._debuggers.set(name, cachedDebugger);
|
|
67
|
+
cachedDebugger.color = debugLoggerColorMap[name] || 0;
|
|
68
|
+
}
|
|
69
|
+
cachedDebugger(message);
|
|
70
|
+
}
|
|
71
|
+
isEnabled(name) {
|
|
72
|
+
return _utilsBundle.debug.enabled(`pw:${name}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const debugLogger = exports.debugLogger = new DebugLogger();
|
|
76
|
+
const kLogCount = 150;
|
|
77
|
+
class RecentLogsCollector {
|
|
78
|
+
constructor() {
|
|
79
|
+
this._logs = [];
|
|
80
|
+
}
|
|
81
|
+
log(message) {
|
|
82
|
+
this._logs.push(message);
|
|
83
|
+
if (this._logs.length === kLogCount * 2) this._logs.splice(0, kLogCount);
|
|
84
|
+
}
|
|
85
|
+
recentLogs() {
|
|
86
|
+
if (this._logs.length > kLogCount) return this._logs.slice(-kLogCount);
|
|
87
|
+
return this._logs;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.RecentLogsCollector = RecentLogsCollector;
|