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,1098 @@
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 fs = require('fs');
18
+ const EventEmitter = require('events');
19
+ const mime = require('mime');
20
+ const {NetworkManager} = require('./NetworkManager');
21
+ const NavigatorWatcher = require('./NavigatorWatcher');
22
+ const Dialog = require('./Dialog');
23
+ const EmulationManager = require('./EmulationManager');
24
+ const {FrameManager} = require('./FrameManager');
25
+ const {Keyboard, Mouse, Touchscreen} = require('./Input');
26
+ const Tracing = require('./Tracing');
27
+ const {helper, debugError} = require('./helper');
28
+ const {Coverage} = require('./Coverage');
29
+
30
+ const writeFileAsync = helper.promisify(fs.writeFile);
31
+
32
+ class Page extends EventEmitter {
33
+ /**
34
+ * @param {!Puppeteer.CDPSession} client
35
+ * @param {!Puppeteer.Target} target
36
+ * @param {boolean} ignoreHTTPSErrors
37
+ * @param {boolean} setDefaultViewport
38
+ * @param {!Puppeteer.TaskQueue} screenshotTaskQueue
39
+ * @return {!Promise<!Page>}
40
+ */
41
+ static async create(client, target, ignoreHTTPSErrors, setDefaultViewport, screenshotTaskQueue) {
42
+
43
+ await client.send('Page.enable');
44
+ const {frameTree} = await client.send('Page.getFrameTree');
45
+ const page = new Page(client, target, frameTree, ignoreHTTPSErrors, screenshotTaskQueue);
46
+
47
+ await Promise.all([
48
+ client.send('Page.setLifecycleEventsEnabled', { enabled: true }),
49
+ client.send('Network.enable', {}),
50
+ client.send('Runtime.enable', {}),
51
+ client.send('Security.enable', {}),
52
+ client.send('Performance.enable', {}),
53
+ client.send('Log.enable', {}),
54
+ ]);
55
+ if (ignoreHTTPSErrors)
56
+ await client.send('Security.setOverrideCertificateErrors', {override: true});
57
+ // Initialize default page size.
58
+ if (setDefaultViewport)
59
+ await page.setViewport({width: 800, height: 600});
60
+
61
+ return page;
62
+ }
63
+
64
+ /**
65
+ * @param {!Puppeteer.CDPSession} client
66
+ * @param {!Puppeteer.Target} target
67
+ * @param {!Protocol.Page.FrameTree} frameTree
68
+ * @param {boolean} ignoreHTTPSErrors
69
+ * @param {!Puppeteer.TaskQueue} screenshotTaskQueue
70
+ */
71
+ constructor(client, target, frameTree, ignoreHTTPSErrors, screenshotTaskQueue) {
72
+ super();
73
+ this._client = client;
74
+ this._target = target;
75
+ this._keyboard = new Keyboard(client);
76
+ this._mouse = new Mouse(client, this._keyboard);
77
+ this._touchscreen = new Touchscreen(client, this._keyboard);
78
+ this._frameManager = new FrameManager(client, frameTree, this);
79
+ this._networkManager = new NetworkManager(client, this._frameManager);
80
+ this._emulationManager = new EmulationManager(client);
81
+ this._tracing = new Tracing(client);
82
+ /** @type {!Map<string, Function>} */
83
+ this._pageBindings = new Map();
84
+ this._ignoreHTTPSErrors = ignoreHTTPSErrors;
85
+ this._coverage = new Coverage(client);
86
+ this._defaultNavigationTimeout = 30000;
87
+
88
+ this._screenshotTaskQueue = screenshotTaskQueue;
89
+
90
+ this._frameManager.on(FrameManager.Events.FrameAttached, event => this.emit(Page.Events.FrameAttached, event));
91
+ this._frameManager.on(FrameManager.Events.FrameDetached, event => this.emit(Page.Events.FrameDetached, event));
92
+ this._frameManager.on(FrameManager.Events.FrameNavigated, event => this.emit(Page.Events.FrameNavigated, event));
93
+
94
+ this._networkManager.on(NetworkManager.Events.Request, event => this.emit(Page.Events.Request, event));
95
+ this._networkManager.on(NetworkManager.Events.Response, event => this.emit(Page.Events.Response, event));
96
+ this._networkManager.on(NetworkManager.Events.RequestFailed, event => this.emit(Page.Events.RequestFailed, event));
97
+ this._networkManager.on(NetworkManager.Events.RequestFinished, event => this.emit(Page.Events.RequestFinished, event));
98
+
99
+ client.on('Page.domContentEventFired', event => this.emit(Page.Events.DOMContentLoaded));
100
+ client.on('Page.loadEventFired', event => this.emit(Page.Events.Load));
101
+ client.on('Runtime.consoleAPICalled', event => this._onConsoleAPI(event));
102
+ client.on('Page.javascriptDialogOpening', event => this._onDialog(event));
103
+ client.on('Runtime.exceptionThrown', exception => this._handleException(exception.exceptionDetails));
104
+ client.on('Security.certificateError', event => this._onCertificateError(event));
105
+ client.on('Inspector.targetCrashed', event => this._onTargetCrashed());
106
+ client.on('Performance.metrics', event => this._emitMetrics(event));
107
+ client.on('Log.entryAdded', event => this._onLogEntryAdded(event));
108
+ this._target._isClosedPromise.then(() => this.emit(Page.Events.Close));
109
+ }
110
+
111
+ /**
112
+ * @return {!Puppeteer.Target}
113
+ */
114
+ target() {
115
+ return this._target;
116
+ }
117
+
118
+ /**
119
+ * @return {!Puppeteer.Browser}
120
+ */
121
+ browser() {
122
+ return this._target.browser();
123
+ }
124
+
125
+ _onTargetCrashed() {
126
+ this.emit('error', new Error('Page crashed!'));
127
+ }
128
+
129
+ _onLogEntryAdded(event) {
130
+ const {level, text, args} = event.entry;
131
+ if (args)
132
+ args.map(arg => helper.releaseObject(this._client, arg));
133
+
134
+ this.emit(Page.Events.Console, new ConsoleMessage(level, text));
135
+ }
136
+
137
+ /**
138
+ * @return {!Puppeteer.Frame}
139
+ */
140
+ mainFrame() {
141
+ return this._frameManager.mainFrame();
142
+ }
143
+
144
+ /**
145
+ * @return {!Keyboard}
146
+ */
147
+ get keyboard() {
148
+ return this._keyboard;
149
+ }
150
+
151
+ /**
152
+ * @return {!Touchscreen}
153
+ */
154
+ get touchscreen() {
155
+ return this._touchscreen;
156
+ }
157
+
158
+ /**
159
+ * @return {!Coverage}
160
+ */
161
+ get coverage() {
162
+ return this._coverage;
163
+ }
164
+
165
+ /**
166
+ * @return {!Tracing}
167
+ */
168
+ get tracing() {
169
+ return this._tracing;
170
+ }
171
+
172
+ /**
173
+ * @return {!Array<Puppeteer.Frame>}
174
+ */
175
+ frames() {
176
+ return this._frameManager.frames();
177
+ }
178
+
179
+ /**
180
+ * @param {boolean} value
181
+ */
182
+ async setRequestInterception(value) {
183
+ return this._networkManager.setRequestInterception(value);
184
+ }
185
+
186
+ /**
187
+ * @param {boolean} enabled
188
+ */
189
+ setOfflineMode(enabled) {
190
+ return this._networkManager.setOfflineMode(enabled);
191
+ }
192
+
193
+ /**
194
+ * @param {number} timeout
195
+ */
196
+ setDefaultNavigationTimeout(timeout) {
197
+ this._defaultNavigationTimeout = timeout;
198
+ }
199
+
200
+ /**
201
+ * @param {!Protocol.Security.certificateErrorPayload} event
202
+ */
203
+ _onCertificateError(event) {
204
+ if (!this._ignoreHTTPSErrors)
205
+ return;
206
+ this._client.send('Security.handleCertificateError', {
207
+ eventId: event.eventId,
208
+ action: 'continue'
209
+ }).catch(debugError);
210
+ }
211
+
212
+ /**
213
+ * @param {string} selector
214
+ * @return {!Promise<?Puppeteer.ElementHandle>}
215
+ */
216
+ async $(selector) {
217
+ return this.mainFrame().$(selector);
218
+ }
219
+
220
+ /**
221
+ * @param {function()|string} pageFunction
222
+ * @param {!Array<*>} args
223
+ * @return {!Promise<!Puppeteer.JSHandle>}
224
+ */
225
+ async evaluateHandle(pageFunction, ...args) {
226
+ const context = await this.mainFrame().executionContext();
227
+ return context.evaluateHandle(pageFunction, ...args);
228
+ }
229
+
230
+ /**
231
+ * @param {!Puppeteer.JSHandle} prototypeHandle
232
+ * @return {!Promise<!Puppeteer.JSHandle>}
233
+ */
234
+ async queryObjects(prototypeHandle) {
235
+ const context = await this.mainFrame().executionContext();
236
+ return context.queryObjects(prototypeHandle);
237
+ }
238
+
239
+ /**
240
+ * @param {string} selector
241
+ * @param {function()|string} pageFunction
242
+ * @param {!Array<*>} args
243
+ * @return {!Promise<(!Object|undefined)>}
244
+ */
245
+ async $eval(selector, pageFunction, ...args) {
246
+ return this.mainFrame().$eval(selector, pageFunction, ...args);
247
+ }
248
+
249
+ /**
250
+ * @param {string} selector
251
+ * @param {Function|string} pageFunction
252
+ * @param {!Array<*>} args
253
+ * @return {!Promise<(!Object|undefined)>}
254
+ */
255
+ async $$eval(selector, pageFunction, ...args) {
256
+ return this.mainFrame().$$eval(selector, pageFunction, ...args);
257
+ }
258
+
259
+ /**
260
+ * @param {string} selector
261
+ * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
262
+ */
263
+ async $$(selector) {
264
+ return this.mainFrame().$$(selector);
265
+ }
266
+
267
+ /**
268
+ * @param {string} expression
269
+ * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
270
+ */
271
+ async $x(expression) {
272
+ return this.mainFrame().$x(expression);
273
+ }
274
+
275
+ /**
276
+ * @param {!Array<string>} urls
277
+ * @return {!Promise<!Array<Network.Cookie>>}
278
+ */
279
+ async cookies(...urls) {
280
+ return (await this._client.send('Network.getCookies', {
281
+ urls: urls.length ? urls : [this.url()]
282
+ })).cookies;
283
+ }
284
+
285
+ /**
286
+ * @param {Array<Network.CookieParam>} cookies
287
+ */
288
+ async deleteCookie(...cookies) {
289
+ const pageURL = this.url();
290
+ for (const cookie of cookies) {
291
+ const item = Object.assign({}, cookie);
292
+ if (!cookie.url && pageURL.startsWith('http'))
293
+ item.url = pageURL;
294
+ await this._client.send('Network.deleteCookies', item);
295
+ }
296
+ }
297
+
298
+ /**
299
+ * @param {Array<Network.CookieParam>} cookies
300
+ */
301
+ async setCookie(...cookies) {
302
+ const pageURL = this.url();
303
+ const startsWithHTTP = pageURL.startsWith('http');
304
+ const items = cookies.map(cookie => {
305
+ const item = Object.assign({}, cookie);
306
+ if (!item.url && startsWithHTTP)
307
+ item.url = pageURL;
308
+ console.assert(
309
+ item.url !== 'about:blank',
310
+ `Blank page can not have cookie "${item.name}"`
311
+ );
312
+ console.assert(
313
+ !String.prototype.startsWith.call(item.url || '', 'data:'),
314
+ `Data URL page can not have cookie "${item.name}"`
315
+ );
316
+ return item;
317
+ });
318
+ await this.deleteCookie(...items);
319
+ if (items.length)
320
+ await this._client.send('Network.setCookies', { cookies: items });
321
+ }
322
+
323
+ /**
324
+ * @param {Object} options
325
+ * @return {!Promise<!Puppeteer.ElementHandle>}
326
+ */
327
+ async addScriptTag(options) {
328
+ return this.mainFrame().addScriptTag(options);
329
+ }
330
+
331
+ /**
332
+ * @param {Object} options
333
+ * @return {!Promise<!Puppeteer.ElementHandle>}
334
+ */
335
+ async addStyleTag(options) {
336
+ return this.mainFrame().addStyleTag(options);
337
+ }
338
+
339
+ /**
340
+ * @param {string} name
341
+ * @param {function(?)} puppeteerFunction
342
+ */
343
+ async exposeFunction(name, puppeteerFunction) {
344
+ if (this._pageBindings[name])
345
+ throw new Error(`Failed to add page binding with name ${name}: window['${name}'] already exists!`);
346
+ this._pageBindings[name] = puppeteerFunction;
347
+
348
+ const expression = helper.evaluationString(addPageBinding, name);
349
+ await this._client.send('Page.addScriptToEvaluateOnNewDocument', {source: expression});
350
+ await Promise.all(this.frames().map(frame => frame.evaluate(expression).catch(debugError)));
351
+
352
+ function addPageBinding(bindingName) {
353
+ window[bindingName] = async(...args) => {
354
+ const me = window[bindingName];
355
+ let callbacks = me['callbacks'];
356
+ if (!callbacks) {
357
+ callbacks = new Map();
358
+ me['callbacks'] = callbacks;
359
+ }
360
+ const seq = (me['lastSeq'] || 0) + 1;
361
+ me['lastSeq'] = seq;
362
+ const promise = new Promise(fulfill => callbacks.set(seq, fulfill));
363
+ // eslint-disable-next-line no-console
364
+ console.debug('driver:page-binding', JSON.stringify({name: bindingName, seq, args}));
365
+ return promise;
366
+ };
367
+ }
368
+ }
369
+
370
+ /**
371
+ * @param {?{username: string, password: string}} credentials
372
+ */
373
+ async authenticate(credentials) {
374
+ return this._networkManager.authenticate(credentials);
375
+ }
376
+
377
+ /**
378
+ * @param {!Object<string, string>} headers
379
+ */
380
+ async setExtraHTTPHeaders(headers) {
381
+ return this._networkManager.setExtraHTTPHeaders(headers);
382
+ }
383
+
384
+ /**
385
+ * @param {string} userAgent
386
+ */
387
+ async setUserAgent(userAgent) {
388
+ return this._networkManager.setUserAgent(userAgent);
389
+ }
390
+
391
+ /**
392
+ * @return {!Promise<!Object>}
393
+ */
394
+ async metrics() {
395
+ const response = await this._client.send('Performance.getMetrics');
396
+ return this._buildMetricsObject(response.metrics);
397
+ }
398
+
399
+ /**
400
+ * @param {*} event
401
+ */
402
+ _emitMetrics(event) {
403
+ this.emit(Page.Events.Metrics, {
404
+ title: event.title,
405
+ metrics: this._buildMetricsObject(event.metrics)
406
+ });
407
+ }
408
+
409
+ /**
410
+ * @param {?Array<!Protocol.Performance.Metric>} metrics
411
+ * @return {!Object}
412
+ */
413
+ _buildMetricsObject(metrics) {
414
+ const result = {};
415
+ for (const metric of metrics || []) {
416
+ if (supportedMetrics.has(metric.name))
417
+ result[metric.name] = metric.value;
418
+ }
419
+ return result;
420
+ }
421
+
422
+ /**
423
+ * @param {!Protocol.Runtime.ExceptionDetails} exceptionDetails
424
+ */
425
+ _handleException(exceptionDetails) {
426
+ const message = helper.getExceptionMessage(exceptionDetails);
427
+ this.emit(Page.Events.PageError, new Error(message));
428
+ }
429
+
430
+ async _onConsoleAPI(event) {
431
+ if (event.type === 'debug' && event.args.length && event.args[0].value === 'driver:page-binding') {
432
+ const {name, seq, args} = JSON.parse(event.args[1].value);
433
+ const result = await this._pageBindings[name](...args);
434
+ const expression = helper.evaluationString(deliverResult, name, seq, result);
435
+ this._client.send('Runtime.evaluate', { expression, contextId: event.executionContextId }).catch(debugError);
436
+
437
+ function deliverResult(name, seq, result) {
438
+ window[name]['callbacks'].get(seq)(result);
439
+ window[name]['callbacks'].delete(seq);
440
+ }
441
+ return;
442
+ }
443
+ if (!this.listenerCount(Page.Events.Console)) {
444
+ event.args.map(arg => helper.releaseObject(this._client, arg));
445
+ return;
446
+ }
447
+ const values = event.args.map(arg => this._frameManager.createJSHandle(event.executionContextId, arg));
448
+ const textTokens = [];
449
+ for (let i = 0; i < event.args.length; ++i) {
450
+ const remoteObject = event.args[i];
451
+ if (remoteObject.objectId)
452
+ textTokens.push(values[i].toString());
453
+ else
454
+ textTokens.push(helper.valueFromRemoteObject(remoteObject));
455
+ }
456
+ const message = new ConsoleMessage(event.type, textTokens.join(' '), values);
457
+ this.emit(Page.Events.Console, message);
458
+ }
459
+
460
+ _onDialog(event) {
461
+ let dialogType = null;
462
+ if (event.type === 'alert')
463
+ dialogType = Dialog.Type.Alert;
464
+ else if (event.type === 'confirm')
465
+ dialogType = Dialog.Type.Confirm;
466
+ else if (event.type === 'prompt')
467
+ dialogType = Dialog.Type.Prompt;
468
+ else if (event.type === 'beforeunload')
469
+ dialogType = Dialog.Type.BeforeUnload;
470
+ console.assert(dialogType, 'Unknown javascript dialog type: ' + event.type);
471
+ const dialog = new Dialog(this._client, dialogType, event.message, event.defaultPrompt);
472
+ this.emit(Page.Events.Dialog, dialog);
473
+ }
474
+
475
+ /**
476
+ * @return {!string}
477
+ */
478
+ url() {
479
+ return this.mainFrame().url();
480
+ }
481
+
482
+ /**
483
+ * @return {!Promise<String>}
484
+ */
485
+ async content() {
486
+ return await this._frameManager.mainFrame().content();
487
+ }
488
+
489
+ /**
490
+ * @param {string} html
491
+ */
492
+ async setContent(html) {
493
+ await this._frameManager.mainFrame().setContent(html);
494
+ }
495
+
496
+ /**
497
+ * @param {string} url
498
+ * @param {!Object=} options
499
+ * @return {!Promise<?Puppeteer.Response>}
500
+ */
501
+ async goto(url, options = {}) {
502
+ const referrer = this._networkManager.extraHTTPHeaders()['referer'];
503
+
504
+ /** @type {Map<string, !Puppeteer.Request>} */
505
+ const requests = new Map();
506
+ const eventListeners = [
507
+ helper.addEventListener(this._networkManager, NetworkManager.Events.Request, request => {
508
+ if (!requests.get(request.url()))
509
+ requests.set(request.url(), request);
510
+ })
511
+ ];
512
+
513
+ const mainFrame = this._frameManager.mainFrame();
514
+ const timeout = typeof options.timeout === 'number' ? options.timeout : this._defaultNavigationTimeout;
515
+ const watcher = new NavigatorWatcher(this._frameManager, mainFrame, timeout, options);
516
+ const navigationPromise = watcher.navigationPromise();
517
+ let error = await Promise.race([
518
+ navigate(this._client, url, referrer),
519
+ navigationPromise,
520
+ ]);
521
+ if (!error)
522
+ error = await navigationPromise;
523
+ watcher.cancel();
524
+ helper.removeEventListeners(eventListeners);
525
+ if (error)
526
+ throw error;
527
+ const request = requests.get(mainFrame._navigationURL);
528
+ return request ? request.response() : null;
529
+
530
+ /**
531
+ * @param {!Puppeteer.CDPSession} client
532
+ * @param {string} url
533
+ * @param {string} referrer
534
+ * @return {!Promise<?Error>}
535
+ */
536
+ async function navigate(client, url, referrer) {
537
+ try {
538
+ const response = await client.send('Page.navigate', {url, referrer});
539
+ return response.errorText ? new Error(`${response.errorText} at ${url}`) : null;
540
+ } catch (error) {
541
+ return error;
542
+ }
543
+ }
544
+ }
545
+
546
+ /**
547
+ * @param {!Object=} options
548
+ * @return {!Promise<?Puppeteer.Response>}
549
+ */
550
+ async reload(options) {
551
+ const [response] = await Promise.all([
552
+ this.waitForNavigation(options),
553
+ this._client.send('Page.reload')
554
+ ]);
555
+ return response;
556
+ }
557
+
558
+ /**
559
+ * @param {!Object=} options
560
+ * @return {!Promise<!Puppeteer.Response>}
561
+ */
562
+ async waitForNavigation(options = {}) {
563
+ const mainFrame = this._frameManager.mainFrame();
564
+ const timeout = typeof options.timeout === 'number' ? options.timeout : this._defaultNavigationTimeout;
565
+ const watcher = new NavigatorWatcher(this._frameManager, mainFrame, timeout, options);
566
+
567
+ const responses = new Map();
568
+ const listener = helper.addEventListener(this._networkManager, NetworkManager.Events.Response, response => responses.set(response.url(), response));
569
+ const error = await watcher.navigationPromise();
570
+ helper.removeEventListeners([listener]);
571
+ if (error)
572
+ throw error;
573
+ return responses.get(this.mainFrame().url()) || null;
574
+ }
575
+
576
+ /**
577
+ * @param {!Object=} options
578
+ * @return {!Promise<?Puppeteer.Response>}
579
+ */
580
+ async goBack(options) {
581
+ return this._go(-1, options);
582
+ }
583
+
584
+ /**
585
+ * @param {!Object=} options
586
+ * @return {!Promise<?Puppeteer.Response>}
587
+ */
588
+ async goForward(options) {
589
+ return this._go(+1, options);
590
+ }
591
+
592
+ /**
593
+ * @param {!Object=} options
594
+ * @return {!Promise<?Puppeteer.Response>}
595
+ */
596
+ async _go(delta, options) {
597
+ const history = await this._client.send('Page.getNavigationHistory');
598
+ const entry = history.entries[history.currentIndex + delta];
599
+ if (!entry)
600
+ return null;
601
+ const [response] = await Promise.all([
602
+ this.waitForNavigation(options),
603
+ this._client.send('Page.navigateToHistoryEntry', {entryId: entry.id}),
604
+ ]);
605
+ return response;
606
+ }
607
+
608
+ async bringToFront() {
609
+ await this._client.send('Page.bringToFront');
610
+ }
611
+
612
+ /**
613
+ * @param {!Object} options
614
+ */
615
+ async emulate(options) {
616
+ return Promise.all([
617
+ this.setViewport(options.viewport),
618
+ this.setUserAgent(options.userAgent)
619
+ ]);
620
+ }
621
+
622
+ /**
623
+ * @param {boolean} enabled
624
+ */
625
+ async setJavaScriptEnabled(enabled) {
626
+ await this._client.send('Emulation.setScriptExecutionDisabled', { value: !enabled });
627
+ }
628
+
629
+ /**
630
+ * @param {boolean} enabled
631
+ */
632
+ async setBypassCSP(enabled) {
633
+ await this._client.send('Page.setBypassCSP', { enabled });
634
+ }
635
+
636
+ /**
637
+ * @param {?string} mediaType
638
+ */
639
+ async emulateMedia(mediaType) {
640
+ console.assert(mediaType === 'screen' || mediaType === 'print' || mediaType === null, 'Unsupported media type: ' + mediaType);
641
+ await this._client.send('Emulation.setEmulatedMedia', {media: mediaType || ''});
642
+ }
643
+
644
+ /**
645
+ * @param {!Page.Viewport} viewport
646
+ */
647
+ async setViewport(viewport) {
648
+ const needsReload = await this._emulationManager.emulateViewport(viewport);
649
+ this._viewport = viewport;
650
+ if (needsReload)
651
+ await this.reload();
652
+ }
653
+
654
+ /**
655
+ * @return {!Page.Viewport}
656
+ */
657
+ viewport() {
658
+ return this._viewport;
659
+ }
660
+
661
+ /**
662
+ * @param {function()|string} pageFunction
663
+ * @param {!Array<*>} args
664
+ * @return {!Promise<*>}
665
+ */
666
+ async evaluate(pageFunction, ...args) {
667
+ return this._frameManager.mainFrame().evaluate(pageFunction, ...args);
668
+ }
669
+
670
+ /**
671
+ * @param {function()|string} pageFunction
672
+ * @param {!Array<*>} args
673
+ */
674
+ async evaluateOnNewDocument(pageFunction, ...args) {
675
+ const source = helper.evaluationString(pageFunction, ...args);
676
+ await this._client.send('Page.addScriptToEvaluateOnNewDocument', { source });
677
+ }
678
+
679
+ /**
680
+ * @param {Boolean} enabled
681
+ * @returns {!Promise}
682
+ */
683
+ async setCacheEnabled(enabled = true) {
684
+ await this._client.send('Network.setCacheDisabled', {cacheDisabled: !enabled});
685
+ }
686
+
687
+ /**
688
+ * @param {!Object=} options
689
+ * @return {!Promise<!Buffer>}
690
+ */
691
+ async screenshot(options = {}) {
692
+ let screenshotType = null;
693
+ // options.type takes precedence over inferring the type from options.path
694
+ // because it may be a 0-length file with no extension created beforehand (i.e. as a temp file).
695
+ if (options.type) {
696
+ console.assert(options.type === 'png' || options.type === 'jpeg', 'Unknown options.type value: ' + options.type);
697
+ screenshotType = options.type;
698
+ } else if (options.path) {
699
+ const mimeType = mime.getType(options.path);
700
+ if (mimeType === 'image/png')
701
+ screenshotType = 'png';
702
+ else if (mimeType === 'image/jpeg')
703
+ screenshotType = 'jpeg';
704
+ console.assert(screenshotType, 'Unsupported screenshot mime type: ' + mimeType);
705
+ }
706
+
707
+ if (!screenshotType)
708
+ screenshotType = 'png';
709
+
710
+ if (options.quality) {
711
+ console.assert(screenshotType === 'jpeg', 'options.quality is unsupported for the ' + screenshotType + ' screenshots');
712
+ console.assert(typeof options.quality === 'number', 'Expected options.quality to be a number but found ' + (typeof options.quality));
713
+ console.assert(Number.isInteger(options.quality), 'Expected options.quality to be an integer');
714
+ console.assert(options.quality >= 0 && options.quality <= 100, 'Expected options.quality to be between 0 and 100 (inclusive), got ' + options.quality);
715
+ }
716
+ console.assert(!options.clip || !options.fullPage, 'options.clip and options.fullPage are exclusive');
717
+ if (options.clip) {
718
+ console.assert(typeof options.clip.x === 'number', 'Expected options.clip.x to be a number but found ' + (typeof options.clip.x));
719
+ console.assert(typeof options.clip.y === 'number', 'Expected options.clip.y to be a number but found ' + (typeof options.clip.y));
720
+ console.assert(typeof options.clip.width === 'number', 'Expected options.clip.width to be a number but found ' + (typeof options.clip.width));
721
+ console.assert(typeof options.clip.height === 'number', 'Expected options.clip.height to be a number but found ' + (typeof options.clip.height));
722
+ }
723
+ return this._screenshotTaskQueue.postTask(this._screenshotTask.bind(this, screenshotType, options));
724
+ }
725
+
726
+ /**
727
+ * @param {"png"|"jpeg"} format
728
+ * @param {!Object=} options
729
+ * @return {!Promise<!Buffer>}
730
+ */
731
+ async _screenshotTask(format, options) {
732
+ await this._client.send('Target.activateTarget', {targetId: this._target._targetId});
733
+ let clip = options.clip ? Object.assign({}, options['clip']) : undefined;
734
+ if (clip)
735
+ clip.scale = 1;
736
+
737
+ if (options.fullPage) {
738
+ const metrics = await this._client.send('Page.getLayoutMetrics');
739
+ const width = Math.ceil(metrics.contentSize.width);
740
+ const height = Math.ceil(metrics.contentSize.height);
741
+
742
+ // Overwrite clip for full page at all times.
743
+ clip = { x: 0, y: 0, width, height, scale: 1 };
744
+ const mobile = this._viewport.isMobile || false;
745
+ const deviceScaleFactor = this._viewport.deviceScaleFactor || 1;
746
+ const landscape = this._viewport.isLandscape || false;
747
+ /** @type {!Protocol.Emulation.ScreenOrientation} */
748
+ const screenOrientation = landscape ? { angle: 90, type: 'landscapePrimary' } : { angle: 0, type: 'portraitPrimary' };
749
+ await this._client.send('Emulation.setDeviceMetricsOverride', { mobile, width, height, deviceScaleFactor, screenOrientation });
750
+ }
751
+
752
+ if (options.omitBackground)
753
+ await this._client.send('Emulation.setDefaultBackgroundColorOverride', { color: { r: 0, g: 0, b: 0, a: 0 } });
754
+ const result = await this._client.send('Page.captureScreenshot', { format, quality: options.quality, clip });
755
+ if (options.omitBackground)
756
+ await this._client.send('Emulation.setDefaultBackgroundColorOverride');
757
+
758
+ if (options.fullPage)
759
+ await this.setViewport(this._viewport);
760
+
761
+ const buffer = Buffer.from(result.data, 'base64');
762
+ if (options.path)
763
+ await writeFileAsync(options.path, buffer);
764
+ return buffer;
765
+ }
766
+
767
+ /**
768
+ * @param {!Object=} options
769
+ * @return {!Promise<!Buffer>}
770
+ */
771
+ async pdf(options = {}) {
772
+ const scale = options.scale || 1;
773
+ const displayHeaderFooter = !!options.displayHeaderFooter;
774
+ const headerTemplate = options.headerTemplate || '';
775
+ const footerTemplate = options.footerTemplate || '';
776
+ const printBackground = !!options.printBackground;
777
+ const landscape = !!options.landscape;
778
+ const pageRanges = options.pageRanges || '';
779
+
780
+ let paperWidth = 8.5;
781
+ let paperHeight = 11;
782
+ if (options.format) {
783
+ const format = Page.PaperFormats[options.format.toLowerCase()];
784
+ console.assert(format, 'Unknown paper format: ' + options.format);
785
+ paperWidth = format.width;
786
+ paperHeight = format.height;
787
+ } else {
788
+ paperWidth = convertPrintParameterToInches(options.width) || paperWidth;
789
+ paperHeight = convertPrintParameterToInches(options.height) || paperHeight;
790
+ }
791
+
792
+ const marginOptions = options.margin || {};
793
+ const marginTop = convertPrintParameterToInches(marginOptions.top) || 0;
794
+ const marginLeft = convertPrintParameterToInches(marginOptions.left) || 0;
795
+ const marginBottom = convertPrintParameterToInches(marginOptions.bottom) || 0;
796
+ const marginRight = convertPrintParameterToInches(marginOptions.right) || 0;
797
+
798
+ const result = await this._client.send('Page.printToPDF', {
799
+ landscape: landscape,
800
+ displayHeaderFooter: displayHeaderFooter,
801
+ headerTemplate: headerTemplate,
802
+ footerTemplate: footerTemplate,
803
+ printBackground: printBackground,
804
+ scale: scale,
805
+ paperWidth: paperWidth,
806
+ paperHeight: paperHeight,
807
+ marginTop: marginTop,
808
+ marginBottom: marginBottom,
809
+ marginLeft: marginLeft,
810
+ marginRight: marginRight,
811
+ pageRanges: pageRanges
812
+ });
813
+ const buffer = Buffer.from(result.data, 'base64');
814
+ if (options.path)
815
+ await writeFileAsync(options.path, buffer);
816
+ return buffer;
817
+ }
818
+
819
+ /**
820
+ * @return {!Promise<string>}
821
+ */
822
+ async title() {
823
+ return this.mainFrame().title();
824
+ }
825
+
826
+ /**
827
+ * @param {!{runBeforeUnload: (boolean|undefined)}=} options
828
+ */
829
+ async close(options = {runBeforeUnload: undefined}) {
830
+ console.assert(!!this._client._connection, 'Protocol error: Connection closed. Most likely the page has been closed.');
831
+ const runBeforeUnload = !!options.runBeforeUnload;
832
+ if (runBeforeUnload) {
833
+ await this._client.send('Page.close');
834
+ } else {
835
+ await this._client._connection.send('Target.closeTarget', { targetId: this._target._targetId });
836
+ await this._target._isClosedPromise;
837
+ }
838
+ }
839
+
840
+ /**
841
+ * @return {!Mouse}
842
+ */
843
+ get mouse() {
844
+ return this._mouse;
845
+ }
846
+
847
+ /**
848
+ * @param {string} selector
849
+ * @param {!Object=} options
850
+ */
851
+ click(selector, options = {}) {
852
+ return this.mainFrame().click(selector, options);
853
+ }
854
+
855
+ /**
856
+ * @param {string} selector
857
+ */
858
+ focus(selector) {
859
+ return this.mainFrame().focus(selector);
860
+ }
861
+
862
+ /**
863
+ * @param {string} selector
864
+ */
865
+ hover(selector) {
866
+ return this.mainFrame().hover(selector);
867
+ }
868
+
869
+ /**
870
+ * @param {string} selector
871
+ * @param {!Array<string>} values
872
+ * @return {!Promise<!Array<string>>}
873
+ */
874
+ select(selector, ...values) {
875
+ return this.mainFrame().select(selector, ...values);
876
+ }
877
+
878
+ /**
879
+ * @param {string} selector
880
+ */
881
+ tap(selector) {
882
+ return this.mainFrame().tap(selector);
883
+ }
884
+
885
+ /**
886
+ * @param {string} selector
887
+ * @param {string} text
888
+ * @param {{delay: (number|undefined)}=} options
889
+ */
890
+ type(selector, text, options) {
891
+ return this.mainFrame().type(selector, text, options);
892
+ }
893
+
894
+ /**
895
+ * @param {(string|number|Function)} selectorOrFunctionOrTimeout
896
+ * @param {!Object=} options
897
+ * @param {!Array<*>} args
898
+ * @return {!Promise}
899
+ */
900
+ waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
901
+ return this.mainFrame().waitFor(selectorOrFunctionOrTimeout, options, ...args);
902
+ }
903
+
904
+ /**
905
+ * @param {string} selector
906
+ * @param {!Object=} options
907
+ * @return {!Promise}
908
+ */
909
+ waitForSelector(selector, options = {}) {
910
+ return this.mainFrame().waitForSelector(selector, options);
911
+ }
912
+
913
+ /**
914
+ * @param {string} xpath
915
+ * @param {!Object=} options
916
+ * @return {!Promise}
917
+ */
918
+ waitForXPath(xpath, options = {}) {
919
+ return this.mainFrame().waitForXPath(xpath, options);
920
+ }
921
+
922
+ /**
923
+ * @param {function()} pageFunction
924
+ * @param {!Object=} options
925
+ * @param {!Array<*>} args
926
+ * @return {!Promise}
927
+ */
928
+ waitForFunction(pageFunction, options = {}, ...args) {
929
+ return this.mainFrame().waitForFunction(pageFunction, options, ...args);
930
+ }
931
+ }
932
+
933
+ /** @type {!Set<string>} */
934
+ const supportedMetrics = new Set([
935
+ 'Timestamp',
936
+ 'Documents',
937
+ 'Frames',
938
+ 'JSEventListeners',
939
+ 'Nodes',
940
+ 'LayoutCount',
941
+ 'RecalcStyleCount',
942
+ 'LayoutDuration',
943
+ 'RecalcStyleDuration',
944
+ 'ScriptDuration',
945
+ 'TaskDuration',
946
+ 'JSHeapUsedSize',
947
+ 'JSHeapTotalSize',
948
+ ]);
949
+
950
+ /** @enum {string} */
951
+ Page.PaperFormats = {
952
+ letter: {width: 8.5, height: 11},
953
+ legal: {width: 8.5, height: 14},
954
+ tabloid: {width: 11, height: 17},
955
+ ledger: {width: 17, height: 11},
956
+ a0: {width: 33.1, height: 46.8 },
957
+ a1: {width: 23.4, height: 33.1 },
958
+ a2: {width: 16.5, height: 23.4 },
959
+ a3: {width: 11.7, height: 16.5 },
960
+ a4: {width: 8.27, height: 11.7 },
961
+ a5: {width: 5.83, height: 8.27 },
962
+ a6: {width: 4.13, height: 5.83 },
963
+ };
964
+
965
+ const unitToPixels = {
966
+ 'px': 1,
967
+ 'in': 96,
968
+ 'cm': 37.8,
969
+ 'mm': 3.78
970
+ };
971
+
972
+ /**
973
+ * @param {(string|number|undefined)} parameter
974
+ * @return {(number|undefined)}
975
+ */
976
+ function convertPrintParameterToInches(parameter) {
977
+ if (typeof parameter === 'undefined')
978
+ return undefined;
979
+ let pixels;
980
+ if (helper.isNumber(parameter)) {
981
+ // Treat numbers as pixel values to be aligned with phantom's paperSize.
982
+ pixels = /** @type {number} */ (parameter);
983
+ } else if (helper.isString(parameter)) {
984
+ const text = /** @type {string} */ (parameter);
985
+ let unit = text.substring(text.length - 2).toLowerCase();
986
+ let valueText = '';
987
+ if (unitToPixels.hasOwnProperty(unit)) {
988
+ valueText = text.substring(0, text.length - 2);
989
+ } else {
990
+ // In case of unknown unit try to parse the whole parameter as number of pixels.
991
+ // This is consistent with phantom's paperSize behavior.
992
+ unit = 'px';
993
+ valueText = text;
994
+ }
995
+ const value = Number(valueText);
996
+ console.assert(!isNaN(value), 'Failed to parse parameter value: ' + text);
997
+ pixels = value * unitToPixels[unit];
998
+ } else {
999
+ throw new Error('page.pdf() Cannot handle parameter type: ' + (typeof parameter));
1000
+ }
1001
+ return pixels / 96;
1002
+ }
1003
+
1004
+ Page.Events = {
1005
+ Close: 'close',
1006
+ Console: 'console',
1007
+ Dialog: 'dialog',
1008
+ DOMContentLoaded: 'domcontentloaded',
1009
+ Error: 'error',
1010
+ // Can't use just 'error' due to node.js special treatment of error events.
1011
+ // @see https://nodejs.org/api/events.html#events_error_events
1012
+ PageError: 'pageerror',
1013
+ Request: 'request',
1014
+ Response: 'response',
1015
+ RequestFailed: 'requestfailed',
1016
+ RequestFinished: 'requestfinished',
1017
+ FrameAttached: 'frameattached',
1018
+ FrameDetached: 'framedetached',
1019
+ FrameNavigated: 'framenavigated',
1020
+ Load: 'load',
1021
+ Metrics: 'metrics',
1022
+ };
1023
+
1024
+ /**
1025
+ * @typedef {Object} Page.Viewport
1026
+ * @property {number} width
1027
+ * @property {number} height
1028
+ * @property {number=} deviceScaleFactor
1029
+ * @property {boolean=} isMobile
1030
+ * @property {boolean=} isLandscape
1031
+ * @property {boolean=} hasTouch
1032
+ */
1033
+
1034
+ /**
1035
+ * @typedef {Object} Network.Cookie
1036
+ * @property {string} name
1037
+ * @property {string} value
1038
+ * @property {string} domain
1039
+ * @property {string} path
1040
+ * @property {number} expires
1041
+ * @property {number} size
1042
+ * @property {boolean} httpOnly
1043
+ * @property {boolean} secure
1044
+ * @property {boolean} session
1045
+ * @property {("Strict"|"Lax")=} sameSite
1046
+ */
1047
+
1048
+
1049
+ /**
1050
+ * @typedef {Object} Network.CookieParam
1051
+ * @property {string} name
1052
+ * @property {string} value
1053
+ * @property {string=} url
1054
+ * @property {string=} domain
1055
+ * @property {string=} path
1056
+ * @property {number=} expires
1057
+ * @property {boolean=} httpOnly
1058
+ * @property {boolean=} secure
1059
+ * @property {("Strict"|"Lax")=} sameSite
1060
+ */
1061
+
1062
+ class ConsoleMessage {
1063
+ /**
1064
+ * @param {string} type
1065
+ * @param {string} text
1066
+ * @param {!Array<*>} args
1067
+ */
1068
+ constructor(type, text, args = []) {
1069
+ this._type = type;
1070
+ this._text = text;
1071
+ this._args = args;
1072
+ }
1073
+
1074
+ /**
1075
+ * @return {string}
1076
+ */
1077
+ type() {
1078
+ return this._type;
1079
+ }
1080
+
1081
+ /**
1082
+ * @return {string}
1083
+ */
1084
+ text() {
1085
+ return this._text;
1086
+ }
1087
+
1088
+ /**
1089
+ * @return {!Array<string>}
1090
+ */
1091
+ args() {
1092
+ return this._args;
1093
+ }
1094
+ }
1095
+
1096
+
1097
+ module.exports = Page;
1098
+ helper.tracePublicAPI(Page);