@checkly/playwright-core 1.41.2-beta.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/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +3 -0
- package/ThirdPartyNotices.txt +1513 -0
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +2 -0
- package/bin/install_media_pack.ps1 +5 -0
- package/bin/reinstall_chrome_beta_linux.sh +40 -0
- package/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/bin/reinstall_chrome_beta_win.ps1 +23 -0
- package/bin/reinstall_chrome_stable_linux.sh +40 -0
- package/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/bin/reinstall_chrome_stable_win.ps1 +23 -0
- package/bin/reinstall_msedge_beta_linux.sh +40 -0
- package/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/bin/reinstall_msedge_beta_win.ps1 +22 -0
- package/bin/reinstall_msedge_dev_linux.sh +40 -0
- package/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/bin/reinstall_msedge_dev_win.ps1 +22 -0
- package/bin/reinstall_msedge_stable_linux.sh +40 -0
- package/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/bin/reinstall_msedge_stable_win.ps1 +23 -0
- package/browsers.json +64 -0
- package/cli.js +17 -0
- package/index.d.ts +17 -0
- package/index.js +33 -0
- package/index.mjs +28 -0
- package/lib/androidServerImpl.js +69 -0
- package/lib/browserServerImpl.js +92 -0
- package/lib/cli/driver.js +97 -0
- package/lib/cli/program.js +582 -0
- package/lib/cli/programWithTestStub.js +67 -0
- package/lib/client/accessibility.js +50 -0
- package/lib/client/android.js +473 -0
- package/lib/client/api.js +272 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +509 -0
- package/lib/client/browserType.js +233 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +229 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +40 -0
- package/lib/client/connection.js +327 -0
- package/lib/client/consoleMessage.js +55 -0
- package/lib/client/coverage.js +41 -0
- package/lib/client/dialog.js +57 -0
- package/lib/client/download.js +62 -0
- package/lib/client/electron.js +130 -0
- package/lib/client/elementHandle.js +291 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/events.js +93 -0
- package/lib/client/fetch.js +343 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +506 -0
- package/lib/client/harRouter.js +93 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +123 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +35 -0
- package/lib/client/locator.js +432 -0
- package/lib/client/network.js +601 -0
- package/lib/client/page.js +707 -0
- package/lib/client/playwright.js +74 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +135 -0
- package/lib/client/types.js +24 -0
- package/lib/client/video.js +51 -0
- package/lib/client/waiter.js +158 -0
- package/lib/client/webError.js +37 -0
- package/lib/client/worker.js +71 -0
- package/lib/client/writableStream.js +54 -0
- package/lib/common/socksProxy.js +569 -0
- package/lib/common/timeoutSettings.js +73 -0
- package/lib/common/types.js +5 -0
- package/lib/generated/consoleApiSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +7 -0
- package/lib/generated/recorderSource.js +7 -0
- package/lib/generated/utilityScriptSource.js +7 -0
- package/lib/image_tools/colorUtils.js +98 -0
- package/lib/image_tools/compare.js +108 -0
- package/lib/image_tools/imageChannel.js +70 -0
- package/lib/image_tools/stats.js +102 -0
- package/lib/inProcessFactory.js +54 -0
- package/lib/inprocess.js +20 -0
- package/lib/outofprocess.js +67 -0
- package/lib/protocol/debug.js +27 -0
- package/lib/protocol/serializers.js +172 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2599 -0
- package/lib/protocol/validatorPrimitives.js +139 -0
- package/lib/remote/playwrightConnection.js +274 -0
- package/lib/remote/playwrightServer.js +110 -0
- package/lib/server/accessibility.js +62 -0
- package/lib/server/android/android.js +441 -0
- package/lib/server/android/backendAdb.js +172 -0
- package/lib/server/artifact.js +104 -0
- package/lib/server/browser.js +129 -0
- package/lib/server/browserContext.js +609 -0
- package/lib/server/browserType.js +300 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +346 -0
- package/lib/server/chromium/chromiumSwitches.js +41 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +521 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +104 -0
- package/lib/server/chromium/crDragDrop.js +144 -0
- package/lib/server/chromium/crExecutionContext.js +156 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +723 -0
- package/lib/server/chromium/crPage.js +1173 -0
- package/lib/server/chromium/crPdf.js +147 -0
- package/lib/server/chromium/crProtocolHelper.js +131 -0
- package/lib/server/chromium/crServiceWorker.js +115 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/console.js +59 -0
- package/lib/server/cookieStore.js +112 -0
- package/lib/server/debugController.js +236 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +21 -0
- package/lib/server/deviceDescriptorsSource.json +1549 -0
- package/lib/server/dialog.js +70 -0
- package/lib/server/dispatchers/androidDispatcher.js +193 -0
- package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
- package/lib/server/dispatchers/browserDispatcher.js +170 -0
- package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- package/lib/server/dispatchers/dispatcher.js +400 -0
- package/lib/server/dispatchers/electronDispatcher.js +80 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +287 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +363 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
- package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- package/lib/server/dispatchers/streamDispatcher.js +62 -0
- package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
- package/lib/server/dom.js +808 -0
- package/lib/server/download.js +53 -0
- package/lib/server/electron/electron.js +254 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +611 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +71 -0
- package/lib/server/firefox/ffAccessibility.js +215 -0
- package/lib/server/firefox/ffBrowser.js +447 -0
- package/lib/server/firefox/ffConnection.js +168 -0
- package/lib/server/firefox/ffExecutionContext.js +138 -0
- package/lib/server/firefox/ffInput.js +150 -0
- package/lib/server/firefox/ffNetworkManager.js +231 -0
- package/lib/server/firefox/ffPage.js +558 -0
- package/lib/server/firefox/firefox.js +91 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1597 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +539 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +96 -0
- package/lib/server/input.js +301 -0
- package/lib/server/instrumentation.js +74 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
- package/lib/server/javascript.js +305 -0
- package/lib/server/launchApp.js +90 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +607 -0
- package/lib/server/page.js +793 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +82 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/codeGenerator.js +153 -0
- package/lib/server/recorder/csharp.js +310 -0
- package/lib/server/recorder/java.js +216 -0
- package/lib/server/recorder/javascript.js +229 -0
- package/lib/server/recorder/jsonl.js +47 -0
- package/lib/server/recorder/language.js +44 -0
- package/lib/server/recorder/python.js +275 -0
- package/lib/server/recorder/recorderActions.js +5 -0
- package/lib/server/recorder/recorderApp.js +181 -0
- package/lib/server/recorder/recorderUtils.js +48 -0
- package/lib/server/recorder/utils.js +45 -0
- package/lib/server/recorder.js +700 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +925 -0
- package/lib/server/registry/nativeDeps.js +383 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +354 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +168 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +552 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +229 -0
- package/lib/server/transport.js +191 -0
- package/lib/server/types.js +24 -0
- package/lib/server/usKeyboardLayout.js +555 -0
- package/lib/server/webkit/webkit.js +87 -0
- package/lib/server/webkit/wkAccessibility.js +194 -0
- package/lib/server/webkit/wkBrowser.js +328 -0
- package/lib/server/webkit/wkConnection.js +173 -0
- package/lib/server/webkit/wkExecutionContext.js +146 -0
- package/lib/server/webkit/wkInput.js +169 -0
- package/lib/server/webkit/wkInterceptableRequest.js +158 -0
- package/lib/server/webkit/wkPage.js +1198 -0
- package/lib/server/webkit/wkProvisionalPage.js +59 -0
- package/lib/server/webkit/wkWorkers.js +104 -0
- package/lib/third_party/diff_match_patch.js +2222 -0
- package/lib/third_party/pixelmatch.js +255 -0
- package/lib/utils/ascii.js +31 -0
- package/lib/utils/comparators.js +171 -0
- package/lib/utils/crypto.js +33 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +89 -0
- package/lib/utils/env.js +47 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/fileUtils.js +66 -0
- package/lib/utils/glob.js +83 -0
- package/lib/utils/happy-eyeballs.js +154 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +124 -0
- package/lib/utils/httpServer.js +195 -0
- package/lib/utils/index.js +324 -0
- package/lib/utils/isomorphic/cssParser.js +250 -0
- package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- package/lib/utils/isomorphic/locatorGenerators.js +651 -0
- package/lib/utils/isomorphic/locatorParser.js +179 -0
- package/lib/utils/isomorphic/locatorUtils.js +62 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +107 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/mimeType.js +29 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +189 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +41 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +123 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +131 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +125 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +99 -0
- package/lib/utilsBundle.js +81 -0
- package/lib/utilsBundleImpl/index.js +51 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
- package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
- package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
- package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
- package/lib/vite/recorder/index.html +29 -0
- package/lib/vite/recorder/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
- package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
- package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
- package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
- package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
- package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
- package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
- package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
- package/lib/vite/traceViewer/index.html +26 -0
- package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
- package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/snapshot.html +21 -0
- package/lib/vite/traceViewer/sw.bundle.js +4 -0
- package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
- package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
- package/lib/vite/traceViewer/uiMode.html +17 -0
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
- package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
- package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
- package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +43 -0
- package/types/protocol.d.ts +20304 -0
- package/types/structs.d.ts +45 -0
- package/types/types.d.ts +20626 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.openTraceInBrowser = openTraceInBrowser;
|
|
7
|
+
exports.openTraceViewerApp = openTraceViewerApp;
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
10
|
+
var _httpServer = require("../../../utils/httpServer");
|
|
11
|
+
var _utils = require("../../../utils");
|
|
12
|
+
var _launchApp = require("../../launchApp");
|
|
13
|
+
var _instrumentation = require("../../instrumentation");
|
|
14
|
+
var _playwright = require("../../playwright");
|
|
15
|
+
var _progress = require("../../progress");
|
|
16
|
+
var _utilsBundle = require("../../../utilsBundle");
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
/**
|
|
19
|
+
* Copyright (c) Microsoft Corporation.
|
|
20
|
+
*
|
|
21
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
22
|
+
* you may not use this file except in compliance with the License.
|
|
23
|
+
* You may obtain a copy of the License at
|
|
24
|
+
*
|
|
25
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
26
|
+
*
|
|
27
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
28
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
29
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
30
|
+
* See the License for the specific language governing permissions and
|
|
31
|
+
* limitations under the License.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
async function startTraceViewerServer(traceUrls, options) {
|
|
35
|
+
for (const traceUrl of traceUrls) {
|
|
36
|
+
let traceFile = traceUrl;
|
|
37
|
+
// If .json is requested, we'll synthesize it.
|
|
38
|
+
if (traceUrl.endsWith('.json')) traceFile = traceUrl.substring(0, traceUrl.length - '.json'.length);
|
|
39
|
+
if (!traceUrl.startsWith('http://') && !traceUrl.startsWith('https://') && !_fs.default.existsSync(traceFile) && !_fs.default.existsSync(traceFile + '.trace')) {
|
|
40
|
+
// eslint-disable-next-line no-console
|
|
41
|
+
console.error(`Trace file ${traceUrl} does not exist!`);
|
|
42
|
+
(0, _utils.gracefullyProcessExitDoNotHang)(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const server = new _httpServer.HttpServer();
|
|
46
|
+
server.routePrefix('/trace', (request, response) => {
|
|
47
|
+
const url = new URL('http://localhost' + request.url);
|
|
48
|
+
const relativePath = url.pathname.slice('/trace'.length);
|
|
49
|
+
if (relativePath.endsWith('/stall.js')) return true;
|
|
50
|
+
if (relativePath.startsWith('/file')) {
|
|
51
|
+
try {
|
|
52
|
+
const filePath = url.searchParams.get('path');
|
|
53
|
+
if (_fs.default.existsSync(filePath)) return server.serveFile(request, response, url.searchParams.get('path'));
|
|
54
|
+
|
|
55
|
+
// If .json is requested, we'll synthesize it for zip-less operation.
|
|
56
|
+
if (filePath.endsWith('.json')) {
|
|
57
|
+
const traceName = filePath.substring(0, filePath.length - '.json'.length);
|
|
58
|
+
response.statusCode = 200;
|
|
59
|
+
response.setHeader('Content-Type', 'application/json');
|
|
60
|
+
response.end(JSON.stringify(traceDescriptor(traceName)));
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
} catch (e) {}
|
|
64
|
+
response.statusCode = 404;
|
|
65
|
+
response.end();
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
const absolutePath = _path.default.join(__dirname, '..', '..', '..', 'vite', 'traceViewer', ...relativePath.split('/'));
|
|
69
|
+
return server.serveFile(request, response, absolutePath);
|
|
70
|
+
});
|
|
71
|
+
const params = traceUrls.map(t => `trace=${encodeURIComponent(t)}`);
|
|
72
|
+
const transport = (options === null || options === void 0 ? void 0 : options.transport) || (options !== null && options !== void 0 && options.isServer ? new StdinServer() : undefined);
|
|
73
|
+
if (transport) {
|
|
74
|
+
const guid = (0, _utils.createGuid)();
|
|
75
|
+
params.push('ws=' + guid);
|
|
76
|
+
const wss = new _utilsBundle.wsServer({
|
|
77
|
+
server: server.server(),
|
|
78
|
+
path: '/' + guid
|
|
79
|
+
});
|
|
80
|
+
wss.on('connection', ws => {
|
|
81
|
+
transport.sendEvent = (method, params) => ws.send(JSON.stringify({
|
|
82
|
+
method,
|
|
83
|
+
params
|
|
84
|
+
}));
|
|
85
|
+
transport.close = () => ws.close();
|
|
86
|
+
ws.on('message', async message => {
|
|
87
|
+
const {
|
|
88
|
+
id,
|
|
89
|
+
method,
|
|
90
|
+
params
|
|
91
|
+
} = JSON.parse(message);
|
|
92
|
+
const result = await transport.dispatch(method, params);
|
|
93
|
+
ws.send(JSON.stringify({
|
|
94
|
+
id,
|
|
95
|
+
result
|
|
96
|
+
}));
|
|
97
|
+
});
|
|
98
|
+
ws.on('close', () => transport.onclose());
|
|
99
|
+
ws.on('error', () => transport.onclose());
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (options !== null && options !== void 0 && options.isServer) params.push('isServer');
|
|
103
|
+
if ((0, _utils.isUnderTest)()) params.push('isUnderTest=true');
|
|
104
|
+
const {
|
|
105
|
+
host,
|
|
106
|
+
port
|
|
107
|
+
} = options || {};
|
|
108
|
+
const url = await server.start({
|
|
109
|
+
preferredPort: port,
|
|
110
|
+
host
|
|
111
|
+
});
|
|
112
|
+
const {
|
|
113
|
+
app
|
|
114
|
+
} = options || {};
|
|
115
|
+
const searchQuery = params.length ? '?' + params.join('&') : '';
|
|
116
|
+
const urlPath = `/trace/${app || 'index.html'}${searchQuery}`;
|
|
117
|
+
server.routePath('/', (request, response) => {
|
|
118
|
+
response.statusCode = 302;
|
|
119
|
+
response.setHeader('Location', urlPath + request.url.substring(1));
|
|
120
|
+
response.end();
|
|
121
|
+
return true;
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
server,
|
|
125
|
+
url
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async function openTraceViewerApp(traceUrls, browserName, options) {
|
|
129
|
+
const {
|
|
130
|
+
url
|
|
131
|
+
} = await startTraceViewerServer(traceUrls, options);
|
|
132
|
+
const traceViewerPlaywright = (0, _playwright.createPlaywright)({
|
|
133
|
+
sdkLanguage: 'javascript',
|
|
134
|
+
isInternalPlaywright: true
|
|
135
|
+
});
|
|
136
|
+
const traceViewerBrowser = (0, _utils.isUnderTest)() ? 'chromium' : browserName;
|
|
137
|
+
const {
|
|
138
|
+
context,
|
|
139
|
+
page
|
|
140
|
+
} = await (0, _launchApp.launchApp)(traceViewerPlaywright[traceViewerBrowser], {
|
|
141
|
+
// TODO: store language in the trace.
|
|
142
|
+
sdkLanguage: traceViewerPlaywright.options.sdkLanguage,
|
|
143
|
+
windowSize: {
|
|
144
|
+
width: 1280,
|
|
145
|
+
height: 800
|
|
146
|
+
},
|
|
147
|
+
persistentContextOptions: {
|
|
148
|
+
...(options === null || options === void 0 ? void 0 : options.persistentContextOptions),
|
|
149
|
+
useWebSocket: (0, _utils.isUnderTest)(),
|
|
150
|
+
headless: options === null || options === void 0 ? void 0 : options.headless
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
const controller = new _progress.ProgressController((0, _instrumentation.serverSideCallMetadata)(), context._browser);
|
|
154
|
+
await controller.run(async progress => {
|
|
155
|
+
await context._browser._defaultContext._loadDefaultContextAsIs(progress);
|
|
156
|
+
});
|
|
157
|
+
if (process.env.PWTEST_PRINT_WS_ENDPOINT) process.stderr.write('DevTools listening on: ' + context._browser.options.wsEndpoint + '\n');
|
|
158
|
+
if (!(0, _utils.isUnderTest)()) await (0, _launchApp.syncLocalStorageWithSettings)(page, 'traceviewer');
|
|
159
|
+
if ((0, _utils.isUnderTest)()) page.on('close', () => context.close({
|
|
160
|
+
reason: 'Trace viewer closed'
|
|
161
|
+
}).catch(() => {}));
|
|
162
|
+
await page.mainFrame().goto((0, _instrumentation.serverSideCallMetadata)(), url);
|
|
163
|
+
return page;
|
|
164
|
+
}
|
|
165
|
+
async function openTraceInBrowser(traceUrls, options) {
|
|
166
|
+
const {
|
|
167
|
+
url
|
|
168
|
+
} = await startTraceViewerServer(traceUrls, options);
|
|
169
|
+
// eslint-disable-next-line no-console
|
|
170
|
+
console.log('\nListening on ' + url);
|
|
171
|
+
if (!(0, _utils.isUnderTest)()) await (0, _utilsBundle.open)(url.replace('0.0.0.0', 'localhost')).catch(() => {});
|
|
172
|
+
}
|
|
173
|
+
class StdinServer {
|
|
174
|
+
constructor() {
|
|
175
|
+
this._pollTimer = void 0;
|
|
176
|
+
this._traceUrl = void 0;
|
|
177
|
+
this.sendEvent = void 0;
|
|
178
|
+
this.close = void 0;
|
|
179
|
+
process.stdin.on('data', data => {
|
|
180
|
+
const url = data.toString().trim();
|
|
181
|
+
if (url === this._traceUrl) return;
|
|
182
|
+
if (url.endsWith('.json')) this._pollLoadTrace(url);else this._loadTrace(url);
|
|
183
|
+
});
|
|
184
|
+
process.stdin.on('close', () => (0, _utils.gracefullyProcessExitDoNotHang)(0));
|
|
185
|
+
}
|
|
186
|
+
async dispatch(method, params) {
|
|
187
|
+
if (method === 'ready') {
|
|
188
|
+
if (this._traceUrl) this._loadTrace(this._traceUrl);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
onclose() {
|
|
192
|
+
(0, _utils.gracefullyProcessExitDoNotHang)(0);
|
|
193
|
+
}
|
|
194
|
+
_loadTrace(url) {
|
|
195
|
+
var _this$sendEvent;
|
|
196
|
+
this._traceUrl = url;
|
|
197
|
+
clearTimeout(this._pollTimer);
|
|
198
|
+
(_this$sendEvent = this.sendEvent) === null || _this$sendEvent === void 0 || _this$sendEvent.call(this, 'loadTrace', {
|
|
199
|
+
url
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
_pollLoadTrace(url) {
|
|
203
|
+
this._loadTrace(url);
|
|
204
|
+
this._pollTimer = setTimeout(() => {
|
|
205
|
+
this._pollLoadTrace(url);
|
|
206
|
+
}, 500);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function traceDescriptor(traceName) {
|
|
210
|
+
const result = {
|
|
211
|
+
entries: []
|
|
212
|
+
};
|
|
213
|
+
const traceDir = _path.default.dirname(traceName);
|
|
214
|
+
const traceFile = _path.default.basename(traceName);
|
|
215
|
+
for (const name of _fs.default.readdirSync(traceDir)) {
|
|
216
|
+
if (name.startsWith(traceFile)) result.entries.push({
|
|
217
|
+
name,
|
|
218
|
+
path: _path.default.join(traceDir, name)
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
const resourcesDir = _path.default.join(traceDir, 'resources');
|
|
222
|
+
if (_fs.default.existsSync(resourcesDir)) {
|
|
223
|
+
for (const name of _fs.default.readdirSync(resourcesDir)) result.entries.push({
|
|
224
|
+
name: 'resources/' + name,
|
|
225
|
+
path: _path.default.join(resourcesDir, name)
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.perMessageDeflate = exports.WebSocketTransport = void 0;
|
|
7
|
+
var _utilsBundle = require("../utilsBundle");
|
|
8
|
+
var _utils = require("../utils");
|
|
9
|
+
var _happyEyeballs = require("../utils/happy-eyeballs");
|
|
10
|
+
/**
|
|
11
|
+
* Copyright 2018 Google Inc. All rights reserved.
|
|
12
|
+
* Modifications copyright (c) Microsoft Corporation.
|
|
13
|
+
*
|
|
14
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
15
|
+
* you may not use this file except in compliance with the License.
|
|
16
|
+
* You may obtain a copy of the License at
|
|
17
|
+
*
|
|
18
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
19
|
+
*
|
|
20
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
21
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
22
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
23
|
+
* See the License for the specific language governing permissions and
|
|
24
|
+
* limitations under the License.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const perMessageDeflate = exports.perMessageDeflate = {
|
|
28
|
+
zlibDeflateOptions: {
|
|
29
|
+
level: 3
|
|
30
|
+
},
|
|
31
|
+
zlibInflateOptions: {
|
|
32
|
+
chunkSize: 10 * 1024
|
|
33
|
+
},
|
|
34
|
+
threshold: 10 * 1024
|
|
35
|
+
};
|
|
36
|
+
class WebSocketTransport {
|
|
37
|
+
static async connect(progress, url, headers, followRedirects, debugLogHeader) {
|
|
38
|
+
return await WebSocketTransport._connect(progress, url, headers || {}, {
|
|
39
|
+
follow: !!followRedirects,
|
|
40
|
+
hadRedirects: false
|
|
41
|
+
}, debugLogHeader);
|
|
42
|
+
}
|
|
43
|
+
static async _connect(progress, url, headers, redirect, debugLogHeader) {
|
|
44
|
+
const logUrl = stripQueryParams(url);
|
|
45
|
+
progress === null || progress === void 0 || progress.log(`<ws connecting> ${logUrl}`);
|
|
46
|
+
const transport = new WebSocketTransport(progress, url, logUrl, headers, redirect.follow && redirect.hadRedirects, debugLogHeader);
|
|
47
|
+
let success = false;
|
|
48
|
+
progress === null || progress === void 0 || progress.cleanupWhenAborted(async () => {
|
|
49
|
+
if (!success) await transport.closeAndWait().catch(e => null);
|
|
50
|
+
});
|
|
51
|
+
const result = await new Promise((fulfill, reject) => {
|
|
52
|
+
transport._ws.on('open', async () => {
|
|
53
|
+
progress === null || progress === void 0 || progress.log(`<ws connected> ${logUrl}`);
|
|
54
|
+
fulfill({
|
|
55
|
+
transport
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
transport._ws.on('error', event => {
|
|
59
|
+
progress === null || progress === void 0 || progress.log(`<ws connect error> ${logUrl} ${event.message}`);
|
|
60
|
+
reject(new Error('WebSocket error: ' + event.message));
|
|
61
|
+
transport._ws.close();
|
|
62
|
+
});
|
|
63
|
+
transport._ws.on('unexpected-response', (request, response) => {
|
|
64
|
+
if (redirect.follow && !redirect.hadRedirects && (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 307 || response.statusCode === 308)) {
|
|
65
|
+
fulfill({
|
|
66
|
+
redirect: response
|
|
67
|
+
});
|
|
68
|
+
transport._ws.close();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
for (let i = 0; i < response.rawHeaders.length; i += 2) {
|
|
72
|
+
if (debugLogHeader && response.rawHeaders[i] === debugLogHeader) progress === null || progress === void 0 || progress.log(response.rawHeaders[i + 1]);
|
|
73
|
+
}
|
|
74
|
+
const chunks = [];
|
|
75
|
+
const errorPrefix = `${logUrl} ${response.statusCode} ${response.statusMessage}`;
|
|
76
|
+
response.on('data', chunk => chunks.push(chunk));
|
|
77
|
+
response.on('close', () => {
|
|
78
|
+
const error = chunks.length ? `${errorPrefix}\n${Buffer.concat(chunks)}` : errorPrefix;
|
|
79
|
+
progress === null || progress === void 0 || progress.log(`<ws unexpected response> ${error}`);
|
|
80
|
+
reject(new Error('WebSocket error: ' + error));
|
|
81
|
+
transport._ws.close();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
if (result.redirect) {
|
|
86
|
+
// Strip authorization headers from the redirected request.
|
|
87
|
+
const newHeaders = Object.fromEntries(Object.entries(headers || {}).filter(([name]) => {
|
|
88
|
+
return !name.includes('access-key') && name.toLowerCase() !== 'authorization';
|
|
89
|
+
}));
|
|
90
|
+
return WebSocketTransport._connect(progress, result.redirect.headers.location, newHeaders, {
|
|
91
|
+
follow: true,
|
|
92
|
+
hadRedirects: true
|
|
93
|
+
}, debugLogHeader);
|
|
94
|
+
}
|
|
95
|
+
success = true;
|
|
96
|
+
return transport;
|
|
97
|
+
}
|
|
98
|
+
constructor(progress, url, logUrl, headers, followRedirects, debugLogHeader) {
|
|
99
|
+
var _progress$timeUntilDe;
|
|
100
|
+
this._ws = void 0;
|
|
101
|
+
this._progress = void 0;
|
|
102
|
+
this._logUrl = void 0;
|
|
103
|
+
this.onmessage = void 0;
|
|
104
|
+
this.onclose = void 0;
|
|
105
|
+
this.wsEndpoint = void 0;
|
|
106
|
+
this.headers = [];
|
|
107
|
+
this.wsEndpoint = url;
|
|
108
|
+
this._logUrl = logUrl;
|
|
109
|
+
this._ws = new _utilsBundle.ws(url, [], {
|
|
110
|
+
maxPayload: 256 * 1024 * 1024,
|
|
111
|
+
// 256Mb,
|
|
112
|
+
// Prevent internal http client error when passing negative timeout.
|
|
113
|
+
handshakeTimeout: Math.max((_progress$timeUntilDe = progress === null || progress === void 0 ? void 0 : progress.timeUntilDeadline()) !== null && _progress$timeUntilDe !== void 0 ? _progress$timeUntilDe : 30_000, 1),
|
|
114
|
+
headers,
|
|
115
|
+
followRedirects,
|
|
116
|
+
agent: /^(https|wss):\/\//.test(url) ? _happyEyeballs.httpsHappyEyeballsAgent : _happyEyeballs.httpHappyEyeballsAgent,
|
|
117
|
+
perMessageDeflate
|
|
118
|
+
});
|
|
119
|
+
this._ws.on('upgrade', response => {
|
|
120
|
+
for (let i = 0; i < response.rawHeaders.length; i += 2) {
|
|
121
|
+
this.headers.push({
|
|
122
|
+
name: response.rawHeaders[i],
|
|
123
|
+
value: response.rawHeaders[i + 1]
|
|
124
|
+
});
|
|
125
|
+
if (debugLogHeader && response.rawHeaders[i] === debugLogHeader) progress === null || progress === void 0 || progress.log(response.rawHeaders[i + 1]);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
this._progress = progress;
|
|
129
|
+
// The 'ws' module in node sometimes sends us multiple messages in a single task.
|
|
130
|
+
// In Web, all IO callbacks (e.g. WebSocket callbacks)
|
|
131
|
+
// are dispatched into separate tasks, so there's no need
|
|
132
|
+
// to do anything extra.
|
|
133
|
+
const messageWrap = (0, _utils.makeWaitForNextTask)();
|
|
134
|
+
this._ws.addEventListener('message', event => {
|
|
135
|
+
messageWrap(() => {
|
|
136
|
+
const eventData = event.data;
|
|
137
|
+
let parsedJson;
|
|
138
|
+
try {
|
|
139
|
+
parsedJson = JSON.parse(eventData);
|
|
140
|
+
} catch (e) {
|
|
141
|
+
var _this$_progress;
|
|
142
|
+
(_this$_progress = this._progress) === null || _this$_progress === void 0 || _this$_progress.log(`<closing ws> Closing websocket due to malformed JSON. eventData=${eventData} e=${e === null || e === void 0 ? void 0 : e.message}`);
|
|
143
|
+
this._ws.close();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
if (this.onmessage) this.onmessage.call(null, parsedJson);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
var _this$_progress2;
|
|
150
|
+
(_this$_progress2 = this._progress) === null || _this$_progress2 === void 0 || _this$_progress2.log(`<closing ws> Closing websocket due to failed onmessage callback. eventData=${eventData} e=${e === null || e === void 0 ? void 0 : e.message}`);
|
|
151
|
+
this._ws.close();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
this._ws.addEventListener('close', event => {
|
|
156
|
+
var _this$_progress3;
|
|
157
|
+
(_this$_progress3 = this._progress) === null || _this$_progress3 === void 0 || _this$_progress3.log(`<ws disconnected> ${logUrl} code=${event.code} reason=${event.reason}`);
|
|
158
|
+
if (this.onclose) this.onclose.call(null);
|
|
159
|
+
});
|
|
160
|
+
// Prevent Error: read ECONNRESET.
|
|
161
|
+
this._ws.addEventListener('error', error => {
|
|
162
|
+
var _this$_progress4;
|
|
163
|
+
return (_this$_progress4 = this._progress) === null || _this$_progress4 === void 0 ? void 0 : _this$_progress4.log(`<ws error> ${logUrl} ${error.type} ${error.message}`);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
send(message) {
|
|
167
|
+
this._ws.send(JSON.stringify(message));
|
|
168
|
+
}
|
|
169
|
+
close() {
|
|
170
|
+
var _this$_progress5;
|
|
171
|
+
(_this$_progress5 = this._progress) === null || _this$_progress5 === void 0 || _this$_progress5.log(`<ws disconnecting> ${this._logUrl}`);
|
|
172
|
+
this._ws.close();
|
|
173
|
+
}
|
|
174
|
+
async closeAndWait() {
|
|
175
|
+
if (this._ws.readyState === _utilsBundle.ws.CLOSED) return;
|
|
176
|
+
const promise = new Promise(f => this._ws.once('close', f));
|
|
177
|
+
this.close();
|
|
178
|
+
await promise; // Make sure to await the actual disconnect.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.WebSocketTransport = WebSocketTransport;
|
|
182
|
+
function stripQueryParams(url) {
|
|
183
|
+
try {
|
|
184
|
+
const u = new URL(url);
|
|
185
|
+
u.search = '';
|
|
186
|
+
u.hash = '';
|
|
187
|
+
return u.toString();
|
|
188
|
+
} catch {
|
|
189
|
+
return url;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.kLifecycleEvents = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Copyright 2018 Google Inc. All rights reserved.
|
|
9
|
+
* Modifications 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
|
+
const kLifecycleEvents = exports.kLifecycleEvents = new Set(['load', 'domcontentloaded', 'networkidle', 'commit']);
|