@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,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.kBrowserCloseMessageId = exports.ConnectionEvents = exports.CRSession = exports.CRConnection = exports.CDPSession = void 0;
|
|
7
|
+
var _utils = require("../../utils");
|
|
8
|
+
var _events = require("events");
|
|
9
|
+
var _debugLogger = require("../../utils/debugLogger");
|
|
10
|
+
var _helper = require("../helper");
|
|
11
|
+
var _protocolError = require("../protocolError");
|
|
12
|
+
/**
|
|
13
|
+
* Copyright 2017 Google Inc. All rights reserved.
|
|
14
|
+
* Modifications copyright (c) Microsoft Corporation.
|
|
15
|
+
*
|
|
16
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
17
|
+
* you may not use this file except in compliance with the License.
|
|
18
|
+
* You may obtain a copy of the License at
|
|
19
|
+
*
|
|
20
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
21
|
+
*
|
|
22
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
23
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
24
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
25
|
+
* See the License for the specific language governing permissions and
|
|
26
|
+
* limitations under the License.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const ConnectionEvents = exports.ConnectionEvents = {
|
|
30
|
+
Disconnected: Symbol('ConnectionEvents.Disconnected')
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// CRPlaywright uses this special id to issue Browser.close command which we
|
|
34
|
+
// should ignore.
|
|
35
|
+
const kBrowserCloseMessageId = exports.kBrowserCloseMessageId = -9999;
|
|
36
|
+
class CRConnection extends _events.EventEmitter {
|
|
37
|
+
constructor(transport, protocolLogger, browserLogsCollector) {
|
|
38
|
+
super();
|
|
39
|
+
this._lastId = 0;
|
|
40
|
+
this._transport = void 0;
|
|
41
|
+
this._sessions = new Map();
|
|
42
|
+
this._protocolLogger = void 0;
|
|
43
|
+
this._browserLogsCollector = void 0;
|
|
44
|
+
this._browserDisconnectedLogs = void 0;
|
|
45
|
+
this.rootSession = void 0;
|
|
46
|
+
this._closed = false;
|
|
47
|
+
this.setMaxListeners(0);
|
|
48
|
+
this._transport = transport;
|
|
49
|
+
this._protocolLogger = protocolLogger;
|
|
50
|
+
this._browserLogsCollector = browserLogsCollector;
|
|
51
|
+
this.rootSession = new CRSession(this, null, '');
|
|
52
|
+
this._sessions.set('', this.rootSession);
|
|
53
|
+
this._transport.onmessage = this._onMessage.bind(this);
|
|
54
|
+
// onclose should be set last, since it can be immediately called.
|
|
55
|
+
this._transport.onclose = this._onClose.bind(this);
|
|
56
|
+
}
|
|
57
|
+
_rawSend(sessionId, method, params) {
|
|
58
|
+
const id = ++this._lastId;
|
|
59
|
+
const message = {
|
|
60
|
+
id,
|
|
61
|
+
method,
|
|
62
|
+
params
|
|
63
|
+
};
|
|
64
|
+
if (sessionId) message.sessionId = sessionId;
|
|
65
|
+
this._protocolLogger('send', message);
|
|
66
|
+
this._transport.send(message);
|
|
67
|
+
return id;
|
|
68
|
+
}
|
|
69
|
+
async _onMessage(message) {
|
|
70
|
+
this._protocolLogger('receive', message);
|
|
71
|
+
if (message.id === kBrowserCloseMessageId) return;
|
|
72
|
+
const session = this._sessions.get(message.sessionId || '');
|
|
73
|
+
if (session) session._onMessage(message);
|
|
74
|
+
}
|
|
75
|
+
_onClose() {
|
|
76
|
+
this._closed = true;
|
|
77
|
+
this._transport.onmessage = undefined;
|
|
78
|
+
this._transport.onclose = undefined;
|
|
79
|
+
this._browserDisconnectedLogs = _helper.helper.formatBrowserLogs(this._browserLogsCollector.recentLogs());
|
|
80
|
+
this.rootSession.dispose();
|
|
81
|
+
Promise.resolve().then(() => this.emit(ConnectionEvents.Disconnected));
|
|
82
|
+
}
|
|
83
|
+
close() {
|
|
84
|
+
if (!this._closed) this._transport.close();
|
|
85
|
+
}
|
|
86
|
+
async createBrowserSession() {
|
|
87
|
+
const {
|
|
88
|
+
sessionId
|
|
89
|
+
} = await this.rootSession.send('Target.attachToBrowserTarget');
|
|
90
|
+
return new CDPSession(this.rootSession, sessionId);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.CRConnection = CRConnection;
|
|
94
|
+
class CRSession extends _events.EventEmitter {
|
|
95
|
+
constructor(connection, parentSession, sessionId, eventListener) {
|
|
96
|
+
super();
|
|
97
|
+
this._connection = void 0;
|
|
98
|
+
this._eventListener = void 0;
|
|
99
|
+
this._callbacks = new Map();
|
|
100
|
+
this._sessionId = void 0;
|
|
101
|
+
this._parentSession = void 0;
|
|
102
|
+
this._crashed = false;
|
|
103
|
+
this._closed = false;
|
|
104
|
+
this.on = void 0;
|
|
105
|
+
this.addListener = void 0;
|
|
106
|
+
this.off = void 0;
|
|
107
|
+
this.removeListener = void 0;
|
|
108
|
+
this.once = void 0;
|
|
109
|
+
this.setMaxListeners(0);
|
|
110
|
+
this._connection = connection;
|
|
111
|
+
this._parentSession = parentSession;
|
|
112
|
+
this._sessionId = sessionId;
|
|
113
|
+
this._eventListener = eventListener;
|
|
114
|
+
this.on = super.on;
|
|
115
|
+
this.addListener = super.addListener;
|
|
116
|
+
this.off = super.removeListener;
|
|
117
|
+
this.removeListener = super.removeListener;
|
|
118
|
+
this.once = super.once;
|
|
119
|
+
}
|
|
120
|
+
_markAsCrashed() {
|
|
121
|
+
this._crashed = true;
|
|
122
|
+
}
|
|
123
|
+
createChildSession(sessionId, eventListener) {
|
|
124
|
+
const session = new CRSession(this._connection, this, sessionId, eventListener);
|
|
125
|
+
this._connection._sessions.set(sessionId, session);
|
|
126
|
+
return session;
|
|
127
|
+
}
|
|
128
|
+
async send(method, params) {
|
|
129
|
+
if (this._crashed || this._closed || this._connection._closed || this._connection._browserDisconnectedLogs) throw new _protocolError.ProtocolError(this._crashed ? 'crashed' : 'closed', undefined, this._connection._browserDisconnectedLogs);
|
|
130
|
+
const id = this._connection._rawSend(this._sessionId, method, params);
|
|
131
|
+
return new Promise((resolve, reject) => {
|
|
132
|
+
this._callbacks.set(id, {
|
|
133
|
+
resolve,
|
|
134
|
+
reject,
|
|
135
|
+
error: new _protocolError.ProtocolError('error', method)
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
_sendMayFail(method, params) {
|
|
140
|
+
return this.send(method, params).catch(error => _debugLogger.debugLogger.log('error', error));
|
|
141
|
+
}
|
|
142
|
+
_onMessage(object) {
|
|
143
|
+
var _object$error;
|
|
144
|
+
if (object.id && this._callbacks.has(object.id)) {
|
|
145
|
+
const callback = this._callbacks.get(object.id);
|
|
146
|
+
this._callbacks.delete(object.id);
|
|
147
|
+
if (object.error) {
|
|
148
|
+
callback.error.setMessage(object.error.message);
|
|
149
|
+
callback.reject(callback.error);
|
|
150
|
+
} else {
|
|
151
|
+
callback.resolve(object.result);
|
|
152
|
+
}
|
|
153
|
+
} else if (object.id && ((_object$error = object.error) === null || _object$error === void 0 ? void 0 : _object$error.code) === -32001) {
|
|
154
|
+
// Message to a closed session, just ignore it.
|
|
155
|
+
} else {
|
|
156
|
+
var _object$error2;
|
|
157
|
+
(0, _utils.assert)(!object.id, (object === null || object === void 0 || (_object$error2 = object.error) === null || _object$error2 === void 0 ? void 0 : _object$error2.message) || undefined);
|
|
158
|
+
Promise.resolve().then(() => {
|
|
159
|
+
if (this._eventListener) this._eventListener(object.method, object.params);
|
|
160
|
+
this.emit(object.method, object.params);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async detach() {
|
|
165
|
+
if (this._closed) throw new Error(`Session already detached. Most likely the page has been closed.`);
|
|
166
|
+
if (!this._parentSession) throw new Error('Root session cannot be closed');
|
|
167
|
+
// Ideally, detaching should resume any target, but there is a bug in the backend,
|
|
168
|
+
// so we must Runtime.runIfWaitingForDebugger first.
|
|
169
|
+
await this._sendMayFail('Runtime.runIfWaitingForDebugger');
|
|
170
|
+
await this._parentSession.send('Target.detachFromTarget', {
|
|
171
|
+
sessionId: this._sessionId
|
|
172
|
+
});
|
|
173
|
+
this.dispose();
|
|
174
|
+
}
|
|
175
|
+
dispose() {
|
|
176
|
+
this._closed = true;
|
|
177
|
+
this._connection._sessions.delete(this._sessionId);
|
|
178
|
+
for (const callback of this._callbacks.values()) {
|
|
179
|
+
callback.error.setMessage(`Internal server error, session closed.`);
|
|
180
|
+
callback.error.type = this._crashed ? 'crashed' : 'closed';
|
|
181
|
+
callback.error.logs = this._connection._browserDisconnectedLogs;
|
|
182
|
+
callback.reject(callback.error);
|
|
183
|
+
}
|
|
184
|
+
this._callbacks.clear();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.CRSession = CRSession;
|
|
188
|
+
class CDPSession extends _events.EventEmitter {
|
|
189
|
+
constructor(parentSession, sessionId) {
|
|
190
|
+
super();
|
|
191
|
+
this.guid = void 0;
|
|
192
|
+
this._session = void 0;
|
|
193
|
+
this._listeners = [];
|
|
194
|
+
this.guid = `cdp-session@${sessionId}`;
|
|
195
|
+
this._session = parentSession.createChildSession(sessionId, (method, params) => this.emit(CDPSession.Events.Event, {
|
|
196
|
+
method,
|
|
197
|
+
params
|
|
198
|
+
}));
|
|
199
|
+
this._listeners = [_utils.eventsHelper.addEventListener(parentSession, 'Target.detachedFromTarget', event => {
|
|
200
|
+
if (event.sessionId === sessionId) this._onClose();
|
|
201
|
+
})];
|
|
202
|
+
}
|
|
203
|
+
async send(method, params) {
|
|
204
|
+
return await this._session.send(method, params);
|
|
205
|
+
}
|
|
206
|
+
async detach() {
|
|
207
|
+
return await this._session.detach();
|
|
208
|
+
}
|
|
209
|
+
async attachToTarget(targetId) {
|
|
210
|
+
const {
|
|
211
|
+
sessionId
|
|
212
|
+
} = await this.send('Target.attachToTarget', {
|
|
213
|
+
targetId,
|
|
214
|
+
flatten: true
|
|
215
|
+
});
|
|
216
|
+
return new CDPSession(this._session, sessionId);
|
|
217
|
+
}
|
|
218
|
+
_onClose() {
|
|
219
|
+
_utils.eventsHelper.removeEventListeners(this._listeners);
|
|
220
|
+
this._session.dispose();
|
|
221
|
+
this.emit(CDPSession.Events.Closed);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
exports.CDPSession = CDPSession;
|
|
225
|
+
CDPSession.Events = {
|
|
226
|
+
Event: 'event',
|
|
227
|
+
Closed: 'close'
|
|
228
|
+
};
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CRCoverage = void 0;
|
|
7
|
+
var _eventsHelper = require("../../utils/eventsHelper");
|
|
8
|
+
var _utils = require("../../utils");
|
|
9
|
+
/**
|
|
10
|
+
* Copyright 2017 Google Inc. All rights reserved.
|
|
11
|
+
* Modifications 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 CRCoverage {
|
|
27
|
+
constructor(client) {
|
|
28
|
+
this._jsCoverage = void 0;
|
|
29
|
+
this._cssCoverage = void 0;
|
|
30
|
+
this._jsCoverage = new JSCoverage(client);
|
|
31
|
+
this._cssCoverage = new CSSCoverage(client);
|
|
32
|
+
}
|
|
33
|
+
async startJSCoverage(options) {
|
|
34
|
+
return await this._jsCoverage.start(options);
|
|
35
|
+
}
|
|
36
|
+
async stopJSCoverage() {
|
|
37
|
+
return await this._jsCoverage.stop();
|
|
38
|
+
}
|
|
39
|
+
async startCSSCoverage(options) {
|
|
40
|
+
return await this._cssCoverage.start(options);
|
|
41
|
+
}
|
|
42
|
+
async stopCSSCoverage() {
|
|
43
|
+
return await this._cssCoverage.stop();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.CRCoverage = CRCoverage;
|
|
47
|
+
class JSCoverage {
|
|
48
|
+
constructor(client) {
|
|
49
|
+
this._client = void 0;
|
|
50
|
+
this._enabled = void 0;
|
|
51
|
+
this._scriptIds = void 0;
|
|
52
|
+
this._scriptSources = void 0;
|
|
53
|
+
this._eventListeners = void 0;
|
|
54
|
+
this._resetOnNavigation = void 0;
|
|
55
|
+
this._reportAnonymousScripts = false;
|
|
56
|
+
this._client = client;
|
|
57
|
+
this._enabled = false;
|
|
58
|
+
this._scriptIds = new Set();
|
|
59
|
+
this._scriptSources = new Map();
|
|
60
|
+
this._eventListeners = [];
|
|
61
|
+
this._resetOnNavigation = false;
|
|
62
|
+
}
|
|
63
|
+
async start(options) {
|
|
64
|
+
(0, _utils.assert)(!this._enabled, 'JSCoverage is already enabled');
|
|
65
|
+
const {
|
|
66
|
+
resetOnNavigation = true,
|
|
67
|
+
reportAnonymousScripts = false
|
|
68
|
+
} = options;
|
|
69
|
+
this._resetOnNavigation = resetOnNavigation;
|
|
70
|
+
this._reportAnonymousScripts = reportAnonymousScripts;
|
|
71
|
+
this._enabled = true;
|
|
72
|
+
this._scriptIds.clear();
|
|
73
|
+
this._scriptSources.clear();
|
|
74
|
+
this._eventListeners = [_eventsHelper.eventsHelper.addEventListener(this._client, 'Debugger.scriptParsed', this._onScriptParsed.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._client, 'Debugger.paused', this._onDebuggerPaused.bind(this))];
|
|
75
|
+
await Promise.all([this._client.send('Profiler.enable'), this._client.send('Profiler.startPreciseCoverage', {
|
|
76
|
+
callCount: true,
|
|
77
|
+
detailed: true
|
|
78
|
+
}), this._client.send('Debugger.enable'), this._client.send('Debugger.setSkipAllPauses', {
|
|
79
|
+
skip: true
|
|
80
|
+
})]);
|
|
81
|
+
}
|
|
82
|
+
_onDebuggerPaused() {
|
|
83
|
+
this._client.send('Debugger.resume');
|
|
84
|
+
}
|
|
85
|
+
_onExecutionContextsCleared() {
|
|
86
|
+
if (!this._resetOnNavigation) return;
|
|
87
|
+
this._scriptIds.clear();
|
|
88
|
+
this._scriptSources.clear();
|
|
89
|
+
}
|
|
90
|
+
async _onScriptParsed(event) {
|
|
91
|
+
this._scriptIds.add(event.scriptId);
|
|
92
|
+
// Ignore other anonymous scripts unless the reportAnonymousScripts option is true.
|
|
93
|
+
if (!event.url && !this._reportAnonymousScripts) return;
|
|
94
|
+
// This might fail if the page has already navigated away.
|
|
95
|
+
const response = await this._client._sendMayFail('Debugger.getScriptSource', {
|
|
96
|
+
scriptId: event.scriptId
|
|
97
|
+
});
|
|
98
|
+
if (response) this._scriptSources.set(event.scriptId, response.scriptSource);
|
|
99
|
+
}
|
|
100
|
+
async stop() {
|
|
101
|
+
(0, _utils.assert)(this._enabled, 'JSCoverage is not enabled');
|
|
102
|
+
this._enabled = false;
|
|
103
|
+
const [profileResponse] = await Promise.all([this._client.send('Profiler.takePreciseCoverage'), this._client.send('Profiler.stopPreciseCoverage'), this._client.send('Profiler.disable'), this._client.send('Debugger.disable')]);
|
|
104
|
+
_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
105
|
+
const coverage = {
|
|
106
|
+
entries: []
|
|
107
|
+
};
|
|
108
|
+
for (const entry of profileResponse.result) {
|
|
109
|
+
if (!this._scriptIds.has(entry.scriptId)) continue;
|
|
110
|
+
if (!entry.url && !this._reportAnonymousScripts) continue;
|
|
111
|
+
const source = this._scriptSources.get(entry.scriptId);
|
|
112
|
+
if (source) coverage.entries.push({
|
|
113
|
+
...entry,
|
|
114
|
+
source
|
|
115
|
+
});else coverage.entries.push(entry);
|
|
116
|
+
}
|
|
117
|
+
return coverage;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
class CSSCoverage {
|
|
121
|
+
constructor(client) {
|
|
122
|
+
this._client = void 0;
|
|
123
|
+
this._enabled = void 0;
|
|
124
|
+
this._stylesheetURLs = void 0;
|
|
125
|
+
this._stylesheetSources = void 0;
|
|
126
|
+
this._eventListeners = void 0;
|
|
127
|
+
this._resetOnNavigation = void 0;
|
|
128
|
+
this._client = client;
|
|
129
|
+
this._enabled = false;
|
|
130
|
+
this._stylesheetURLs = new Map();
|
|
131
|
+
this._stylesheetSources = new Map();
|
|
132
|
+
this._eventListeners = [];
|
|
133
|
+
this._resetOnNavigation = false;
|
|
134
|
+
}
|
|
135
|
+
async start(options) {
|
|
136
|
+
(0, _utils.assert)(!this._enabled, 'CSSCoverage is already enabled');
|
|
137
|
+
const {
|
|
138
|
+
resetOnNavigation = true
|
|
139
|
+
} = options;
|
|
140
|
+
this._resetOnNavigation = resetOnNavigation;
|
|
141
|
+
this._enabled = true;
|
|
142
|
+
this._stylesheetURLs.clear();
|
|
143
|
+
this._stylesheetSources.clear();
|
|
144
|
+
this._eventListeners = [_eventsHelper.eventsHelper.addEventListener(this._client, 'CSS.styleSheetAdded', this._onStyleSheet.bind(this)), _eventsHelper.eventsHelper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this))];
|
|
145
|
+
await Promise.all([this._client.send('DOM.enable'), this._client.send('CSS.enable'), this._client.send('CSS.startRuleUsageTracking')]);
|
|
146
|
+
}
|
|
147
|
+
_onExecutionContextsCleared() {
|
|
148
|
+
if (!this._resetOnNavigation) return;
|
|
149
|
+
this._stylesheetURLs.clear();
|
|
150
|
+
this._stylesheetSources.clear();
|
|
151
|
+
}
|
|
152
|
+
async _onStyleSheet(event) {
|
|
153
|
+
const header = event.header;
|
|
154
|
+
// Ignore anonymous scripts
|
|
155
|
+
if (!header.sourceURL) return;
|
|
156
|
+
// This might fail if the page has already navigated away.
|
|
157
|
+
const response = await this._client._sendMayFail('CSS.getStyleSheetText', {
|
|
158
|
+
styleSheetId: header.styleSheetId
|
|
159
|
+
});
|
|
160
|
+
if (response) {
|
|
161
|
+
this._stylesheetURLs.set(header.styleSheetId, header.sourceURL);
|
|
162
|
+
this._stylesheetSources.set(header.styleSheetId, response.text);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async stop() {
|
|
166
|
+
(0, _utils.assert)(this._enabled, 'CSSCoverage is not enabled');
|
|
167
|
+
this._enabled = false;
|
|
168
|
+
const ruleTrackingResponse = await this._client.send('CSS.stopRuleUsageTracking');
|
|
169
|
+
await Promise.all([this._client.send('CSS.disable'), this._client.send('DOM.disable')]);
|
|
170
|
+
_eventsHelper.eventsHelper.removeEventListeners(this._eventListeners);
|
|
171
|
+
|
|
172
|
+
// aggregate by styleSheetId
|
|
173
|
+
const styleSheetIdToCoverage = new Map();
|
|
174
|
+
for (const entry of ruleTrackingResponse.ruleUsage) {
|
|
175
|
+
let ranges = styleSheetIdToCoverage.get(entry.styleSheetId);
|
|
176
|
+
if (!ranges) {
|
|
177
|
+
ranges = [];
|
|
178
|
+
styleSheetIdToCoverage.set(entry.styleSheetId, ranges);
|
|
179
|
+
}
|
|
180
|
+
ranges.push({
|
|
181
|
+
startOffset: entry.startOffset,
|
|
182
|
+
endOffset: entry.endOffset,
|
|
183
|
+
count: entry.used ? 1 : 0
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const coverage = {
|
|
187
|
+
entries: []
|
|
188
|
+
};
|
|
189
|
+
for (const styleSheetId of this._stylesheetURLs.keys()) {
|
|
190
|
+
const url = this._stylesheetURLs.get(styleSheetId);
|
|
191
|
+
const text = this._stylesheetSources.get(styleSheetId);
|
|
192
|
+
const ranges = convertToDisjointRanges(styleSheetIdToCoverage.get(styleSheetId) || []);
|
|
193
|
+
coverage.entries.push({
|
|
194
|
+
url,
|
|
195
|
+
ranges,
|
|
196
|
+
text
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return coverage;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function convertToDisjointRanges(nestedRanges) {
|
|
203
|
+
const points = [];
|
|
204
|
+
for (const range of nestedRanges) {
|
|
205
|
+
points.push({
|
|
206
|
+
offset: range.startOffset,
|
|
207
|
+
type: 0,
|
|
208
|
+
range
|
|
209
|
+
});
|
|
210
|
+
points.push({
|
|
211
|
+
offset: range.endOffset,
|
|
212
|
+
type: 1,
|
|
213
|
+
range
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// Sort points to form a valid parenthesis sequence.
|
|
217
|
+
points.sort((a, b) => {
|
|
218
|
+
// Sort with increasing offsets.
|
|
219
|
+
if (a.offset !== b.offset) return a.offset - b.offset;
|
|
220
|
+
// All "end" points should go before "start" points.
|
|
221
|
+
if (a.type !== b.type) return b.type - a.type;
|
|
222
|
+
const aLength = a.range.endOffset - a.range.startOffset;
|
|
223
|
+
const bLength = b.range.endOffset - b.range.startOffset;
|
|
224
|
+
// For two "start" points, the one with longer range goes first.
|
|
225
|
+
if (a.type === 0) return bLength - aLength;
|
|
226
|
+
// For two "end" points, the one with shorter range goes first.
|
|
227
|
+
return aLength - bLength;
|
|
228
|
+
});
|
|
229
|
+
const hitCountStack = [];
|
|
230
|
+
const results = [];
|
|
231
|
+
let lastOffset = 0;
|
|
232
|
+
// Run scanning line to intersect all ranges.
|
|
233
|
+
for (const point of points) {
|
|
234
|
+
if (hitCountStack.length && lastOffset < point.offset && hitCountStack[hitCountStack.length - 1] > 0) {
|
|
235
|
+
const lastResult = results.length ? results[results.length - 1] : null;
|
|
236
|
+
if (lastResult && lastResult.end === lastOffset) lastResult.end = point.offset;else results.push({
|
|
237
|
+
start: lastOffset,
|
|
238
|
+
end: point.offset
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
lastOffset = point.offset;
|
|
242
|
+
if (point.type === 0) hitCountStack.push(point.range.count);else hitCountStack.pop();
|
|
243
|
+
}
|
|
244
|
+
// Filter out empty ranges.
|
|
245
|
+
return results.filter(range => range.end - range.start > 1);
|
|
246
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CRDevTools = void 0;
|
|
7
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
/**
|
|
10
|
+
* Copyright (c) Microsoft Corporation.
|
|
11
|
+
*
|
|
12
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
+
* you may not use this file except in compliance with the License.
|
|
14
|
+
* You may obtain a copy of the License at
|
|
15
|
+
*
|
|
16
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
+
*
|
|
18
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
+
* See the License for the specific language governing permissions and
|
|
22
|
+
* limitations under the License.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const kBindingName = '__pw_devtools__';
|
|
26
|
+
|
|
27
|
+
// This class intercepts preferences-related DevTools embedder methods
|
|
28
|
+
// and stores preferences as a json file in the browser installation directory.
|
|
29
|
+
class CRDevTools {
|
|
30
|
+
constructor(preferencesPath) {
|
|
31
|
+
this._preferencesPath = void 0;
|
|
32
|
+
this._prefs = void 0;
|
|
33
|
+
this._savePromise = void 0;
|
|
34
|
+
this.__testHookOnBinding = void 0;
|
|
35
|
+
this._preferencesPath = preferencesPath;
|
|
36
|
+
this._savePromise = Promise.resolve();
|
|
37
|
+
}
|
|
38
|
+
install(session) {
|
|
39
|
+
session.on('Runtime.bindingCalled', async event => {
|
|
40
|
+
if (event.name !== kBindingName) return;
|
|
41
|
+
const parsed = JSON.parse(event.payload);
|
|
42
|
+
let result = undefined;
|
|
43
|
+
if (this.__testHookOnBinding) this.__testHookOnBinding(parsed);
|
|
44
|
+
if (parsed.method === 'getPreferences') {
|
|
45
|
+
if (this._prefs === undefined) {
|
|
46
|
+
try {
|
|
47
|
+
const json = await _fs.default.promises.readFile(this._preferencesPath, 'utf8');
|
|
48
|
+
this._prefs = JSON.parse(json);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
this._prefs = {};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
result = this._prefs;
|
|
54
|
+
} else if (parsed.method === 'setPreference') {
|
|
55
|
+
this._prefs[parsed.params[0]] = parsed.params[1];
|
|
56
|
+
this._save();
|
|
57
|
+
} else if (parsed.method === 'removePreference') {
|
|
58
|
+
delete this._prefs[parsed.params[0]];
|
|
59
|
+
this._save();
|
|
60
|
+
} else if (parsed.method === 'clearPreferences') {
|
|
61
|
+
this._prefs = {};
|
|
62
|
+
this._save();
|
|
63
|
+
}
|
|
64
|
+
session.send('Runtime.evaluate', {
|
|
65
|
+
expression: `window.DevToolsAPI.embedderMessageAck(${parsed.id}, ${JSON.stringify(result)})`,
|
|
66
|
+
contextId: event.executionContextId
|
|
67
|
+
}).catch(e => null);
|
|
68
|
+
});
|
|
69
|
+
Promise.all([session.send('Runtime.enable'), session.send('Runtime.addBinding', {
|
|
70
|
+
name: kBindingName
|
|
71
|
+
}), session.send('Page.enable'), session.send('Page.addScriptToEvaluateOnNewDocument', {
|
|
72
|
+
source: `
|
|
73
|
+
(() => {
|
|
74
|
+
const init = () => {
|
|
75
|
+
// Lazy init happens when InspectorFrontendHost is initialized.
|
|
76
|
+
// At this point DevToolsHost is ready to be used.
|
|
77
|
+
const host = window.DevToolsHost;
|
|
78
|
+
const old = host.sendMessageToEmbedder.bind(host);
|
|
79
|
+
host.sendMessageToEmbedder = message => {
|
|
80
|
+
if (['getPreferences', 'setPreference', 'removePreference', 'clearPreferences'].includes(JSON.parse(message).method))
|
|
81
|
+
window.${kBindingName}(message);
|
|
82
|
+
else
|
|
83
|
+
old(message);
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
let value;
|
|
87
|
+
Object.defineProperty(window, 'InspectorFrontendHost', {
|
|
88
|
+
configurable: true,
|
|
89
|
+
enumerable: true,
|
|
90
|
+
get() { return value; },
|
|
91
|
+
set(v) { value = v; init(); },
|
|
92
|
+
});
|
|
93
|
+
})()
|
|
94
|
+
`
|
|
95
|
+
}), session.send('Runtime.runIfWaitingForDebugger')]).catch(e => null);
|
|
96
|
+
}
|
|
97
|
+
_save() {
|
|
98
|
+
// Serialize saves to avoid corruption.
|
|
99
|
+
this._savePromise = this._savePromise.then(async () => {
|
|
100
|
+
await _fs.default.promises.writeFile(this._preferencesPath, JSON.stringify(this._prefs)).catch(e => null);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.CRDevTools = CRDevTools;
|