isomorfeus-puppetmaster 0.5.3 → 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (802) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -17
  3. data/lib/isomorfeus/puppetmaster/console_message.rb +18 -18
  4. data/lib/isomorfeus/puppetmaster/cookie.rb +46 -46
  5. data/lib/isomorfeus/puppetmaster/driver/puppeteer.rb +413 -403
  6. data/lib/isomorfeus/puppetmaster/driver/puppeteer_document.rb +953 -953
  7. data/lib/isomorfeus/puppetmaster/driver/puppeteer_node.rb +851 -851
  8. data/lib/isomorfeus/puppetmaster/errors.rb +90 -90
  9. data/lib/isomorfeus/puppetmaster/iframe.rb +16 -16
  10. data/lib/isomorfeus/puppetmaster/node/content_editable.rb +17 -17
  11. data/lib/isomorfeus/puppetmaster/node/input.rb +20 -20
  12. data/lib/isomorfeus/puppetmaster/node/select.rb +35 -35
  13. data/lib/isomorfeus/puppetmaster/node.rb +279 -279
  14. data/lib/isomorfeus/puppetmaster/request.rb +16 -16
  15. data/lib/isomorfeus/puppetmaster/response.rb +25 -25
  16. data/lib/isomorfeus/puppetmaster/self_forwardable.rb +38 -38
  17. data/lib/isomorfeus/puppetmaster/server/checker.rb +1 -3
  18. data/lib/isomorfeus/puppetmaster/server.rb +1 -1
  19. data/lib/isomorfeus/puppetmaster/version.rb +3 -3
  20. data/lib/isomorfeus/puppetmaster.rb +85 -85
  21. data/lib/isomorfeus-puppetmaster.rb +1 -0
  22. data/node_modules/.bin/extract-zip +12 -12
  23. data/node_modules/.bin/extract-zip.ps1 +28 -28
  24. data/node_modules/.bin/rimraf +12 -12
  25. data/node_modules/.bin/rimraf.ps1 +28 -28
  26. data/node_modules/.package-lock.json +530 -574
  27. data/node_modules/@types/node/LICENSE +21 -21
  28. data/node_modules/@types/node/assert/strict.d.ts +8 -8
  29. data/node_modules/@types/node/assert.d.ts +912 -912
  30. data/node_modules/@types/node/async_hooks.d.ts +497 -497
  31. data/node_modules/@types/node/buffer.d.ts +2142 -2142
  32. data/node_modules/@types/node/child_process.d.ts +1355 -1355
  33. data/node_modules/@types/node/cluster.d.ts +414 -414
  34. data/node_modules/@types/node/console.d.ts +407 -407
  35. data/node_modules/@types/node/constants.d.ts +18 -18
  36. data/node_modules/@types/node/crypto.d.ts +3224 -3224
  37. data/node_modules/@types/node/dgram.d.ts +545 -545
  38. data/node_modules/@types/node/diagnostics_channel.d.ts +128 -128
  39. data/node_modules/@types/node/dns/promises.d.ts +357 -357
  40. data/node_modules/@types/node/dns.d.ts +643 -643
  41. data/node_modules/@types/node/domain.d.ts +169 -169
  42. data/node_modules/@types/node/events.d.ts +623 -623
  43. data/node_modules/@types/node/fs/promises.d.ts +997 -997
  44. data/node_modules/@types/node/fs.d.ts +3723 -3723
  45. data/node_modules/@types/node/globals.d.ts +285 -285
  46. data/node_modules/@types/node/globals.global.d.ts +1 -1
  47. data/node_modules/@types/node/http.d.ts +1358 -1358
  48. data/node_modules/@types/node/http2.d.ts +2100 -2100
  49. data/node_modules/@types/node/https.d.ts +391 -391
  50. data/node_modules/@types/node/index.d.ts +131 -131
  51. data/node_modules/@types/node/inspector.d.ts +2738 -2738
  52. data/node_modules/@types/node/module.d.ts +114 -114
  53. data/node_modules/@types/node/net.d.ts +783 -783
  54. data/node_modules/@types/node/os.d.ts +455 -455
  55. data/node_modules/@types/node/package.json +229 -229
  56. data/node_modules/@types/node/path.d.ts +172 -172
  57. data/node_modules/@types/node/perf_hooks.d.ts +555 -555
  58. data/node_modules/@types/node/process.d.ts +1477 -1477
  59. data/node_modules/@types/node/punycode.d.ts +117 -117
  60. data/node_modules/@types/node/querystring.d.ts +131 -131
  61. data/node_modules/@types/node/readline.d.ts +542 -542
  62. data/node_modules/@types/node/repl.d.ts +424 -424
  63. data/node_modules/@types/node/stream/consumers.d.ts +24 -24
  64. data/node_modules/@types/node/stream/promises.d.ts +42 -42
  65. data/node_modules/@types/node/stream/web.d.ts +6 -6
  66. data/node_modules/@types/node/stream.d.ts +1181 -1181
  67. data/node_modules/@types/node/string_decoder.d.ts +67 -67
  68. data/node_modules/@types/node/timers/promises.d.ts +68 -68
  69. data/node_modules/@types/node/timers.d.ts +94 -94
  70. data/node_modules/@types/node/tls.d.ts +1019 -1019
  71. data/node_modules/@types/node/trace_events.d.ts +161 -161
  72. data/node_modules/@types/node/tty.d.ts +206 -206
  73. data/node_modules/@types/node/url.d.ts +798 -798
  74. data/node_modules/@types/node/util.d.ts +1556 -1556
  75. data/node_modules/@types/node/v8.d.ts +378 -378
  76. data/node_modules/@types/node/vm.d.ts +504 -504
  77. data/node_modules/@types/node/wasi.d.ts +153 -153
  78. data/node_modules/@types/node/worker_threads.d.ts +649 -649
  79. data/node_modules/@types/node/zlib.d.ts +517 -517
  80. data/node_modules/@types/yauzl/LICENSE +21 -21
  81. data/node_modules/@types/yauzl/index.d.ts +98 -98
  82. data/node_modules/@types/yauzl/package.json +26 -26
  83. data/node_modules/agent-base/README.md +145 -145
  84. data/node_modules/agent-base/dist/src/index.d.ts +78 -78
  85. data/node_modules/agent-base/dist/src/index.js +202 -202
  86. data/node_modules/agent-base/dist/src/promisify.d.ts +4 -4
  87. data/node_modules/agent-base/dist/src/promisify.js +17 -17
  88. data/node_modules/agent-base/package.json +64 -64
  89. data/node_modules/agent-base/src/index.ts +345 -345
  90. data/node_modules/agent-base/src/promisify.ts +33 -33
  91. data/node_modules/balanced-match/.github/FUNDING.yml +2 -2
  92. data/node_modules/balanced-match/LICENSE.md +21 -21
  93. data/node_modules/balanced-match/README.md +97 -97
  94. data/node_modules/balanced-match/index.js +62 -62
  95. data/node_modules/balanced-match/package.json +48 -48
  96. data/node_modules/base64-js/LICENSE +21 -21
  97. data/node_modules/base64-js/README.md +34 -34
  98. data/node_modules/base64-js/index.d.ts +3 -3
  99. data/node_modules/base64-js/index.js +150 -150
  100. data/node_modules/base64-js/package.json +47 -47
  101. data/node_modules/bl/.travis.yml +17 -17
  102. data/node_modules/bl/BufferList.js +396 -396
  103. data/node_modules/bl/LICENSE.md +13 -13
  104. data/node_modules/bl/README.md +247 -247
  105. data/node_modules/bl/bl.js +84 -84
  106. data/node_modules/bl/package.json +37 -37
  107. data/node_modules/bl/test/convert.js +21 -21
  108. data/node_modules/bl/test/indexOf.js +492 -492
  109. data/node_modules/bl/test/isBufferList.js +32 -32
  110. data/node_modules/bl/test/test.js +869 -869
  111. data/node_modules/brace-expansion/LICENSE +21 -21
  112. data/node_modules/brace-expansion/README.md +129 -129
  113. data/node_modules/brace-expansion/index.js +201 -201
  114. data/node_modules/brace-expansion/package.json +47 -47
  115. data/node_modules/buffer/AUTHORS.md +70 -70
  116. data/node_modules/buffer/LICENSE +21 -21
  117. data/node_modules/buffer/README.md +410 -410
  118. data/node_modules/buffer/index.d.ts +186 -186
  119. data/node_modules/buffer/index.js +1817 -1817
  120. data/node_modules/buffer/package.json +96 -96
  121. data/node_modules/buffer-crc32/LICENSE +19 -19
  122. data/node_modules/buffer-crc32/README.md +47 -47
  123. data/node_modules/buffer-crc32/index.js +111 -111
  124. data/node_modules/buffer-crc32/package.json +39 -39
  125. data/node_modules/chownr/LICENSE +15 -15
  126. data/node_modules/chownr/README.md +3 -3
  127. data/node_modules/chownr/chownr.js +167 -167
  128. data/node_modules/chownr/package.json +29 -29
  129. data/node_modules/concat-map/.travis.yml +4 -4
  130. data/node_modules/concat-map/LICENSE +18 -18
  131. data/node_modules/concat-map/README.markdown +62 -62
  132. data/node_modules/concat-map/example/map.js +6 -6
  133. data/node_modules/concat-map/index.js +13 -13
  134. data/node_modules/concat-map/package.json +43 -43
  135. data/node_modules/concat-map/test/map.js +39 -39
  136. data/node_modules/debug/LICENSE +19 -19
  137. data/node_modules/debug/README.md +455 -455
  138. data/node_modules/debug/package.json +59 -59
  139. data/node_modules/debug/src/browser.js +269 -269
  140. data/node_modules/debug/src/common.js +274 -261
  141. data/node_modules/debug/src/index.js +10 -10
  142. data/node_modules/debug/src/node.js +263 -263
  143. data/node_modules/devtools-protocol/LICENSE +27 -27
  144. data/node_modules/devtools-protocol/README.md +12 -12
  145. data/node_modules/devtools-protocol/json/browser_protocol.json +20985 -20640
  146. data/node_modules/devtools-protocol/json/js_protocol.json +3531 -3580
  147. data/node_modules/devtools-protocol/package.json +17 -18
  148. data/node_modules/devtools-protocol/pdl/browser_protocol.pdl +9849 -9637
  149. data/node_modules/devtools-protocol/pdl/js_protocol.pdl +1653 -1678
  150. data/node_modules/devtools-protocol/types/protocol-mapping.d.ts +4333 -4321
  151. data/node_modules/devtools-protocol/types/protocol-proxy-api.d.ts +3695 -3683
  152. data/node_modules/devtools-protocol/types/protocol.d.ts +15714 -15538
  153. data/node_modules/end-of-stream/LICENSE +20 -20
  154. data/node_modules/end-of-stream/README.md +54 -54
  155. data/node_modules/end-of-stream/index.js +94 -94
  156. data/node_modules/end-of-stream/package.json +37 -37
  157. data/node_modules/extract-zip/LICENSE +23 -23
  158. data/node_modules/extract-zip/cli.js +19 -19
  159. data/node_modules/extract-zip/index.d.ts +21 -21
  160. data/node_modules/extract-zip/index.js +173 -173
  161. data/node_modules/extract-zip/package.json +80 -80
  162. data/node_modules/extract-zip/readme.md +57 -57
  163. data/node_modules/fd-slicer/.npmignore +2 -2
  164. data/node_modules/fd-slicer/.travis.yml +7 -7
  165. data/node_modules/fd-slicer/CHANGELOG.md +49 -49
  166. data/node_modules/fd-slicer/LICENSE +21 -21
  167. data/node_modules/fd-slicer/README.md +199 -199
  168. data/node_modules/fd-slicer/index.js +296 -296
  169. data/node_modules/fd-slicer/package.json +36 -36
  170. data/node_modules/fd-slicer/test/test.js +350 -350
  171. data/node_modules/find-up/index.d.ts +137 -137
  172. data/node_modules/find-up/index.js +89 -89
  173. data/node_modules/find-up/license +9 -9
  174. data/node_modules/find-up/package.json +53 -53
  175. data/node_modules/find-up/readme.md +156 -156
  176. data/node_modules/fs-constants/LICENSE +21 -21
  177. data/node_modules/fs-constants/README.md +26 -26
  178. data/node_modules/fs-constants/browser.js +1 -1
  179. data/node_modules/fs-constants/index.js +1 -1
  180. data/node_modules/fs-constants/package.json +19 -19
  181. data/node_modules/fs.realpath/LICENSE +43 -43
  182. data/node_modules/fs.realpath/README.md +33 -33
  183. data/node_modules/fs.realpath/index.js +66 -66
  184. data/node_modules/fs.realpath/old.js +303 -303
  185. data/node_modules/fs.realpath/package.json +26 -26
  186. data/node_modules/get-stream/buffer-stream.js +52 -52
  187. data/node_modules/get-stream/index.d.ts +108 -108
  188. data/node_modules/get-stream/index.js +60 -60
  189. data/node_modules/get-stream/license +9 -9
  190. data/node_modules/get-stream/package.json +50 -50
  191. data/node_modules/get-stream/readme.md +124 -124
  192. data/node_modules/glob/LICENSE +21 -21
  193. data/node_modules/glob/README.md +375 -375
  194. data/node_modules/glob/changelog.md +67 -67
  195. data/node_modules/glob/common.js +234 -234
  196. data/node_modules/glob/glob.js +788 -788
  197. data/node_modules/glob/package.json +51 -51
  198. data/node_modules/glob/sync.js +484 -484
  199. data/node_modules/https-proxy-agent/README.md +137 -137
  200. data/node_modules/https-proxy-agent/dist/agent.d.ts +30 -30
  201. data/node_modules/https-proxy-agent/dist/agent.js +179 -179
  202. data/node_modules/https-proxy-agent/dist/index.d.ts +23 -23
  203. data/node_modules/https-proxy-agent/dist/index.js +13 -13
  204. data/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -7
  205. data/node_modules/https-proxy-agent/dist/parse-proxy-response.js +65 -65
  206. data/node_modules/https-proxy-agent/package.json +56 -56
  207. data/node_modules/ieee754/LICENSE +11 -11
  208. data/node_modules/ieee754/README.md +51 -51
  209. data/node_modules/ieee754/index.d.ts +9 -9
  210. data/node_modules/ieee754/index.js +85 -85
  211. data/node_modules/ieee754/package.json +52 -52
  212. data/node_modules/inflight/LICENSE +15 -15
  213. data/node_modules/inflight/README.md +37 -37
  214. data/node_modules/inflight/inflight.js +54 -54
  215. data/node_modules/inflight/package.json +29 -29
  216. data/node_modules/inherits/LICENSE +16 -16
  217. data/node_modules/inherits/README.md +42 -42
  218. data/node_modules/inherits/inherits.js +9 -9
  219. data/node_modules/inherits/inherits_browser.js +27 -27
  220. data/node_modules/inherits/package.json +29 -29
  221. data/node_modules/locate-path/index.d.ts +83 -83
  222. data/node_modules/locate-path/index.js +65 -65
  223. data/node_modules/locate-path/license +9 -9
  224. data/node_modules/locate-path/package.json +45 -45
  225. data/node_modules/locate-path/readme.md +122 -122
  226. data/node_modules/minimatch/LICENSE +15 -15
  227. data/node_modules/minimatch/README.md +209 -209
  228. data/node_modules/minimatch/minimatch.js +923 -923
  229. data/node_modules/minimatch/package.json +30 -30
  230. data/node_modules/{mkdirp → mkdirp-classic}/LICENSE +21 -21
  231. data/node_modules/mkdirp-classic/README.md +18 -0
  232. data/node_modules/{mkdirp → mkdirp-classic}/index.js +98 -99
  233. data/node_modules/mkdirp-classic/package.json +18 -0
  234. data/node_modules/ms/index.js +162 -162
  235. data/node_modules/ms/license.md +21 -21
  236. data/node_modules/ms/package.json +37 -37
  237. data/node_modules/ms/readme.md +60 -60
  238. data/node_modules/node-fetch/LICENSE.md +22 -22
  239. data/node_modules/node-fetch/README.md +590 -590
  240. data/node_modules/node-fetch/browser.js +24 -24
  241. data/node_modules/node-fetch/lib/index.es.js +1662 -1640
  242. data/node_modules/node-fetch/lib/index.js +1671 -1649
  243. data/node_modules/node-fetch/lib/index.mjs +1660 -1638
  244. data/node_modules/node-fetch/package.json +68 -66
  245. data/node_modules/once/LICENSE +15 -15
  246. data/node_modules/once/README.md +79 -79
  247. data/node_modules/once/once.js +42 -42
  248. data/node_modules/once/package.json +33 -33
  249. data/node_modules/p-limit/index.d.ts +38 -38
  250. data/node_modules/p-limit/index.js +57 -57
  251. data/node_modules/p-limit/license +9 -9
  252. data/node_modules/p-limit/package.json +52 -52
  253. data/node_modules/p-limit/readme.md +101 -101
  254. data/node_modules/p-locate/index.d.ts +64 -64
  255. data/node_modules/p-locate/index.js +52 -52
  256. data/node_modules/p-locate/license +9 -9
  257. data/node_modules/p-locate/package.json +53 -53
  258. data/node_modules/p-locate/readme.md +90 -90
  259. data/node_modules/p-try/index.d.ts +39 -39
  260. data/node_modules/p-try/index.js +9 -9
  261. data/node_modules/p-try/license +9 -9
  262. data/node_modules/p-try/package.json +42 -42
  263. data/node_modules/p-try/readme.md +58 -58
  264. data/node_modules/path-exists/index.d.ts +28 -28
  265. data/node_modules/path-exists/index.js +23 -23
  266. data/node_modules/path-exists/license +9 -9
  267. data/node_modules/path-exists/package.json +39 -39
  268. data/node_modules/path-exists/readme.md +52 -52
  269. data/node_modules/path-is-absolute/index.js +20 -20
  270. data/node_modules/path-is-absolute/license +21 -21
  271. data/node_modules/path-is-absolute/package.json +43 -43
  272. data/node_modules/path-is-absolute/readme.md +59 -59
  273. data/node_modules/pend/LICENSE +23 -23
  274. data/node_modules/pend/README.md +41 -41
  275. data/node_modules/pend/index.js +55 -55
  276. data/node_modules/pend/package.json +18 -18
  277. data/node_modules/pend/test.js +137 -137
  278. data/node_modules/pkg-dir/index.d.ts +44 -44
  279. data/node_modules/pkg-dir/index.js +17 -17
  280. data/node_modules/pkg-dir/license +9 -9
  281. data/node_modules/pkg-dir/package.json +56 -56
  282. data/node_modules/pkg-dir/readme.md +66 -66
  283. data/node_modules/progress/CHANGELOG.md +115 -115
  284. data/node_modules/progress/LICENSE +22 -22
  285. data/node_modules/progress/Makefile +8 -8
  286. data/node_modules/progress/Readme.md +146 -146
  287. data/node_modules/progress/index.js +1 -1
  288. data/node_modules/progress/lib/node-progress.js +236 -235
  289. data/node_modules/progress/package.json +26 -26
  290. data/node_modules/proxy-from-env/.eslintrc +29 -29
  291. data/node_modules/proxy-from-env/.travis.yml +10 -10
  292. data/node_modules/proxy-from-env/LICENSE +20 -20
  293. data/node_modules/proxy-from-env/README.md +131 -131
  294. data/node_modules/proxy-from-env/index.js +108 -108
  295. data/node_modules/proxy-from-env/package.json +34 -34
  296. data/node_modules/proxy-from-env/test.js +483 -483
  297. data/node_modules/pump/.travis.yml +5 -5
  298. data/node_modules/pump/LICENSE +20 -20
  299. data/node_modules/pump/README.md +65 -65
  300. data/node_modules/pump/index.js +82 -82
  301. data/node_modules/pump/package.json +24 -24
  302. data/node_modules/pump/test-browser.js +66 -66
  303. data/node_modules/pump/test-node.js +53 -53
  304. data/node_modules/puppeteer-core/CHANGELOG.md +319 -261
  305. data/node_modules/puppeteer-core/LICENSE +202 -202
  306. data/node_modules/puppeteer-core/README.md +481 -483
  307. data/node_modules/puppeteer-core/cjs-entry-core.js +29 -29
  308. data/node_modules/puppeteer-core/cjs-entry.js +29 -29
  309. data/node_modules/puppeteer-core/install.js +89 -89
  310. data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.d.ts +110 -110
  311. data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.js +80 -80
  312. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.d.ts +175 -175
  313. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.js +360 -360
  314. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.d.ts +20 -20
  315. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js +84 -84
  316. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js.map +1 -1
  317. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.d.ts +455 -453
  318. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.d.ts.map +1 -1
  319. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.js +540 -532
  320. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.js.map +1 -1
  321. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.d.ts +53 -53
  322. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.js +97 -97
  323. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.js.map +1 -1
  324. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
  325. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.js +34 -34
  326. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.d.ts +135 -129
  327. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.d.ts.map +1 -1
  328. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js +298 -280
  329. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js.map +1 -1
  330. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.d.ts +24 -24
  331. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.js +17 -17
  332. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +72 -72
  333. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.js +64 -64
  334. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.d.ts +204 -204
  335. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.js +335 -335
  336. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.js.map +1 -1
  337. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.d.ts +175 -173
  338. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.d.ts.map +1 -1
  339. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.js +662 -658
  340. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.js.map +1 -1
  341. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.d.ts +52 -52
  342. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.js +81 -81
  343. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.d.ts +40 -40
  344. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.js +1070 -1070
  345. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.d.ts +74 -74
  346. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.js +97 -97
  347. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.js.map +1 -1
  348. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.d.ts +24 -24
  349. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.js +37 -37
  350. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.d.ts +50 -41
  351. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.d.ts.map +1 -1
  352. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.js +56 -48
  353. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.js.map +1 -1
  354. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.d.ts +60 -60
  355. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.js +17 -17
  356. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.d.ts +92 -92
  357. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.js +116 -116
  358. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.js.map +1 -1
  359. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.d.ts +81 -81
  360. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.js +86 -86
  361. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.d.ts +193 -193
  362. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.js +321 -321
  363. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.js.map +1 -1
  364. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.d.ts +58 -58
  365. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.js +71 -71
  366. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.js.map +1 -1
  367. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.d.ts +744 -732
  368. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.d.ts.map +1 -1
  369. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js +1047 -964
  370. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js.map +1 -1
  371. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts +350 -340
  372. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  373. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js +549 -546
  374. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js.map +1 -1
  375. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts +134 -125
  376. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  377. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js +184 -154
  378. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js.map +1 -1
  379. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.d.ts +358 -359
  380. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.d.ts.map +1 -1
  381. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.js +543 -544
  382. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.js.map +1 -1
  383. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.d.ts +490 -490
  384. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.d.ts.map +1 -1
  385. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.js +827 -826
  386. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.js.map +1 -1
  387. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts +65 -65
  388. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  389. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js +149 -148
  390. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js.map +1 -1
  391. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.d.ts +26 -26
  392. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.js +33 -33
  393. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts +126 -97
  394. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts.map +1 -1
  395. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js +467 -345
  396. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js.map +1 -1
  397. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.d.ts +161 -161
  398. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.js +34 -34
  399. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.d.ts +2055 -2026
  400. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.d.ts.map +1 -1
  401. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js +2533 -2487
  402. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js.map +1 -1
  403. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.d.ts +20 -20
  404. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.js +17 -17
  405. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.d.ts +159 -159
  406. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.js +161 -161
  407. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.js.map +1 -1
  408. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.d.ts +51 -51
  409. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.js +2 -2
  410. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.d.ts +64 -64
  411. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.js +165 -165
  412. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.d.ts +60 -60
  413. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.js +76 -76
  414. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.d.ts +100 -98
  415. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.d.ts.map +1 -1
  416. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.js +145 -144
  417. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.js.map +1 -1
  418. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.d.ts +21 -0
  419. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.d.ts.map +1 -0
  420. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.js +30 -0
  421. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.js.map +1 -0
  422. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.d.ts +27 -27
  423. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.js +47 -47
  424. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.d.ts +46 -46
  425. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.js +109 -109
  426. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.js.map +1 -1
  427. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.d.ts +39 -39
  428. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.js +406 -406
  429. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.d.ts +98 -98
  430. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.js +112 -112
  431. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.d.ts +22 -22
  432. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.js +33 -33
  433. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.d.ts +16 -16
  434. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.js +43 -43
  435. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.d.ts +84 -84
  436. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.js +327 -327
  437. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.js.map +1 -1
  438. data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.d.ts +16 -16
  439. data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.js +19 -19
  440. data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.d.ts +16 -16
  441. data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.js +2 -2
  442. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.d.ts +17 -17
  443. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.js +44 -44
  444. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.d.ts +17 -17
  445. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.js +26 -26
  446. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.d.ts +133 -133
  447. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.js +500 -500
  448. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.js.map +1 -1
  449. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts +40 -39
  450. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  451. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js +256 -224
  452. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js.map +1 -1
  453. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.d.ts +134 -130
  454. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  455. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.js +17 -17
  456. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts +16 -16
  457. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts.map +1 -1
  458. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js +655 -573
  459. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js.map +1 -1
  460. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
  461. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.js +47 -47
  462. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.d.ts +29 -29
  463. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js +64 -64
  464. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.d.ts +153 -153
  465. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.js +188 -188
  466. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.js.map +1 -1
  467. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.d.ts +17 -17
  468. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.js +173 -173
  469. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.js.map +1 -1
  470. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.d.ts +17 -17
  471. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.js +24 -24
  472. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.js.map +1 -1
  473. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.d.ts +17 -17
  474. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.js +23 -23
  475. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.js.map +1 -1
  476. data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.d.ts +21 -21
  477. data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.js +22 -22
  478. data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.d.ts +17 -17
  479. data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.js +23 -23
  480. data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.js.map +1 -1
  481. data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.d.ts +27 -27
  482. data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.js +56 -56
  483. data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.d.ts +110 -110
  484. data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.js +80 -80
  485. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.d.ts +175 -175
  486. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.js +356 -356
  487. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.d.ts +20 -20
  488. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js +81 -81
  489. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js.map +1 -1
  490. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.d.ts +455 -453
  491. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.d.ts.map +1 -1
  492. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.js +535 -527
  493. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.js.map +1 -1
  494. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.d.ts +53 -53
  495. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.js +74 -74
  496. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
  497. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.js +30 -30
  498. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.d.ts +135 -129
  499. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.d.ts.map +1 -1
  500. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.js +293 -275
  501. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.js.map +1 -1
  502. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.d.ts +24 -24
  503. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.js +16 -16
  504. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.d.ts +72 -72
  505. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.js +60 -60
  506. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.d.ts +204 -204
  507. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.js +329 -329
  508. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.d.ts +175 -173
  509. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.d.ts.map +1 -1
  510. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.js +657 -653
  511. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.js.map +1 -1
  512. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.d.ts +52 -52
  513. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.js +77 -77
  514. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.d.ts +40 -40
  515. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.js +1067 -1067
  516. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.d.ts +74 -74
  517. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.js +93 -93
  518. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.d.ts +24 -24
  519. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.js +33 -33
  520. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.d.ts +50 -41
  521. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.d.ts.map +1 -1
  522. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.js +50 -43
  523. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.js.map +1 -1
  524. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.d.ts +60 -60
  525. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.js +16 -16
  526. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.d.ts +92 -92
  527. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.js +109 -109
  528. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.d.ts +81 -81
  529. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.js +83 -83
  530. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.d.ts +193 -193
  531. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.js +317 -317
  532. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.d.ts +58 -58
  533. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.js +67 -67
  534. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.d.ts +744 -732
  535. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.d.ts.map +1 -1
  536. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js +1042 -959
  537. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js.map +1 -1
  538. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts +350 -340
  539. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  540. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js +545 -542
  541. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js.map +1 -1
  542. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts +134 -125
  543. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  544. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js +180 -150
  545. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js.map +1 -1
  546. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.d.ts +358 -359
  547. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.d.ts.map +1 -1
  548. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.js +537 -538
  549. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.js.map +1 -1
  550. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.d.ts +490 -490
  551. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.d.ts.map +1 -1
  552. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.js +802 -801
  553. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.js.map +1 -1
  554. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts +65 -65
  555. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  556. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js +145 -144
  557. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js.map +1 -1
  558. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.d.ts +26 -26
  559. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.js +30 -30
  560. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts +126 -97
  561. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts.map +1 -1
  562. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js +463 -341
  563. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js.map +1 -1
  564. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.d.ts +161 -161
  565. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.js +31 -31
  566. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.d.ts +2055 -2026
  567. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.d.ts.map +1 -1
  568. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.js +2529 -2483
  569. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.js.map +1 -1
  570. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.d.ts +20 -20
  571. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.js +16 -16
  572. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.d.ts +159 -159
  573. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.js +157 -157
  574. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.d.ts +51 -51
  575. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.js +1 -1
  576. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.d.ts +64 -64
  577. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.js +157 -157
  578. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.d.ts +60 -60
  579. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.js +72 -72
  580. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.d.ts +100 -98
  581. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.d.ts.map +1 -1
  582. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.js +141 -140
  583. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.js.map +1 -1
  584. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.d.ts +21 -0
  585. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.d.ts.map +1 -0
  586. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.js +26 -0
  587. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.js.map +1 -0
  588. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.d.ts +27 -27
  589. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.js +43 -43
  590. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.d.ts +46 -46
  591. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.js +105 -105
  592. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.d.ts +39 -39
  593. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.js +403 -403
  594. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.d.ts +98 -98
  595. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.js +108 -108
  596. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.d.ts +22 -22
  597. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.js +28 -28
  598. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.d.ts +16 -16
  599. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.js +20 -20
  600. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.d.ts +84 -84
  601. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.js +305 -305
  602. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.js.map +1 -1
  603. data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.d.ts +16 -16
  604. data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.js +16 -16
  605. data/node_modules/puppeteer-core/lib/esm/puppeteer/global.d.ts +16 -16
  606. data/node_modules/puppeteer-core/lib/esm/puppeteer/global.js +1 -1
  607. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.d.ts +17 -17
  608. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.js +37 -37
  609. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.d.ts +17 -17
  610. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.js +22 -22
  611. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.d.ts +133 -133
  612. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.js +474 -474
  613. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.js.map +1 -1
  614. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts +40 -39
  615. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  616. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js +230 -198
  617. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js.map +1 -1
  618. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.d.ts +134 -130
  619. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.d.ts.map +1 -1
  620. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.js +16 -16
  621. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts +16 -16
  622. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts.map +1 -1
  623. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js +633 -551
  624. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js.map +1 -1
  625. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
  626. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.js +40 -40
  627. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.d.ts +29 -29
  628. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.js +60 -60
  629. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.d.ts +153 -153
  630. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.js +181 -181
  631. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.d.ts +17 -17
  632. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.js +165 -165
  633. data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.d.ts +17 -17
  634. data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.js +22 -22
  635. data/node_modules/puppeteer-core/lib/esm/puppeteer/node.d.ts +17 -17
  636. data/node_modules/puppeteer-core/lib/esm/puppeteer/node.js +21 -21
  637. data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.d.ts +21 -21
  638. data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.js +19 -19
  639. data/node_modules/puppeteer-core/lib/esm/puppeteer/web.d.ts +17 -17
  640. data/node_modules/puppeteer-core/lib/esm/puppeteer/web.js +21 -21
  641. data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.d.ts +27 -27
  642. data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.js +53 -53
  643. data/node_modules/puppeteer-core/lib/types.d.ts +3899 -3766
  644. data/node_modules/puppeteer-core/package.json +115 -122
  645. data/node_modules/puppeteer-core/typescript-if-required.js +61 -61
  646. data/node_modules/readable-stream/CONTRIBUTING.md +38 -38
  647. data/node_modules/readable-stream/GOVERNANCE.md +136 -136
  648. data/node_modules/readable-stream/LICENSE +47 -47
  649. data/node_modules/readable-stream/README.md +106 -106
  650. data/node_modules/readable-stream/errors-browser.js +127 -127
  651. data/node_modules/readable-stream/errors.js +116 -116
  652. data/node_modules/readable-stream/experimentalWarning.js +17 -17
  653. data/node_modules/readable-stream/lib/_stream_duplex.js +138 -138
  654. data/node_modules/readable-stream/lib/_stream_passthrough.js +38 -38
  655. data/node_modules/readable-stream/lib/_stream_readable.js +1123 -1123
  656. data/node_modules/readable-stream/lib/_stream_transform.js +200 -200
  657. data/node_modules/readable-stream/lib/_stream_writable.js +696 -696
  658. data/node_modules/readable-stream/lib/internal/streams/async_iterator.js +206 -206
  659. data/node_modules/readable-stream/lib/internal/streams/buffer_list.js +209 -209
  660. data/node_modules/readable-stream/lib/internal/streams/destroy.js +104 -104
  661. data/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +103 -103
  662. data/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -3
  663. data/node_modules/readable-stream/lib/internal/streams/from.js +63 -63
  664. data/node_modules/readable-stream/lib/internal/streams/pipeline.js +96 -96
  665. data/node_modules/readable-stream/lib/internal/streams/state.js +26 -26
  666. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -1
  667. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -1
  668. data/node_modules/readable-stream/package.json +68 -68
  669. data/node_modules/readable-stream/readable-browser.js +9 -9
  670. data/node_modules/readable-stream/readable.js +16 -16
  671. data/node_modules/rimraf/CHANGELOG.md +65 -65
  672. data/node_modules/rimraf/LICENSE +15 -15
  673. data/node_modules/rimraf/README.md +101 -101
  674. data/node_modules/rimraf/bin.js +68 -68
  675. data/node_modules/rimraf/package.json +32 -32
  676. data/node_modules/rimraf/rimraf.js +360 -360
  677. data/node_modules/safe-buffer/LICENSE +21 -21
  678. data/node_modules/safe-buffer/README.md +584 -584
  679. data/node_modules/safe-buffer/index.d.ts +186 -186
  680. data/node_modules/safe-buffer/index.js +65 -65
  681. data/node_modules/safe-buffer/package.json +51 -51
  682. data/node_modules/string_decoder/LICENSE +48 -48
  683. data/node_modules/string_decoder/README.md +47 -47
  684. data/node_modules/string_decoder/lib/string_decoder.js +295 -295
  685. data/node_modules/string_decoder/package.json +34 -34
  686. data/node_modules/tar-fs/.travis.yml +6 -5
  687. data/node_modules/tar-fs/LICENSE +20 -20
  688. data/node_modules/tar-fs/README.md +165 -163
  689. data/node_modules/tar-fs/index.js +351 -348
  690. data/node_modules/tar-fs/package.json +41 -41
  691. data/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -1
  692. data/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -1
  693. data/node_modules/tar-fs/test/index.js +346 -346
  694. data/node_modules/tar-stream/LICENSE +20 -20
  695. data/node_modules/tar-stream/README.md +168 -168
  696. data/node_modules/tar-stream/extract.js +257 -257
  697. data/node_modules/tar-stream/headers.js +295 -295
  698. data/node_modules/tar-stream/index.js +2 -2
  699. data/node_modules/tar-stream/pack.js +255 -255
  700. data/node_modules/tar-stream/package.json +58 -58
  701. data/node_modules/tar-stream/sandbox.js +11 -11
  702. data/node_modules/through/.travis.yml +5 -5
  703. data/node_modules/through/LICENSE.APACHE2 +15 -15
  704. data/node_modules/through/LICENSE.MIT +24 -24
  705. data/node_modules/through/index.js +108 -108
  706. data/node_modules/through/package.json +36 -36
  707. data/node_modules/through/readme.markdown +64 -64
  708. data/node_modules/through/test/async.js +28 -28
  709. data/node_modules/through/test/auto-destroy.js +30 -30
  710. data/node_modules/through/test/buffering.js +71 -71
  711. data/node_modules/through/test/end.js +45 -45
  712. data/node_modules/through/test/index.js +133 -133
  713. data/node_modules/tr46/.npmignore +4 -0
  714. data/node_modules/tr46/index.js +193 -0
  715. data/node_modules/tr46/lib/.gitkeep +0 -0
  716. data/node_modules/tr46/lib/mappingTable.json +1 -0
  717. data/node_modules/tr46/package.json +31 -0
  718. data/node_modules/unbzip2-stream/LICENSE +24 -24
  719. data/node_modules/unbzip2-stream/README.md +59 -59
  720. data/node_modules/unbzip2-stream/dist/unbzip2-stream.min.js +1 -1
  721. data/node_modules/unbzip2-stream/index.js +93 -92
  722. data/node_modules/unbzip2-stream/lib/bit_iterator.js +39 -39
  723. data/node_modules/unbzip2-stream/lib/bzip2.js +365 -367
  724. data/node_modules/unbzip2-stream/package.json +51 -51
  725. data/node_modules/util-deprecate/History.md +16 -16
  726. data/node_modules/util-deprecate/LICENSE +24 -24
  727. data/node_modules/util-deprecate/README.md +53 -53
  728. data/node_modules/util-deprecate/browser.js +67 -67
  729. data/node_modules/util-deprecate/node.js +6 -6
  730. data/node_modules/util-deprecate/package.json +27 -27
  731. data/node_modules/webidl-conversions/LICENSE.md +12 -0
  732. data/node_modules/webidl-conversions/README.md +53 -0
  733. data/node_modules/webidl-conversions/lib/index.js +189 -0
  734. data/node_modules/webidl-conversions/package.json +23 -0
  735. data/node_modules/whatwg-url/LICENSE.txt +21 -0
  736. data/node_modules/whatwg-url/README.md +67 -0
  737. data/node_modules/whatwg-url/lib/URL-impl.js +200 -0
  738. data/node_modules/whatwg-url/lib/URL.js +196 -0
  739. data/node_modules/whatwg-url/lib/public-api.js +11 -0
  740. data/node_modules/whatwg-url/lib/url-state-machine.js +1297 -0
  741. data/node_modules/whatwg-url/lib/utils.js +20 -0
  742. data/node_modules/whatwg-url/package.json +32 -0
  743. data/node_modules/wrappy/LICENSE +15 -15
  744. data/node_modules/wrappy/README.md +36 -36
  745. data/node_modules/wrappy/package.json +29 -29
  746. data/node_modules/wrappy/wrappy.js +33 -33
  747. data/node_modules/ws/LICENSE +19 -21
  748. data/node_modules/ws/README.md +493 -496
  749. data/node_modules/ws/browser.js +8 -8
  750. data/node_modules/ws/index.js +13 -10
  751. data/node_modules/ws/lib/buffer-util.js +126 -129
  752. data/node_modules/ws/lib/constants.js +12 -10
  753. data/node_modules/ws/lib/event-target.js +266 -184
  754. data/node_modules/ws/lib/extension.js +203 -223
  755. data/node_modules/ws/lib/limiter.js +55 -55
  756. data/node_modules/ws/lib/permessage-deflate.js +511 -517
  757. data/node_modules/ws/lib/receiver.js +612 -507
  758. data/node_modules/ws/lib/sender.js +422 -405
  759. data/node_modules/ws/lib/stream.js +180 -165
  760. data/node_modules/ws/lib/subprotocol.js +62 -0
  761. data/node_modules/ws/lib/validation.js +124 -104
  762. data/node_modules/ws/lib/websocket-server.js +485 -418
  763. data/node_modules/ws/lib/websocket.js +1149 -942
  764. data/node_modules/ws/package.json +61 -56
  765. data/node_modules/ws/wrapper.mjs +8 -0
  766. data/node_modules/yauzl/LICENSE +21 -21
  767. data/node_modules/yauzl/README.md +658 -658
  768. data/node_modules/yauzl/index.js +796 -796
  769. data/node_modules/yauzl/package.json +40 -40
  770. data/package.json +1 -1
  771. metadata +59 -61
  772. data/node_modules/.bin/mkdirp +0 -12
  773. data/node_modules/.bin/mkdirp.cmd +0 -17
  774. data/node_modules/.bin/mkdirp.ps1 +0 -28
  775. data/node_modules/devtools-protocol/changelog.md +0 -10491
  776. data/node_modules/devtools-protocol/externs/protocol_externs.js +0 -9734
  777. data/node_modules/minimist/.travis.yml +0 -8
  778. data/node_modules/minimist/LICENSE +0 -18
  779. data/node_modules/minimist/example/parse.js +0 -2
  780. data/node_modules/minimist/index.js +0 -245
  781. data/node_modules/minimist/package.json +0 -45
  782. data/node_modules/minimist/readme.markdown +0 -95
  783. data/node_modules/minimist/test/all_bool.js +0 -32
  784. data/node_modules/minimist/test/bool.js +0 -178
  785. data/node_modules/minimist/test/dash.js +0 -31
  786. data/node_modules/minimist/test/default_bool.js +0 -35
  787. data/node_modules/minimist/test/dotted.js +0 -22
  788. data/node_modules/minimist/test/kv_short.js +0 -16
  789. data/node_modules/minimist/test/long.js +0 -31
  790. data/node_modules/minimist/test/num.js +0 -36
  791. data/node_modules/minimist/test/parse.js +0 -197
  792. data/node_modules/minimist/test/parse_modified.js +0 -9
  793. data/node_modules/minimist/test/proto.js +0 -44
  794. data/node_modules/minimist/test/short.js +0 -67
  795. data/node_modules/minimist/test/stop_early.js +0 -15
  796. data/node_modules/minimist/test/unknown.js +0 -102
  797. data/node_modules/minimist/test/whitespace.js +0 -8
  798. data/node_modules/mkdirp/bin/cmd.js +0 -33
  799. data/node_modules/mkdirp/bin/usage.txt +0 -12
  800. data/node_modules/mkdirp/package.json +0 -34
  801. data/node_modules/mkdirp/readme.markdown +0 -100
  802. data/node_modules/node-fetch/CHANGELOG.md +0 -272
@@ -1,851 +1,851 @@
1
- module Isomorfeus
2
- module Puppetmaster
3
- module Driver
4
- module PuppeteerNode
5
- def node_all_text(node)
6
- await <<~JAVASCRIPT
7
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
8
- return node.textContent;
9
- }, AllElementHandles[#{node.handle}]);
10
- JAVASCRIPT
11
- end
12
-
13
- def node_click(node, x: nil, y: nil, modifiers: nil)
14
- # modifier_keys: :alt, :control, :meta, :shift
15
- # raise Isomorfeus::Pupppetmaster::InvalidActionError.new(:click) unless visible?
16
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
17
- modifiers = [] unless modifiers
18
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
19
- await <<~JAVASCRIPT
20
- var response_event_occurred = false;
21
- var response_handler = function(event){ response_event_occurred = true; };
22
- var response_watcher = new Promise(function(resolve, reject){
23
- setTimeout(function(){
24
- if (!response_event_occurred) { resolve(true); }
25
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
26
- AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
27
- }, #{@puppeteer_reaction_timeout});
28
- });
29
- AllPageHandles[#{node.document.handle}].on('response', response_handler);
30
- var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
31
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
32
- var options = {button: 0, bubbles: true, cancelable: true};
33
- var x = #{x ? x : 'null'};
34
- var y = #{y ? y : 'null'};
35
- var modifiers = #{modifiers};
36
- if (x && y) {
37
- var bounding_box = node.getBoundingClientRect();
38
- options['clientX'] = bounding_box.x + x;
39
- options['clientY'] = bounding_box.y + y;
40
- }
41
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
42
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
43
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
44
- if (modifiers.includes('alt')) { options['altKey'] = true; }
45
- node.dispatchEvent(new MouseEvent('mousedown', options));
46
- node.dispatchEvent(new MouseEvent('mouseup', options));
47
- node.dispatchEvent(new MouseEvent('click', options));
48
- }, AllElementHandles[#{node.handle}]);
49
- await Promise.race([response_watcher, navigation_watcher]);
50
- JAVASCRIPT
51
- end
52
-
53
- def node_disabled?(node)
54
- await <<~JAVASCRIPT
55
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(node => {
56
- const xpath = `parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] |
57
- ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]`;
58
- return node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;
59
- }, AllElementHandles[#{node.handle}]);
60
- JAVASCRIPT
61
- end
62
-
63
- def node_dispatch_event(node, name, event_type = nil, **options)
64
- raise ArgumentError, 'Unknown event' unless Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS.key?(name.to_sym) || event_type
65
- event_type, opts = *Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS[name.to_sym] if event_type.nil?
66
- opts.merge!(options)
67
- final_options = options.map { |k,v| "#{k}: '#{v}'" }
68
- await <<~JAVASCRIPT
69
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
70
- var event = new #{event_type}('#{name}', { #{final_options.join(', ')} });
71
- node.dispatchEvent(event);
72
- }, AllElementHandles[#{node.handle}]);
73
- JAVASCRIPT
74
- end
75
-
76
- def node_double_click(node, x: nil, y: nil, modifiers: nil)
77
- # modifier_keys: :alt, :control, :meta, :shift
78
- # offset: { x: int, y: int }
79
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
80
- modifiers = [] unless modifiers
81
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
82
- await <<~JAVASCRIPT
83
- var response_event_occurred = false;
84
- var response_handler = function(event){ response_event_occurred = true; };
85
- var response_watcher = new Promise(function(resolve, reject){
86
- setTimeout(function(){
87
- if (!response_event_occurred) { resolve(true); }
88
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
89
- AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
90
- }, #{@puppeteer_reaction_timeout});
91
- });
92
- AllPageHandles[#{node.document.handle}].on('response', response_handler);
93
- var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
94
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
95
- var options = {button: 0, bubbles: true, cancelable: true};
96
- var x = #{x ? x : 'null'};
97
- var y = #{y ? y : 'null'};
98
- var modifiers = #{modifiers};
99
- if (x && y) {
100
- var bounding_box = node.getBoundingClientRect();
101
- options['clientX'] = bounding_box.left + x;
102
- options['clientY'] = bounding_box.top + y;
103
- }
104
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
105
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
106
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
107
- if (modifiers.includes('alt')) { options['altKey'] = true; }
108
- node.dispatchEvent(new MouseEvent('mousedown', options));
109
- node.dispatchEvent(new MouseEvent('mouseup', options));
110
- node.dispatchEvent(new MouseEvent('dblclick', options));
111
- return options;
112
- }, AllElementHandles[#{node.handle}]);
113
- await Promise.race([response_watcher, navigation_watcher]);
114
- JAVASCRIPT
115
- end
116
-
117
- def node_drag_to(node, other_node)
118
- if node[:draggable]
119
- await <<~JAVASCRIPT
120
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
121
- document.addEventListener('mousedown', event => {
122
- window.puppeteer_mousedown_prevented = event.defaultPrevented;
123
- }, { once: true, passive: true });
124
- }, AllElementHandles[#{node.handle}]);
125
- JAVASCRIPT
126
- # TODO use scrollIntoView once chromium bug is fixed
127
- # https://bugs.chromium.org/p/chromium/issues/detail?id=939740&can=2&start=0&num=100&q=mousemove%20scrollintoview&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=
128
- await <<~JAVASCRIPT
129
- var node_handle = #{node.handle};
130
- await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
131
- var n = node;
132
- var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
133
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
134
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
135
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
136
- if (!node_in_view) { node.scrollTo(0,0); };
137
- setTimeout(function(){
138
- var client_rect = node.getBoundingClientRect();
139
- var x = (client_rect.left + (client_rect.width / 2));
140
- var y = (client_rect.top + (client_rect.height / 2));
141
- node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
142
- setTimeout(function(){
143
- node.dispatchEvent(new MouseEvent('mousedown', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
144
- if (window.puppeteer_mousedown_prevented) {
145
- n = other_node;
146
- top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
147
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
148
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
149
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
150
- if (!node_in_view) { other_node.scrollTo(0,0) };
151
- setTimeout(function(){
152
- client_rect = other_node.getBoundingClientRect();
153
- x = (client_rect.left + (client_rect.width / 2));
154
- y = (client_rect.top + (client_rect.height / 2));
155
- node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
156
- setTimeout(function(){
157
- node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
158
- }, #{@puppeteer_reaction_timeout/2});
159
- }, #{@puppeteer_reaction_timeout});
160
- } else {
161
- var dt = new DataTransfer();
162
- if (node.tagName == 'A'){ dt.setData('text/uri-list', node.href); dt.setData('text', node.href); }
163
- if (node.tagName == 'IMG'){ dt.setData('text/uri-list', node.src); dt.setData('text', node.src); }
164
- var opts = { cancelable: true, bubbles: true, dataTransfer: dt };
165
- var dragEvent = new DragEvent('dragstart', opts);
166
- node.dispatchEvent(dragEvent);
167
- n = other_node;
168
- top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
169
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
170
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
171
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
172
- if (!node_in_view) { other_node.scrollTo(0,0); };
173
- setTimeout(function(){
174
- var rect = node.getBoundingClientRect()
175
- var node_center = new DOMPoint((rect.left + rect.right)/2, (rect.top + rect.bottom)/2);
176
- var other_rect = other_node.getBoundingClientRect();
177
- var other_point = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
178
- var entry_point = null;
179
- var slope = (other_point.y - other_point.y) / (other_point.x - node_center.x);
180
- if (other_point.x <= other_point.x) { // left side
181
- var minXy = slope * (other_rect.left - node_center.x) + node_center.y;
182
- if (other_rect.top <= minXy && minXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.left, minXy); }
183
- }
184
- if (node_center.x >= other_point.x) { // right side
185
- var maxXy = slope * (other_rect.right - node_center.x) + node_center.y;
186
- if (other_rect.top <= maxXy && maxXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.right, maxXy); }
187
- }
188
- if (node_center.y <= other_point.y) { // top side
189
- var minYx = (other_point.top - node_center.y) / slope + node_center.x;
190
- if (other_rect.left <= minYx && minYx <= other_rect.right) { entry_point = new DOMPoint(minYx, other_rect.top); }
191
- }
192
- if (node_center.y >= other_point.y) { // bottom side
193
- var maxYx = (other_rect.bottom - node_center.y) / slope + node_center.x;
194
- if (other_rect.left <= maxYx && maxYx <= other_rect.right) { entry_point = new DOMPoint(maxYx, other_rect.bottom); }
195
- }
196
- if (!entry_point) {
197
- entry_point = new DOMPoint(node_center.x, node_center.y);
198
- }
199
- var drag_over_event = new DragEvent('dragover', {clientX: entry_point.x, clientY: entry_point.y, bubbles: true, cancelable: true});
200
- other_node.dispatchEvent(drag_over_event);
201
- var other_center = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
202
- drag_over_event = new DragEvent('dragover', {clientX: targetCenter.x, clientY: targetCenter.y, bubbles: true, cancelable: true});
203
- other_node.dispatchEvent(drag_over_event);
204
- other_node.dispatchEvent(new DragEvent('dragleave', {bubbles: true, cancelable: true}));
205
- if (drag_over_event.defaultPrevented) {
206
- other_node.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
207
- }
208
- node.dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
209
- client_rect = other_node.getBoundingClientRect();
210
- x = (client_rect.left + (client_rect.width / 2));
211
- y = (client_rect.top + (client_rect.height / 2));
212
- node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
213
- }, #{@puppeteer_reaction_timeout});
214
- }
215
- }, #{@puppeteer_reaction_timeout/2});
216
- }, #{@puppeteer_reaction_timeout});
217
- }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
218
- JAVASCRIPT
219
- sleep (@reaction_timeout * 3) + 0.2
220
- else
221
- await <<~JAVASCRIPT
222
- var node_handle = #{node.handle};
223
- await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
224
- var n = node;
225
- var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
226
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
227
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
228
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
229
- if (!node_in_view) { res = (n === node); node.scrollTo(0,0); };
230
- setTimeout(function() {
231
- var client_rect = node.getBoundingClientRect();
232
- var x = (client_rect.left + (client_rect.width / 2));
233
- var y = (client_rect.top + (client_rect.height / 2));
234
- node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
235
- setTimeout(function() {
236
- node.dispatchEvent(new MouseEvent('mousedown', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
237
- var n = other_node;
238
- var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
239
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
240
- var other_node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
241
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
242
- if (!other_node_in_view) { other_node.scrollTo(0,0); };
243
- setTimeout(function() {
244
- var other_client_rect = other_node.getBoundingClientRect();
245
- var x = (other_client_rect.left + (other_client_rect.width / 2));
246
- var y = (other_client_rect.top + (other_client_rect.height / 2));
247
- node.dispatchEvent(new MouseEvent('mousemove', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
248
- setTimeout(function() {
249
- node.dispatchEvent(new MouseEvent('mouseup', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
250
- }, #{@puppeteer_reaction_timeout/2});
251
- }, #{@puppeteer_reaction_timeout});
252
- }, #{@puppeteer_reaction_timeout/2});
253
- }, #{@puppeteer_reaction_timeout});
254
- }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
255
- JAVASCRIPT
256
- sleep (@reaction_timeout * 3) + 0.2
257
- end
258
- end
259
-
260
- def node_equal(node, other_node)
261
- await <<~JAVASCRIPT
262
- var node_handle = #{node.handle};
263
- var other_handle = #{other_node.handle};
264
- if (AllElementHandles[node_handle] && AllElementHandles[other_handle]) {
265
- try {
266
- var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node){
267
- return (node === other_node);
268
- }, AllElementHandles[node_handle],AllElementHandles[other_handle]);
269
- LastResult = await handle.jsonValue();
270
- } catch (err) {
271
- LastResult = false;
272
- }
273
- }
274
- JAVASCRIPT
275
- end
276
-
277
- def node_execute_script(node, script, *args)
278
- await <<~JAVASCRIPT
279
- var node_handle = #{node.handle};
280
- await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
281
- arguments.unshift(node);
282
- #{script}
283
- }, AllElementHandles[node_handle], #{args[1..-1]});
284
- JAVASCRIPT
285
- end
286
-
287
- def node_evaluate_script(node, script, *args)
288
- await <<~JAVASCRIPT
289
- var node_handle = #{node.handle};
290
- handle = await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
291
- arguments.unshift(node);
292
- return #{script};
293
- }, AllElementHandles[node_handle], #{args[1..-1]});
294
- LastResult = await handle.jsonValue();
295
- JAVASCRIPT
296
- end
297
-
298
- def node_find(node, selector)
299
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
300
- node_data = await <<~JAVASCRIPT
301
- var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
302
- if (element_handle) {
303
- var node_handle = RegisterElementHandle(element_handle);
304
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
305
- var name = node.nodeName;
306
- var tag = node.tagName.toLowerCase();
307
- var type = null;
308
- if (tag === 'input') { type = node.getAttribute('type'); }
309
- return [name, tag, type, node.isContentEditable];
310
- }, AllElementHandles[node_handle]);
311
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
312
- }
313
- JAVASCRIPT
314
- if node_data
315
- node_data[:css_selector] = selector
316
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
317
- else
318
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
319
- end
320
- end
321
-
322
- def node_find_all(node, selector)
323
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
324
- node_data_array = await <<~JAVASCRIPT
325
- var node_data_array = [];
326
- var element_handle_array = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
327
- if (element_handle_array) {
328
-
329
- for (var i=0; i<element_handle_array.length; i++) {
330
- var node_handle = RegisterElementHandle(element_handle_array[i]);
331
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
332
- var name = node.nodeName;
333
- var tag = node.tagName.toLowerCase();
334
- var type = null;
335
- if (tag === 'input') { type = node.getAttribute('type'); }
336
- return [name, tag, type, node.isContentEditable];
337
- }, AllElementHandles[node_handle]);
338
- node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
339
- }
340
- }
341
- LastResult = node_data_array;
342
- JAVASCRIPT
343
- node_data_array.map do |node_data|
344
- node_data[:css_selector] = selector
345
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
346
- end
347
- end
348
-
349
- def node_find_all_xpath(node, query)
350
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
351
- node_data_array = await <<~JAVASCRIPT
352
- var node_data_array = [];
353
- var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
354
- if (element_handle_array) {
355
- for (var i=0; i<element_handle_array.length; i++) {
356
- var node_handle = RegisterElementHandle(element_handle_array[i]);
357
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
358
- var name = node.nodeName;
359
- var tag = node.tagName.toLowerCase();
360
- var type = null;
361
- if (tag === 'input') { type = node.getAttribute('type'); }
362
- return [name, tag, type, node.isContentEditable];
363
- }, AllElementHandles[node_handle]);
364
- node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
365
- }
366
- }
367
- LastResult = node_data_array;
368
- JAVASCRIPT
369
- node_data_array.map do |node_data|
370
- node_data[:xpath_query] = query
371
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
372
- end
373
- end
374
-
375
- def node_find_xpath(node, query)
376
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
377
- node_data = await <<~JAVASCRIPT
378
- var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
379
- var element_handle = (element_handle_array) ? element_handle_array[0] : null;
380
- if (element_handle) {
381
- var node_handle = RegisterElementHandle(element_handle);
382
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
383
- var name = node.nodeName;
384
- var tag = node.tagName.toLowerCase();
385
- var type = null;
386
- if (tag === 'input') { type = node.getAttribute('type'); }
387
- return [name, tag, type, node.isContentEditable];
388
- }, AllElementHandles[node_handle]);
389
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
390
- }
391
- JAVASCRIPT
392
- if node_data
393
- node_data[:xpath_query] = query
394
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
395
- else
396
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(query)
397
- end
398
- end
399
-
400
- def node_focus(node)
401
- await "await AllElementHandles[#{node.handle}].focus();"
402
- end
403
-
404
- def node_get_attribute(node, attribute)
405
- await <<~JAVASCRIPT
406
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, attribute){
407
- return node.getAttribute(attribute);
408
- }, AllElementHandles[#{node.handle}], '#{attribute}');
409
- JAVASCRIPT
410
- end
411
-
412
- def node_get_property(node, property)
413
- await <<~JAVASCRIPT
414
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, property){
415
- return node[property];
416
- }, AllElementHandles[#{node.handle}], '#{property}');
417
- JAVASCRIPT
418
- end
419
-
420
- def node_hover(node)
421
- await "await AllElementHandles[#{node.handle}].hover(); }"
422
- end
423
-
424
- def node_in_viewport?(node)
425
- await <<~JAVASCRIPT
426
- var node_handle = #{node.handle};
427
- var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node) {
428
- var top = node.offsetTop, left = node.offsetLeft, width = node.offsetWidth, height = node.offsetHeight;
429
- while(node.offsetParent) { node = node.offsetParent; top += node.offsetTop; left += node.offsetLeft; }
430
- return (top >= window.pageYOffset && left >= window.pageXOffset &&
431
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
432
- }, AllElementHandles[node_handle]);
433
- LastResult = await handle.jsonValue();
434
- JAVASCRIPT
435
- end
436
-
437
- def node_render_base64(node, **options)
438
- # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
439
- final_options = ["encoding: 'base64'"]
440
- if options.key?(:format)
441
- options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
442
- final_options << "type: '#{options.delete(:format).to_s.downcase}'"
443
- end
444
- final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
445
- box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
446
- final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
447
- options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
448
- await "LastResult = await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
449
- end
450
-
451
- def node_right_click(node, x: nil, y: nil, modifiers: nil)
452
- # modifier_keys: :alt, :control, :meta, :shift
453
- # offset: { x: int, y: int }
454
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
455
- modifiers = [] unless modifiers
456
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
457
- await <<~JAVASCRIPT
458
- var response_event_occurred = false;
459
- var response_handler = function(event){ response_event_occurred = true; };
460
- var response_watcher = new Promise(function(resolve, reject){
461
- setTimeout(function(){
462
- if (!response_event_occurred) { resolve(true); }
463
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
464
- AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
465
- }, #{@puppeteer_reaction_timeout});
466
- });
467
- AllPageHandles[#{node.document.handle}].on('response', response_handler);
468
- var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
469
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
470
- var options = {button: 2, bubbles: true, cancelable: true};
471
- var x = #{x ? x : 'null'};
472
- var y = #{y ? y : 'null'};
473
- var modifiers = #{modifiers};
474
- if (x && y) {
475
- var bounding_box = node.getBoundingClientRect();
476
- options['clientX'] = bounding_box.left + x;
477
- options['clientY'] = bounding_box.top + y;
478
- }
479
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
480
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
481
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
482
- if (modifiers.includes('alt')) { options['altKey'] = true; }
483
- node.dispatchEvent(new MouseEvent('mousedown', options));
484
- node.dispatchEvent(new MouseEvent('mouseup', options));
485
- node.dispatchEvent(new MouseEvent('contextmenu', options));
486
- return options;
487
- }, AllElementHandles[#{node.handle}]);
488
- await Promise.race([response_watcher, navigation_watcher]);
489
- JAVASCRIPT
490
- end
491
-
492
- def node_save_screenshot(node, path, **options)
493
- # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
494
- absolute_path = File.absolute_path(path)
495
- final_options = ["path: '#{absolute_path}'"]
496
- if options.key?(:format)
497
- options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
498
- final_options << "type: '#{options.delete(:format).to_s.downcase}'"
499
- end
500
- final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
501
- box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
502
- final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
503
- options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
504
- await "await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
505
- end
506
-
507
- def node_scroll_by(node, x, y)
508
- await <<~JAVASCRIPT
509
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
510
- node.scrollBy(#{x}, #{y});
511
- }, AllElementHandles[#{node.handle}]);
512
- JAVASCRIPT
513
- end
514
-
515
- def node_scroll_into_view(node)
516
- await <<~JAVASCRIPT
517
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
518
- node.scrollIntoView();
519
- }, AllElementHandles[#{node.handle}]);
520
- JAVASCRIPT
521
- end
522
-
523
- def node_scroll_to(node, x, y)
524
- await <<~JAVASCRIPT
525
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
526
- node.scrollTo(#{x}, #{y});
527
- }, AllElementHandles[#{node.handle}]);
528
- JAVASCRIPT
529
- end
530
-
531
- def node_select(node)
532
- # In the case of an OPTION tag, the change event should come
533
- # from the parent SELECT
534
- await <<~JAVASCRIPT
535
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
536
- var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
537
- ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
538
- if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
539
- else if (node.value == false && !node.parentNode.multiple) { return false; }
540
- else {
541
- node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
542
- node.selected = true;
543
- var element;
544
- if (node.nodeName == "OPTION") {
545
- element = node.parentNode;
546
- if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
547
- } else { element = node; }
548
- element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
549
- node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
550
- return true;
551
- }
552
- }, AllElementHandles[#{node.handle}]);
553
- JAVASCRIPT
554
- end
555
-
556
- def node_style(node, *styles)
557
- await <<~JAVASCRIPT
558
- var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node, styles){
559
- return = window.getComputedStyle(node);
560
- }, AllElementHandles[#{node.handle}], #{styles});
561
- LastResult = await handle.jsonValue();
562
- JAVASCRIPT
563
- end
564
-
565
- def node_type_keys(node, *keys)
566
- cjs = "await AllElementHandles[#{node.handle}].focus();\n"
567
- top_modifiers = []
568
- keys.each do |key|
569
- if key.is_a?(String)
570
- key.each_char do |c|
571
- need_shift = /[[:upper:]]/.match(c)
572
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
573
- c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
574
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
575
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
576
- end
577
- elsif key.is_a?(Symbol)
578
- if %i[ctrl Ctrl].include?(key)
579
- key = :control
580
- elsif %i[command Command Meta].include?(key)
581
- key = :meta
582
- elsif %i[divide Divide].include?(key)
583
- key = :numpad_divide
584
- elsif %i[decimal Decimal].include?(key)
585
- key = :numpad_decimal
586
- elsif %i[left right up down].include?(key)
587
- key = "arrow_#{key}".to_sym
588
- end
589
- if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(key)
590
- top_modifiers << key
591
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{key.to_s.camelize}');\n"
592
- else
593
- cjs << "await AllElementHandles[#{node.handle}].press('#{key.to_s.camelize}');\n"
594
- end
595
- elsif key.is_a?(Array)
596
- modifiers = []
597
- key.each do |k|
598
- if k.is_a?(Symbol)
599
- if %i[ctrl Ctrl].include?(k)
600
- k = :control
601
- elsif %i[command Command Meta].include?(k)
602
- k = :meta
603
- elsif %i[divide Divide].include?(k)
604
- k = :numpad_divide
605
- elsif %i[decimal Decimal].include?(k)
606
- k = :numpad_decimal
607
- elsif %i[left right up down].include?(key)
608
- k = "arrow_#{key}".to_sym
609
- end
610
- if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(k)
611
- modifiers << k
612
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{k.to_s.camelize}');\n"
613
- else
614
- cjs << "await AllElementHandles[#{node.handle}].press('#{k.to_s.camelize}');\n"
615
- end
616
- elsif k.is_a?(String)
617
- k.each_char do |c|
618
- need_shift = /[[:upper:]]/.match(c)
619
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
620
- c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
621
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
622
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
623
- end
624
- end
625
- end
626
- modifiers.reverse.each do |k|
627
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{k.to_s.camelize}');\n"
628
- end
629
- end
630
- end
631
- top_modifiers.reverse.each do |key|
632
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{key.to_s.camelize}');\n"
633
- end
634
- await(cjs)
635
- end
636
-
637
- def node_unselect(node)
638
- # In the case of an OPTION tag, the change event should come
639
- # from the parent SELECT
640
- await <<~JAVASCRIPT
641
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
642
- var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
643
- ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
644
- if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
645
- else if (node.value == false && !node.parentNode.multiple) { return false; }
646
- else {
647
- node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
648
- node.selected = false;
649
- var element;
650
- if (node.nodeName == "OPTION") {
651
- element = node.parentNode;
652
- if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
653
- } else { element = node; }
654
- element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
655
- node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
656
- return true;
657
- }
658
- }, AllElementHandles[#{node.handle}]);
659
- JAVASCRIPT
660
- end
661
-
662
- def node_value(node)
663
- await <<~JAVASCRIPT
664
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
665
- if (node.tagName == "SELECT" && node.multiple) {
666
- var result = []
667
- for (let i = 0, len = node.children.length; i < len; i++) {
668
- var option = node.children[i];
669
- if (option.selected) { result.push(option.value); }
670
- }
671
- return result;
672
- } else if (node.isContentEditable) { return node.textContent; }
673
- else { return node.value; }
674
- }, AllElementHandles[#{node.handle}]);
675
- JAVASCRIPT
676
- end
677
-
678
- def node_value=(node, value)
679
- raise Isomorfeus::Puppetmaster::ReadOnlyElementError if node.readonly?
680
- real_value = "`#{value}`"
681
- if %w[input textarea].include?(node.tag)
682
- await <<~JAVASCRIPT
683
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
684
- if (node.maxLength >= 0) { value = value.substr(0, node.maxLength); }
685
- node.dispatchEvent(new FocusEvent("focus",{bubbles: true, cancelable: true}));
686
- var tag_name = node.tagName.toLowerCase();
687
- if (tag_name === 'input') {
688
- node.value = '';
689
- if (node.type === "number" || node.type === "date") {
690
- for (var i = 0; i < value.length; i++) {
691
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
692
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
693
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
694
- }
695
- node.value = value;
696
- }
697
- else if (node.type == "time") { node.value = new Date(value).toTimeString().split(" ")[0]; }
698
- else if (node.type == "datetime-local") {
699
- value = new Date(value);
700
- var year = value.getFullYear();
701
- var month = ("0" + (value.getMonth() + 1)).slice(-2);
702
- var date = ("0" + value.getDate()).slice(-2);
703
- var hour = ("0" + value.getHours()).slice(-2);
704
- var min = ("0" + value.getMinutes()).slice(-2);
705
- var sec = ("0" + value.getSeconds()).slice(-2);
706
- value = `${year}-${month}-${date}T${hour}:${min}:${sec}`;
707
- for (var i = 0; i < value.length; i++) {
708
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
709
- node.value = node.value + value[i];
710
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
711
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
712
- }
713
- } else if (node.type === 'checkbox' || node.type === 'radio') { node.checked = value; }
714
- else {
715
- for (var i = 0; i < value.length; i++) {
716
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
717
- node.value = node.value + value[i];
718
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
719
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
720
- }
721
- }
722
- } else if (tag_name === 'textarea') {
723
- for (var i = 0; i < value.length; i++) {
724
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
725
- node.value = node.value + value[i];
726
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
727
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
728
- }
729
- }
730
- }, AllElementHandles[#{node.handle}], #{real_value});
731
- JAVASCRIPT
732
- else
733
- await <<~JAVASCRIPT
734
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
735
- if (node.isContentEditable) {
736
- var range = document.createRange();
737
- range.selectNodeContents(node);
738
- window.getSelection().removeAllRanges();
739
- window.getSelection().addRange(range);
740
- window.getSelection().deleteFromDocument();
741
- window.getSelection().removeAllRanges();
742
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
743
- node.textContent = value;
744
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
745
- }
746
- }, AllElementHandles[#{node.handle}], #{real_value});
747
- JAVASCRIPT
748
- end
749
- real_value
750
- end
751
-
752
- def node_visible_text(node)
753
- # if node is AREA, check visibility of relevant image
754
- text = await <<~JAVASCRIPT
755
- var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
756
- var temp_node = node;
757
- var mapName, style;
758
- if (node.tagName === "AREA") {
759
- mapName = document.evaluate("./ancestor::map/@name", node, null, XPathResult.STRING_TYPE, null).stringValue;
760
- temp_node = document.querySelector(`img[usemap="#${mapName}"]`);
761
- if (temp_node == null) { return ''; }
762
- }
763
- temp_node = node;
764
- while (temp_node) {
765
- style = window.getComputedStyle(node);
766
- if (style.display === "none" || style.visibility === "hidden" || parseFloat(style.opacity) === 0) { return ''; }
767
- temp_node = temp_node.parentElement;
768
- }
769
- if (node.nodeName == "TEXTAREA" || node instanceof SVGElement) { return node.textContent; }
770
- else { return node.innerText; }
771
- }, AllElementHandles[#{node.handle}]);
772
- LastResult = await handle.jsonValue();
773
- JAVASCRIPT
774
- text.gsub(/\A[[:space:]&&[^\u00a0]]+/, "").gsub(/[[:space:]&&[^\u00a0]]+\z/, "").gsub(/\n+/, "\n").tr("\u00a0", " ")
775
- end
776
-
777
- def node_visible?(node)
778
- await <<~JAVASCRIPT
779
- var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
780
- if (node.tagName == 'AREA'){
781
- const map_name = document.evaluate('./ancestor::map/@name', node, null, XPathResult.STRING_TYPE, null).stringValue;
782
- node = document.querySelector(`img[usemap='#${map_name}']`);
783
- if (!node){ return false; }
784
- }
785
- var forced_visible = false;
786
- while (node) {
787
- const style = window.getComputedStyle(node);
788
- if (style.visibility == 'visible') { forced_visible = true; }
789
- if ((style.display == 'none') || ((style.visibility == 'hidden') && !forced_visible) || (parseFloat(style.opacity) == 0)) {
790
- return false;
791
- }
792
- node = node.parentElement;
793
- }
794
- return true;
795
- }, AllElementHandles[#{node.handle}]);
796
- LastResult = await handle.jsonValue();
797
- JAVASCRIPT
798
- end
799
-
800
- def node_wait_for(node, selector)
801
- # TODO setTimeout
802
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
803
- node_data = await <<~JAVASCRIPT
804
- var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
805
- if (element_handle) {
806
- var node_handle = RegisterElementHandle(element_handle);
807
- var handle = await AllElementHandles[node_handle].evaluate((node) => {
808
- var name = node.nodeName;
809
- var tag = node.tagName.toLower();
810
- var type = null;
811
- if (tag === 'input') { type = node.getAttribute('type'); }
812
- return [name, tag, type, node.isContentEditable];
813
- }, AllElementHandles[node_handle]);
814
- var tt = await handle.jsonValue();
815
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
816
- }
817
- JAVASCRIPT
818
- if node_data
819
- node_data[:css_selector] = selector
820
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
821
- end
822
- end
823
-
824
- def node_wait_for_xpath(node, query)
825
- # TODO setTimeout
826
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
827
- node_data = await <<~JAVASCRIPT
828
- var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
829
- var element_handle = (element_handle_array) ? element_handle_array[0] : null;
830
- if (element_handle) {
831
- var node_handle = RegisterElementHandle(element_handle);
832
- var handle = await AllElementHandles[node_handle].evaluate((node) => {
833
- var name = node.nodeName;
834
- var tag = node.tagName.toLower();
835
- var type = null;
836
- if (tag === 'input') { type = node.getAttribute('type'); }
837
- return [name, tag, type, node.isContentEditable];
838
- }, AllElementHandles[node_handle]);
839
- var tt = await handle.jsonValue();
840
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
841
- }
842
- JAVASCRIPT
843
- if node_data
844
- node_data[:xpath_query] = query
845
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
846
- end
847
- end
848
- end
849
- end
850
- end
851
- end
1
+ module Isomorfeus
2
+ module Puppetmaster
3
+ module Driver
4
+ module PuppeteerNode
5
+ def node_all_text(node)
6
+ await <<~JAVASCRIPT
7
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
8
+ return node.textContent;
9
+ }, AllElementHandles[#{node.handle}]);
10
+ JAVASCRIPT
11
+ end
12
+
13
+ def node_click(node, x: nil, y: nil, modifiers: nil)
14
+ # modifier_keys: :alt, :control, :meta, :shift
15
+ # raise Isomorfeus::Pupppetmaster::InvalidActionError.new(:click) unless visible?
16
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
17
+ modifiers = [] unless modifiers
18
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
19
+ await <<~JAVASCRIPT
20
+ var response_event_occurred = false;
21
+ var response_handler = function(event){ response_event_occurred = true; };
22
+ var response_watcher = new Promise(function(resolve, reject){
23
+ setTimeout(function(){
24
+ if (!response_event_occurred) { resolve(true); }
25
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
26
+ AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
27
+ }, #{@puppeteer_reaction_timeout});
28
+ });
29
+ AllPageHandles[#{node.document.handle}].on('response', response_handler);
30
+ var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
31
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
32
+ var options = {button: 0, bubbles: true, cancelable: true};
33
+ var x = #{x ? x : 'null'};
34
+ var y = #{y ? y : 'null'};
35
+ var modifiers = #{modifiers};
36
+ if (x && y) {
37
+ var bounding_box = node.getBoundingClientRect();
38
+ options['clientX'] = bounding_box.x + x;
39
+ options['clientY'] = bounding_box.y + y;
40
+ }
41
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
42
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
43
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
44
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
45
+ node.dispatchEvent(new MouseEvent('mousedown', options));
46
+ node.dispatchEvent(new MouseEvent('mouseup', options));
47
+ node.dispatchEvent(new MouseEvent('click', options));
48
+ }, AllElementHandles[#{node.handle}]);
49
+ await Promise.race([response_watcher, navigation_watcher]);
50
+ JAVASCRIPT
51
+ end
52
+
53
+ def node_disabled?(node)
54
+ await <<~JAVASCRIPT
55
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(node => {
56
+ const xpath = `parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] |
57
+ ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]`;
58
+ return node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;
59
+ }, AllElementHandles[#{node.handle}]);
60
+ JAVASCRIPT
61
+ end
62
+
63
+ def node_dispatch_event(node, name, event_type = nil, **options)
64
+ raise ArgumentError, 'Unknown event' unless Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS.key?(name.to_sym) || event_type
65
+ event_type, opts = *Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS[name.to_sym] if event_type.nil?
66
+ opts.merge!(options)
67
+ final_options = options.map { |k,v| "#{k}: '#{v}'" }
68
+ await <<~JAVASCRIPT
69
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
70
+ var event = new #{event_type}('#{name}', { #{final_options.join(', ')} });
71
+ node.dispatchEvent(event);
72
+ }, AllElementHandles[#{node.handle}]);
73
+ JAVASCRIPT
74
+ end
75
+
76
+ def node_double_click(node, x: nil, y: nil, modifiers: nil)
77
+ # modifier_keys: :alt, :control, :meta, :shift
78
+ # offset: { x: int, y: int }
79
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
80
+ modifiers = [] unless modifiers
81
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
82
+ await <<~JAVASCRIPT
83
+ var response_event_occurred = false;
84
+ var response_handler = function(event){ response_event_occurred = true; };
85
+ var response_watcher = new Promise(function(resolve, reject){
86
+ setTimeout(function(){
87
+ if (!response_event_occurred) { resolve(true); }
88
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
89
+ AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
90
+ }, #{@puppeteer_reaction_timeout});
91
+ });
92
+ AllPageHandles[#{node.document.handle}].on('response', response_handler);
93
+ var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
94
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
95
+ var options = {button: 0, bubbles: true, cancelable: true};
96
+ var x = #{x ? x : 'null'};
97
+ var y = #{y ? y : 'null'};
98
+ var modifiers = #{modifiers};
99
+ if (x && y) {
100
+ var bounding_box = node.getBoundingClientRect();
101
+ options['clientX'] = bounding_box.left + x;
102
+ options['clientY'] = bounding_box.top + y;
103
+ }
104
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
105
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
106
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
107
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
108
+ node.dispatchEvent(new MouseEvent('mousedown', options));
109
+ node.dispatchEvent(new MouseEvent('mouseup', options));
110
+ node.dispatchEvent(new MouseEvent('dblclick', options));
111
+ return options;
112
+ }, AllElementHandles[#{node.handle}]);
113
+ await Promise.race([response_watcher, navigation_watcher]);
114
+ JAVASCRIPT
115
+ end
116
+
117
+ def node_drag_to(node, other_node)
118
+ if node[:draggable]
119
+ await <<~JAVASCRIPT
120
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
121
+ document.addEventListener('mousedown', event => {
122
+ window.puppeteer_mousedown_prevented = event.defaultPrevented;
123
+ }, { once: true, passive: true });
124
+ }, AllElementHandles[#{node.handle}]);
125
+ JAVASCRIPT
126
+ # TODO use scrollIntoView once chromium bug is fixed
127
+ # https://bugs.chromium.org/p/chromium/issues/detail?id=939740&can=2&start=0&num=100&q=mousemove%20scrollintoview&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=
128
+ await <<~JAVASCRIPT
129
+ var node_handle = #{node.handle};
130
+ await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
131
+ var n = node;
132
+ var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
133
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
134
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
135
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
136
+ if (!node_in_view) { node.scrollTo(0,0); };
137
+ setTimeout(function(){
138
+ var client_rect = node.getBoundingClientRect();
139
+ var x = (client_rect.left + (client_rect.width / 2));
140
+ var y = (client_rect.top + (client_rect.height / 2));
141
+ node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
142
+ setTimeout(function(){
143
+ node.dispatchEvent(new MouseEvent('mousedown', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
144
+ if (window.puppeteer_mousedown_prevented) {
145
+ n = other_node;
146
+ top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
147
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
148
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
149
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
150
+ if (!node_in_view) { other_node.scrollTo(0,0) };
151
+ setTimeout(function(){
152
+ client_rect = other_node.getBoundingClientRect();
153
+ x = (client_rect.left + (client_rect.width / 2));
154
+ y = (client_rect.top + (client_rect.height / 2));
155
+ node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
156
+ setTimeout(function(){
157
+ node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
158
+ }, #{@puppeteer_reaction_timeout/2});
159
+ }, #{@puppeteer_reaction_timeout});
160
+ } else {
161
+ var dt = new DataTransfer();
162
+ if (node.tagName == 'A'){ dt.setData('text/uri-list', node.href); dt.setData('text', node.href); }
163
+ if (node.tagName == 'IMG'){ dt.setData('text/uri-list', node.src); dt.setData('text', node.src); }
164
+ var opts = { cancelable: true, bubbles: true, dataTransfer: dt };
165
+ var dragEvent = new DragEvent('dragstart', opts);
166
+ node.dispatchEvent(dragEvent);
167
+ n = other_node;
168
+ top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
169
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
170
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
171
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
172
+ if (!node_in_view) { other_node.scrollTo(0,0); };
173
+ setTimeout(function(){
174
+ var rect = node.getBoundingClientRect()
175
+ var node_center = new DOMPoint((rect.left + rect.right)/2, (rect.top + rect.bottom)/2);
176
+ var other_rect = other_node.getBoundingClientRect();
177
+ var other_point = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
178
+ var entry_point = null;
179
+ var slope = (other_point.y - other_point.y) / (other_point.x - node_center.x);
180
+ if (other_point.x <= other_point.x) { // left side
181
+ var minXy = slope * (other_rect.left - node_center.x) + node_center.y;
182
+ if (other_rect.top <= minXy && minXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.left, minXy); }
183
+ }
184
+ if (node_center.x >= other_point.x) { // right side
185
+ var maxXy = slope * (other_rect.right - node_center.x) + node_center.y;
186
+ if (other_rect.top <= maxXy && maxXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.right, maxXy); }
187
+ }
188
+ if (node_center.y <= other_point.y) { // top side
189
+ var minYx = (other_point.top - node_center.y) / slope + node_center.x;
190
+ if (other_rect.left <= minYx && minYx <= other_rect.right) { entry_point = new DOMPoint(minYx, other_rect.top); }
191
+ }
192
+ if (node_center.y >= other_point.y) { // bottom side
193
+ var maxYx = (other_rect.bottom - node_center.y) / slope + node_center.x;
194
+ if (other_rect.left <= maxYx && maxYx <= other_rect.right) { entry_point = new DOMPoint(maxYx, other_rect.bottom); }
195
+ }
196
+ if (!entry_point) {
197
+ entry_point = new DOMPoint(node_center.x, node_center.y);
198
+ }
199
+ var drag_over_event = new DragEvent('dragover', {clientX: entry_point.x, clientY: entry_point.y, bubbles: true, cancelable: true});
200
+ other_node.dispatchEvent(drag_over_event);
201
+ var other_center = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
202
+ drag_over_event = new DragEvent('dragover', {clientX: targetCenter.x, clientY: targetCenter.y, bubbles: true, cancelable: true});
203
+ other_node.dispatchEvent(drag_over_event);
204
+ other_node.dispatchEvent(new DragEvent('dragleave', {bubbles: true, cancelable: true}));
205
+ if (drag_over_event.defaultPrevented) {
206
+ other_node.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
207
+ }
208
+ node.dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
209
+ client_rect = other_node.getBoundingClientRect();
210
+ x = (client_rect.left + (client_rect.width / 2));
211
+ y = (client_rect.top + (client_rect.height / 2));
212
+ node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
213
+ }, #{@puppeteer_reaction_timeout});
214
+ }
215
+ }, #{@puppeteer_reaction_timeout/2});
216
+ }, #{@puppeteer_reaction_timeout});
217
+ }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
218
+ JAVASCRIPT
219
+ sleep (@reaction_timeout * 3) + 0.2
220
+ else
221
+ await <<~JAVASCRIPT
222
+ var node_handle = #{node.handle};
223
+ await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
224
+ var n = node;
225
+ var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
226
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
227
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
228
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
229
+ if (!node_in_view) { res = (n === node); node.scrollTo(0,0); };
230
+ setTimeout(function() {
231
+ var client_rect = node.getBoundingClientRect();
232
+ var x = (client_rect.left + (client_rect.width / 2));
233
+ var y = (client_rect.top + (client_rect.height / 2));
234
+ node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
235
+ setTimeout(function() {
236
+ node.dispatchEvent(new MouseEvent('mousedown', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
237
+ var n = other_node;
238
+ var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
239
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
240
+ var other_node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
241
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
242
+ if (!other_node_in_view) { other_node.scrollTo(0,0); };
243
+ setTimeout(function() {
244
+ var other_client_rect = other_node.getBoundingClientRect();
245
+ var x = (other_client_rect.left + (other_client_rect.width / 2));
246
+ var y = (other_client_rect.top + (other_client_rect.height / 2));
247
+ node.dispatchEvent(new MouseEvent('mousemove', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
248
+ setTimeout(function() {
249
+ node.dispatchEvent(new MouseEvent('mouseup', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
250
+ }, #{@puppeteer_reaction_timeout/2});
251
+ }, #{@puppeteer_reaction_timeout});
252
+ }, #{@puppeteer_reaction_timeout/2});
253
+ }, #{@puppeteer_reaction_timeout});
254
+ }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
255
+ JAVASCRIPT
256
+ sleep (@reaction_timeout * 3) + 0.2
257
+ end
258
+ end
259
+
260
+ def node_equal(node, other_node)
261
+ await <<~JAVASCRIPT
262
+ var node_handle = #{node.handle};
263
+ var other_handle = #{other_node.handle};
264
+ if (AllElementHandles[node_handle] && AllElementHandles[other_handle]) {
265
+ try {
266
+ var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node){
267
+ return (node === other_node);
268
+ }, AllElementHandles[node_handle],AllElementHandles[other_handle]);
269
+ LastResult = await handle.jsonValue();
270
+ } catch (err) {
271
+ LastResult = false;
272
+ }
273
+ }
274
+ JAVASCRIPT
275
+ end
276
+
277
+ def node_execute_script(node, script, *args)
278
+ await <<~JAVASCRIPT
279
+ var node_handle = #{node.handle};
280
+ await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
281
+ arguments.unshift(node);
282
+ #{script}
283
+ }, AllElementHandles[node_handle], #{args[1..-1]});
284
+ JAVASCRIPT
285
+ end
286
+
287
+ def node_evaluate_script(node, script, *args)
288
+ await <<~JAVASCRIPT
289
+ var node_handle = #{node.handle};
290
+ handle = await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
291
+ arguments.unshift(node);
292
+ return #{script};
293
+ }, AllElementHandles[node_handle], #{args[1..-1]});
294
+ LastResult = await handle.jsonValue();
295
+ JAVASCRIPT
296
+ end
297
+
298
+ def node_find(node, selector)
299
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
300
+ node_data = await <<~JAVASCRIPT
301
+ var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
302
+ if (element_handle) {
303
+ var node_handle = RegisterElementHandle(element_handle);
304
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
305
+ var name = node.nodeName;
306
+ var tag = node.tagName.toLowerCase();
307
+ var type = null;
308
+ if (tag === 'input') { type = node.getAttribute('type'); }
309
+ return [name, tag, type, node.isContentEditable];
310
+ }, AllElementHandles[node_handle]);
311
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
312
+ }
313
+ JAVASCRIPT
314
+ if node_data
315
+ node_data[:css_selector] = selector
316
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
317
+ else
318
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
319
+ end
320
+ end
321
+
322
+ def node_find_all(node, selector)
323
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
324
+ node_data_array = await <<~JAVASCRIPT
325
+ var node_data_array = [];
326
+ var element_handle_array = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
327
+ if (element_handle_array) {
328
+
329
+ for (var i=0; i<element_handle_array.length; i++) {
330
+ var node_handle = RegisterElementHandle(element_handle_array[i]);
331
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
332
+ var name = node.nodeName;
333
+ var tag = node.tagName.toLowerCase();
334
+ var type = null;
335
+ if (tag === 'input') { type = node.getAttribute('type'); }
336
+ return [name, tag, type, node.isContentEditable];
337
+ }, AllElementHandles[node_handle]);
338
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
339
+ }
340
+ }
341
+ LastResult = node_data_array;
342
+ JAVASCRIPT
343
+ node_data_array.map do |node_data|
344
+ node_data[:css_selector] = selector
345
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
346
+ end
347
+ end
348
+
349
+ def node_find_all_xpath(node, query)
350
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
351
+ node_data_array = await <<~JAVASCRIPT
352
+ var node_data_array = [];
353
+ var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
354
+ if (element_handle_array) {
355
+ for (var i=0; i<element_handle_array.length; i++) {
356
+ var node_handle = RegisterElementHandle(element_handle_array[i]);
357
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
358
+ var name = node.nodeName;
359
+ var tag = node.tagName.toLowerCase();
360
+ var type = null;
361
+ if (tag === 'input') { type = node.getAttribute('type'); }
362
+ return [name, tag, type, node.isContentEditable];
363
+ }, AllElementHandles[node_handle]);
364
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
365
+ }
366
+ }
367
+ LastResult = node_data_array;
368
+ JAVASCRIPT
369
+ node_data_array.map do |node_data|
370
+ node_data[:xpath_query] = query
371
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
372
+ end
373
+ end
374
+
375
+ def node_find_xpath(node, query)
376
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
377
+ node_data = await <<~JAVASCRIPT
378
+ var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
379
+ var element_handle = (element_handle_array) ? element_handle_array[0] : null;
380
+ if (element_handle) {
381
+ var node_handle = RegisterElementHandle(element_handle);
382
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
383
+ var name = node.nodeName;
384
+ var tag = node.tagName.toLowerCase();
385
+ var type = null;
386
+ if (tag === 'input') { type = node.getAttribute('type'); }
387
+ return [name, tag, type, node.isContentEditable];
388
+ }, AllElementHandles[node_handle]);
389
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
390
+ }
391
+ JAVASCRIPT
392
+ if node_data
393
+ node_data[:xpath_query] = query
394
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
395
+ else
396
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(query)
397
+ end
398
+ end
399
+
400
+ def node_focus(node)
401
+ await "await AllElementHandles[#{node.handle}].focus();"
402
+ end
403
+
404
+ def node_get_attribute(node, attribute)
405
+ await <<~JAVASCRIPT
406
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, attribute){
407
+ return node.getAttribute(attribute);
408
+ }, AllElementHandles[#{node.handle}], '#{attribute}');
409
+ JAVASCRIPT
410
+ end
411
+
412
+ def node_get_property(node, property)
413
+ await <<~JAVASCRIPT
414
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, property){
415
+ return node[property];
416
+ }, AllElementHandles[#{node.handle}], '#{property}');
417
+ JAVASCRIPT
418
+ end
419
+
420
+ def node_hover(node)
421
+ await "await AllElementHandles[#{node.handle}].hover(); }"
422
+ end
423
+
424
+ def node_in_viewport?(node)
425
+ await <<~JAVASCRIPT
426
+ var node_handle = #{node.handle};
427
+ var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node) {
428
+ var top = node.offsetTop, left = node.offsetLeft, width = node.offsetWidth, height = node.offsetHeight;
429
+ while(node.offsetParent) { node = node.offsetParent; top += node.offsetTop; left += node.offsetLeft; }
430
+ return (top >= window.pageYOffset && left >= window.pageXOffset &&
431
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
432
+ }, AllElementHandles[node_handle]);
433
+ LastResult = await handle.jsonValue();
434
+ JAVASCRIPT
435
+ end
436
+
437
+ def node_render_base64(node, **options)
438
+ # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
439
+ final_options = ["encoding: 'base64'"]
440
+ if options.key?(:format)
441
+ options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
442
+ final_options << "type: '#{options.delete(:format).to_s.downcase}'"
443
+ end
444
+ final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
445
+ box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
446
+ final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
447
+ options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
448
+ await "LastResult = await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
449
+ end
450
+
451
+ def node_right_click(node, x: nil, y: nil, modifiers: nil)
452
+ # modifier_keys: :alt, :control, :meta, :shift
453
+ # offset: { x: int, y: int }
454
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
455
+ modifiers = [] unless modifiers
456
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
457
+ await <<~JAVASCRIPT
458
+ var response_event_occurred = false;
459
+ var response_handler = function(event){ response_event_occurred = true; };
460
+ var response_watcher = new Promise(function(resolve, reject){
461
+ setTimeout(function(){
462
+ if (!response_event_occurred) { resolve(true); }
463
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
464
+ AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
465
+ }, #{@puppeteer_reaction_timeout});
466
+ });
467
+ AllPageHandles[#{node.document.handle}].on('response', response_handler);
468
+ var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
469
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
470
+ var options = {button: 2, bubbles: true, cancelable: true};
471
+ var x = #{x ? x : 'null'};
472
+ var y = #{y ? y : 'null'};
473
+ var modifiers = #{modifiers};
474
+ if (x && y) {
475
+ var bounding_box = node.getBoundingClientRect();
476
+ options['clientX'] = bounding_box.left + x;
477
+ options['clientY'] = bounding_box.top + y;
478
+ }
479
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
480
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
481
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
482
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
483
+ node.dispatchEvent(new MouseEvent('mousedown', options));
484
+ node.dispatchEvent(new MouseEvent('mouseup', options));
485
+ node.dispatchEvent(new MouseEvent('contextmenu', options));
486
+ return options;
487
+ }, AllElementHandles[#{node.handle}]);
488
+ await Promise.race([response_watcher, navigation_watcher]);
489
+ JAVASCRIPT
490
+ end
491
+
492
+ def node_save_screenshot(node, path, **options)
493
+ # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
494
+ absolute_path = File.absolute_path(path)
495
+ final_options = ["path: '#{absolute_path}'"]
496
+ if options.key?(:format)
497
+ options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
498
+ final_options << "type: '#{options.delete(:format).to_s.downcase}'"
499
+ end
500
+ final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
501
+ box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
502
+ final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
503
+ options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
504
+ await "await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
505
+ end
506
+
507
+ def node_scroll_by(node, x, y)
508
+ await <<~JAVASCRIPT
509
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
510
+ node.scrollBy(#{x}, #{y});
511
+ }, AllElementHandles[#{node.handle}]);
512
+ JAVASCRIPT
513
+ end
514
+
515
+ def node_scroll_into_view(node)
516
+ await <<~JAVASCRIPT
517
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
518
+ node.scrollIntoView();
519
+ }, AllElementHandles[#{node.handle}]);
520
+ JAVASCRIPT
521
+ end
522
+
523
+ def node_scroll_to(node, x, y)
524
+ await <<~JAVASCRIPT
525
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
526
+ node.scrollTo(#{x}, #{y});
527
+ }, AllElementHandles[#{node.handle}]);
528
+ JAVASCRIPT
529
+ end
530
+
531
+ def node_select(node)
532
+ # In the case of an OPTION tag, the change event should come
533
+ # from the parent SELECT
534
+ await <<~JAVASCRIPT
535
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
536
+ var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
537
+ ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
538
+ if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
539
+ else if (node.value == false && !node.parentNode.multiple) { return false; }
540
+ else {
541
+ node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
542
+ node.selected = true;
543
+ var element;
544
+ if (node.nodeName == "OPTION") {
545
+ element = node.parentNode;
546
+ if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
547
+ } else { element = node; }
548
+ element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
549
+ node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
550
+ return true;
551
+ }
552
+ }, AllElementHandles[#{node.handle}]);
553
+ JAVASCRIPT
554
+ end
555
+
556
+ def node_style(node, *styles)
557
+ await <<~JAVASCRIPT
558
+ var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node, styles){
559
+ return = window.getComputedStyle(node);
560
+ }, AllElementHandles[#{node.handle}], #{styles});
561
+ LastResult = await handle.jsonValue();
562
+ JAVASCRIPT
563
+ end
564
+
565
+ def node_type_keys(node, *keys)
566
+ cjs = "await AllElementHandles[#{node.handle}].focus();\n"
567
+ top_modifiers = []
568
+ keys.each do |key|
569
+ if key.is_a?(String)
570
+ key.each_char do |c|
571
+ need_shift = /[[:upper:]]/.match(c)
572
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
573
+ c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
574
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
575
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
576
+ end
577
+ elsif key.is_a?(Symbol)
578
+ if %i[ctrl Ctrl].include?(key)
579
+ key = :control
580
+ elsif %i[command Command Meta].include?(key)
581
+ key = :meta
582
+ elsif %i[divide Divide].include?(key)
583
+ key = :numpad_divide
584
+ elsif %i[decimal Decimal].include?(key)
585
+ key = :numpad_decimal
586
+ elsif %i[left right up down].include?(key)
587
+ key = "arrow_#{key}".to_sym
588
+ end
589
+ if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(key)
590
+ top_modifiers << key
591
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{key.to_s.camelize}');\n"
592
+ else
593
+ cjs << "await AllElementHandles[#{node.handle}].press('#{key.to_s.camelize}');\n"
594
+ end
595
+ elsif key.is_a?(Array)
596
+ modifiers = []
597
+ key.each do |k|
598
+ if k.is_a?(Symbol)
599
+ if %i[ctrl Ctrl].include?(k)
600
+ k = :control
601
+ elsif %i[command Command Meta].include?(k)
602
+ k = :meta
603
+ elsif %i[divide Divide].include?(k)
604
+ k = :numpad_divide
605
+ elsif %i[decimal Decimal].include?(k)
606
+ k = :numpad_decimal
607
+ elsif %i[left right up down].include?(key)
608
+ k = "arrow_#{key}".to_sym
609
+ end
610
+ if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(k)
611
+ modifiers << k
612
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{k.to_s.camelize}');\n"
613
+ else
614
+ cjs << "await AllElementHandles[#{node.handle}].press('#{k.to_s.camelize}');\n"
615
+ end
616
+ elsif k.is_a?(String)
617
+ k.each_char do |c|
618
+ need_shift = /[[:upper:]]/.match(c)
619
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
620
+ c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
621
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
622
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
623
+ end
624
+ end
625
+ end
626
+ modifiers.reverse.each do |k|
627
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{k.to_s.camelize}');\n"
628
+ end
629
+ end
630
+ end
631
+ top_modifiers.reverse.each do |key|
632
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{key.to_s.camelize}');\n"
633
+ end
634
+ await(cjs)
635
+ end
636
+
637
+ def node_unselect(node)
638
+ # In the case of an OPTION tag, the change event should come
639
+ # from the parent SELECT
640
+ await <<~JAVASCRIPT
641
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
642
+ var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
643
+ ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
644
+ if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
645
+ else if (node.value == false && !node.parentNode.multiple) { return false; }
646
+ else {
647
+ node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
648
+ node.selected = false;
649
+ var element;
650
+ if (node.nodeName == "OPTION") {
651
+ element = node.parentNode;
652
+ if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
653
+ } else { element = node; }
654
+ element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
655
+ node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
656
+ return true;
657
+ }
658
+ }, AllElementHandles[#{node.handle}]);
659
+ JAVASCRIPT
660
+ end
661
+
662
+ def node_value(node)
663
+ await <<~JAVASCRIPT
664
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
665
+ if (node.tagName == "SELECT" && node.multiple) {
666
+ var result = []
667
+ for (let i = 0, len = node.children.length; i < len; i++) {
668
+ var option = node.children[i];
669
+ if (option.selected) { result.push(option.value); }
670
+ }
671
+ return result;
672
+ } else if (node.isContentEditable) { return node.textContent; }
673
+ else { return node.value; }
674
+ }, AllElementHandles[#{node.handle}]);
675
+ JAVASCRIPT
676
+ end
677
+
678
+ def node_value=(node, value)
679
+ raise Isomorfeus::Puppetmaster::ReadOnlyElementError if node.readonly?
680
+ real_value = "`#{value}`"
681
+ if %w[input textarea].include?(node.tag)
682
+ await <<~JAVASCRIPT
683
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
684
+ if (node.maxLength >= 0) { value = value.substr(0, node.maxLength); }
685
+ node.dispatchEvent(new FocusEvent("focus",{bubbles: true, cancelable: true}));
686
+ var tag_name = node.tagName.toLowerCase();
687
+ if (tag_name === 'input') {
688
+ node.value = '';
689
+ if (node.type === "number" || node.type === "date") {
690
+ for (var i = 0; i < value.length; i++) {
691
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
692
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
693
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
694
+ }
695
+ node.value = value;
696
+ }
697
+ else if (node.type == "time") { node.value = new Date(value).toTimeString().split(" ")[0]; }
698
+ else if (node.type == "datetime-local") {
699
+ value = new Date(value);
700
+ var year = value.getFullYear();
701
+ var month = ("0" + (value.getMonth() + 1)).slice(-2);
702
+ var date = ("0" + value.getDate()).slice(-2);
703
+ var hour = ("0" + value.getHours()).slice(-2);
704
+ var min = ("0" + value.getMinutes()).slice(-2);
705
+ var sec = ("0" + value.getSeconds()).slice(-2);
706
+ value = `${year}-${month}-${date}T${hour}:${min}:${sec}`;
707
+ for (var i = 0; i < value.length; i++) {
708
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
709
+ node.value = node.value + value[i];
710
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
711
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
712
+ }
713
+ } else if (node.type === 'checkbox' || node.type === 'radio') { node.checked = value; }
714
+ else {
715
+ for (var i = 0; i < value.length; i++) {
716
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
717
+ node.value = node.value + value[i];
718
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
719
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
720
+ }
721
+ }
722
+ } else if (tag_name === 'textarea') {
723
+ for (var i = 0; i < value.length; i++) {
724
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
725
+ node.value = node.value + value[i];
726
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
727
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
728
+ }
729
+ }
730
+ }, AllElementHandles[#{node.handle}], #{real_value});
731
+ JAVASCRIPT
732
+ else
733
+ await <<~JAVASCRIPT
734
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
735
+ if (node.isContentEditable) {
736
+ var range = document.createRange();
737
+ range.selectNodeContents(node);
738
+ window.getSelection().removeAllRanges();
739
+ window.getSelection().addRange(range);
740
+ window.getSelection().deleteFromDocument();
741
+ window.getSelection().removeAllRanges();
742
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
743
+ node.textContent = value;
744
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
745
+ }
746
+ }, AllElementHandles[#{node.handle}], #{real_value});
747
+ JAVASCRIPT
748
+ end
749
+ real_value
750
+ end
751
+
752
+ def node_visible_text(node)
753
+ # if node is AREA, check visibility of relevant image
754
+ text = await <<~JAVASCRIPT
755
+ var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
756
+ var temp_node = node;
757
+ var mapName, style;
758
+ if (node.tagName === "AREA") {
759
+ mapName = document.evaluate("./ancestor::map/@name", node, null, XPathResult.STRING_TYPE, null).stringValue;
760
+ temp_node = document.querySelector(`img[usemap="#${mapName}"]`);
761
+ if (temp_node == null) { return ''; }
762
+ }
763
+ temp_node = node;
764
+ while (temp_node) {
765
+ style = window.getComputedStyle(node);
766
+ if (style.display === "none" || style.visibility === "hidden" || parseFloat(style.opacity) === 0) { return ''; }
767
+ temp_node = temp_node.parentElement;
768
+ }
769
+ if (node.nodeName == "TEXTAREA" || node instanceof SVGElement) { return node.textContent; }
770
+ else { return node.innerText; }
771
+ }, AllElementHandles[#{node.handle}]);
772
+ LastResult = await handle.jsonValue();
773
+ JAVASCRIPT
774
+ text.gsub(/\A[[:space:]&&[^\u00a0]]+/, "").gsub(/[[:space:]&&[^\u00a0]]+\z/, "").gsub(/\n+/, "\n").tr("\u00a0", " ")
775
+ end
776
+
777
+ def node_visible?(node)
778
+ await <<~JAVASCRIPT
779
+ var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
780
+ if (node.tagName == 'AREA'){
781
+ const map_name = document.evaluate('./ancestor::map/@name', node, null, XPathResult.STRING_TYPE, null).stringValue;
782
+ node = document.querySelector(`img[usemap='#${map_name}']`);
783
+ if (!node){ return false; }
784
+ }
785
+ var forced_visible = false;
786
+ while (node) {
787
+ const style = window.getComputedStyle(node);
788
+ if (style.visibility == 'visible') { forced_visible = true; }
789
+ if ((style.display == 'none') || ((style.visibility == 'hidden') && !forced_visible) || (parseFloat(style.opacity) == 0)) {
790
+ return false;
791
+ }
792
+ node = node.parentElement;
793
+ }
794
+ return true;
795
+ }, AllElementHandles[#{node.handle}]);
796
+ LastResult = await handle.jsonValue();
797
+ JAVASCRIPT
798
+ end
799
+
800
+ def node_wait_for(node, selector)
801
+ # TODO setTimeout
802
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
803
+ node_data = await <<~JAVASCRIPT
804
+ var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
805
+ if (element_handle) {
806
+ var node_handle = RegisterElementHandle(element_handle);
807
+ var handle = await AllElementHandles[node_handle].evaluate((node) => {
808
+ var name = node.nodeName;
809
+ var tag = node.tagName.toLower();
810
+ var type = null;
811
+ if (tag === 'input') { type = node.getAttribute('type'); }
812
+ return [name, tag, type, node.isContentEditable];
813
+ }, AllElementHandles[node_handle]);
814
+ var tt = await handle.jsonValue();
815
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
816
+ }
817
+ JAVASCRIPT
818
+ if node_data
819
+ node_data[:css_selector] = selector
820
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
821
+ end
822
+ end
823
+
824
+ def node_wait_for_xpath(node, query)
825
+ # TODO setTimeout
826
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
827
+ node_data = await <<~JAVASCRIPT
828
+ var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
829
+ var element_handle = (element_handle_array) ? element_handle_array[0] : null;
830
+ if (element_handle) {
831
+ var node_handle = RegisterElementHandle(element_handle);
832
+ var handle = await AllElementHandles[node_handle].evaluate((node) => {
833
+ var name = node.nodeName;
834
+ var tag = node.tagName.toLower();
835
+ var type = null;
836
+ if (tag === 'input') { type = node.getAttribute('type'); }
837
+ return [name, tag, type, node.isContentEditable];
838
+ }, AllElementHandles[node_handle]);
839
+ var tt = await handle.jsonValue();
840
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
841
+ }
842
+ JAVASCRIPT
843
+ if node_data
844
+ node_data[:xpath_query] = query
845
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
846
+ end
847
+ end
848
+ end
849
+ end
850
+ end
851
+ end