rebrowser-playwright-core 1.47.2

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