postdoc 0.1.2 → 0.2.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (372) hide show
  1. checksums.yaml +5 -5
  2. data/lib/pdf.js +27 -0
  3. data/lib/postdoc.rb +3 -7
  4. data/node_modules/agent-base/History.md +113 -0
  5. data/node_modules/agent-base/README.md +145 -0
  6. data/node_modules/agent-base/index.js +160 -0
  7. data/node_modules/agent-base/package.json +35 -0
  8. data/node_modules/agent-base/patch-core.js +37 -0
  9. data/node_modules/agent-base/test/ssl-cert-snakeoil.key +15 -0
  10. data/node_modules/agent-base/test/ssl-cert-snakeoil.pem +12 -0
  11. data/node_modules/agent-base/test/test.js +673 -0
  12. data/node_modules/async-limiter/LICENSE +8 -0
  13. data/node_modules/async-limiter/coverage/coverage.json +1 -0
  14. data/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.html +73 -0
  15. data/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.js.html +246 -0
  16. data/node_modules/async-limiter/coverage/lcov-report/base.css +182 -0
  17. data/node_modules/async-limiter/coverage/lcov-report/index.html +73 -0
  18. data/node_modules/async-limiter/coverage/lcov-report/prettify.css +1 -0
  19. data/node_modules/async-limiter/coverage/lcov-report/prettify.js +1 -0
  20. data/node_modules/async-limiter/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  21. data/node_modules/async-limiter/coverage/lcov-report/sorter.js +156 -0
  22. data/node_modules/async-limiter/coverage/lcov.info +74 -0
  23. data/node_modules/async-limiter/index.js +67 -0
  24. data/node_modules/async-limiter/package.json +35 -0
  25. data/node_modules/async-limiter/readme.md +132 -0
  26. data/node_modules/balanced-match/LICENSE.md +21 -0
  27. data/node_modules/balanced-match/README.md +91 -0
  28. data/node_modules/balanced-match/index.js +59 -0
  29. data/node_modules/balanced-match/package.json +49 -0
  30. data/node_modules/brace-expansion/LICENSE +21 -0
  31. data/node_modules/brace-expansion/README.md +129 -0
  32. data/node_modules/brace-expansion/index.js +201 -0
  33. data/node_modules/brace-expansion/package.json +47 -0
  34. data/node_modules/buffer-from/index.js +69 -0
  35. data/node_modules/buffer-from/package.json +16 -0
  36. data/node_modules/buffer-from/readme.md +69 -0
  37. data/node_modules/buffer-from/test.js +12 -0
  38. data/node_modules/concat-map/LICENSE +18 -0
  39. data/node_modules/concat-map/README.markdown +62 -0
  40. data/node_modules/concat-map/example/map.js +6 -0
  41. data/node_modules/concat-map/index.js +13 -0
  42. data/node_modules/concat-map/package.json +43 -0
  43. data/node_modules/concat-map/test/map.js +39 -0
  44. data/node_modules/concat-stream/LICENSE +24 -0
  45. data/node_modules/concat-stream/index.js +144 -0
  46. data/node_modules/concat-stream/package.json +55 -0
  47. data/node_modules/concat-stream/readme.md +102 -0
  48. data/node_modules/core-util-is/LICENSE +19 -0
  49. data/node_modules/core-util-is/README.md +3 -0
  50. data/node_modules/core-util-is/float.patch +604 -0
  51. data/node_modules/core-util-is/lib/util.js +107 -0
  52. data/node_modules/core-util-is/package.json +32 -0
  53. data/node_modules/core-util-is/test.js +68 -0
  54. data/node_modules/debug/CHANGELOG.md +395 -0
  55. data/node_modules/debug/LICENSE +19 -0
  56. data/node_modules/debug/Makefile +58 -0
  57. data/node_modules/debug/README.md +368 -0
  58. data/node_modules/debug/karma.conf.js +70 -0
  59. data/node_modules/debug/node.js +1 -0
  60. data/node_modules/debug/package.json +43 -0
  61. data/node_modules/debug/src/browser.js +195 -0
  62. data/node_modules/debug/src/debug.js +225 -0
  63. data/node_modules/debug/src/index.js +10 -0
  64. data/node_modules/debug/src/node.js +186 -0
  65. data/node_modules/es6-promise/CHANGELOG.md +151 -0
  66. data/node_modules/es6-promise/LICENSE +19 -0
  67. data/node_modules/es6-promise/README.md +97 -0
  68. data/node_modules/es6-promise/auto.js +4 -0
  69. data/node_modules/es6-promise/dist/es6-promise.auto.js +1181 -0
  70. data/node_modules/es6-promise/dist/es6-promise.auto.map +1 -0
  71. data/node_modules/es6-promise/dist/es6-promise.auto.min.js +1 -0
  72. data/node_modules/es6-promise/dist/es6-promise.auto.min.map +1 -0
  73. data/node_modules/es6-promise/dist/es6-promise.js +1179 -0
  74. data/node_modules/es6-promise/dist/es6-promise.map +1 -0
  75. data/node_modules/es6-promise/dist/es6-promise.min.js +1 -0
  76. data/node_modules/es6-promise/dist/es6-promise.min.map +1 -0
  77. data/node_modules/es6-promise/es6-promise.d.ts +81 -0
  78. data/node_modules/es6-promise/lib/es6-promise/-internal.js +266 -0
  79. data/node_modules/es6-promise/lib/es6-promise/asap.js +119 -0
  80. data/node_modules/es6-promise/lib/es6-promise/enumerator.js +113 -0
  81. data/node_modules/es6-promise/lib/es6-promise/polyfill.js +35 -0
  82. data/node_modules/es6-promise/lib/es6-promise/promise/all.js +52 -0
  83. data/node_modules/es6-promise/lib/es6-promise/promise/race.js +84 -0
  84. data/node_modules/es6-promise/lib/es6-promise/promise/reject.js +46 -0
  85. data/node_modules/es6-promise/lib/es6-promise/promise/resolve.js +48 -0
  86. data/node_modules/es6-promise/lib/es6-promise/promise.js +427 -0
  87. data/node_modules/es6-promise/lib/es6-promise/then.js +32 -0
  88. data/node_modules/es6-promise/lib/es6-promise/utils.js +21 -0
  89. data/node_modules/es6-promise/lib/es6-promise.auto.js +3 -0
  90. data/node_modules/es6-promise/lib/es6-promise.js +7 -0
  91. data/node_modules/es6-promise/package.json +75 -0
  92. data/node_modules/es6-promisify/README.md +89 -0
  93. data/node_modules/es6-promisify/dist/promise.js +73 -0
  94. data/node_modules/es6-promisify/dist/promisify.js +85 -0
  95. data/node_modules/es6-promisify/package.json +41 -0
  96. data/node_modules/extract-zip/CONTRIBUTING.md +1 -0
  97. data/node_modules/extract-zip/LICENSE +23 -0
  98. data/node_modules/extract-zip/cli.js +20 -0
  99. data/node_modules/extract-zip/index.js +205 -0
  100. data/node_modules/extract-zip/node_modules/debug/CHANGELOG.md +362 -0
  101. data/node_modules/extract-zip/node_modules/debug/LICENSE +19 -0
  102. data/node_modules/extract-zip/node_modules/debug/Makefile +50 -0
  103. data/node_modules/extract-zip/node_modules/debug/README.md +312 -0
  104. data/node_modules/extract-zip/node_modules/debug/component.json +19 -0
  105. data/node_modules/extract-zip/node_modules/debug/karma.conf.js +70 -0
  106. data/node_modules/extract-zip/node_modules/debug/node.js +1 -0
  107. data/node_modules/extract-zip/node_modules/debug/package.json +49 -0
  108. data/node_modules/extract-zip/node_modules/debug/src/browser.js +185 -0
  109. data/node_modules/extract-zip/node_modules/debug/src/debug.js +202 -0
  110. data/node_modules/extract-zip/node_modules/debug/src/index.js +10 -0
  111. data/node_modules/extract-zip/node_modules/debug/src/inspector-log.js +15 -0
  112. data/node_modules/extract-zip/node_modules/debug/src/node.js +248 -0
  113. data/node_modules/extract-zip/package.json +35 -0
  114. data/node_modules/extract-zip/readme.md +49 -0
  115. data/node_modules/fd-slicer/CHANGELOG.md +49 -0
  116. data/node_modules/fd-slicer/LICENSE +21 -0
  117. data/node_modules/fd-slicer/README.md +189 -0
  118. data/node_modules/fd-slicer/index.js +277 -0
  119. data/node_modules/fd-slicer/package.json +36 -0
  120. data/node_modules/fd-slicer/test/test.js +350 -0
  121. data/node_modules/fs.realpath/LICENSE +43 -0
  122. data/node_modules/fs.realpath/README.md +33 -0
  123. data/node_modules/fs.realpath/index.js +66 -0
  124. data/node_modules/fs.realpath/old.js +303 -0
  125. data/node_modules/fs.realpath/package.json +26 -0
  126. data/node_modules/glob/LICENSE +15 -0
  127. data/node_modules/glob/README.md +368 -0
  128. data/node_modules/glob/changelog.md +67 -0
  129. data/node_modules/glob/common.js +240 -0
  130. data/node_modules/glob/glob.js +790 -0
  131. data/node_modules/glob/package.json +43 -0
  132. data/node_modules/glob/sync.js +486 -0
  133. data/node_modules/https-proxy-agent/History.md +124 -0
  134. data/node_modules/https-proxy-agent/README.md +137 -0
  135. data/node_modules/https-proxy-agent/index.js +229 -0
  136. data/node_modules/https-proxy-agent/package.json +35 -0
  137. data/node_modules/https-proxy-agent/test/ssl-cert-snakeoil.key +15 -0
  138. data/node_modules/https-proxy-agent/test/ssl-cert-snakeoil.pem +12 -0
  139. data/node_modules/https-proxy-agent/test/test.js +342 -0
  140. data/node_modules/inflight/LICENSE +15 -0
  141. data/node_modules/inflight/README.md +37 -0
  142. data/node_modules/inflight/inflight.js +54 -0
  143. data/node_modules/inflight/package.json +29 -0
  144. data/node_modules/inherits/LICENSE +16 -0
  145. data/node_modules/inherits/README.md +42 -0
  146. data/node_modules/inherits/inherits.js +7 -0
  147. data/node_modules/inherits/inherits_browser.js +23 -0
  148. data/node_modules/inherits/package.json +29 -0
  149. data/node_modules/isarray/Makefile +6 -0
  150. data/node_modules/isarray/README.md +60 -0
  151. data/node_modules/isarray/component.json +19 -0
  152. data/node_modules/isarray/index.js +5 -0
  153. data/node_modules/isarray/package.json +45 -0
  154. data/node_modules/isarray/test.js +20 -0
  155. data/node_modules/mime/CHANGELOG.md +225 -0
  156. data/node_modules/mime/CONTRIBUTING.md +5 -0
  157. data/node_modules/mime/LICENSE +21 -0
  158. data/node_modules/mime/Mime.js +89 -0
  159. data/node_modules/mime/README.md +188 -0
  160. data/node_modules/mime/cli.js +10 -0
  161. data/node_modules/mime/index.js +4 -0
  162. data/node_modules/mime/lite.js +4 -0
  163. data/node_modules/mime/package.json +43 -0
  164. data/node_modules/mime/src/README_js.md +179 -0
  165. data/node_modules/mime/src/build.js +71 -0
  166. data/node_modules/mime/src/test.js +257 -0
  167. data/node_modules/mime/types/other.json +1 -0
  168. data/node_modules/mime/types/standard.json +1 -0
  169. data/node_modules/minimatch/LICENSE +15 -0
  170. data/node_modules/minimatch/README.md +209 -0
  171. data/node_modules/minimatch/minimatch.js +923 -0
  172. data/node_modules/minimatch/package.json +30 -0
  173. data/node_modules/minimist/LICENSE +18 -0
  174. data/node_modules/minimist/example/parse.js +2 -0
  175. data/node_modules/minimist/index.js +187 -0
  176. data/node_modules/minimist/package.json +40 -0
  177. data/node_modules/minimist/readme.markdown +73 -0
  178. data/node_modules/minimist/test/dash.js +24 -0
  179. data/node_modules/minimist/test/default_bool.js +20 -0
  180. data/node_modules/minimist/test/dotted.js +16 -0
  181. data/node_modules/minimist/test/long.js +31 -0
  182. data/node_modules/minimist/test/parse.js +318 -0
  183. data/node_modules/minimist/test/parse_modified.js +9 -0
  184. data/node_modules/minimist/test/short.js +67 -0
  185. data/node_modules/minimist/test/whitespace.js +8 -0
  186. data/node_modules/mkdirp/LICENSE +21 -0
  187. data/node_modules/mkdirp/bin/cmd.js +33 -0
  188. data/node_modules/mkdirp/bin/usage.txt +12 -0
  189. data/node_modules/mkdirp/examples/pow.js +6 -0
  190. data/node_modules/mkdirp/index.js +98 -0
  191. data/node_modules/mkdirp/package.json +27 -0
  192. data/node_modules/mkdirp/readme.markdown +100 -0
  193. data/node_modules/mkdirp/test/chmod.js +41 -0
  194. data/node_modules/mkdirp/test/clobber.js +38 -0
  195. data/node_modules/mkdirp/test/mkdirp.js +28 -0
  196. data/node_modules/mkdirp/test/opts_fs.js +29 -0
  197. data/node_modules/mkdirp/test/opts_fs_sync.js +27 -0
  198. data/node_modules/mkdirp/test/perm.js +32 -0
  199. data/node_modules/mkdirp/test/perm_sync.js +36 -0
  200. data/node_modules/mkdirp/test/race.js +37 -0
  201. data/node_modules/mkdirp/test/rel.js +32 -0
  202. data/node_modules/mkdirp/test/return.js +25 -0
  203. data/node_modules/mkdirp/test/return_sync.js +24 -0
  204. data/node_modules/mkdirp/test/root.js +19 -0
  205. data/node_modules/mkdirp/test/sync.js +32 -0
  206. data/node_modules/mkdirp/test/umask.js +28 -0
  207. data/node_modules/mkdirp/test/umask_sync.js +32 -0
  208. data/node_modules/ms/index.js +152 -0
  209. data/node_modules/ms/license.md +21 -0
  210. data/node_modules/ms/package.json +37 -0
  211. data/node_modules/ms/readme.md +51 -0
  212. data/node_modules/once/LICENSE +15 -0
  213. data/node_modules/once/README.md +79 -0
  214. data/node_modules/once/once.js +42 -0
  215. data/node_modules/once/package.json +33 -0
  216. data/node_modules/path-is-absolute/index.js +20 -0
  217. data/node_modules/path-is-absolute/license +21 -0
  218. data/node_modules/path-is-absolute/package.json +43 -0
  219. data/node_modules/path-is-absolute/readme.md +59 -0
  220. data/node_modules/pend/LICENSE +23 -0
  221. data/node_modules/pend/README.md +41 -0
  222. data/node_modules/pend/index.js +55 -0
  223. data/node_modules/pend/package.json +18 -0
  224. data/node_modules/pend/test.js +137 -0
  225. data/node_modules/process-nextick-args/index.js +44 -0
  226. data/node_modules/process-nextick-args/license.md +19 -0
  227. data/node_modules/process-nextick-args/package.json +25 -0
  228. data/node_modules/process-nextick-args/readme.md +18 -0
  229. data/node_modules/progress/CHANGELOG.md +115 -0
  230. data/node_modules/progress/LICENSE +22 -0
  231. data/node_modules/progress/Makefile +8 -0
  232. data/node_modules/progress/README.md +146 -0
  233. data/node_modules/progress/index.js +1 -0
  234. data/node_modules/progress/lib/node-progress.js +231 -0
  235. data/node_modules/progress/package.json +25 -0
  236. data/node_modules/proxy-from-env/README.md +131 -0
  237. data/node_modules/proxy-from-env/index.js +103 -0
  238. data/node_modules/proxy-from-env/package.json +35 -0
  239. data/node_modules/proxy-from-env/test.js +393 -0
  240. data/node_modules/puppeteer/CONTRIBUTING.md +206 -0
  241. data/node_modules/puppeteer/DeviceDescriptors.js +704 -0
  242. data/node_modules/puppeteer/LICENSE +202 -0
  243. data/node_modules/puppeteer/README.md +306 -0
  244. data/node_modules/puppeteer/index.js +28 -0
  245. data/node_modules/puppeteer/install.js +122 -0
  246. data/node_modules/puppeteer/lib/Browser.js +186 -0
  247. data/node_modules/puppeteer/lib/BrowserFetcher.js +279 -0
  248. data/node_modules/puppeteer/lib/Connection.js +246 -0
  249. data/node_modules/puppeteer/lib/Coverage.js +301 -0
  250. data/node_modules/puppeteer/lib/Dialog.js +84 -0
  251. data/node_modules/puppeteer/lib/ElementHandle.js +328 -0
  252. data/node_modules/puppeteer/lib/EmulationManager.js +89 -0
  253. data/node_modules/puppeteer/lib/ExecutionContext.js +232 -0
  254. data/node_modules/puppeteer/lib/FrameManager.js +997 -0
  255. data/node_modules/puppeteer/lib/Input.js +309 -0
  256. data/node_modules/puppeteer/lib/Launcher.js +310 -0
  257. data/node_modules/puppeteer/lib/Multimap.js +95 -0
  258. data/node_modules/puppeteer/lib/NavigatorWatcher.js +137 -0
  259. data/node_modules/puppeteer/lib/NetworkManager.js +796 -0
  260. data/node_modules/puppeteer/lib/Page.js +1098 -0
  261. data/node_modules/puppeteer/lib/Pipe.js +69 -0
  262. data/node_modules/puppeteer/lib/Puppeteer.js +60 -0
  263. data/node_modules/puppeteer/lib/Target.js +88 -0
  264. data/node_modules/puppeteer/lib/TaskQueue.js +17 -0
  265. data/node_modules/puppeteer/lib/Tracing.js +99 -0
  266. data/node_modules/puppeteer/lib/USKeyboardLayout.js +281 -0
  267. data/node_modules/puppeteer/lib/helper.js +248 -0
  268. data/node_modules/puppeteer/node6/lib/Browser.js +394 -0
  269. data/node_modules/puppeteer/node6/lib/BrowserFetcher.js +357 -0
  270. data/node_modules/puppeteer/node6/lib/Connection.js +350 -0
  271. data/node_modules/puppeteer/node6/lib/Coverage.js +561 -0
  272. data/node_modules/puppeteer/node6/lib/Dialog.js +136 -0
  273. data/node_modules/puppeteer/node6/lib/ElementHandle.js +796 -0
  274. data/node_modules/puppeteer/node6/lib/EmulationManager.js +115 -0
  275. data/node_modules/puppeteer/node6/lib/ExecutionContext.js +414 -0
  276. data/node_modules/puppeteer/node6/lib/FrameManager.js +1621 -0
  277. data/node_modules/puppeteer/node6/lib/Input.js +569 -0
  278. data/node_modules/puppeteer/node6/lib/Launcher.js +362 -0
  279. data/node_modules/puppeteer/node6/lib/Multimap.js +95 -0
  280. data/node_modules/puppeteer/node6/lib/NavigatorWatcher.js +163 -0
  281. data/node_modules/puppeteer/node6/lib/NetworkManager.js +1108 -0
  282. data/node_modules/puppeteer/node6/lib/Page.js +2242 -0
  283. data/node_modules/puppeteer/node6/lib/Pipe.js +69 -0
  284. data/node_modules/puppeteer/node6/lib/Puppeteer.js +60 -0
  285. data/node_modules/puppeteer/node6/lib/Target.js +114 -0
  286. data/node_modules/puppeteer/node6/lib/TaskQueue.js +17 -0
  287. data/node_modules/puppeteer/node6/lib/Tracing.js +177 -0
  288. data/node_modules/puppeteer/node6/lib/USKeyboardLayout.js +281 -0
  289. data/node_modules/puppeteer/node6/lib/helper.js +274 -0
  290. data/node_modules/puppeteer/package.json +61 -0
  291. data/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  292. data/node_modules/readable-stream/GOVERNANCE.md +136 -0
  293. data/node_modules/readable-stream/LICENSE +47 -0
  294. data/node_modules/readable-stream/README.md +58 -0
  295. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  296. data/node_modules/readable-stream/duplex-browser.js +1 -0
  297. data/node_modules/readable-stream/duplex.js +1 -0
  298. data/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  299. data/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  300. data/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  301. data/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  302. data/node_modules/readable-stream/lib/_stream_writable.js +687 -0
  303. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +79 -0
  304. data/node_modules/readable-stream/lib/internal/streams/destroy.js +74 -0
  305. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  306. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  307. data/node_modules/readable-stream/package.json +52 -0
  308. data/node_modules/readable-stream/passthrough.js +1 -0
  309. data/node_modules/readable-stream/readable-browser.js +7 -0
  310. data/node_modules/readable-stream/readable.js +19 -0
  311. data/node_modules/readable-stream/transform.js +1 -0
  312. data/node_modules/readable-stream/writable-browser.js +1 -0
  313. data/node_modules/readable-stream/writable.js +8 -0
  314. data/node_modules/rimraf/LICENSE +15 -0
  315. data/node_modules/rimraf/README.md +101 -0
  316. data/node_modules/rimraf/bin.js +50 -0
  317. data/node_modules/rimraf/package.json +26 -0
  318. data/node_modules/rimraf/rimraf.js +364 -0
  319. data/node_modules/safe-buffer/LICENSE +21 -0
  320. data/node_modules/safe-buffer/README.md +584 -0
  321. data/node_modules/safe-buffer/index.d.ts +187 -0
  322. data/node_modules/safe-buffer/index.js +62 -0
  323. data/node_modules/safe-buffer/package.json +37 -0
  324. data/node_modules/string_decoder/LICENSE +48 -0
  325. data/node_modules/string_decoder/README.md +47 -0
  326. data/node_modules/string_decoder/lib/string_decoder.js +296 -0
  327. data/node_modules/string_decoder/package.json +31 -0
  328. data/node_modules/typedarray/LICENSE +35 -0
  329. data/node_modules/typedarray/example/tarray.js +4 -0
  330. data/node_modules/typedarray/index.js +630 -0
  331. data/node_modules/typedarray/package.json +55 -0
  332. data/node_modules/typedarray/readme.markdown +61 -0
  333. data/node_modules/typedarray/test/server/undef_globals.js +19 -0
  334. data/node_modules/typedarray/test/tarray.js +10 -0
  335. data/node_modules/ultron/LICENSE +22 -0
  336. data/node_modules/ultron/README.md +113 -0
  337. data/node_modules/ultron/index.js +136 -0
  338. data/node_modules/ultron/package.json +41 -0
  339. data/node_modules/util-deprecate/History.md +16 -0
  340. data/node_modules/util-deprecate/LICENSE +24 -0
  341. data/node_modules/util-deprecate/README.md +53 -0
  342. data/node_modules/util-deprecate/browser.js +67 -0
  343. data/node_modules/util-deprecate/node.js +6 -0
  344. data/node_modules/util-deprecate/package.json +27 -0
  345. data/node_modules/wrappy/LICENSE +15 -0
  346. data/node_modules/wrappy/README.md +36 -0
  347. data/node_modules/wrappy/package.json +29 -0
  348. data/node_modules/wrappy/wrappy.js +33 -0
  349. data/node_modules/ws/LICENSE +21 -0
  350. data/node_modules/ws/README.md +341 -0
  351. data/node_modules/ws/index.js +15 -0
  352. data/node_modules/ws/lib/BufferUtil.js +71 -0
  353. data/node_modules/ws/lib/Constants.js +10 -0
  354. data/node_modules/ws/lib/ErrorCodes.js +28 -0
  355. data/node_modules/ws/lib/EventTarget.js +151 -0
  356. data/node_modules/ws/lib/Extensions.js +203 -0
  357. data/node_modules/ws/lib/PerMessageDeflate.js +507 -0
  358. data/node_modules/ws/lib/Receiver.js +553 -0
  359. data/node_modules/ws/lib/Sender.js +412 -0
  360. data/node_modules/ws/lib/Validation.js +17 -0
  361. data/node_modules/ws/lib/WebSocket.js +717 -0
  362. data/node_modules/ws/lib/WebSocketServer.js +326 -0
  363. data/node_modules/ws/package.json +46 -0
  364. data/node_modules/yauzl/LICENSE +21 -0
  365. data/node_modules/yauzl/README.md +467 -0
  366. data/node_modules/yauzl/index.js +626 -0
  367. data/node_modules/yauzl/package.json +36 -0
  368. data/package.json +5 -0
  369. data/yarn.lock +240 -0
  370. metadata +372 -7
  371. data/app/assets/stylesheets/default.css +0 -4
  372. data/lib/postdoc/postdoc_view_helper.rb +0 -22
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Copyright 2017 Google Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ const {helper, debugError} = require('./helper');
18
+
19
+ /**
20
+ * @typedef {Object} CoverageEntry
21
+ * @property {string} url
22
+ * @property {string} text
23
+ * @property {!Array<!{start: number, end: number}>} ranges
24
+ */
25
+
26
+ class Coverage {
27
+ /**
28
+ * @param {!Puppeteer.CDPSession} client
29
+ */
30
+ constructor(client) {
31
+ this._jsCoverage = new JSCoverage(client);
32
+ this._cssCoverage = new CSSCoverage(client);
33
+ }
34
+
35
+ /**
36
+ * @param {!Object} options
37
+ */
38
+ async startJSCoverage(options) {
39
+ return await this._jsCoverage.start(options);
40
+ }
41
+
42
+ /**
43
+ * @return {!Promise<!Array<!CoverageEntry>>}
44
+ */
45
+ async stopJSCoverage() {
46
+ return await this._jsCoverage.stop();
47
+ }
48
+
49
+ /**
50
+ * @param {!Object} options
51
+ */
52
+ async startCSSCoverage(options) {
53
+ return await this._cssCoverage.start(options);
54
+ }
55
+
56
+ /**
57
+ * @return {!Promise<!Array<!CoverageEntry>>}
58
+ */
59
+ async stopCSSCoverage() {
60
+ return await this._cssCoverage.stop();
61
+ }
62
+ }
63
+
64
+ module.exports = {Coverage};
65
+ helper.tracePublicAPI(Coverage);
66
+
67
+ class JSCoverage {
68
+ /**
69
+ * @param {!Puppeteer.CDPSession} client
70
+ */
71
+ constructor(client) {
72
+ this._client = client;
73
+ this._enabled = false;
74
+ this._scriptURLs = new Map();
75
+ this._scriptSources = new Map();
76
+ this._eventListeners = [];
77
+ this._resetOnNavigation = false;
78
+ }
79
+
80
+ /**
81
+ * @param {!Object} options
82
+ */
83
+ async start(options = {}) {
84
+ console.assert(!this._enabled, 'JSCoverage is already enabled');
85
+ this._resetOnNavigation = options.resetOnNavigation === undefined ? true : !!options.resetOnNavigation;
86
+ this._enabled = true;
87
+ this._scriptURLs.clear();
88
+ this._scriptSources.clear();
89
+ this._eventListeners = [
90
+ helper.addEventListener(this._client, 'Debugger.scriptParsed', this._onScriptParsed.bind(this)),
91
+ helper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)),
92
+ ];
93
+ await Promise.all([
94
+ this._client.send('Profiler.enable'),
95
+ this._client.send('Profiler.startPreciseCoverage', {callCount: false, detailed: true}),
96
+ this._client.send('Debugger.enable'),
97
+ this._client.send('Debugger.setSkipAllPauses', {skip: true})
98
+ ]);
99
+ }
100
+
101
+ _onExecutionContextsCleared() {
102
+ if (!this._resetOnNavigation)
103
+ return;
104
+ this._scriptURLs.clear();
105
+ this._scriptSources.clear();
106
+ }
107
+
108
+ /**
109
+ * @param {!Protocol.Debugger.scriptParsedPayload} event
110
+ */
111
+ async _onScriptParsed(event) {
112
+ // Ignore anonymous scripts
113
+ if (!event.url)
114
+ return;
115
+ try {
116
+ const response = await this._client.send('Debugger.getScriptSource', {scriptId: event.scriptId});
117
+ this._scriptURLs.set(event.scriptId, event.url);
118
+ this._scriptSources.set(event.scriptId, response.scriptSource);
119
+ } catch (e) {
120
+ // This might happen if the page has already navigated away.
121
+ debugError(e);
122
+ }
123
+ }
124
+
125
+ /**
126
+ * @return {!Promise<!Array<!CoverageEntry>>}
127
+ */
128
+ async stop() {
129
+ console.assert(this._enabled, 'JSCoverage is not enabled');
130
+ this._enabled = false;
131
+ const [profileResponse] = await Promise.all([
132
+ this._client.send('Profiler.takePreciseCoverage'),
133
+ this._client.send('Profiler.stopPreciseCoverage'),
134
+ this._client.send('Profiler.disable'),
135
+ this._client.send('Debugger.disable'),
136
+ ]);
137
+ helper.removeEventListeners(this._eventListeners);
138
+
139
+ const coverage = [];
140
+ for (const entry of profileResponse.result) {
141
+ const url = this._scriptURLs.get(entry.scriptId);
142
+ const text = this._scriptSources.get(entry.scriptId);
143
+ if (text === undefined || url === undefined)
144
+ continue;
145
+ const flattenRanges = [];
146
+ for (const func of entry.functions)
147
+ flattenRanges.push(...func.ranges);
148
+ const ranges = convertToDisjointRanges(flattenRanges);
149
+ coverage.push({url, ranges, text});
150
+ }
151
+ return coverage;
152
+ }
153
+ }
154
+
155
+ class CSSCoverage {
156
+ /**
157
+ * @param {!Puppeteer.CDPSession} client
158
+ */
159
+ constructor(client) {
160
+ this._client = client;
161
+ this._enabled = false;
162
+ this._stylesheetURLs = new Map();
163
+ this._stylesheetSources = new Map();
164
+ this._eventListeners = [];
165
+ this._resetOnNavigation = false;
166
+ }
167
+
168
+ /**
169
+ * @param {!Object} options
170
+ */
171
+ async start(options = {}) {
172
+ console.assert(!this._enabled, 'CSSCoverage is already enabled');
173
+ this._resetOnNavigation = options.resetOnNavigation === undefined ? true : !!options.resetOnNavigation;
174
+ this._enabled = true;
175
+ this._stylesheetURLs.clear();
176
+ this._stylesheetSources.clear();
177
+ this._eventListeners = [
178
+ helper.addEventListener(this._client, 'CSS.styleSheetAdded', this._onStyleSheet.bind(this)),
179
+ helper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)),
180
+ ];
181
+ await Promise.all([
182
+ this._client.send('DOM.enable'),
183
+ this._client.send('CSS.enable'),
184
+ this._client.send('CSS.startRuleUsageTracking'),
185
+ ]);
186
+ }
187
+
188
+ _onExecutionContextsCleared() {
189
+ if (!this._resetOnNavigation)
190
+ return;
191
+ this._stylesheetURLs.clear();
192
+ this._stylesheetSources.clear();
193
+ }
194
+
195
+ /**
196
+ * @param {!Protocol.CSS.styleSheetAddedPayload} event
197
+ */
198
+ async _onStyleSheet(event) {
199
+ const header = event.header;
200
+ // Ignore anonymous scripts
201
+ if (!header.sourceURL)
202
+ return;
203
+ try {
204
+ const response = await this._client.send('CSS.getStyleSheetText', {styleSheetId: header.styleSheetId});
205
+ this._stylesheetURLs.set(header.styleSheetId, header.sourceURL);
206
+ this._stylesheetSources.set(header.styleSheetId, response.text);
207
+ } catch (e) {
208
+ // This might happen if the page has already navigated away.
209
+ debugError(e);
210
+ }
211
+ }
212
+
213
+ /**
214
+ * @return {!Promise<!Array<!CoverageEntry>>}
215
+ */
216
+ async stop() {
217
+ console.assert(this._enabled, 'CSSCoverage is not enabled');
218
+ this._enabled = false;
219
+ const [ruleTrackingResponse] = await Promise.all([
220
+ this._client.send('CSS.stopRuleUsageTracking'),
221
+ this._client.send('CSS.disable'),
222
+ this._client.send('DOM.disable'),
223
+ ]);
224
+ helper.removeEventListeners(this._eventListeners);
225
+
226
+ // aggregate by styleSheetId
227
+ const styleSheetIdToCoverage = new Map();
228
+ for (const entry of ruleTrackingResponse.ruleUsage) {
229
+ let ranges = styleSheetIdToCoverage.get(entry.styleSheetId);
230
+ if (!ranges) {
231
+ ranges = [];
232
+ styleSheetIdToCoverage.set(entry.styleSheetId, ranges);
233
+ }
234
+ ranges.push({
235
+ startOffset: entry.startOffset,
236
+ endOffset: entry.endOffset,
237
+ count: entry.used ? 1 : 0,
238
+ });
239
+ }
240
+
241
+ const coverage = [];
242
+ for (const styleSheetId of this._stylesheetURLs.keys()) {
243
+ const url = this._stylesheetURLs.get(styleSheetId);
244
+ const text = this._stylesheetSources.get(styleSheetId);
245
+ const ranges = convertToDisjointRanges(styleSheetIdToCoverage.get(styleSheetId) || []);
246
+ coverage.push({url, ranges, text});
247
+ }
248
+
249
+ return coverage;
250
+ }
251
+ }
252
+
253
+ /**
254
+ * @param {!Array<!{startOffset:number, endOffset:number, count:number}>} nestedRanges
255
+ * @return {!Array<!{start:number, end:number}>}
256
+ */
257
+ function convertToDisjointRanges(nestedRanges) {
258
+ const points = [];
259
+ for (const range of nestedRanges) {
260
+ points.push({ offset: range.startOffset, type: 0, range });
261
+ points.push({ offset: range.endOffset, type: 1, range });
262
+ }
263
+ // Sort points to form a valid parenthesis sequence.
264
+ points.sort((a, b) => {
265
+ // Sort with increasing offsets.
266
+ if (a.offset !== b.offset)
267
+ return a.offset - b.offset;
268
+ // All "end" points should go before "start" points.
269
+ if (a.type !== b.type)
270
+ return b.type - a.type;
271
+ const aLength = a.range.endOffset - a.range.startOffset;
272
+ const bLength = b.range.endOffset - b.range.startOffset;
273
+ // For two "start" points, the one with longer range goes first.
274
+ if (a.type === 0)
275
+ return bLength - aLength;
276
+ // For two "end" points, the one with shorter range goes first.
277
+ return aLength - bLength;
278
+ });
279
+
280
+ const hitCountStack = [];
281
+ const results = [];
282
+ let lastOffset = 0;
283
+ // Run scanning line to intersect all ranges.
284
+ for (const point of points) {
285
+ if (hitCountStack.length && lastOffset < point.offset && hitCountStack[hitCountStack.length - 1] > 0) {
286
+ const lastResult = results.length ? results[results.length - 1] : null;
287
+ if (lastResult && lastResult.end === lastOffset)
288
+ lastResult.end = point.offset;
289
+ else
290
+ results.push({start: lastOffset, end: point.offset});
291
+ }
292
+ lastOffset = point.offset;
293
+ if (point.type === 0)
294
+ hitCountStack.push(point.range.count);
295
+ else
296
+ hitCountStack.pop();
297
+ }
298
+ // Filter out empty ranges.
299
+ return results.filter(range => range.end - range.start > 1);
300
+ }
301
+
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Copyright 2017 Google Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ const {helper} = require('./helper');
18
+
19
+ class Dialog {
20
+ /**
21
+ * @param {!Puppeteer.CDPSession} client
22
+ * @param {string} type
23
+ * @param {string} message
24
+ * @param {(string|undefined)} defaultValue
25
+ */
26
+ constructor(client, type, message, defaultValue = '') {
27
+ this._client = client;
28
+ this._type = type;
29
+ this._message = message;
30
+ this._handled = false;
31
+ this._defaultValue = defaultValue;
32
+ }
33
+
34
+ /**
35
+ * @return {string}
36
+ */
37
+ type() {
38
+ return this._type;
39
+ }
40
+
41
+ /**
42
+ * @return {string}
43
+ */
44
+ message() {
45
+ return this._message;
46
+ }
47
+
48
+ /**
49
+ * @return {string}
50
+ */
51
+ defaultValue() {
52
+ return this._defaultValue;
53
+ }
54
+
55
+ /**
56
+ * @param {string=} promptText
57
+ */
58
+ async accept(promptText) {
59
+ console.assert(!this._handled, 'Cannot accept dialog which is already handled!');
60
+ this._handled = true;
61
+ await this._client.send('Page.handleJavaScriptDialog', {
62
+ accept: true,
63
+ promptText: promptText
64
+ });
65
+ }
66
+
67
+ async dismiss() {
68
+ console.assert(!this._handled, 'Cannot dismiss dialog which is already handled!');
69
+ this._handled = true;
70
+ await this._client.send('Page.handleJavaScriptDialog', {
71
+ accept: false
72
+ });
73
+ }
74
+ }
75
+
76
+ Dialog.Type = {
77
+ Alert: 'alert',
78
+ BeforeUnload: 'beforeunload',
79
+ Confirm: 'confirm',
80
+ Prompt: 'prompt'
81
+ };
82
+
83
+ module.exports = Dialog;
84
+ helper.tracePublicAPI(Dialog);
@@ -0,0 +1,328 @@
1
+ /**
2
+ * Copyright 2017 Google Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ const path = require('path');
17
+ const {JSHandle} = require('./ExecutionContext');
18
+ const {helper, debugError} = require('./helper');
19
+
20
+ class ElementHandle extends JSHandle {
21
+ /**
22
+ * @param {!Puppeteer.ExecutionContext} context
23
+ * @param {!Puppeteer.CDPSession} client
24
+ * @param {!Protocol.Runtime.RemoteObject} remoteObject
25
+ * @param {!Puppeteer.Page} page
26
+ * @param {!Puppeteer.FrameManager} frameManager
27
+ */
28
+ constructor(context, client, remoteObject, page, frameManager) {
29
+ super(context, client, remoteObject);
30
+ this._client = client;
31
+ this._remoteObject = remoteObject;
32
+ this._page = page;
33
+ this._frameManager = frameManager;
34
+ this._disposed = false;
35
+ }
36
+
37
+ /**
38
+ * @override
39
+ * @return {?ElementHandle}
40
+ */
41
+ asElement() {
42
+ return this;
43
+ }
44
+
45
+ /**
46
+ * @return {!Promise<?Puppeteer.Frame>}
47
+ */
48
+ async contentFrame() {
49
+ const nodeInfo = await this._client.send('DOM.describeNode', {
50
+ objectId: this._remoteObject.objectId
51
+ });
52
+ if (typeof nodeInfo.node.frameId !== 'string')
53
+ return null;
54
+ return this._frameManager.frame(nodeInfo.node.frameId);
55
+ }
56
+
57
+ async _scrollIntoViewIfNeeded() {
58
+ const error = await this.executionContext().evaluate(element => {
59
+ if (!element.isConnected)
60
+ return 'Node is detached from document';
61
+ if (element.nodeType !== Node.ELEMENT_NODE)
62
+ return 'Node is not of type HTMLElement';
63
+ element.scrollIntoViewIfNeeded();
64
+ return false;
65
+ }, this);
66
+ if (error)
67
+ throw new Error(error);
68
+ }
69
+
70
+ /**
71
+ * @return {!Promise<{x: number, y: number}>}
72
+ */
73
+ async _visibleCenter() {
74
+ await this._scrollIntoViewIfNeeded();
75
+ const box = await this._assertBoundingBox();
76
+ return {
77
+ x: box.x + box.width / 2,
78
+ y: box.y + box.height / 2
79
+ };
80
+ }
81
+
82
+ /**
83
+ * @return {!Promise<void|Protocol.DOM.getBoxModelReturnValue>}
84
+ */
85
+ _getBoxModel() {
86
+ return this._client.send('DOM.getBoxModel', {
87
+ objectId: this._remoteObject.objectId
88
+ }).catch(error => debugError(error));
89
+ }
90
+
91
+ /**
92
+ * @param {!Array<number>} quad
93
+ * @return {!Array<object>}
94
+ */
95
+ _fromProtocolQuad(quad) {
96
+ return [
97
+ {x: quad[0], y: quad[1]},
98
+ {x: quad[2], y: quad[3]},
99
+ {x: quad[4], y: quad[5]},
100
+ {x: quad[6], y: quad[7]}
101
+ ];
102
+ }
103
+
104
+ async hover() {
105
+ const {x, y} = await this._visibleCenter();
106
+ await this._page.mouse.move(x, y);
107
+ }
108
+
109
+ /**
110
+ * @param {!Object=} options
111
+ */
112
+ async click(options = {}) {
113
+ const {x, y} = await this._visibleCenter();
114
+ await this._page.mouse.click(x, y, options);
115
+ }
116
+
117
+ /**
118
+ * @param {!Array<string>} filePaths
119
+ * @return {!Promise}
120
+ */
121
+ async uploadFile(...filePaths) {
122
+ const files = filePaths.map(filePath => path.resolve(filePath));
123
+ const objectId = this._remoteObject.objectId;
124
+ return this._client.send('DOM.setFileInputFiles', { objectId, files });
125
+ }
126
+
127
+ async tap() {
128
+ const {x, y} = await this._visibleCenter();
129
+ await this._page.touchscreen.tap(x, y);
130
+ }
131
+
132
+ async focus() {
133
+ await this.executionContext().evaluate(element => element.focus(), this);
134
+ }
135
+
136
+ /**
137
+ * @param {string} text
138
+ * @param {{delay: (number|undefined)}=} options
139
+ */
140
+ async type(text, options) {
141
+ await this.focus();
142
+ await this._page.keyboard.type(text, options);
143
+ }
144
+
145
+ /**
146
+ * @param {string} key
147
+ * @param {!Object=} options
148
+ */
149
+ async press(key, options) {
150
+ await this.focus();
151
+ await this._page.keyboard.press(key, options);
152
+ }
153
+
154
+ /**
155
+ * @return {!Promise<?{x: number, y: number, width: number, height: number}>}
156
+ */
157
+ async boundingBox() {
158
+ const result = await this._getBoxModel();
159
+
160
+ if (!result)
161
+ return null;
162
+
163
+ const quad = result.model.border;
164
+ const x = Math.min(quad[0], quad[2], quad[4], quad[6]);
165
+ const y = Math.min(quad[1], quad[3], quad[5], quad[7]);
166
+ const width = Math.max(quad[0], quad[2], quad[4], quad[6]) - x;
167
+ const height = Math.max(quad[1], quad[3], quad[5], quad[7]) - y;
168
+
169
+ return {x, y, width, height};
170
+ }
171
+
172
+ /**
173
+ * @return {!Promise<?object>}
174
+ */
175
+ async boxModel() {
176
+ const result = await this._getBoxModel();
177
+
178
+ if (!result)
179
+ return null;
180
+
181
+ const {content, padding, border, margin, width, height} = result.model;
182
+ return {
183
+ content: this._fromProtocolQuad(content),
184
+ padding: this._fromProtocolQuad(padding),
185
+ border: this._fromProtocolQuad(border),
186
+ margin: this._fromProtocolQuad(margin),
187
+ width,
188
+ height
189
+ };
190
+ }
191
+
192
+ /**
193
+ * @return {!Promise<?{x: number, y: number, width: number, height: number}>}
194
+ */
195
+ async _assertBoundingBox() {
196
+ const boundingBox = await this.boundingBox();
197
+ if (boundingBox)
198
+ return boundingBox;
199
+
200
+ throw new Error('Node is either not visible or not an HTMLElement');
201
+ }
202
+
203
+ /**
204
+ *
205
+ * @param {!Object=} options
206
+ * @returns {!Promise<Object>}
207
+ */
208
+ async screenshot(options = {}) {
209
+ let needsViewportReset = false;
210
+
211
+ let boundingBox = await this._assertBoundingBox();
212
+
213
+ const viewport = this._page.viewport();
214
+
215
+ if (boundingBox.width > viewport.width || boundingBox.height > viewport.height) {
216
+ const newViewport = {
217
+ width: Math.max(viewport.width, Math.ceil(boundingBox.width)),
218
+ height: Math.max(viewport.height, Math.ceil(boundingBox.height)),
219
+ };
220
+ await this._page.setViewport(Object.assign({}, viewport, newViewport));
221
+
222
+ needsViewportReset = true;
223
+ }
224
+
225
+ await this.executionContext().evaluate(function(element) {
226
+ element.scrollIntoView({block: 'center', inline: 'center', behavior: 'instant'});
227
+ }, this);
228
+
229
+ boundingBox = await this._assertBoundingBox();
230
+
231
+ const { layoutViewport: { pageX, pageY } } = await this._client.send('Page.getLayoutMetrics');
232
+
233
+ const clip = Object.assign({}, boundingBox);
234
+ clip.x += pageX;
235
+ clip.y += pageY;
236
+
237
+ const imageData = await this._page.screenshot(Object.assign({}, {
238
+ clip
239
+ }, options));
240
+
241
+ if (needsViewportReset)
242
+ await this._page.setViewport(viewport);
243
+
244
+ return imageData;
245
+ }
246
+
247
+ /**
248
+ * @param {string} selector
249
+ * @return {!Promise<?ElementHandle>}
250
+ */
251
+ async $(selector) {
252
+ const handle = await this.executionContext().evaluateHandle(
253
+ (element, selector) => element.querySelector(selector),
254
+ this, selector
255
+ );
256
+ const element = handle.asElement();
257
+ if (element)
258
+ return element;
259
+ await handle.dispose();
260
+ return null;
261
+ }
262
+
263
+ /**
264
+ * @param {string} selector
265
+ * @return {!Promise<!Array<!ElementHandle>>}
266
+ */
267
+ async $$(selector) {
268
+ const arrayHandle = await this.executionContext().evaluateHandle(
269
+ (element, selector) => element.querySelectorAll(selector),
270
+ this, selector
271
+ );
272
+ const properties = await arrayHandle.getProperties();
273
+ await arrayHandle.dispose();
274
+ const result = [];
275
+ for (const property of properties.values()) {
276
+ const elementHandle = property.asElement();
277
+ if (elementHandle)
278
+ result.push(elementHandle);
279
+ }
280
+ return result;
281
+ }
282
+
283
+ /**
284
+ * @param {string} selector
285
+ * @param {Function|String} pageFunction
286
+ * @param {!Array<*>} args
287
+ * @return {!Promise<(!Object|undefined)>}
288
+ */
289
+ async $eval(selector, pageFunction, ...args) {
290
+ const elementHandle = await this.$(selector);
291
+ if (!elementHandle)
292
+ throw new Error(`Error: failed to find element matching selector "${selector}"`);
293
+ const result = await this.executionContext().evaluate(pageFunction, elementHandle, ...args);
294
+ await elementHandle.dispose();
295
+ return result;
296
+ }
297
+
298
+ /**
299
+ * @param {string} expression
300
+ * @return {!Promise<!Array<!ElementHandle>>}
301
+ */
302
+ async $x(expression) {
303
+ const arrayHandle = await this.executionContext().evaluateHandle(
304
+ (element, expression) => {
305
+ const document = element.ownerDocument || element;
306
+ const iterator = document.evaluate(expression, element, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE);
307
+ const array = [];
308
+ let item;
309
+ while ((item = iterator.iterateNext()))
310
+ array.push(item);
311
+ return array;
312
+ },
313
+ this, expression
314
+ );
315
+ const properties = await arrayHandle.getProperties();
316
+ await arrayHandle.dispose();
317
+ const result = [];
318
+ for (const property of properties.values()) {
319
+ const elementHandle = property.asElement();
320
+ if (elementHandle)
321
+ result.push(elementHandle);
322
+ }
323
+ return result;
324
+ }
325
+ }
326
+
327
+ module.exports = ElementHandle;
328
+ helper.tracePublicAPI(ElementHandle);