@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.
Files changed (305) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +3 -0
  4. package/ThirdPartyNotices.txt +1513 -0
  5. package/bin/PrintDeps.exe +0 -0
  6. package/bin/README.md +2 -0
  7. package/bin/install_media_pack.ps1 +5 -0
  8. package/bin/reinstall_chrome_beta_linux.sh +40 -0
  9. package/bin/reinstall_chrome_beta_mac.sh +13 -0
  10. package/bin/reinstall_chrome_beta_win.ps1 +23 -0
  11. package/bin/reinstall_chrome_stable_linux.sh +40 -0
  12. package/bin/reinstall_chrome_stable_mac.sh +12 -0
  13. package/bin/reinstall_chrome_stable_win.ps1 +23 -0
  14. package/bin/reinstall_msedge_beta_linux.sh +40 -0
  15. package/bin/reinstall_msedge_beta_mac.sh +11 -0
  16. package/bin/reinstall_msedge_beta_win.ps1 +22 -0
  17. package/bin/reinstall_msedge_dev_linux.sh +40 -0
  18. package/bin/reinstall_msedge_dev_mac.sh +11 -0
  19. package/bin/reinstall_msedge_dev_win.ps1 +22 -0
  20. package/bin/reinstall_msedge_stable_linux.sh +40 -0
  21. package/bin/reinstall_msedge_stable_mac.sh +11 -0
  22. package/bin/reinstall_msedge_stable_win.ps1 +23 -0
  23. package/browsers.json +64 -0
  24. package/cli.js +17 -0
  25. package/index.d.ts +17 -0
  26. package/index.js +33 -0
  27. package/index.mjs +28 -0
  28. package/lib/androidServerImpl.js +69 -0
  29. package/lib/browserServerImpl.js +92 -0
  30. package/lib/cli/driver.js +97 -0
  31. package/lib/cli/program.js +582 -0
  32. package/lib/cli/programWithTestStub.js +67 -0
  33. package/lib/client/accessibility.js +50 -0
  34. package/lib/client/android.js +473 -0
  35. package/lib/client/api.js +272 -0
  36. package/lib/client/artifact.js +79 -0
  37. package/lib/client/browser.js +145 -0
  38. package/lib/client/browserContext.js +509 -0
  39. package/lib/client/browserType.js +233 -0
  40. package/lib/client/cdpSession.js +53 -0
  41. package/lib/client/channelOwner.js +229 -0
  42. package/lib/client/clientHelper.js +57 -0
  43. package/lib/client/clientInstrumentation.js +40 -0
  44. package/lib/client/connection.js +327 -0
  45. package/lib/client/consoleMessage.js +55 -0
  46. package/lib/client/coverage.js +41 -0
  47. package/lib/client/dialog.js +57 -0
  48. package/lib/client/download.js +62 -0
  49. package/lib/client/electron.js +130 -0
  50. package/lib/client/elementHandle.js +291 -0
  51. package/lib/client/errors.js +77 -0
  52. package/lib/client/events.js +93 -0
  53. package/lib/client/fetch.js +343 -0
  54. package/lib/client/fileChooser.js +45 -0
  55. package/lib/client/frame.js +506 -0
  56. package/lib/client/harRouter.js +93 -0
  57. package/lib/client/input.js +111 -0
  58. package/lib/client/jsHandle.js +123 -0
  59. package/lib/client/jsonPipe.js +35 -0
  60. package/lib/client/localUtils.js +35 -0
  61. package/lib/client/locator.js +432 -0
  62. package/lib/client/network.js +601 -0
  63. package/lib/client/page.js +707 -0
  64. package/lib/client/playwright.js +74 -0
  65. package/lib/client/selectors.js +67 -0
  66. package/lib/client/stream.js +54 -0
  67. package/lib/client/tracing.js +135 -0
  68. package/lib/client/types.js +24 -0
  69. package/lib/client/video.js +51 -0
  70. package/lib/client/waiter.js +158 -0
  71. package/lib/client/webError.js +37 -0
  72. package/lib/client/worker.js +71 -0
  73. package/lib/client/writableStream.js +54 -0
  74. package/lib/common/socksProxy.js +569 -0
  75. package/lib/common/timeoutSettings.js +73 -0
  76. package/lib/common/types.js +5 -0
  77. package/lib/generated/consoleApiSource.js +7 -0
  78. package/lib/generated/injectedScriptSource.js +7 -0
  79. package/lib/generated/recorderSource.js +7 -0
  80. package/lib/generated/utilityScriptSource.js +7 -0
  81. package/lib/image_tools/colorUtils.js +98 -0
  82. package/lib/image_tools/compare.js +108 -0
  83. package/lib/image_tools/imageChannel.js +70 -0
  84. package/lib/image_tools/stats.js +102 -0
  85. package/lib/inProcessFactory.js +54 -0
  86. package/lib/inprocess.js +20 -0
  87. package/lib/outofprocess.js +67 -0
  88. package/lib/protocol/debug.js +27 -0
  89. package/lib/protocol/serializers.js +172 -0
  90. package/lib/protocol/transport.js +82 -0
  91. package/lib/protocol/validator.js +2599 -0
  92. package/lib/protocol/validatorPrimitives.js +139 -0
  93. package/lib/remote/playwrightConnection.js +274 -0
  94. package/lib/remote/playwrightServer.js +110 -0
  95. package/lib/server/accessibility.js +62 -0
  96. package/lib/server/android/android.js +441 -0
  97. package/lib/server/android/backendAdb.js +172 -0
  98. package/lib/server/artifact.js +104 -0
  99. package/lib/server/browser.js +129 -0
  100. package/lib/server/browserContext.js +609 -0
  101. package/lib/server/browserType.js +300 -0
  102. package/lib/server/chromium/appIcon.png +0 -0
  103. package/lib/server/chromium/chromium.js +346 -0
  104. package/lib/server/chromium/chromiumSwitches.js +41 -0
  105. package/lib/server/chromium/crAccessibility.js +237 -0
  106. package/lib/server/chromium/crBrowser.js +521 -0
  107. package/lib/server/chromium/crConnection.js +228 -0
  108. package/lib/server/chromium/crCoverage.js +246 -0
  109. package/lib/server/chromium/crDevTools.js +104 -0
  110. package/lib/server/chromium/crDragDrop.js +144 -0
  111. package/lib/server/chromium/crExecutionContext.js +156 -0
  112. package/lib/server/chromium/crInput.js +171 -0
  113. package/lib/server/chromium/crNetworkManager.js +723 -0
  114. package/lib/server/chromium/crPage.js +1173 -0
  115. package/lib/server/chromium/crPdf.js +147 -0
  116. package/lib/server/chromium/crProtocolHelper.js +131 -0
  117. package/lib/server/chromium/crServiceWorker.js +115 -0
  118. package/lib/server/chromium/defaultFontFamilies.js +145 -0
  119. package/lib/server/chromium/videoRecorder.js +155 -0
  120. package/lib/server/console.js +59 -0
  121. package/lib/server/cookieStore.js +112 -0
  122. package/lib/server/debugController.js +236 -0
  123. package/lib/server/debugger.js +132 -0
  124. package/lib/server/deviceDescriptors.js +21 -0
  125. package/lib/server/deviceDescriptorsSource.json +1549 -0
  126. package/lib/server/dialog.js +70 -0
  127. package/lib/server/dispatchers/androidDispatcher.js +193 -0
  128. package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  129. package/lib/server/dispatchers/browserContextDispatcher.js +306 -0
  130. package/lib/server/dispatchers/browserDispatcher.js +170 -0
  131. package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
  132. package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
  133. package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
  134. package/lib/server/dispatchers/dialogDispatcher.js +44 -0
  135. package/lib/server/dispatchers/dispatcher.js +400 -0
  136. package/lib/server/dispatchers/electronDispatcher.js +80 -0
  137. package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
  138. package/lib/server/dispatchers/frameDispatcher.js +287 -0
  139. package/lib/server/dispatchers/jsHandleDispatcher.js +102 -0
  140. package/lib/server/dispatchers/jsonPipeDispatcher.js +61 -0
  141. package/lib/server/dispatchers/localUtilsDispatcher.js +399 -0
  142. package/lib/server/dispatchers/networkDispatchers.js +221 -0
  143. package/lib/server/dispatchers/pageDispatcher.js +363 -0
  144. package/lib/server/dispatchers/playwrightDispatcher.js +105 -0
  145. package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
  146. package/lib/server/dispatchers/streamDispatcher.js +62 -0
  147. package/lib/server/dispatchers/tracingDispatcher.js +54 -0
  148. package/lib/server/dispatchers/writableStreamDispatcher.js +55 -0
  149. package/lib/server/dom.js +808 -0
  150. package/lib/server/download.js +53 -0
  151. package/lib/server/electron/electron.js +254 -0
  152. package/lib/server/electron/loader.js +57 -0
  153. package/lib/server/errors.js +68 -0
  154. package/lib/server/fetch.js +611 -0
  155. package/lib/server/fileChooser.js +42 -0
  156. package/lib/server/fileUploadUtils.js +71 -0
  157. package/lib/server/firefox/ffAccessibility.js +215 -0
  158. package/lib/server/firefox/ffBrowser.js +447 -0
  159. package/lib/server/firefox/ffConnection.js +168 -0
  160. package/lib/server/firefox/ffExecutionContext.js +138 -0
  161. package/lib/server/firefox/ffInput.js +150 -0
  162. package/lib/server/firefox/ffNetworkManager.js +231 -0
  163. package/lib/server/firefox/ffPage.js +558 -0
  164. package/lib/server/firefox/firefox.js +91 -0
  165. package/lib/server/formData.js +75 -0
  166. package/lib/server/frameSelectors.js +171 -0
  167. package/lib/server/frames.js +1597 -0
  168. package/lib/server/har/harRecorder.js +139 -0
  169. package/lib/server/har/harTracer.js +539 -0
  170. package/lib/server/helper.js +103 -0
  171. package/lib/server/index.js +96 -0
  172. package/lib/server/input.js +301 -0
  173. package/lib/server/instrumentation.js +74 -0
  174. package/lib/server/isomorphic/utilityScriptSerializers.js +212 -0
  175. package/lib/server/javascript.js +305 -0
  176. package/lib/server/launchApp.js +90 -0
  177. package/lib/server/macEditingCommands.js +139 -0
  178. package/lib/server/network.js +607 -0
  179. package/lib/server/page.js +793 -0
  180. package/lib/server/pipeTransport.js +85 -0
  181. package/lib/server/playwright.js +82 -0
  182. package/lib/server/progress.js +102 -0
  183. package/lib/server/protocolError.js +49 -0
  184. package/lib/server/recorder/codeGenerator.js +153 -0
  185. package/lib/server/recorder/csharp.js +310 -0
  186. package/lib/server/recorder/java.js +216 -0
  187. package/lib/server/recorder/javascript.js +229 -0
  188. package/lib/server/recorder/jsonl.js +47 -0
  189. package/lib/server/recorder/language.js +44 -0
  190. package/lib/server/recorder/python.js +275 -0
  191. package/lib/server/recorder/recorderActions.js +5 -0
  192. package/lib/server/recorder/recorderApp.js +181 -0
  193. package/lib/server/recorder/recorderUtils.js +48 -0
  194. package/lib/server/recorder/utils.js +45 -0
  195. package/lib/server/recorder.js +700 -0
  196. package/lib/server/registry/browserFetcher.js +168 -0
  197. package/lib/server/registry/dependencies.js +322 -0
  198. package/lib/server/registry/index.js +925 -0
  199. package/lib/server/registry/nativeDeps.js +383 -0
  200. package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
  201. package/lib/server/screenshotter.js +354 -0
  202. package/lib/server/selectors.js +73 -0
  203. package/lib/server/socksInterceptor.js +100 -0
  204. package/lib/server/trace/recorder/snapshotter.js +168 -0
  205. package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
  206. package/lib/server/trace/recorder/tracing.js +552 -0
  207. package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
  208. package/lib/server/trace/viewer/traceViewer.js +229 -0
  209. package/lib/server/transport.js +191 -0
  210. package/lib/server/types.js +24 -0
  211. package/lib/server/usKeyboardLayout.js +555 -0
  212. package/lib/server/webkit/webkit.js +87 -0
  213. package/lib/server/webkit/wkAccessibility.js +194 -0
  214. package/lib/server/webkit/wkBrowser.js +328 -0
  215. package/lib/server/webkit/wkConnection.js +173 -0
  216. package/lib/server/webkit/wkExecutionContext.js +146 -0
  217. package/lib/server/webkit/wkInput.js +169 -0
  218. package/lib/server/webkit/wkInterceptableRequest.js +158 -0
  219. package/lib/server/webkit/wkPage.js +1198 -0
  220. package/lib/server/webkit/wkProvisionalPage.js +59 -0
  221. package/lib/server/webkit/wkWorkers.js +104 -0
  222. package/lib/third_party/diff_match_patch.js +2222 -0
  223. package/lib/third_party/pixelmatch.js +255 -0
  224. package/lib/utils/ascii.js +31 -0
  225. package/lib/utils/comparators.js +171 -0
  226. package/lib/utils/crypto.js +33 -0
  227. package/lib/utils/debug.js +46 -0
  228. package/lib/utils/debugLogger.js +89 -0
  229. package/lib/utils/env.js +47 -0
  230. package/lib/utils/eventsHelper.js +38 -0
  231. package/lib/utils/fileUtils.js +66 -0
  232. package/lib/utils/glob.js +83 -0
  233. package/lib/utils/happy-eyeballs.js +154 -0
  234. package/lib/utils/headers.js +52 -0
  235. package/lib/utils/hostPlatform.js +124 -0
  236. package/lib/utils/httpServer.js +195 -0
  237. package/lib/utils/index.js +324 -0
  238. package/lib/utils/isomorphic/cssParser.js +250 -0
  239. package/lib/utils/isomorphic/cssTokenizer.js +979 -0
  240. package/lib/utils/isomorphic/locatorGenerators.js +651 -0
  241. package/lib/utils/isomorphic/locatorParser.js +179 -0
  242. package/lib/utils/isomorphic/locatorUtils.js +62 -0
  243. package/lib/utils/isomorphic/selectorParser.js +397 -0
  244. package/lib/utils/isomorphic/stringUtils.js +107 -0
  245. package/lib/utils/isomorphic/traceUtils.js +39 -0
  246. package/lib/utils/linuxUtils.js +78 -0
  247. package/lib/utils/manualPromise.js +109 -0
  248. package/lib/utils/mimeType.js +29 -0
  249. package/lib/utils/multimap.js +75 -0
  250. package/lib/utils/network.js +189 -0
  251. package/lib/utils/processLauncher.js +248 -0
  252. package/lib/utils/profiler.js +53 -0
  253. package/lib/utils/rtti.js +41 -0
  254. package/lib/utils/semaphore.js +51 -0
  255. package/lib/utils/spawnAsync.js +45 -0
  256. package/lib/utils/stackTrace.js +123 -0
  257. package/lib/utils/task.js +58 -0
  258. package/lib/utils/time.js +37 -0
  259. package/lib/utils/timeoutRunner.js +131 -0
  260. package/lib/utils/traceUtils.js +44 -0
  261. package/lib/utils/userAgent.js +105 -0
  262. package/lib/utils/wsServer.js +125 -0
  263. package/lib/utils/zipFile.js +75 -0
  264. package/lib/utils/zones.js +99 -0
  265. package/lib/utilsBundle.js +81 -0
  266. package/lib/utilsBundleImpl/index.js +51 -0
  267. package/lib/utilsBundleImpl/xdg-open +1066 -0
  268. package/lib/vite/htmlReport/index.html +66 -0
  269. package/lib/vite/recorder/assets/codeMirrorModule-Hs9-1ZG4.css +1 -0
  270. package/lib/vite/recorder/assets/codeMirrorModule-I9ks4y7D.js +24 -0
  271. package/lib/vite/recorder/assets/codicon-zGuYmc9o.ttf +0 -0
  272. package/lib/vite/recorder/assets/index-ljsTwXtJ.css +1 -0
  273. package/lib/vite/recorder/assets/index-yg8ypzl6.js +47 -0
  274. package/lib/vite/recorder/index.html +29 -0
  275. package/lib/vite/recorder/playwright-logo.svg +9 -0
  276. package/lib/vite/traceViewer/assets/codeMirrorModule-GluP1cQ1.js +24 -0
  277. package/lib/vite/traceViewer/assets/codeMirrorModule-fqJB1XDu.js +24 -0
  278. package/lib/vite/traceViewer/assets/codeMirrorModule-y3M3aAqy.js +24 -0
  279. package/lib/vite/traceViewer/assets/wsPort-Rvwd4WC-.js +69 -0
  280. package/lib/vite/traceViewer/assets/wsPort-dlD7vDkY.js +69 -0
  281. package/lib/vite/traceViewer/assets/wsPort-qOE2NWrO.js +69 -0
  282. package/lib/vite/traceViewer/assets/xtermModule-Yt6xwiJ_.js +9 -0
  283. package/lib/vite/traceViewer/codeMirrorModule.Hs9-1ZG4.css +1 -0
  284. package/lib/vite/traceViewer/codicon.zGuYmc9o.ttf +0 -0
  285. package/lib/vite/traceViewer/index.-g_5lMbJ.css +1 -0
  286. package/lib/vite/traceViewer/index.4X7zDysg.js +2 -0
  287. package/lib/vite/traceViewer/index.HkJgzlGy.js +2 -0
  288. package/lib/vite/traceViewer/index.html +26 -0
  289. package/lib/vite/traceViewer/index.kRjx5sAJ.js +2 -0
  290. package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  291. package/lib/vite/traceViewer/snapshot.html +21 -0
  292. package/lib/vite/traceViewer/sw.bundle.js +4 -0
  293. package/lib/vite/traceViewer/uiMode.1Wcp_Kto.js +10 -0
  294. package/lib/vite/traceViewer/uiMode.GTNzARcV.js +10 -0
  295. package/lib/vite/traceViewer/uiMode.html +17 -0
  296. package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +1 -0
  297. package/lib/vite/traceViewer/uiMode.zV-7Lf9v.js +10 -0
  298. package/lib/vite/traceViewer/wsPort.kSgQKQ0y.css +1 -0
  299. package/lib/vite/traceViewer/xtermModule.0lwXJFHT.css +32 -0
  300. package/lib/zipBundle.js +25 -0
  301. package/lib/zipBundleImpl.js +5 -0
  302. package/package.json +43 -0
  303. package/types/protocol.d.ts +20304 -0
  304. package/types/structs.d.ts +45 -0
  305. 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;