rebrowser-playwright-core 1.47.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +12 -0
- package/ThirdPartyNotices.txt +1548 -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 +24 -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 +24 -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 +23 -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 +23 -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 +24 -0
- package/browsers.json +53 -0
- package/cli.js +18 -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 +95 -0
- package/lib/cli/program.js +577 -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 +279 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +541 -0
- package/lib/client/browserType.js +241 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +231 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +50 -0
- package/lib/client/clock.js +68 -0
- package/lib/client/connection.js +330 -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 +135 -0
- package/lib/client/elementHandle.js +321 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/eventEmitter.js +314 -0
- package/lib/client/events.js +94 -0
- package/lib/client/fetch.js +396 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +504 -0
- package/lib/client/harRouter.js +99 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +129 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +35 -0
- package/lib/client/locator.js +441 -0
- package/lib/client/network.js +604 -0
- package/lib/client/page.js +725 -0
- package/lib/client/playwright.js +77 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +138 -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/clockSource.js +7 -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 +173 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2694 -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/bidi/bidiBrowser.js +296 -0
- package/lib/server/bidi/bidiConnection.js +206 -0
- package/lib/server/bidi/bidiExecutionContext.js +162 -0
- package/lib/server/bidi/bidiFirefox.js +110 -0
- package/lib/server/bidi/bidiInput.js +174 -0
- package/lib/server/bidi/bidiNetworkManager.js +304 -0
- package/lib/server/bidi/bidiPage.js +456 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
- package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
- package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
- package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
- package/lib/server/browser.js +137 -0
- package/lib/server/browserContext.js +684 -0
- package/lib/server/browserType.js +307 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +362 -0
- package/lib/server/chromium/chromiumSwitches.js +44 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +515 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +108 -0
- package/lib/server/chromium/crDragDrop.js +143 -0
- package/lib/server/chromium/crExecutionContext.js +156 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +767 -0
- package/lib/server/chromium/crPage.js +1135 -0
- package/lib/server/chromium/crPdf.js +153 -0
- package/lib/server/chromium/crProtocolHelper.js +133 -0
- package/lib/server/chromium/crServiceWorker.js +114 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/clock.js +125 -0
- package/lib/server/codegen/csharp.js +299 -0
- package/lib/server/codegen/java.js +235 -0
- package/lib/server/codegen/javascript.js +223 -0
- package/lib/server/codegen/jsonl.js +47 -0
- package/lib/server/codegen/language.js +76 -0
- package/lib/server/codegen/languages.js +30 -0
- package/lib/server/codegen/python.js +265 -0
- package/lib/server/codegen/types.js +5 -0
- package/lib/server/console.js +57 -0
- package/lib/server/cookieStore.js +112 -0
- package/lib/server/debugController.js +234 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +26 -0
- package/lib/server/deviceDescriptorsSource.json +1669 -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 +351 -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 +395 -0
- package/lib/server/dispatchers/electronDispatcher.js +93 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +286 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +59 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +413 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +358 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +106 -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 +58 -0
- package/lib/server/dom.js +845 -0
- package/lib/server/download.js +53 -0
- package/lib/server/electron/electron.js +296 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +660 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +75 -0
- package/lib/server/firefox/ffAccessibility.js +216 -0
- package/lib/server/firefox/ffBrowser.js +458 -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 +233 -0
- package/lib/server/firefox/ffPage.js +556 -0
- package/lib/server/firefox/firefox.js +110 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1685 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +531 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +114 -0
- package/lib/server/input.js +311 -0
- package/lib/server/instrumentation.js +70 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +226 -0
- package/lib/server/javascript.js +306 -0
- package/lib/server/launchApp.js +91 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +617 -0
- package/lib/server/page.js +825 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +85 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/contextRecorder.js +316 -0
- package/lib/server/recorder/recorderActions.js +5 -0
- package/lib/server/recorder/recorderApp.js +190 -0
- package/lib/server/recorder/recorderCollection.js +127 -0
- package/lib/server/recorder/recorderRunner.js +177 -0
- package/lib/server/recorder/recorderUtils.js +71 -0
- package/lib/server/recorder/throttledFile.js +46 -0
- package/lib/server/recorder.js +324 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +924 -0
- package/lib/server/registry/nativeDeps.js +490 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +348 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksClientCertificatesInterceptor.js +328 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +171 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +486 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +216 -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 +162 -0
- package/lib/server/webkit/wkPage.js +1216 -0
- package/lib/server/webkit/wkProvisionalPage.js +94 -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 +174 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +91 -0
- package/lib/utils/env.js +49 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/expectUtils.js +33 -0
- package/lib/utils/fileUtils.js +205 -0
- package/lib/utils/happy-eyeballs.js +181 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +133 -0
- package/lib/utils/httpServer.js +236 -0
- package/lib/utils/index.js +368 -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/mimeType.js +29 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +139 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/isomorphic/urlMatch.js +120 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +160 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +44 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +121 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +66 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +127 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +62 -0
- package/lib/utilsBundle.js +82 -0
- package/lib/utilsBundleImpl/index.js +53 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-aW6Vz3gf.js +24 -0
- package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +1 -0
- package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/lib/vite/recorder/assets/index-B-MT5gKo.css +1 -0
- package/lib/vite/recorder/assets/index-DCpXOVIh.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-eFKCUIu2.js +24 -0
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- package/lib/vite/traceViewer/assets/workbench-D0cirtfA.js +72 -0
- package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +1 -0
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/embedded.BkuvsLJp.js +2 -0
- package/lib/vite/traceViewer/embedded.html +16 -0
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- package/lib/vite/traceViewer/index.C968kAiC.js +2 -0
- package/lib/vite/traceViewer/index.CrbWWHbf.css +1 -0
- package/lib/vite/traceViewer/index.html +27 -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 +3 -0
- package/lib/vite/traceViewer/uiMode.BkFnr4V0.js +10 -0
- package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
- package/lib/vite/traceViewer/uiMode.html +18 -0
- package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
- package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +64 -0
- package/types/protocol.d.ts +21500 -0
- package/types/structs.d.ts +45 -0
- package/types/types.d.ts +21431 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RecorderApp = exports.EmptyRecorderApp = void 0;
|
|
7
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _progress = require("../progress");
|
|
10
|
+
var _events = require("events");
|
|
11
|
+
var _instrumentation = require("../instrumentation");
|
|
12
|
+
var _utils = require("../../utils");
|
|
13
|
+
var _utilsBundle = require("../../utilsBundle");
|
|
14
|
+
var _launchApp = require("../launchApp");
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
/**
|
|
17
|
+
* Copyright (c) Microsoft Corporation.
|
|
18
|
+
*
|
|
19
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
20
|
+
* you may not use this file except in compliance with the License.
|
|
21
|
+
* You may obtain a copy of the License at
|
|
22
|
+
*
|
|
23
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
24
|
+
*
|
|
25
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
26
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
27
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
28
|
+
* See the License for the specific language governing permissions and
|
|
29
|
+
* limitations under the License.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
class EmptyRecorderApp extends _events.EventEmitter {
|
|
33
|
+
async close() {}
|
|
34
|
+
async setPaused(paused) {}
|
|
35
|
+
async setMode(mode) {}
|
|
36
|
+
async setFileIfNeeded(file) {}
|
|
37
|
+
async setSelector(selector, userGesture) {}
|
|
38
|
+
async updateCallLogs(callLogs) {}
|
|
39
|
+
async setSources(sources) {}
|
|
40
|
+
}
|
|
41
|
+
exports.EmptyRecorderApp = EmptyRecorderApp;
|
|
42
|
+
class RecorderApp extends _events.EventEmitter {
|
|
43
|
+
constructor(recorder, page, wsEndpoint) {
|
|
44
|
+
super();
|
|
45
|
+
this._page = void 0;
|
|
46
|
+
this.wsEndpoint = void 0;
|
|
47
|
+
this._recorder = void 0;
|
|
48
|
+
this.setMaxListeners(0);
|
|
49
|
+
this._recorder = recorder;
|
|
50
|
+
this._page = page;
|
|
51
|
+
this.wsEndpoint = wsEndpoint;
|
|
52
|
+
}
|
|
53
|
+
async close() {
|
|
54
|
+
await this._page.context().close({
|
|
55
|
+
reason: 'Recorder window closed'
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async _init() {
|
|
59
|
+
await (0, _launchApp.syncLocalStorageWithSettings)(this._page, 'recorder');
|
|
60
|
+
await this._page._setServerRequestInterceptor(route => {
|
|
61
|
+
if (!route.request().url().startsWith('https://playwright/')) return false;
|
|
62
|
+
const uri = route.request().url().substring('https://playwright/'.length);
|
|
63
|
+
const file = require.resolve('../../vite/recorder/' + uri);
|
|
64
|
+
_fs.default.promises.readFile(file).then(buffer => {
|
|
65
|
+
route.fulfill({
|
|
66
|
+
requestUrl: route.request().url(),
|
|
67
|
+
status: 200,
|
|
68
|
+
headers: [{
|
|
69
|
+
name: 'Content-Type',
|
|
70
|
+
value: _utilsBundle.mime.getType(_path.default.extname(file)) || 'application/octet-stream'
|
|
71
|
+
}],
|
|
72
|
+
body: buffer.toString('base64'),
|
|
73
|
+
isBase64: true
|
|
74
|
+
}).catch(() => {});
|
|
75
|
+
});
|
|
76
|
+
return true;
|
|
77
|
+
});
|
|
78
|
+
await this._page.exposeBinding('dispatch', false, (_, data) => this.emit('event', data));
|
|
79
|
+
this._page.once('close', () => {
|
|
80
|
+
this.emit('close');
|
|
81
|
+
this._page.context().close({
|
|
82
|
+
reason: 'Recorder window closed'
|
|
83
|
+
}).catch(() => {});
|
|
84
|
+
});
|
|
85
|
+
const mainFrame = this._page.mainFrame();
|
|
86
|
+
await mainFrame.goto((0, _instrumentation.serverSideCallMetadata)(), 'https://playwright/index.html');
|
|
87
|
+
}
|
|
88
|
+
static factory(context) {
|
|
89
|
+
return async recorder => {
|
|
90
|
+
if (process.env.PW_CODEGEN_NO_INSPECTOR) return new EmptyRecorderApp();
|
|
91
|
+
return await RecorderApp._open(recorder, context);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
static async _open(recorder, inspectedContext) {
|
|
95
|
+
const sdkLanguage = inspectedContext.attribution.playwright.options.sdkLanguage;
|
|
96
|
+
const headed = !!inspectedContext._browser.options.headful;
|
|
97
|
+
const recorderPlaywright = require('../playwright').createPlaywright({
|
|
98
|
+
sdkLanguage: 'javascript',
|
|
99
|
+
isInternalPlaywright: true
|
|
100
|
+
});
|
|
101
|
+
const {
|
|
102
|
+
context,
|
|
103
|
+
page
|
|
104
|
+
} = await (0, _launchApp.launchApp)(recorderPlaywright.chromium, {
|
|
105
|
+
sdkLanguage,
|
|
106
|
+
windowSize: {
|
|
107
|
+
width: 600,
|
|
108
|
+
height: 600
|
|
109
|
+
},
|
|
110
|
+
windowPosition: {
|
|
111
|
+
x: 1020,
|
|
112
|
+
y: 10
|
|
113
|
+
},
|
|
114
|
+
persistentContextOptions: {
|
|
115
|
+
noDefaultViewport: true,
|
|
116
|
+
headless: !!process.env.PWTEST_CLI_HEADLESS || (0, _utils.isUnderTest)() && !headed,
|
|
117
|
+
useWebSocket: !!process.env.PWTEST_RECORDER_PORT,
|
|
118
|
+
handleSIGINT: false,
|
|
119
|
+
args: process.env.PWTEST_RECORDER_PORT ? [`--remote-debugging-port=${process.env.PWTEST_RECORDER_PORT}`] : [],
|
|
120
|
+
executablePath: inspectedContext._browser.options.isChromium ? inspectedContext._browser.options.customExecutablePath : undefined
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
const controller = new _progress.ProgressController((0, _instrumentation.serverSideCallMetadata)(), context._browser);
|
|
124
|
+
await controller.run(async progress => {
|
|
125
|
+
await context._browser._defaultContext._loadDefaultContextAsIs(progress);
|
|
126
|
+
});
|
|
127
|
+
const result = new RecorderApp(recorder, page, context._browser.options.wsEndpoint);
|
|
128
|
+
await result._init();
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
async setMode(mode) {
|
|
132
|
+
await this._page.mainFrame().evaluateExpression((mode => {
|
|
133
|
+
window.playwrightSetMode(mode);
|
|
134
|
+
}).toString(), {
|
|
135
|
+
isFunction: true
|
|
136
|
+
}, mode).catch(() => {});
|
|
137
|
+
}
|
|
138
|
+
async setFileIfNeeded(file) {
|
|
139
|
+
await this._page.mainFrame().evaluateExpression((file => {
|
|
140
|
+
window.playwrightSetFileIfNeeded(file);
|
|
141
|
+
}).toString(), {
|
|
142
|
+
isFunction: true
|
|
143
|
+
}, file).catch(() => {});
|
|
144
|
+
}
|
|
145
|
+
async setPaused(paused) {
|
|
146
|
+
await this._page.mainFrame().evaluateExpression((paused => {
|
|
147
|
+
window.playwrightSetPaused(paused);
|
|
148
|
+
}).toString(), {
|
|
149
|
+
isFunction: true
|
|
150
|
+
}, paused).catch(() => {});
|
|
151
|
+
}
|
|
152
|
+
async setSources(sources) {
|
|
153
|
+
await this._page.mainFrame().evaluateExpression((sources => {
|
|
154
|
+
window.playwrightSetSources(sources);
|
|
155
|
+
}).toString(), {
|
|
156
|
+
isFunction: true
|
|
157
|
+
}, sources).catch(() => {});
|
|
158
|
+
|
|
159
|
+
// Testing harness for runCLI mode.
|
|
160
|
+
if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) process._didSetSourcesForTest(sources[0].text);
|
|
161
|
+
}
|
|
162
|
+
async setSelector(selector, userGesture) {
|
|
163
|
+
if (userGesture) {
|
|
164
|
+
var _this$_recorder;
|
|
165
|
+
if (((_this$_recorder = this._recorder) === null || _this$_recorder === void 0 ? void 0 : _this$_recorder.mode()) === 'inspecting') {
|
|
166
|
+
this._recorder.setMode('standby');
|
|
167
|
+
this._page.bringToFront();
|
|
168
|
+
} else {
|
|
169
|
+
var _this$_recorder2;
|
|
170
|
+
(_this$_recorder2 = this._recorder) === null || _this$_recorder2 === void 0 || _this$_recorder2.setMode('recording');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
await this._page.mainFrame().evaluateExpression((data => {
|
|
174
|
+
window.playwrightSetSelector(data.selector, data.userGesture);
|
|
175
|
+
}).toString(), {
|
|
176
|
+
isFunction: true
|
|
177
|
+
}, {
|
|
178
|
+
selector,
|
|
179
|
+
userGesture
|
|
180
|
+
}).catch(() => {});
|
|
181
|
+
}
|
|
182
|
+
async updateCallLogs(callLogs) {
|
|
183
|
+
await this._page.mainFrame().evaluateExpression((callLogs => {
|
|
184
|
+
window.playwrightUpdateLogs(callLogs);
|
|
185
|
+
}).toString(), {
|
|
186
|
+
isFunction: true
|
|
187
|
+
}, callLogs).catch(() => {});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.RecorderApp = RecorderApp;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RecorderCollection = void 0;
|
|
7
|
+
var _events = require("events");
|
|
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
|
+
class RecorderCollection extends _events.EventEmitter {
|
|
25
|
+
constructor(enabled) {
|
|
26
|
+
super();
|
|
27
|
+
this._currentAction = null;
|
|
28
|
+
this._lastAction = null;
|
|
29
|
+
this._actions = [];
|
|
30
|
+
this._enabled = void 0;
|
|
31
|
+
this._enabled = enabled;
|
|
32
|
+
this.restart();
|
|
33
|
+
}
|
|
34
|
+
restart() {
|
|
35
|
+
this._currentAction = null;
|
|
36
|
+
this._lastAction = null;
|
|
37
|
+
this._actions = [];
|
|
38
|
+
this.emit('change');
|
|
39
|
+
}
|
|
40
|
+
actions() {
|
|
41
|
+
return this._actions;
|
|
42
|
+
}
|
|
43
|
+
setEnabled(enabled) {
|
|
44
|
+
this._enabled = enabled;
|
|
45
|
+
}
|
|
46
|
+
addAction(action) {
|
|
47
|
+
if (!this._enabled) return;
|
|
48
|
+
this.willPerformAction(action);
|
|
49
|
+
this.didPerformAction(action);
|
|
50
|
+
}
|
|
51
|
+
willPerformAction(action) {
|
|
52
|
+
if (!this._enabled) return;
|
|
53
|
+
this._currentAction = action;
|
|
54
|
+
}
|
|
55
|
+
performedActionFailed(action) {
|
|
56
|
+
if (!this._enabled) return;
|
|
57
|
+
if (this._currentAction === action) this._currentAction = null;
|
|
58
|
+
}
|
|
59
|
+
didPerformAction(actionInContext) {
|
|
60
|
+
if (!this._enabled) return;
|
|
61
|
+
const action = actionInContext.action;
|
|
62
|
+
let eraseLastAction = false;
|
|
63
|
+
if (this._lastAction && this._lastAction.frame.pageAlias === actionInContext.frame.pageAlias) {
|
|
64
|
+
const lastAction = this._lastAction.action;
|
|
65
|
+
// We augment last action based on the type.
|
|
66
|
+
if (this._lastAction && action.name === 'fill' && lastAction.name === 'fill') {
|
|
67
|
+
if (action.selector === lastAction.selector) eraseLastAction = true;
|
|
68
|
+
}
|
|
69
|
+
if (lastAction && action.name === 'click' && lastAction.name === 'click') {
|
|
70
|
+
if (action.selector === lastAction.selector && action.clickCount > lastAction.clickCount) eraseLastAction = true;
|
|
71
|
+
}
|
|
72
|
+
if (lastAction && action.name === 'navigate' && lastAction.name === 'navigate') {
|
|
73
|
+
if (action.url === lastAction.url) {
|
|
74
|
+
// Already at a target URL.
|
|
75
|
+
this._currentAction = null;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Check and uncheck erase click.
|
|
80
|
+
if (lastAction && (action.name === 'check' || action.name === 'uncheck') && lastAction.name === 'click') {
|
|
81
|
+
if (action.selector === lastAction.selector) eraseLastAction = true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
this._lastAction = actionInContext;
|
|
85
|
+
this._currentAction = null;
|
|
86
|
+
if (eraseLastAction) this._actions.pop();
|
|
87
|
+
this._actions.push(actionInContext);
|
|
88
|
+
this.emit('change');
|
|
89
|
+
}
|
|
90
|
+
commitLastAction() {
|
|
91
|
+
if (!this._enabled) return;
|
|
92
|
+
const action = this._lastAction;
|
|
93
|
+
if (action) action.committed = true;
|
|
94
|
+
}
|
|
95
|
+
signal(pageAlias, frame, signal) {
|
|
96
|
+
if (!this._enabled) return;
|
|
97
|
+
|
|
98
|
+
// Signal either arrives while action is being performed or shortly after.
|
|
99
|
+
if (this._currentAction) {
|
|
100
|
+
this._currentAction.action.signals.push(signal);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (this._lastAction && (!this._lastAction.committed || signal.name !== 'navigation')) {
|
|
104
|
+
const signals = this._lastAction.action.signals;
|
|
105
|
+
if (signal.name === 'navigation' && signals.length && signals[signals.length - 1].name === 'download') return;
|
|
106
|
+
if (signal.name === 'download' && signals.length && signals[signals.length - 1].name === 'navigation') signals.length = signals.length - 1;
|
|
107
|
+
this._lastAction.action.signals.push(signal);
|
|
108
|
+
this.emit('change');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (signal.name === 'navigation' && frame._page.mainFrame() === frame) {
|
|
112
|
+
this.addAction({
|
|
113
|
+
frame: {
|
|
114
|
+
pageAlias,
|
|
115
|
+
framePath: []
|
|
116
|
+
},
|
|
117
|
+
committed: true,
|
|
118
|
+
action: {
|
|
119
|
+
name: 'navigate',
|
|
120
|
+
url: frame.url(),
|
|
121
|
+
signals: []
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.RecorderCollection = RecorderCollection;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.performAction = performAction;
|
|
7
|
+
var _utils = require("../../utils");
|
|
8
|
+
var _language = require("../codegen/language");
|
|
9
|
+
var _recorderUtils = require("./recorderUtils");
|
|
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
|
+
async function innerPerformAction(mainFrame, action, params, cb) {
|
|
27
|
+
const callMetadata = {
|
|
28
|
+
id: `call@${(0, _utils.createGuid)()}`,
|
|
29
|
+
apiName: 'frame.' + action,
|
|
30
|
+
objectId: mainFrame.guid,
|
|
31
|
+
pageId: mainFrame._page.guid,
|
|
32
|
+
frameId: mainFrame.guid,
|
|
33
|
+
startTime: (0, _utils.monotonicTime)(),
|
|
34
|
+
endTime: 0,
|
|
35
|
+
type: 'Frame',
|
|
36
|
+
method: action,
|
|
37
|
+
params,
|
|
38
|
+
log: []
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
await mainFrame.instrumentation.onBeforeCall(mainFrame, callMetadata);
|
|
42
|
+
await cb(callMetadata);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
callMetadata.endTime = (0, _utils.monotonicTime)();
|
|
45
|
+
await mainFrame.instrumentation.onAfterCall(mainFrame, callMetadata);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
callMetadata.endTime = (0, _utils.monotonicTime)();
|
|
49
|
+
await mainFrame.instrumentation.onAfterCall(mainFrame, callMetadata);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
async function performAction(pageAliases, actionInContext) {
|
|
53
|
+
var _find;
|
|
54
|
+
const pageAlias = actionInContext.frame.pageAlias;
|
|
55
|
+
const page = (_find = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)) === null || _find === void 0 ? void 0 : _find[0];
|
|
56
|
+
if (!page) throw new Error('Internal error: page not found');
|
|
57
|
+
const mainFrame = page.mainFrame();
|
|
58
|
+
const {
|
|
59
|
+
action
|
|
60
|
+
} = actionInContext;
|
|
61
|
+
const kActionTimeout = 5000;
|
|
62
|
+
if (action.name === 'navigate') return await innerPerformAction(mainFrame, 'goto', {
|
|
63
|
+
url: action.url
|
|
64
|
+
}, callMetadata => mainFrame.goto(callMetadata, action.url, {
|
|
65
|
+
timeout: kActionTimeout
|
|
66
|
+
}));
|
|
67
|
+
if (action.name === 'openPage') throw Error('Not reached');
|
|
68
|
+
if (action.name === 'closePage') return await innerPerformAction(mainFrame, 'close', {}, callMetadata => mainFrame._page.close(callMetadata));
|
|
69
|
+
const selector = (0, _recorderUtils.buildFullSelector)(actionInContext.frame.framePath, action.selector);
|
|
70
|
+
if (action.name === 'click') {
|
|
71
|
+
const options = (0, _language.toClickOptions)(action);
|
|
72
|
+
return await innerPerformAction(mainFrame, 'click', {
|
|
73
|
+
selector
|
|
74
|
+
}, callMetadata => mainFrame.click(callMetadata, selector, {
|
|
75
|
+
...options,
|
|
76
|
+
timeout: kActionTimeout,
|
|
77
|
+
strict: true
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
if (action.name === 'press') {
|
|
81
|
+
const modifiers = (0, _language.toKeyboardModifiers)(action.modifiers);
|
|
82
|
+
const shortcut = [...modifiers, action.key].join('+');
|
|
83
|
+
return await innerPerformAction(mainFrame, 'press', {
|
|
84
|
+
selector,
|
|
85
|
+
key: shortcut
|
|
86
|
+
}, callMetadata => mainFrame.press(callMetadata, selector, shortcut, {
|
|
87
|
+
timeout: kActionTimeout,
|
|
88
|
+
strict: true
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
if (action.name === 'fill') return await innerPerformAction(mainFrame, 'fill', {
|
|
92
|
+
selector,
|
|
93
|
+
text: action.text
|
|
94
|
+
}, callMetadata => mainFrame.fill(callMetadata, selector, action.text, {
|
|
95
|
+
timeout: kActionTimeout,
|
|
96
|
+
strict: true
|
|
97
|
+
}));
|
|
98
|
+
if (action.name === 'setInputFiles') return await innerPerformAction(mainFrame, 'setInputFiles', {
|
|
99
|
+
selector,
|
|
100
|
+
files: action.files
|
|
101
|
+
}, callMetadata => mainFrame.setInputFiles(callMetadata, selector, {
|
|
102
|
+
selector,
|
|
103
|
+
payloads: [],
|
|
104
|
+
timeout: kActionTimeout,
|
|
105
|
+
strict: true
|
|
106
|
+
}));
|
|
107
|
+
if (action.name === 'check') return await innerPerformAction(mainFrame, 'check', {
|
|
108
|
+
selector
|
|
109
|
+
}, callMetadata => mainFrame.check(callMetadata, selector, {
|
|
110
|
+
timeout: kActionTimeout,
|
|
111
|
+
strict: true
|
|
112
|
+
}));
|
|
113
|
+
if (action.name === 'uncheck') return await innerPerformAction(mainFrame, 'uncheck', {
|
|
114
|
+
selector
|
|
115
|
+
}, callMetadata => mainFrame.uncheck(callMetadata, selector, {
|
|
116
|
+
timeout: kActionTimeout,
|
|
117
|
+
strict: true
|
|
118
|
+
}));
|
|
119
|
+
if (action.name === 'select') {
|
|
120
|
+
const values = action.options.map(value => ({
|
|
121
|
+
value
|
|
122
|
+
}));
|
|
123
|
+
return await innerPerformAction(mainFrame, 'selectOption', {
|
|
124
|
+
selector,
|
|
125
|
+
values
|
|
126
|
+
}, callMetadata => mainFrame.selectOption(callMetadata, selector, [], values, {
|
|
127
|
+
timeout: kActionTimeout,
|
|
128
|
+
strict: true
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
if (action.name === 'assertChecked') {
|
|
132
|
+
return await innerPerformAction(mainFrame, 'expect', {
|
|
133
|
+
selector
|
|
134
|
+
}, callMetadata => mainFrame.expect(callMetadata, selector, {
|
|
135
|
+
selector,
|
|
136
|
+
expression: 'to.be.checked',
|
|
137
|
+
isNot: !action.checked,
|
|
138
|
+
timeout: kActionTimeout
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
if (action.name === 'assertText') {
|
|
142
|
+
return await innerPerformAction(mainFrame, 'expect', {
|
|
143
|
+
selector
|
|
144
|
+
}, callMetadata => mainFrame.expect(callMetadata, selector, {
|
|
145
|
+
selector,
|
|
146
|
+
expression: 'to.have.text',
|
|
147
|
+
expectedText: (0, _utils.serializeExpectedTextValues)([action.text], {
|
|
148
|
+
matchSubstring: true,
|
|
149
|
+
normalizeWhiteSpace: true
|
|
150
|
+
}),
|
|
151
|
+
isNot: false,
|
|
152
|
+
timeout: kActionTimeout
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
if (action.name === 'assertValue') {
|
|
156
|
+
return await innerPerformAction(mainFrame, 'expect', {
|
|
157
|
+
selector
|
|
158
|
+
}, callMetadata => mainFrame.expect(callMetadata, selector, {
|
|
159
|
+
selector,
|
|
160
|
+
expression: 'to.have.value',
|
|
161
|
+
expectedValue: action.value,
|
|
162
|
+
isNot: false,
|
|
163
|
+
timeout: kActionTimeout
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
if (action.name === 'assertVisible') {
|
|
167
|
+
return await innerPerformAction(mainFrame, 'expect', {
|
|
168
|
+
selector
|
|
169
|
+
}, callMetadata => mainFrame.expect(callMetadata, selector, {
|
|
170
|
+
selector,
|
|
171
|
+
expression: 'to.be.visible',
|
|
172
|
+
isNot: false,
|
|
173
|
+
timeout: kActionTimeout
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
throw new Error('Internal error: unexpected action ' + action.name);
|
|
177
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildFullSelector = buildFullSelector;
|
|
7
|
+
exports.frameForAction = frameForAction;
|
|
8
|
+
exports.mainFrameForAction = mainFrameForAction;
|
|
9
|
+
exports.metadataToCallLog = metadataToCallLog;
|
|
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
|
+
function metadataToCallLog(metadata, status) {
|
|
27
|
+
var _metadata$params, _metadata$params2, _metadata$error;
|
|
28
|
+
let title = metadata.apiName || metadata.method;
|
|
29
|
+
if (metadata.method === 'waitForEventInfo') title += `(${metadata.params.info.event})`;
|
|
30
|
+
title = title.replace('object.expect', 'expect');
|
|
31
|
+
if (metadata.error) status = 'error';
|
|
32
|
+
const params = {
|
|
33
|
+
url: (_metadata$params = metadata.params) === null || _metadata$params === void 0 ? void 0 : _metadata$params.url,
|
|
34
|
+
selector: (_metadata$params2 = metadata.params) === null || _metadata$params2 === void 0 ? void 0 : _metadata$params2.selector
|
|
35
|
+
};
|
|
36
|
+
let duration = metadata.endTime ? metadata.endTime - metadata.startTime : undefined;
|
|
37
|
+
if (typeof duration === 'number' && metadata.pauseStartTime && metadata.pauseEndTime) {
|
|
38
|
+
duration -= metadata.pauseEndTime - metadata.pauseStartTime;
|
|
39
|
+
duration = Math.max(duration, 0);
|
|
40
|
+
}
|
|
41
|
+
const callLog = {
|
|
42
|
+
id: metadata.id,
|
|
43
|
+
messages: metadata.log,
|
|
44
|
+
title,
|
|
45
|
+
status,
|
|
46
|
+
error: (_metadata$error = metadata.error) === null || _metadata$error === void 0 || (_metadata$error = _metadata$error.error) === null || _metadata$error === void 0 ? void 0 : _metadata$error.message,
|
|
47
|
+
params,
|
|
48
|
+
duration
|
|
49
|
+
};
|
|
50
|
+
return callLog;
|
|
51
|
+
}
|
|
52
|
+
function buildFullSelector(framePath, selector) {
|
|
53
|
+
return [...framePath, selector].join(' >> internal:control=enter-frame >> ');
|
|
54
|
+
}
|
|
55
|
+
function mainFrameForAction(pageAliases, actionInContext) {
|
|
56
|
+
var _find;
|
|
57
|
+
const pageAlias = actionInContext.frame.pageAlias;
|
|
58
|
+
const page = (_find = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)) === null || _find === void 0 ? void 0 : _find[0];
|
|
59
|
+
if (!page) throw new Error('Internal error: page not found');
|
|
60
|
+
return page.mainFrame();
|
|
61
|
+
}
|
|
62
|
+
async function frameForAction(pageAliases, actionInContext, action) {
|
|
63
|
+
var _find2;
|
|
64
|
+
const pageAlias = actionInContext.frame.pageAlias;
|
|
65
|
+
const page = (_find2 = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)) === null || _find2 === void 0 ? void 0 : _find2[0];
|
|
66
|
+
if (!page) throw new Error('Internal error: page not found');
|
|
67
|
+
const fullSelector = buildFullSelector(actionInContext.frame.framePath, action.selector);
|
|
68
|
+
const result = await page.mainFrame().selectors.resolveFrameForSelector(fullSelector);
|
|
69
|
+
if (!result) throw new Error('Internal error: frame not found');
|
|
70
|
+
return result.frame;
|
|
71
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ThrottledFile = void 0;
|
|
7
|
+
var fs = _interopRequireWildcard(require("fs"));
|
|
8
|
+
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); }
|
|
9
|
+
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; }
|
|
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
|
+
class ThrottledFile {
|
|
27
|
+
constructor(file) {
|
|
28
|
+
this._file = void 0;
|
|
29
|
+
this._timer = void 0;
|
|
30
|
+
this._text = void 0;
|
|
31
|
+
this._file = file;
|
|
32
|
+
}
|
|
33
|
+
setContent(text) {
|
|
34
|
+
this._text = text;
|
|
35
|
+
if (!this._timer) this._timer = setTimeout(() => this.flush(), 250);
|
|
36
|
+
}
|
|
37
|
+
flush() {
|
|
38
|
+
if (this._timer) {
|
|
39
|
+
clearTimeout(this._timer);
|
|
40
|
+
this._timer = undefined;
|
|
41
|
+
}
|
|
42
|
+
if (this._text) fs.writeFileSync(this._file, this._text);
|
|
43
|
+
this._text = undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.ThrottledFile = ThrottledFile;
|