@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,229 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.openTraceInBrowser = openTraceInBrowser;
7
+ exports.openTraceViewerApp = openTraceViewerApp;
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _fs = _interopRequireDefault(require("fs"));
10
+ var _httpServer = require("../../../utils/httpServer");
11
+ var _utils = require("../../../utils");
12
+ var _launchApp = require("../../launchApp");
13
+ var _instrumentation = require("../../instrumentation");
14
+ var _playwright = require("../../playwright");
15
+ var _progress = require("../../progress");
16
+ var _utilsBundle = require("../../../utilsBundle");
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ /**
19
+ * Copyright (c) Microsoft Corporation.
20
+ *
21
+ * Licensed under the Apache License, Version 2.0 (the "License");
22
+ * you may not use this file except in compliance with the License.
23
+ * You may obtain a copy of the License at
24
+ *
25
+ * http://www.apache.org/licenses/LICENSE-2.0
26
+ *
27
+ * Unless required by applicable law or agreed to in writing, software
28
+ * distributed under the License is distributed on an "AS IS" BASIS,
29
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30
+ * See the License for the specific language governing permissions and
31
+ * limitations under the License.
32
+ */
33
+
34
+ async function startTraceViewerServer(traceUrls, options) {
35
+ for (const traceUrl of traceUrls) {
36
+ let traceFile = traceUrl;
37
+ // If .json is requested, we'll synthesize it.
38
+ if (traceUrl.endsWith('.json')) traceFile = traceUrl.substring(0, traceUrl.length - '.json'.length);
39
+ if (!traceUrl.startsWith('http://') && !traceUrl.startsWith('https://') && !_fs.default.existsSync(traceFile) && !_fs.default.existsSync(traceFile + '.trace')) {
40
+ // eslint-disable-next-line no-console
41
+ console.error(`Trace file ${traceUrl} does not exist!`);
42
+ (0, _utils.gracefullyProcessExitDoNotHang)(1);
43
+ }
44
+ }
45
+ const server = new _httpServer.HttpServer();
46
+ server.routePrefix('/trace', (request, response) => {
47
+ const url = new URL('http://localhost' + request.url);
48
+ const relativePath = url.pathname.slice('/trace'.length);
49
+ if (relativePath.endsWith('/stall.js')) return true;
50
+ if (relativePath.startsWith('/file')) {
51
+ try {
52
+ const filePath = url.searchParams.get('path');
53
+ if (_fs.default.existsSync(filePath)) return server.serveFile(request, response, url.searchParams.get('path'));
54
+
55
+ // If .json is requested, we'll synthesize it for zip-less operation.
56
+ if (filePath.endsWith('.json')) {
57
+ const traceName = filePath.substring(0, filePath.length - '.json'.length);
58
+ response.statusCode = 200;
59
+ response.setHeader('Content-Type', 'application/json');
60
+ response.end(JSON.stringify(traceDescriptor(traceName)));
61
+ return true;
62
+ }
63
+ } catch (e) {}
64
+ response.statusCode = 404;
65
+ response.end();
66
+ return true;
67
+ }
68
+ const absolutePath = _path.default.join(__dirname, '..', '..', '..', 'vite', 'traceViewer', ...relativePath.split('/'));
69
+ return server.serveFile(request, response, absolutePath);
70
+ });
71
+ const params = traceUrls.map(t => `trace=${encodeURIComponent(t)}`);
72
+ const transport = (options === null || options === void 0 ? void 0 : options.transport) || (options !== null && options !== void 0 && options.isServer ? new StdinServer() : undefined);
73
+ if (transport) {
74
+ const guid = (0, _utils.createGuid)();
75
+ params.push('ws=' + guid);
76
+ const wss = new _utilsBundle.wsServer({
77
+ server: server.server(),
78
+ path: '/' + guid
79
+ });
80
+ wss.on('connection', ws => {
81
+ transport.sendEvent = (method, params) => ws.send(JSON.stringify({
82
+ method,
83
+ params
84
+ }));
85
+ transport.close = () => ws.close();
86
+ ws.on('message', async message => {
87
+ const {
88
+ id,
89
+ method,
90
+ params
91
+ } = JSON.parse(message);
92
+ const result = await transport.dispatch(method, params);
93
+ ws.send(JSON.stringify({
94
+ id,
95
+ result
96
+ }));
97
+ });
98
+ ws.on('close', () => transport.onclose());
99
+ ws.on('error', () => transport.onclose());
100
+ });
101
+ }
102
+ if (options !== null && options !== void 0 && options.isServer) params.push('isServer');
103
+ if ((0, _utils.isUnderTest)()) params.push('isUnderTest=true');
104
+ const {
105
+ host,
106
+ port
107
+ } = options || {};
108
+ const url = await server.start({
109
+ preferredPort: port,
110
+ host
111
+ });
112
+ const {
113
+ app
114
+ } = options || {};
115
+ const searchQuery = params.length ? '?' + params.join('&') : '';
116
+ const urlPath = `/trace/${app || 'index.html'}${searchQuery}`;
117
+ server.routePath('/', (request, response) => {
118
+ response.statusCode = 302;
119
+ response.setHeader('Location', urlPath + request.url.substring(1));
120
+ response.end();
121
+ return true;
122
+ });
123
+ return {
124
+ server,
125
+ url
126
+ };
127
+ }
128
+ async function openTraceViewerApp(traceUrls, browserName, options) {
129
+ const {
130
+ url
131
+ } = await startTraceViewerServer(traceUrls, options);
132
+ const traceViewerPlaywright = (0, _playwright.createPlaywright)({
133
+ sdkLanguage: 'javascript',
134
+ isInternalPlaywright: true
135
+ });
136
+ const traceViewerBrowser = (0, _utils.isUnderTest)() ? 'chromium' : browserName;
137
+ const {
138
+ context,
139
+ page
140
+ } = await (0, _launchApp.launchApp)(traceViewerPlaywright[traceViewerBrowser], {
141
+ // TODO: store language in the trace.
142
+ sdkLanguage: traceViewerPlaywright.options.sdkLanguage,
143
+ windowSize: {
144
+ width: 1280,
145
+ height: 800
146
+ },
147
+ persistentContextOptions: {
148
+ ...(options === null || options === void 0 ? void 0 : options.persistentContextOptions),
149
+ useWebSocket: (0, _utils.isUnderTest)(),
150
+ headless: options === null || options === void 0 ? void 0 : options.headless
151
+ }
152
+ });
153
+ const controller = new _progress.ProgressController((0, _instrumentation.serverSideCallMetadata)(), context._browser);
154
+ await controller.run(async progress => {
155
+ await context._browser._defaultContext._loadDefaultContextAsIs(progress);
156
+ });
157
+ if (process.env.PWTEST_PRINT_WS_ENDPOINT) process.stderr.write('DevTools listening on: ' + context._browser.options.wsEndpoint + '\n');
158
+ if (!(0, _utils.isUnderTest)()) await (0, _launchApp.syncLocalStorageWithSettings)(page, 'traceviewer');
159
+ if ((0, _utils.isUnderTest)()) page.on('close', () => context.close({
160
+ reason: 'Trace viewer closed'
161
+ }).catch(() => {}));
162
+ await page.mainFrame().goto((0, _instrumentation.serverSideCallMetadata)(), url);
163
+ return page;
164
+ }
165
+ async function openTraceInBrowser(traceUrls, options) {
166
+ const {
167
+ url
168
+ } = await startTraceViewerServer(traceUrls, options);
169
+ // eslint-disable-next-line no-console
170
+ console.log('\nListening on ' + url);
171
+ if (!(0, _utils.isUnderTest)()) await (0, _utilsBundle.open)(url.replace('0.0.0.0', 'localhost')).catch(() => {});
172
+ }
173
+ class StdinServer {
174
+ constructor() {
175
+ this._pollTimer = void 0;
176
+ this._traceUrl = void 0;
177
+ this.sendEvent = void 0;
178
+ this.close = void 0;
179
+ process.stdin.on('data', data => {
180
+ const url = data.toString().trim();
181
+ if (url === this._traceUrl) return;
182
+ if (url.endsWith('.json')) this._pollLoadTrace(url);else this._loadTrace(url);
183
+ });
184
+ process.stdin.on('close', () => (0, _utils.gracefullyProcessExitDoNotHang)(0));
185
+ }
186
+ async dispatch(method, params) {
187
+ if (method === 'ready') {
188
+ if (this._traceUrl) this._loadTrace(this._traceUrl);
189
+ }
190
+ }
191
+ onclose() {
192
+ (0, _utils.gracefullyProcessExitDoNotHang)(0);
193
+ }
194
+ _loadTrace(url) {
195
+ var _this$sendEvent;
196
+ this._traceUrl = url;
197
+ clearTimeout(this._pollTimer);
198
+ (_this$sendEvent = this.sendEvent) === null || _this$sendEvent === void 0 || _this$sendEvent.call(this, 'loadTrace', {
199
+ url
200
+ });
201
+ }
202
+ _pollLoadTrace(url) {
203
+ this._loadTrace(url);
204
+ this._pollTimer = setTimeout(() => {
205
+ this._pollLoadTrace(url);
206
+ }, 500);
207
+ }
208
+ }
209
+ function traceDescriptor(traceName) {
210
+ const result = {
211
+ entries: []
212
+ };
213
+ const traceDir = _path.default.dirname(traceName);
214
+ const traceFile = _path.default.basename(traceName);
215
+ for (const name of _fs.default.readdirSync(traceDir)) {
216
+ if (name.startsWith(traceFile)) result.entries.push({
217
+ name,
218
+ path: _path.default.join(traceDir, name)
219
+ });
220
+ }
221
+ const resourcesDir = _path.default.join(traceDir, 'resources');
222
+ if (_fs.default.existsSync(resourcesDir)) {
223
+ for (const name of _fs.default.readdirSync(resourcesDir)) result.entries.push({
224
+ name: 'resources/' + name,
225
+ path: _path.default.join(resourcesDir, name)
226
+ });
227
+ }
228
+ return result;
229
+ }
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.perMessageDeflate = exports.WebSocketTransport = void 0;
7
+ var _utilsBundle = require("../utilsBundle");
8
+ var _utils = require("../utils");
9
+ var _happyEyeballs = require("../utils/happy-eyeballs");
10
+ /**
11
+ * Copyright 2018 Google Inc. All rights reserved.
12
+ * Modifications copyright (c) Microsoft Corporation.
13
+ *
14
+ * Licensed under the Apache License, Version 2.0 (the "License");
15
+ * you may not use this file except in compliance with the License.
16
+ * You may obtain a copy of the License at
17
+ *
18
+ * http://www.apache.org/licenses/LICENSE-2.0
19
+ *
20
+ * Unless required by applicable law or agreed to in writing, software
21
+ * distributed under the License is distributed on an "AS IS" BASIS,
22
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
+ * See the License for the specific language governing permissions and
24
+ * limitations under the License.
25
+ */
26
+
27
+ const perMessageDeflate = exports.perMessageDeflate = {
28
+ zlibDeflateOptions: {
29
+ level: 3
30
+ },
31
+ zlibInflateOptions: {
32
+ chunkSize: 10 * 1024
33
+ },
34
+ threshold: 10 * 1024
35
+ };
36
+ class WebSocketTransport {
37
+ static async connect(progress, url, headers, followRedirects, debugLogHeader) {
38
+ return await WebSocketTransport._connect(progress, url, headers || {}, {
39
+ follow: !!followRedirects,
40
+ hadRedirects: false
41
+ }, debugLogHeader);
42
+ }
43
+ static async _connect(progress, url, headers, redirect, debugLogHeader) {
44
+ const logUrl = stripQueryParams(url);
45
+ progress === null || progress === void 0 || progress.log(`<ws connecting> ${logUrl}`);
46
+ const transport = new WebSocketTransport(progress, url, logUrl, headers, redirect.follow && redirect.hadRedirects, debugLogHeader);
47
+ let success = false;
48
+ progress === null || progress === void 0 || progress.cleanupWhenAborted(async () => {
49
+ if (!success) await transport.closeAndWait().catch(e => null);
50
+ });
51
+ const result = await new Promise((fulfill, reject) => {
52
+ transport._ws.on('open', async () => {
53
+ progress === null || progress === void 0 || progress.log(`<ws connected> ${logUrl}`);
54
+ fulfill({
55
+ transport
56
+ });
57
+ });
58
+ transport._ws.on('error', event => {
59
+ progress === null || progress === void 0 || progress.log(`<ws connect error> ${logUrl} ${event.message}`);
60
+ reject(new Error('WebSocket error: ' + event.message));
61
+ transport._ws.close();
62
+ });
63
+ transport._ws.on('unexpected-response', (request, response) => {
64
+ if (redirect.follow && !redirect.hadRedirects && (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 307 || response.statusCode === 308)) {
65
+ fulfill({
66
+ redirect: response
67
+ });
68
+ transport._ws.close();
69
+ return;
70
+ }
71
+ for (let i = 0; i < response.rawHeaders.length; i += 2) {
72
+ if (debugLogHeader && response.rawHeaders[i] === debugLogHeader) progress === null || progress === void 0 || progress.log(response.rawHeaders[i + 1]);
73
+ }
74
+ const chunks = [];
75
+ const errorPrefix = `${logUrl} ${response.statusCode} ${response.statusMessage}`;
76
+ response.on('data', chunk => chunks.push(chunk));
77
+ response.on('close', () => {
78
+ const error = chunks.length ? `${errorPrefix}\n${Buffer.concat(chunks)}` : errorPrefix;
79
+ progress === null || progress === void 0 || progress.log(`<ws unexpected response> ${error}`);
80
+ reject(new Error('WebSocket error: ' + error));
81
+ transport._ws.close();
82
+ });
83
+ });
84
+ });
85
+ if (result.redirect) {
86
+ // Strip authorization headers from the redirected request.
87
+ const newHeaders = Object.fromEntries(Object.entries(headers || {}).filter(([name]) => {
88
+ return !name.includes('access-key') && name.toLowerCase() !== 'authorization';
89
+ }));
90
+ return WebSocketTransport._connect(progress, result.redirect.headers.location, newHeaders, {
91
+ follow: true,
92
+ hadRedirects: true
93
+ }, debugLogHeader);
94
+ }
95
+ success = true;
96
+ return transport;
97
+ }
98
+ constructor(progress, url, logUrl, headers, followRedirects, debugLogHeader) {
99
+ var _progress$timeUntilDe;
100
+ this._ws = void 0;
101
+ this._progress = void 0;
102
+ this._logUrl = void 0;
103
+ this.onmessage = void 0;
104
+ this.onclose = void 0;
105
+ this.wsEndpoint = void 0;
106
+ this.headers = [];
107
+ this.wsEndpoint = url;
108
+ this._logUrl = logUrl;
109
+ this._ws = new _utilsBundle.ws(url, [], {
110
+ maxPayload: 256 * 1024 * 1024,
111
+ // 256Mb,
112
+ // Prevent internal http client error when passing negative timeout.
113
+ handshakeTimeout: Math.max((_progress$timeUntilDe = progress === null || progress === void 0 ? void 0 : progress.timeUntilDeadline()) !== null && _progress$timeUntilDe !== void 0 ? _progress$timeUntilDe : 30_000, 1),
114
+ headers,
115
+ followRedirects,
116
+ agent: /^(https|wss):\/\//.test(url) ? _happyEyeballs.httpsHappyEyeballsAgent : _happyEyeballs.httpHappyEyeballsAgent,
117
+ perMessageDeflate
118
+ });
119
+ this._ws.on('upgrade', response => {
120
+ for (let i = 0; i < response.rawHeaders.length; i += 2) {
121
+ this.headers.push({
122
+ name: response.rawHeaders[i],
123
+ value: response.rawHeaders[i + 1]
124
+ });
125
+ if (debugLogHeader && response.rawHeaders[i] === debugLogHeader) progress === null || progress === void 0 || progress.log(response.rawHeaders[i + 1]);
126
+ }
127
+ });
128
+ this._progress = progress;
129
+ // The 'ws' module in node sometimes sends us multiple messages in a single task.
130
+ // In Web, all IO callbacks (e.g. WebSocket callbacks)
131
+ // are dispatched into separate tasks, so there's no need
132
+ // to do anything extra.
133
+ const messageWrap = (0, _utils.makeWaitForNextTask)();
134
+ this._ws.addEventListener('message', event => {
135
+ messageWrap(() => {
136
+ const eventData = event.data;
137
+ let parsedJson;
138
+ try {
139
+ parsedJson = JSON.parse(eventData);
140
+ } catch (e) {
141
+ var _this$_progress;
142
+ (_this$_progress = this._progress) === null || _this$_progress === void 0 || _this$_progress.log(`<closing ws> Closing websocket due to malformed JSON. eventData=${eventData} e=${e === null || e === void 0 ? void 0 : e.message}`);
143
+ this._ws.close();
144
+ return;
145
+ }
146
+ try {
147
+ if (this.onmessage) this.onmessage.call(null, parsedJson);
148
+ } catch (e) {
149
+ var _this$_progress2;
150
+ (_this$_progress2 = this._progress) === null || _this$_progress2 === void 0 || _this$_progress2.log(`<closing ws> Closing websocket due to failed onmessage callback. eventData=${eventData} e=${e === null || e === void 0 ? void 0 : e.message}`);
151
+ this._ws.close();
152
+ }
153
+ });
154
+ });
155
+ this._ws.addEventListener('close', event => {
156
+ var _this$_progress3;
157
+ (_this$_progress3 = this._progress) === null || _this$_progress3 === void 0 || _this$_progress3.log(`<ws disconnected> ${logUrl} code=${event.code} reason=${event.reason}`);
158
+ if (this.onclose) this.onclose.call(null);
159
+ });
160
+ // Prevent Error: read ECONNRESET.
161
+ this._ws.addEventListener('error', error => {
162
+ var _this$_progress4;
163
+ return (_this$_progress4 = this._progress) === null || _this$_progress4 === void 0 ? void 0 : _this$_progress4.log(`<ws error> ${logUrl} ${error.type} ${error.message}`);
164
+ });
165
+ }
166
+ send(message) {
167
+ this._ws.send(JSON.stringify(message));
168
+ }
169
+ close() {
170
+ var _this$_progress5;
171
+ (_this$_progress5 = this._progress) === null || _this$_progress5 === void 0 || _this$_progress5.log(`<ws disconnecting> ${this._logUrl}`);
172
+ this._ws.close();
173
+ }
174
+ async closeAndWait() {
175
+ if (this._ws.readyState === _utilsBundle.ws.CLOSED) return;
176
+ const promise = new Promise(f => this._ws.once('close', f));
177
+ this.close();
178
+ await promise; // Make sure to await the actual disconnect.
179
+ }
180
+ }
181
+ exports.WebSocketTransport = WebSocketTransport;
182
+ function stripQueryParams(url) {
183
+ try {
184
+ const u = new URL(url);
185
+ u.search = '';
186
+ u.hash = '';
187
+ return u.toString();
188
+ } catch {
189
+ return url;
190
+ }
191
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.kLifecycleEvents = void 0;
7
+ /**
8
+ * Copyright 2018 Google Inc. All rights reserved.
9
+ * Modifications copyright (c) Microsoft Corporation.
10
+ *
11
+ * Licensed under the Apache License, Version 2.0 (the "License");
12
+ * you may not use this file except in compliance with the License.
13
+ * You may obtain a copy of the License at
14
+ *
15
+ * http://www.apache.org/licenses/LICENSE-2.0
16
+ *
17
+ * Unless required by applicable law or agreed to in writing, software
18
+ * distributed under the License is distributed on an "AS IS" BASIS,
19
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ * See the License for the specific language governing permissions and
21
+ * limitations under the License.
22
+ */
23
+
24
+ const kLifecycleEvents = exports.kLifecycleEvents = new Set(['load', 'domcontentloaded', 'networkidle', 'commit']);