patchright-core 1.48.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/README.md +3 -0
  2. package/ThirdPartyNotices.txt +1548 -0
  3. package/bin/PrintDeps.exe +0 -0
  4. package/bin/README.md +2 -0
  5. package/bin/install_media_pack.ps1 +5 -0
  6. package/bin/reinstall_chrome_beta_linux.sh +40 -0
  7. package/bin/reinstall_chrome_beta_mac.sh +13 -0
  8. package/bin/reinstall_chrome_beta_win.ps1 +24 -0
  9. package/bin/reinstall_chrome_stable_linux.sh +40 -0
  10. package/bin/reinstall_chrome_stable_mac.sh +12 -0
  11. package/bin/reinstall_chrome_stable_win.ps1 +24 -0
  12. package/bin/reinstall_msedge_beta_linux.sh +40 -0
  13. package/bin/reinstall_msedge_beta_mac.sh +11 -0
  14. package/bin/reinstall_msedge_beta_win.ps1 +23 -0
  15. package/bin/reinstall_msedge_dev_linux.sh +40 -0
  16. package/bin/reinstall_msedge_dev_mac.sh +11 -0
  17. package/bin/reinstall_msedge_dev_win.ps1 +23 -0
  18. package/bin/reinstall_msedge_stable_linux.sh +40 -0
  19. package/bin/reinstall_msedge_stable_mac.sh +11 -0
  20. package/bin/reinstall_msedge_stable_win.ps1 +24 -0
  21. package/browsers.json +57 -0
  22. package/cli.js +18 -0
  23. package/index.d.ts +17 -0
  24. package/index.js +33 -0
  25. package/index.mjs +28 -0
  26. package/lib/androidServerImpl.js +69 -0
  27. package/lib/browserServerImpl.js +92 -0
  28. package/lib/cli/driver.js +95 -0
  29. package/lib/cli/program.js +589 -0
  30. package/lib/cli/programWithTestStub.js +67 -0
  31. package/lib/client/accessibility.js +50 -0
  32. package/lib/client/android.js +473 -0
  33. package/lib/client/api.js +285 -0
  34. package/lib/client/artifact.js +79 -0
  35. package/lib/client/browser.js +145 -0
  36. package/lib/client/browserContext.js +583 -0
  37. package/lib/client/browserType.js +241 -0
  38. package/lib/client/cdpSession.js +53 -0
  39. package/lib/client/channelOwner.js +235 -0
  40. package/lib/client/clientHelper.js +57 -0
  41. package/lib/client/clientInstrumentation.js +50 -0
  42. package/lib/client/clock.js +69 -0
  43. package/lib/client/connection.js +333 -0
  44. package/lib/client/consoleMessage.js +55 -0
  45. package/lib/client/coverage.js +41 -0
  46. package/lib/client/dialog.js +57 -0
  47. package/lib/client/download.js +62 -0
  48. package/lib/client/electron.js +135 -0
  49. package/lib/client/elementHandle.js +321 -0
  50. package/lib/client/errors.js +77 -0
  51. package/lib/client/eventEmitter.js +314 -0
  52. package/lib/client/events.js +94 -0
  53. package/lib/client/fetch.js +391 -0
  54. package/lib/client/fileChooser.js +45 -0
  55. package/lib/client/frame.js +504 -0
  56. package/lib/client/harRouter.js +99 -0
  57. package/lib/client/input.js +111 -0
  58. package/lib/client/jsHandle.js +121 -0
  59. package/lib/client/jsonPipe.js +35 -0
  60. package/lib/client/localUtils.js +36 -0
  61. package/lib/client/locator.js +441 -0
  62. package/lib/client/network.js +762 -0
  63. package/lib/client/page.js +770 -0
  64. package/lib/client/playwright.js +80 -0
  65. package/lib/client/selectors.js +67 -0
  66. package/lib/client/stream.js +54 -0
  67. package/lib/client/tracing.js +134 -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/clockSource.js +7 -0
  78. package/lib/generated/consoleApiSource.js +7 -0
  79. package/lib/generated/injectedScriptSource.js +7 -0
  80. package/lib/generated/pollingRecorderSource.js +7 -0
  81. package/lib/generated/utilityScriptSource.js +7 -0
  82. package/lib/generated/webSocketMockSource.js +7 -0
  83. package/lib/image_tools/colorUtils.js +98 -0
  84. package/lib/image_tools/compare.js +108 -0
  85. package/lib/image_tools/imageChannel.js +70 -0
  86. package/lib/image_tools/stats.js +102 -0
  87. package/lib/inProcessFactory.js +54 -0
  88. package/lib/inprocess.js +20 -0
  89. package/lib/outofprocess.js +67 -0
  90. package/lib/protocol/debug.js +27 -0
  91. package/lib/protocol/serializers.js +173 -0
  92. package/lib/protocol/transport.js +82 -0
  93. package/lib/protocol/validator.js +2760 -0
  94. package/lib/protocol/validatorPrimitives.js +139 -0
  95. package/lib/remote/playwrightConnection.js +274 -0
  96. package/lib/remote/playwrightServer.js +110 -0
  97. package/lib/server/accessibility.js +62 -0
  98. package/lib/server/android/android.js +441 -0
  99. package/lib/server/android/backendAdb.js +172 -0
  100. package/lib/server/artifact.js +104 -0
  101. package/lib/server/bidi/bidiBrowser.js +311 -0
  102. package/lib/server/bidi/bidiChromium.js +124 -0
  103. package/lib/server/bidi/bidiConnection.js +206 -0
  104. package/lib/server/bidi/bidiExecutionContext.js +159 -0
  105. package/lib/server/bidi/bidiFirefox.js +104 -0
  106. package/lib/server/bidi/bidiInput.js +158 -0
  107. package/lib/server/bidi/bidiNetworkManager.js +338 -0
  108. package/lib/server/bidi/bidiOverCdp.js +103 -0
  109. package/lib/server/bidi/bidiPage.js +529 -0
  110. package/lib/server/bidi/bidiPdf.js +140 -0
  111. package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
  112. package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
  113. package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
  114. package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
  115. package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
  116. package/lib/server/browser.js +148 -0
  117. package/lib/server/browserContext.js +666 -0
  118. package/lib/server/browserType.js +335 -0
  119. package/lib/server/chromium/appIcon.png +0 -0
  120. package/lib/server/chromium/chromium.js +350 -0
  121. package/lib/server/chromium/chromiumSwitches.js +36 -0
  122. package/lib/server/chromium/crAccessibility.js +237 -0
  123. package/lib/server/chromium/crBrowser.js +522 -0
  124. package/lib/server/chromium/crConnection.js +228 -0
  125. package/lib/server/chromium/crCoverage.js +246 -0
  126. package/lib/server/chromium/crDevTools.js +104 -0
  127. package/lib/server/chromium/crDragDrop.js +143 -0
  128. package/lib/server/chromium/crExecutionContext.js +149 -0
  129. package/lib/server/chromium/crInput.js +171 -0
  130. package/lib/server/chromium/crNetworkManager.js +809 -0
  131. package/lib/server/chromium/crPage.js +1235 -0
  132. package/lib/server/chromium/crPdf.js +153 -0
  133. package/lib/server/chromium/crProtocolHelper.js +133 -0
  134. package/lib/server/chromium/crServiceWorker.js +111 -0
  135. package/lib/server/chromium/defaultFontFamilies.js +145 -0
  136. package/lib/server/chromium/videoRecorder.js +155 -0
  137. package/lib/server/clock.js +133 -0
  138. package/lib/server/codegen/csharp.js +299 -0
  139. package/lib/server/codegen/java.js +235 -0
  140. package/lib/server/codegen/javascript.js +223 -0
  141. package/lib/server/codegen/jsonl.js +47 -0
  142. package/lib/server/codegen/language.js +88 -0
  143. package/lib/server/codegen/languages.js +30 -0
  144. package/lib/server/codegen/python.js +265 -0
  145. package/lib/server/codegen/types.js +5 -0
  146. package/lib/server/console.js +57 -0
  147. package/lib/server/cookieStore.js +185 -0
  148. package/lib/server/debugController.js +234 -0
  149. package/lib/server/debugger.js +132 -0
  150. package/lib/server/deviceDescriptors.js +26 -0
  151. package/lib/server/deviceDescriptorsSource.json +1669 -0
  152. package/lib/server/dialog.js +71 -0
  153. package/lib/server/dispatchers/androidDispatcher.js +193 -0
  154. package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  155. package/lib/server/dispatchers/browserContextDispatcher.js +368 -0
  156. package/lib/server/dispatchers/browserDispatcher.js +170 -0
  157. package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
  158. package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
  159. package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
  160. package/lib/server/dispatchers/dialogDispatcher.js +44 -0
  161. package/lib/server/dispatchers/dispatcher.js +395 -0
  162. package/lib/server/dispatchers/electronDispatcher.js +93 -0
  163. package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
  164. package/lib/server/dispatchers/frameDispatcher.js +286 -0
  165. package/lib/server/dispatchers/jsHandleDispatcher.js +97 -0
  166. package/lib/server/dispatchers/jsonPipeDispatcher.js +59 -0
  167. package/lib/server/dispatchers/localUtilsDispatcher.js +413 -0
  168. package/lib/server/dispatchers/networkDispatchers.js +221 -0
  169. package/lib/server/dispatchers/pageDispatcher.js +367 -0
  170. package/lib/server/dispatchers/playwrightDispatcher.js +107 -0
  171. package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
  172. package/lib/server/dispatchers/streamDispatcher.js +62 -0
  173. package/lib/server/dispatchers/tracingDispatcher.js +54 -0
  174. package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
  175. package/lib/server/dispatchers/writableStreamDispatcher.js +58 -0
  176. package/lib/server/dom.js +845 -0
  177. package/lib/server/download.js +60 -0
  178. package/lib/server/electron/electron.js +296 -0
  179. package/lib/server/electron/loader.js +57 -0
  180. package/lib/server/errors.js +68 -0
  181. package/lib/server/fetch.js +656 -0
  182. package/lib/server/fileChooser.js +42 -0
  183. package/lib/server/fileUploadUtils.js +75 -0
  184. package/lib/server/firefox/ffAccessibility.js +216 -0
  185. package/lib/server/firefox/ffBrowser.js +460 -0
  186. package/lib/server/firefox/ffConnection.js +168 -0
  187. package/lib/server/firefox/ffExecutionContext.js +135 -0
  188. package/lib/server/firefox/ffInput.js +150 -0
  189. package/lib/server/firefox/ffNetworkManager.js +233 -0
  190. package/lib/server/firefox/ffPage.js +559 -0
  191. package/lib/server/firefox/firefox.js +99 -0
  192. package/lib/server/formData.js +75 -0
  193. package/lib/server/frameSelectors.js +171 -0
  194. package/lib/server/frames.js +1808 -0
  195. package/lib/server/har/harRecorder.js +139 -0
  196. package/lib/server/har/harTracer.js +542 -0
  197. package/lib/server/helper.js +103 -0
  198. package/lib/server/index.js +114 -0
  199. package/lib/server/input.js +310 -0
  200. package/lib/server/instrumentation.js +70 -0
  201. package/lib/server/isomorphic/utilityScriptSerializers.js +226 -0
  202. package/lib/server/javascript.js +299 -0
  203. package/lib/server/launchApp.js +91 -0
  204. package/lib/server/macEditingCommands.js +139 -0
  205. package/lib/server/network.js +617 -0
  206. package/lib/server/page.js +819 -0
  207. package/lib/server/pipeTransport.js +85 -0
  208. package/lib/server/playwright.js +88 -0
  209. package/lib/server/progress.js +102 -0
  210. package/lib/server/protocolError.js +49 -0
  211. package/lib/server/recorder/contextRecorder.js +299 -0
  212. package/lib/server/recorder/recorderApp.js +196 -0
  213. package/lib/server/recorder/recorderCollection.js +116 -0
  214. package/lib/server/recorder/recorderFrontend.js +5 -0
  215. package/lib/server/recorder/recorderInTraceViewer.js +144 -0
  216. package/lib/server/recorder/recorderRunner.js +155 -0
  217. package/lib/server/recorder/recorderUtils.js +112 -0
  218. package/lib/server/recorder/throttledFile.js +46 -0
  219. package/lib/server/recorder.js +329 -0
  220. package/lib/server/registry/browserFetcher.js +168 -0
  221. package/lib/server/registry/dependencies.js +322 -0
  222. package/lib/server/registry/index.js +1005 -0
  223. package/lib/server/registry/nativeDeps.js +490 -0
  224. package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
  225. package/lib/server/screenshotter.js +348 -0
  226. package/lib/server/selectors.js +73 -0
  227. package/lib/server/socksClientCertificatesInterceptor.js +340 -0
  228. package/lib/server/socksInterceptor.js +100 -0
  229. package/lib/server/trace/recorder/snapshotter.js +172 -0
  230. package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
  231. package/lib/server/trace/recorder/tracing.js +542 -0
  232. package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
  233. package/lib/server/trace/viewer/traceViewer.js +213 -0
  234. package/lib/server/transport.js +191 -0
  235. package/lib/server/types.js +24 -0
  236. package/lib/server/usKeyboardLayout.js +555 -0
  237. package/lib/server/webkit/webkit.js +87 -0
  238. package/lib/server/webkit/wkAccessibility.js +194 -0
  239. package/lib/server/webkit/wkBrowser.js +329 -0
  240. package/lib/server/webkit/wkConnection.js +173 -0
  241. package/lib/server/webkit/wkExecutionContext.js +143 -0
  242. package/lib/server/webkit/wkInput.js +169 -0
  243. package/lib/server/webkit/wkInterceptableRequest.js +162 -0
  244. package/lib/server/webkit/wkPage.js +1219 -0
  245. package/lib/server/webkit/wkProvisionalPage.js +94 -0
  246. package/lib/server/webkit/wkWorkers.js +104 -0
  247. package/lib/third_party/diff_match_patch.js +2222 -0
  248. package/lib/third_party/pixelmatch.js +255 -0
  249. package/lib/utils/ascii.js +31 -0
  250. package/lib/utils/comparators.js +171 -0
  251. package/lib/utils/crypto.js +174 -0
  252. package/lib/utils/debug.js +46 -0
  253. package/lib/utils/debugLogger.js +91 -0
  254. package/lib/utils/env.js +49 -0
  255. package/lib/utils/eventsHelper.js +38 -0
  256. package/lib/utils/expectUtils.js +33 -0
  257. package/lib/utils/fileUtils.js +205 -0
  258. package/lib/utils/happy-eyeballs.js +194 -0
  259. package/lib/utils/headers.js +52 -0
  260. package/lib/utils/hostPlatform.js +133 -0
  261. package/lib/utils/httpServer.js +237 -0
  262. package/lib/utils/index.js +368 -0
  263. package/lib/utils/isomorphic/cssParser.js +250 -0
  264. package/lib/utils/isomorphic/cssTokenizer.js +979 -0
  265. package/lib/utils/isomorphic/locatorGenerators.js +642 -0
  266. package/lib/utils/isomorphic/locatorParser.js +179 -0
  267. package/lib/utils/isomorphic/locatorUtils.js +62 -0
  268. package/lib/utils/isomorphic/mimeType.js +29 -0
  269. package/lib/utils/isomorphic/recorderUtils.js +195 -0
  270. package/lib/utils/isomorphic/selectorParser.js +397 -0
  271. package/lib/utils/isomorphic/stringUtils.js +139 -0
  272. package/lib/utils/isomorphic/traceUtils.js +39 -0
  273. package/lib/utils/isomorphic/urlMatch.js +120 -0
  274. package/lib/utils/linuxUtils.js +78 -0
  275. package/lib/utils/manualPromise.js +109 -0
  276. package/lib/utils/multimap.js +75 -0
  277. package/lib/utils/network.js +160 -0
  278. package/lib/utils/processLauncher.js +248 -0
  279. package/lib/utils/profiler.js +53 -0
  280. package/lib/utils/rtti.js +44 -0
  281. package/lib/utils/semaphore.js +51 -0
  282. package/lib/utils/spawnAsync.js +45 -0
  283. package/lib/utils/stackTrace.js +121 -0
  284. package/lib/utils/task.js +58 -0
  285. package/lib/utils/time.js +37 -0
  286. package/lib/utils/timeoutRunner.js +66 -0
  287. package/lib/utils/traceUtils.js +44 -0
  288. package/lib/utils/userAgent.js +105 -0
  289. package/lib/utils/wsServer.js +127 -0
  290. package/lib/utils/zipFile.js +75 -0
  291. package/lib/utils/zones.js +62 -0
  292. package/lib/utilsBundle.js +82 -0
  293. package/lib/utilsBundleImpl/index.js +53 -0
  294. package/lib/utilsBundleImpl/xdg-open +1066 -0
  295. package/lib/vite/htmlReport/index.html +66 -0
  296. package/lib/vite/recorder/assets/codeMirrorModule-baozm8ur.js +24 -0
  297. package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +1 -0
  298. package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  299. package/lib/vite/recorder/assets/index-2ElAIWFB.js +42 -0
  300. package/lib/vite/recorder/assets/index-BW-aOBcL.css +1 -0
  301. package/lib/vite/recorder/index.html +29 -0
  302. package/lib/vite/recorder/playwright-logo.svg +9 -0
  303. package/lib/vite/traceViewer/assets/codeMirrorModule-Bh1rfd2w.js +24 -0
  304. package/lib/vite/traceViewer/assets/inspectorTab-7GHnKvSD.js +64 -0
  305. package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
  306. package/lib/vite/traceViewer/assets/workbench-DPQnTHYP.js +9 -0
  307. package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +9 -0
  308. package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +1 -0
  309. package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  310. package/lib/vite/traceViewer/embedded.BlHoW5LY.js +2 -0
  311. package/lib/vite/traceViewer/embedded.html +18 -0
  312. package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
  313. package/lib/vite/traceViewer/index.CrbWWHbf.css +1 -0
  314. package/lib/vite/traceViewer/index.DaWVfou1.js +2 -0
  315. package/lib/vite/traceViewer/index.html +29 -0
  316. package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
  317. package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  318. package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  319. package/lib/vite/traceViewer/recorder.C4zxcvd2.js +2 -0
  320. package/lib/vite/traceViewer/recorder.html +17 -0
  321. package/lib/vite/traceViewer/snapshot.html +21 -0
  322. package/lib/vite/traceViewer/sw.bundle.js +3 -0
  323. package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
  324. package/lib/vite/traceViewer/uiMode.html +20 -0
  325. package/lib/vite/traceViewer/uiMode.mTXWniJb.js +5 -0
  326. package/lib/vite/traceViewer/workbench.D3JVcA9K.css +1 -0
  327. package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +32 -0
  328. package/lib/zipBundle.js +25 -0
  329. package/lib/zipBundleImpl.js +5 -0
  330. package/package.json +44 -0
  331. package/types/protocol.d.ts +21571 -0
  332. package/types/structs.d.ts +45 -0
  333. package/types/types.d.ts +22519 -0
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RecorderApp = exports.EmptyRecorderApp = void 0;
7
+ var _fs = _interopRequireDefault(require("fs"));
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _progress = require("../progress");
10
+ var _events = require("events");
11
+ var _instrumentation = require("../instrumentation");
12
+ var _utils = require("../../utils");
13
+ var _utilsBundle = require("../../utilsBundle");
14
+ var _launchApp = require("../launchApp");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ /**
17
+ * Copyright (c) Microsoft Corporation.
18
+ *
19
+ * Licensed under the Apache License, Version 2.0 (the "License");
20
+ * you may not use this file except in compliance with the License.
21
+ * You may obtain a copy of the License at
22
+ *
23
+ * http://www.apache.org/licenses/LICENSE-2.0
24
+ *
25
+ * Unless required by applicable law or agreed to in writing, software
26
+ * distributed under the License is distributed on an "AS IS" BASIS,
27
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28
+ * See the License for the specific language governing permissions and
29
+ * limitations under the License.
30
+ */
31
+
32
+ class EmptyRecorderApp extends _events.EventEmitter {
33
+ constructor(...args) {
34
+ super(...args);
35
+ this.wsEndpointForTest = void 0;
36
+ }
37
+ async close() {}
38
+ async setPaused(paused) {}
39
+ async setMode(mode) {}
40
+ async setRunningFile(file) {}
41
+ async setSelector(selector, userGesture) {}
42
+ async updateCallLogs(callLogs) {}
43
+ async setSources(sources) {}
44
+ async setActions(actions, sources) {}
45
+ }
46
+ exports.EmptyRecorderApp = EmptyRecorderApp;
47
+ class RecorderApp extends _events.EventEmitter {
48
+ constructor(recorder, page, wsEndpoint) {
49
+ super();
50
+ this._page = void 0;
51
+ this.wsEndpointForTest = void 0;
52
+ this._recorder = void 0;
53
+ this.setMaxListeners(0);
54
+ this._recorder = recorder;
55
+ this._page = page;
56
+ this.wsEndpointForTest = wsEndpoint;
57
+ }
58
+ async close() {
59
+ await this._page.context().close({
60
+ reason: 'Recorder window closed'
61
+ });
62
+ }
63
+ async _init() {
64
+ await (0, _launchApp.syncLocalStorageWithSettings)(this._page, 'recorder');
65
+ await this._page._setServerRequestInterceptor(route => {
66
+ if (!route.request().url().startsWith('https://playwright/')) return false;
67
+ const uri = route.request().url().substring('https://playwright/'.length);
68
+ const file = require.resolve('../../vite/recorder/' + uri);
69
+ _fs.default.promises.readFile(file).then(buffer => {
70
+ route.fulfill({
71
+ status: 200,
72
+ headers: [{
73
+ name: 'Content-Type',
74
+ value: _utilsBundle.mime.getType(_path.default.extname(file)) || 'application/octet-stream'
75
+ }],
76
+ body: buffer.toString('base64'),
77
+ isBase64: true
78
+ }).catch(() => {});
79
+ });
80
+ return true;
81
+ });
82
+ await this._page.exposeBinding('dispatch', false, (_, data) => this.emit('event', data));
83
+ this._page.once('close', () => {
84
+ this.emit('close');
85
+ this._page.context().close({
86
+ reason: 'Recorder window closed'
87
+ }).catch(() => {});
88
+ });
89
+ const mainFrame = this._page.mainFrame();
90
+ await mainFrame.goto((0, _instrumentation.serverSideCallMetadata)(), 'https://playwright/index.html');
91
+ }
92
+ static factory(context) {
93
+ return async recorder => {
94
+ if (process.env.PW_CODEGEN_NO_INSPECTOR) return new EmptyRecorderApp();
95
+ return await RecorderApp._open(recorder, context);
96
+ };
97
+ }
98
+ static async _open(recorder, inspectedContext) {
99
+ const sdkLanguage = inspectedContext.attribution.playwright.options.sdkLanguage;
100
+ const headed = !!inspectedContext._browser.options.headful;
101
+ const recorderPlaywright = require('../playwright').createPlaywright({
102
+ sdkLanguage: 'javascript',
103
+ isInternalPlaywright: true
104
+ });
105
+ const {
106
+ context,
107
+ page
108
+ } = await (0, _launchApp.launchApp)(recorderPlaywright.chromium, {
109
+ sdkLanguage,
110
+ windowSize: {
111
+ width: 600,
112
+ height: 600
113
+ },
114
+ windowPosition: {
115
+ x: 1020,
116
+ y: 10
117
+ },
118
+ persistentContextOptions: {
119
+ noDefaultViewport: true,
120
+ headless: !!process.env.PWTEST_CLI_HEADLESS || (0, _utils.isUnderTest)() && !headed,
121
+ useWebSocket: (0, _utils.isUnderTest)(),
122
+ handleSIGINT: recorder.handleSIGINT,
123
+ executablePath: inspectedContext._browser.options.isChromium ? inspectedContext._browser.options.customExecutablePath : undefined
124
+ }
125
+ });
126
+ const controller = new _progress.ProgressController((0, _instrumentation.serverSideCallMetadata)(), context._browser);
127
+ await controller.run(async progress => {
128
+ await context._browser._defaultContext._loadDefaultContextAsIs(progress);
129
+ });
130
+ const result = new RecorderApp(recorder, page, context._browser.options.wsEndpoint);
131
+ await result._init();
132
+ return result;
133
+ }
134
+ async setMode(mode) {
135
+ await this._page.mainFrame().evaluateExpression((mode => {
136
+ window.playwrightSetMode(mode);
137
+ }).toString(), {
138
+ isFunction: true
139
+ }, mode).catch(() => {});
140
+ }
141
+ async setRunningFile(file) {
142
+ await this._page.mainFrame().evaluateExpression((file => {
143
+ window.playwrightSetRunningFile(file);
144
+ }).toString(), {
145
+ isFunction: true
146
+ }, file).catch(() => {});
147
+ }
148
+ async setPaused(paused) {
149
+ await this._page.mainFrame().evaluateExpression((paused => {
150
+ window.playwrightSetPaused(paused);
151
+ }).toString(), {
152
+ isFunction: true
153
+ }, paused).catch(() => {});
154
+ }
155
+ async setSources(sources) {
156
+ await this._page.mainFrame().evaluateExpression((sources => {
157
+ window.playwrightSetSources(sources);
158
+ }).toString(), {
159
+ isFunction: true
160
+ }, sources).catch(() => {});
161
+
162
+ // Testing harness for runCLI mode.
163
+ if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) {
164
+ if (process._didSetSourcesForTest(sources[0].text)) this.close();
165
+ }
166
+ }
167
+ async setActions(actions, sources) {}
168
+ async setSelector(selector, userGesture) {
169
+ if (userGesture) {
170
+ var _this$_recorder;
171
+ if (((_this$_recorder = this._recorder) === null || _this$_recorder === void 0 ? void 0 : _this$_recorder.mode()) === 'inspecting') {
172
+ this._recorder.setMode('standby');
173
+ this._page.bringToFront();
174
+ } else {
175
+ var _this$_recorder2;
176
+ (_this$_recorder2 = this._recorder) === null || _this$_recorder2 === void 0 || _this$_recorder2.setMode('recording');
177
+ }
178
+ }
179
+ await this._page.mainFrame().evaluateExpression((data => {
180
+ window.playwrightSetSelector(data.selector, data.userGesture);
181
+ }).toString(), {
182
+ isFunction: true
183
+ }, {
184
+ selector,
185
+ userGesture
186
+ }).catch(() => {});
187
+ }
188
+ async updateCallLogs(callLogs) {
189
+ await this._page.mainFrame().evaluateExpression((callLogs => {
190
+ window.playwrightUpdateLogs(callLogs);
191
+ }).toString(), {
192
+ isFunction: true
193
+ }, callLogs).catch(() => {});
194
+ }
195
+ }
196
+ exports.RecorderApp = RecorderApp;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RecorderCollection = void 0;
7
+ var _events = require("events");
8
+ var _time = require("../../utils/time");
9
+ var _recorderUtils = require("./recorderUtils");
10
+ var _errors = require("../errors");
11
+ var _recorderRunner = require("./recorderRunner");
12
+ var _debug = require("../../utils/debug");
13
+ /**
14
+ * 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
+ class RecorderCollection extends _events.EventEmitter {
30
+ constructor(pageAliases) {
31
+ super();
32
+ this._actions = [];
33
+ this._enabled = false;
34
+ this._pageAliases = void 0;
35
+ this._pageAliases = pageAliases;
36
+ }
37
+ restart() {
38
+ this._actions = [];
39
+ this._fireChange();
40
+ }
41
+ setEnabled(enabled) {
42
+ this._enabled = enabled;
43
+ }
44
+ async performAction(actionInContext) {
45
+ await this._addAction(actionInContext, async callMetadata => {
46
+ await (0, _recorderRunner.performAction)(callMetadata, this._pageAliases, actionInContext);
47
+ });
48
+ }
49
+ addRecordedAction(actionInContext) {
50
+ if (['openPage', 'closePage'].includes(actionInContext.action.name)) {
51
+ this._actions.push(actionInContext);
52
+ this._fireChange();
53
+ return;
54
+ }
55
+ this._addAction(actionInContext).catch(() => {});
56
+ }
57
+ async _addAction(actionInContext, callback) {
58
+ if (!this._enabled) return;
59
+ if (actionInContext.action.name === 'openPage' || actionInContext.action.name === 'closePage') {
60
+ this._actions.push(actionInContext);
61
+ this._fireChange();
62
+ return;
63
+ }
64
+ const {
65
+ callMetadata,
66
+ mainFrame
67
+ } = (0, _recorderUtils.callMetadataForAction)(this._pageAliases, actionInContext);
68
+ await mainFrame.instrumentation.onBeforeCall(mainFrame, callMetadata);
69
+ this._actions.push(actionInContext);
70
+ this._fireChange();
71
+ const error = await (callback === null || callback === void 0 ? void 0 : callback(callMetadata).catch(e => e));
72
+ callMetadata.endTime = (0, _time.monotonicTime)();
73
+ actionInContext.endTime = callMetadata.endTime;
74
+ callMetadata.error = error ? (0, _errors.serializeError)(error) : undefined;
75
+ // Do not wait for onAfterCall so that performAction returned immediately after the action.
76
+ mainFrame.instrumentation.onAfterCall(mainFrame, callMetadata).then(() => {
77
+ this._fireChange();
78
+ }).catch(() => {});
79
+ }
80
+ signal(pageAlias, frame, signal) {
81
+ if (!this._enabled) return;
82
+ if (signal.name === 'navigation' && frame._page.mainFrame() === frame) {
83
+ const timestamp = (0, _time.monotonicTime)();
84
+ const lastAction = this._actions[this._actions.length - 1];
85
+ const signalThreshold = (0, _debug.isUnderTest)() ? 500 : 5000;
86
+ let generateGoto = false;
87
+ if (!lastAction) generateGoto = true;else if (lastAction.action.name !== 'click' && lastAction.action.name !== 'press') generateGoto = true;else if (timestamp - lastAction.startTime > signalThreshold) generateGoto = true;
88
+ if (generateGoto) {
89
+ this.addRecordedAction({
90
+ frame: {
91
+ pageAlias,
92
+ framePath: []
93
+ },
94
+ action: {
95
+ name: 'navigate',
96
+ url: frame.url(),
97
+ signals: []
98
+ },
99
+ startTime: timestamp,
100
+ endTime: timestamp
101
+ });
102
+ }
103
+ return;
104
+ }
105
+ if (this._actions.length) {
106
+ this._actions[this._actions.length - 1].action.signals.push(signal);
107
+ this._fireChange();
108
+ return;
109
+ }
110
+ }
111
+ _fireChange() {
112
+ if (!this._enabled) return;
113
+ this.emit('change', (0, _recorderUtils.collapseActions)(this._actions));
114
+ }
115
+ }
116
+ exports.RecorderCollection = RecorderCollection;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RecorderInTraceViewer = void 0;
7
+ var _path = _interopRequireDefault(require("path"));
8
+ var _events = require("events");
9
+ var _traceViewer = require("../trace/viewer/traceViewer");
10
+ var _manualPromise = require("../../utils/manualPromise");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ /**
13
+ * Copyright (c) Microsoft Corporation.
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the "License");
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an "AS IS" BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ */
27
+
28
+ class RecorderInTraceViewer extends _events.EventEmitter {
29
+ static factory(context) {
30
+ return async recorder => {
31
+ const transport = new RecorderTransport();
32
+ const trace = _path.default.join(context._browser.options.tracesDir, 'trace');
33
+ const {
34
+ wsEndpointForTest,
35
+ tracePage,
36
+ traceServer
37
+ } = await openApp(trace, {
38
+ transport,
39
+ headless: !context._browser.options.headful
40
+ });
41
+ return new RecorderInTraceViewer(transport, tracePage, traceServer, wsEndpointForTest);
42
+ };
43
+ }
44
+ constructor(transport, tracePage, traceServer, wsEndpointForTest) {
45
+ super();
46
+ this.wsEndpointForTest = void 0;
47
+ this._transport = void 0;
48
+ this._tracePage = void 0;
49
+ this._traceServer = void 0;
50
+ this._transport = transport;
51
+ this._transport.eventSink.resolve(this);
52
+ this._tracePage = tracePage;
53
+ this._traceServer = traceServer;
54
+ this.wsEndpointForTest = wsEndpointForTest;
55
+ this._tracePage.once('close', () => {
56
+ this.close();
57
+ });
58
+ }
59
+ async close() {
60
+ await this._tracePage.context().close({
61
+ reason: 'Recorder window closed'
62
+ });
63
+ await this._traceServer.stop();
64
+ }
65
+ async setPaused(paused) {
66
+ this._transport.deliverEvent('setPaused', {
67
+ paused
68
+ });
69
+ }
70
+ async setMode(mode) {
71
+ this._transport.deliverEvent('setMode', {
72
+ mode
73
+ });
74
+ }
75
+ async setRunningFile(file) {
76
+ this._transport.deliverEvent('setRunningFile', {
77
+ file
78
+ });
79
+ }
80
+ async setSelector(selector, userGesture) {
81
+ this._transport.deliverEvent('setSelector', {
82
+ selector,
83
+ userGesture
84
+ });
85
+ }
86
+ async updateCallLogs(callLogs) {
87
+ this._transport.deliverEvent('updateCallLogs', {
88
+ callLogs
89
+ });
90
+ }
91
+ async setSources(sources) {
92
+ this._transport.deliverEvent('setSources', {
93
+ sources
94
+ });
95
+ if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) {
96
+ if (process._didSetSourcesForTest(sources[0].text)) this.close();
97
+ }
98
+ }
99
+ async setActions(actions, sources) {
100
+ this._transport.deliverEvent('setActions', {
101
+ actions,
102
+ sources
103
+ });
104
+ }
105
+ }
106
+ exports.RecorderInTraceViewer = RecorderInTraceViewer;
107
+ async function openApp(trace, options) {
108
+ const traceServer = await (0, _traceViewer.startTraceViewerServer)(options);
109
+ await (0, _traceViewer.installRootRedirect)(traceServer, [trace], {
110
+ ...options,
111
+ webApp: 'recorder.html'
112
+ });
113
+ const page = await (0, _traceViewer.openTraceViewerApp)(traceServer.urlPrefix('precise'), 'chromium', options);
114
+ return {
115
+ wsEndpointForTest: page.context()._browser.options.wsEndpoint,
116
+ tracePage: page,
117
+ traceServer
118
+ };
119
+ }
120
+ class RecorderTransport {
121
+ constructor() {
122
+ this._connected = new _manualPromise.ManualPromise();
123
+ this.eventSink = new _manualPromise.ManualPromise();
124
+ this.sendEvent = void 0;
125
+ this.close = void 0;
126
+ }
127
+ onconnect() {
128
+ this._connected.resolve();
129
+ }
130
+ async dispatch(method, params) {
131
+ const eventSink = await this.eventSink;
132
+ eventSink.emit('event', {
133
+ event: method,
134
+ params
135
+ });
136
+ }
137
+ onclose() {}
138
+ deliverEvent(method, params) {
139
+ this._connected.then(() => {
140
+ var _this$sendEvent;
141
+ return (_this$sendEvent = this.sendEvent) === null || _this$sendEvent === void 0 ? void 0 : _this$sendEvent.call(this, method, params);
142
+ });
143
+ }
144
+ }
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.performAction = performAction;
7
+ exports.toClickOptions = toClickOptions;
8
+ var _utils = require("../../utils");
9
+ var _language = require("../codegen/language");
10
+ var _recorderUtils = require("./recorderUtils");
11
+ var _recorderUtils2 = require("../../utils/isomorphic/recorderUtils");
12
+ /**
13
+ * Copyright (c) Microsoft Corporation.
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the "License");
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an "AS IS" BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ */
27
+
28
+ async function performAction(callMetadata, pageAliases, actionInContext) {
29
+ const mainFrame = (0, _recorderUtils.mainFrameForAction)(pageAliases, actionInContext);
30
+ const {
31
+ action
32
+ } = actionInContext;
33
+ const kActionTimeout = 5000;
34
+ if (action.name === 'navigate') {
35
+ await mainFrame.goto(callMetadata, action.url, {
36
+ timeout: kActionTimeout
37
+ });
38
+ return;
39
+ }
40
+ if (action.name === 'openPage') throw Error('Not reached');
41
+ if (action.name === 'closePage') {
42
+ await mainFrame._page.close(callMetadata);
43
+ return;
44
+ }
45
+ const selector = (0, _recorderUtils2.buildFullSelector)(actionInContext.frame.framePath, action.selector);
46
+ if (action.name === 'click') {
47
+ const options = toClickOptions(action);
48
+ await mainFrame.click(callMetadata, selector, {
49
+ ...options,
50
+ timeout: kActionTimeout,
51
+ strict: true
52
+ });
53
+ return;
54
+ }
55
+ if (action.name === 'press') {
56
+ const modifiers = (0, _language.toKeyboardModifiers)(action.modifiers);
57
+ const shortcut = [...modifiers, action.key].join('+');
58
+ await mainFrame.press(callMetadata, selector, shortcut, {
59
+ timeout: kActionTimeout,
60
+ strict: true
61
+ });
62
+ return;
63
+ }
64
+ if (action.name === 'fill') {
65
+ await mainFrame.fill(callMetadata, selector, action.text, {
66
+ timeout: kActionTimeout,
67
+ strict: true
68
+ });
69
+ return;
70
+ }
71
+ if (action.name === 'setInputFiles') {
72
+ await mainFrame.setInputFiles(callMetadata, selector, {
73
+ selector,
74
+ payloads: [],
75
+ timeout: kActionTimeout,
76
+ strict: true
77
+ });
78
+ return;
79
+ }
80
+ if (action.name === 'check') {
81
+ await mainFrame.check(callMetadata, selector, {
82
+ timeout: kActionTimeout,
83
+ strict: true
84
+ });
85
+ return;
86
+ }
87
+ if (action.name === 'uncheck') {
88
+ await mainFrame.uncheck(callMetadata, selector, {
89
+ timeout: kActionTimeout,
90
+ strict: true
91
+ });
92
+ return;
93
+ }
94
+ if (action.name === 'select') {
95
+ const values = action.options.map(value => ({
96
+ value
97
+ }));
98
+ await mainFrame.selectOption(callMetadata, selector, [], values, {
99
+ timeout: kActionTimeout,
100
+ strict: true
101
+ });
102
+ return;
103
+ }
104
+ if (action.name === 'assertChecked') {
105
+ await mainFrame.expect(callMetadata, selector, {
106
+ selector,
107
+ expression: 'to.be.checked',
108
+ isNot: !action.checked,
109
+ timeout: kActionTimeout
110
+ });
111
+ return;
112
+ }
113
+ if (action.name === 'assertText') {
114
+ await mainFrame.expect(callMetadata, selector, {
115
+ selector,
116
+ expression: 'to.have.text',
117
+ expectedText: (0, _utils.serializeExpectedTextValues)([action.text], {
118
+ matchSubstring: true,
119
+ normalizeWhiteSpace: true
120
+ }),
121
+ isNot: false,
122
+ timeout: kActionTimeout
123
+ });
124
+ return;
125
+ }
126
+ if (action.name === 'assertValue') {
127
+ await mainFrame.expect(callMetadata, selector, {
128
+ selector,
129
+ expression: 'to.have.value',
130
+ expectedValue: action.value,
131
+ isNot: false,
132
+ timeout: kActionTimeout
133
+ });
134
+ return;
135
+ }
136
+ if (action.name === 'assertVisible') {
137
+ await mainFrame.expect(callMetadata, selector, {
138
+ selector,
139
+ expression: 'to.be.visible',
140
+ isNot: false,
141
+ timeout: kActionTimeout
142
+ });
143
+ return;
144
+ }
145
+ throw new Error('Internal error: unexpected action ' + action.name);
146
+ }
147
+ function toClickOptions(action) {
148
+ const modifiers = (0, _language.toKeyboardModifiers)(action.modifiers);
149
+ const options = {};
150
+ if (action.button !== 'left') options.button = action.button;
151
+ if (modifiers.length) options.modifiers = modifiers;
152
+ if (action.clickCount > 1) options.clickCount = action.clickCount;
153
+ if (action.position) options.position = action.position;
154
+ return options;
155
+ }