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,2242 @@
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) {return (fn => {
42
+ const gen = fn.call(this);
43
+ return new Promise((resolve, reject) => {
44
+ function step(key, arg) {
45
+ let info, value;
46
+ try {
47
+ info = gen[key](arg);
48
+ value = info.value;
49
+ } catch (error) {
50
+ reject(error);
51
+ return;
52
+ }
53
+ if (info.done) {
54
+ resolve(value);
55
+ } else {
56
+ return Promise.resolve(value).then(
57
+ value => {
58
+ step('next', value);
59
+ },
60
+ err => {
61
+ step('throw', err);
62
+ });
63
+ }
64
+ }
65
+ return step('next');
66
+ });
67
+ })(function*(){
68
+
69
+ (yield client.send('Page.enable'));
70
+ const {frameTree} = (yield client.send('Page.getFrameTree'));
71
+ const page = new Page(client, target, frameTree, ignoreHTTPSErrors, screenshotTaskQueue);
72
+
73
+ (yield Promise.all([
74
+ client.send('Page.setLifecycleEventsEnabled', { enabled: true }),
75
+ client.send('Network.enable', {}),
76
+ client.send('Runtime.enable', {}),
77
+ client.send('Security.enable', {}),
78
+ client.send('Performance.enable', {}),
79
+ client.send('Log.enable', {}),
80
+ ]));
81
+ if (ignoreHTTPSErrors)
82
+ (yield client.send('Security.setOverrideCertificateErrors', {override: true}));
83
+ // Initialize default page size.
84
+ if (setDefaultViewport)
85
+ (yield page.setViewport({width: 800, height: 600}));
86
+
87
+ return page;
88
+ });}
89
+
90
+ /**
91
+ * @param {!Puppeteer.CDPSession} client
92
+ * @param {!Puppeteer.Target} target
93
+ * @param {!Protocol.Page.FrameTree} frameTree
94
+ * @param {boolean} ignoreHTTPSErrors
95
+ * @param {!Puppeteer.TaskQueue} screenshotTaskQueue
96
+ */
97
+ constructor(client, target, frameTree, ignoreHTTPSErrors, screenshotTaskQueue) {
98
+ super();
99
+ this._client = client;
100
+ this._target = target;
101
+ this._keyboard = new Keyboard(client);
102
+ this._mouse = new Mouse(client, this._keyboard);
103
+ this._touchscreen = new Touchscreen(client, this._keyboard);
104
+ this._frameManager = new FrameManager(client, frameTree, this);
105
+ this._networkManager = new NetworkManager(client, this._frameManager);
106
+ this._emulationManager = new EmulationManager(client);
107
+ this._tracing = new Tracing(client);
108
+ /** @type {!Map<string, Function>} */
109
+ this._pageBindings = new Map();
110
+ this._ignoreHTTPSErrors = ignoreHTTPSErrors;
111
+ this._coverage = new Coverage(client);
112
+ this._defaultNavigationTimeout = 30000;
113
+
114
+ this._screenshotTaskQueue = screenshotTaskQueue;
115
+
116
+ this._frameManager.on(FrameManager.Events.FrameAttached, event => this.emit(Page.Events.FrameAttached, event));
117
+ this._frameManager.on(FrameManager.Events.FrameDetached, event => this.emit(Page.Events.FrameDetached, event));
118
+ this._frameManager.on(FrameManager.Events.FrameNavigated, event => this.emit(Page.Events.FrameNavigated, event));
119
+
120
+ this._networkManager.on(NetworkManager.Events.Request, event => this.emit(Page.Events.Request, event));
121
+ this._networkManager.on(NetworkManager.Events.Response, event => this.emit(Page.Events.Response, event));
122
+ this._networkManager.on(NetworkManager.Events.RequestFailed, event => this.emit(Page.Events.RequestFailed, event));
123
+ this._networkManager.on(NetworkManager.Events.RequestFinished, event => this.emit(Page.Events.RequestFinished, event));
124
+
125
+ client.on('Page.domContentEventFired', event => this.emit(Page.Events.DOMContentLoaded));
126
+ client.on('Page.loadEventFired', event => this.emit(Page.Events.Load));
127
+ client.on('Runtime.consoleAPICalled', event => this._onConsoleAPI(event));
128
+ client.on('Page.javascriptDialogOpening', event => this._onDialog(event));
129
+ client.on('Runtime.exceptionThrown', exception => this._handleException(exception.exceptionDetails));
130
+ client.on('Security.certificateError', event => this._onCertificateError(event));
131
+ client.on('Inspector.targetCrashed', event => this._onTargetCrashed());
132
+ client.on('Performance.metrics', event => this._emitMetrics(event));
133
+ client.on('Log.entryAdded', event => this._onLogEntryAdded(event));
134
+ this._target._isClosedPromise.then(() => this.emit(Page.Events.Close));
135
+ }
136
+
137
+ /**
138
+ * @return {!Puppeteer.Target}
139
+ */
140
+ target() {
141
+ return this._target;
142
+ }
143
+
144
+ /**
145
+ * @return {!Puppeteer.Browser}
146
+ */
147
+ browser() {
148
+ return this._target.browser();
149
+ }
150
+
151
+ _onTargetCrashed() {
152
+ this.emit('error', new Error('Page crashed!'));
153
+ }
154
+
155
+ _onLogEntryAdded(event) {
156
+ const {level, text, args} = event.entry;
157
+ if (args)
158
+ args.map(arg => helper.releaseObject(this._client, arg));
159
+
160
+ this.emit(Page.Events.Console, new ConsoleMessage(level, text));
161
+ }
162
+
163
+ /**
164
+ * @return {!Puppeteer.Frame}
165
+ */
166
+ mainFrame() {
167
+ return this._frameManager.mainFrame();
168
+ }
169
+
170
+ /**
171
+ * @return {!Keyboard}
172
+ */
173
+ get keyboard() {
174
+ return this._keyboard;
175
+ }
176
+
177
+ /**
178
+ * @return {!Touchscreen}
179
+ */
180
+ get touchscreen() {
181
+ return this._touchscreen;
182
+ }
183
+
184
+ /**
185
+ * @return {!Coverage}
186
+ */
187
+ get coverage() {
188
+ return this._coverage;
189
+ }
190
+
191
+ /**
192
+ * @return {!Tracing}
193
+ */
194
+ get tracing() {
195
+ return this._tracing;
196
+ }
197
+
198
+ /**
199
+ * @return {!Array<Puppeteer.Frame>}
200
+ */
201
+ frames() {
202
+ return this._frameManager.frames();
203
+ }
204
+
205
+ /**
206
+ * @param {boolean} value
207
+ */
208
+ /* async */ setRequestInterception(value) {return (fn => {
209
+ const gen = fn.call(this);
210
+ return new Promise((resolve, reject) => {
211
+ function step(key, arg) {
212
+ let info, value;
213
+ try {
214
+ info = gen[key](arg);
215
+ value = info.value;
216
+ } catch (error) {
217
+ reject(error);
218
+ return;
219
+ }
220
+ if (info.done) {
221
+ resolve(value);
222
+ } else {
223
+ return Promise.resolve(value).then(
224
+ value => {
225
+ step('next', value);
226
+ },
227
+ err => {
228
+ step('throw', err);
229
+ });
230
+ }
231
+ }
232
+ return step('next');
233
+ });
234
+ })(function*(){
235
+ return this._networkManager.setRequestInterception(value);
236
+ });}
237
+
238
+ /**
239
+ * @param {boolean} enabled
240
+ */
241
+ setOfflineMode(enabled) {
242
+ return this._networkManager.setOfflineMode(enabled);
243
+ }
244
+
245
+ /**
246
+ * @param {number} timeout
247
+ */
248
+ setDefaultNavigationTimeout(timeout) {
249
+ this._defaultNavigationTimeout = timeout;
250
+ }
251
+
252
+ /**
253
+ * @param {!Protocol.Security.certificateErrorPayload} event
254
+ */
255
+ _onCertificateError(event) {
256
+ if (!this._ignoreHTTPSErrors)
257
+ return;
258
+ this._client.send('Security.handleCertificateError', {
259
+ eventId: event.eventId,
260
+ action: 'continue'
261
+ }).catch(debugError);
262
+ }
263
+
264
+ /**
265
+ * @param {string} selector
266
+ * @return {!Promise<?Puppeteer.ElementHandle>}
267
+ */
268
+ /* async */ $(selector) {return (fn => {
269
+ const gen = fn.call(this);
270
+ return new Promise((resolve, reject) => {
271
+ function step(key, arg) {
272
+ let info, value;
273
+ try {
274
+ info = gen[key](arg);
275
+ value = info.value;
276
+ } catch (error) {
277
+ reject(error);
278
+ return;
279
+ }
280
+ if (info.done) {
281
+ resolve(value);
282
+ } else {
283
+ return Promise.resolve(value).then(
284
+ value => {
285
+ step('next', value);
286
+ },
287
+ err => {
288
+ step('throw', err);
289
+ });
290
+ }
291
+ }
292
+ return step('next');
293
+ });
294
+ })(function*(){
295
+ return this.mainFrame().$(selector);
296
+ });}
297
+
298
+ /**
299
+ * @param {function()|string} pageFunction
300
+ * @param {!Array<*>} args
301
+ * @return {!Promise<!Puppeteer.JSHandle>}
302
+ */
303
+ /* async */ evaluateHandle(pageFunction, ...args) {return (fn => {
304
+ const gen = fn.call(this);
305
+ return new Promise((resolve, reject) => {
306
+ function step(key, arg) {
307
+ let info, value;
308
+ try {
309
+ info = gen[key](arg);
310
+ value = info.value;
311
+ } catch (error) {
312
+ reject(error);
313
+ return;
314
+ }
315
+ if (info.done) {
316
+ resolve(value);
317
+ } else {
318
+ return Promise.resolve(value).then(
319
+ value => {
320
+ step('next', value);
321
+ },
322
+ err => {
323
+ step('throw', err);
324
+ });
325
+ }
326
+ }
327
+ return step('next');
328
+ });
329
+ })(function*(){
330
+ const context = (yield this.mainFrame().executionContext());
331
+ return context.evaluateHandle(pageFunction, ...args);
332
+ });}
333
+
334
+ /**
335
+ * @param {!Puppeteer.JSHandle} prototypeHandle
336
+ * @return {!Promise<!Puppeteer.JSHandle>}
337
+ */
338
+ /* async */ queryObjects(prototypeHandle) {return (fn => {
339
+ const gen = fn.call(this);
340
+ return new Promise((resolve, reject) => {
341
+ function step(key, arg) {
342
+ let info, value;
343
+ try {
344
+ info = gen[key](arg);
345
+ value = info.value;
346
+ } catch (error) {
347
+ reject(error);
348
+ return;
349
+ }
350
+ if (info.done) {
351
+ resolve(value);
352
+ } else {
353
+ return Promise.resolve(value).then(
354
+ value => {
355
+ step('next', value);
356
+ },
357
+ err => {
358
+ step('throw', err);
359
+ });
360
+ }
361
+ }
362
+ return step('next');
363
+ });
364
+ })(function*(){
365
+ const context = (yield this.mainFrame().executionContext());
366
+ return context.queryObjects(prototypeHandle);
367
+ });}
368
+
369
+ /**
370
+ * @param {string} selector
371
+ * @param {function()|string} pageFunction
372
+ * @param {!Array<*>} args
373
+ * @return {!Promise<(!Object|undefined)>}
374
+ */
375
+ /* async */ $eval(selector, pageFunction, ...args) {return (fn => {
376
+ const gen = fn.call(this);
377
+ return new Promise((resolve, reject) => {
378
+ function step(key, arg) {
379
+ let info, value;
380
+ try {
381
+ info = gen[key](arg);
382
+ value = info.value;
383
+ } catch (error) {
384
+ reject(error);
385
+ return;
386
+ }
387
+ if (info.done) {
388
+ resolve(value);
389
+ } else {
390
+ return Promise.resolve(value).then(
391
+ value => {
392
+ step('next', value);
393
+ },
394
+ err => {
395
+ step('throw', err);
396
+ });
397
+ }
398
+ }
399
+ return step('next');
400
+ });
401
+ })(function*(){
402
+ return this.mainFrame().$eval(selector, pageFunction, ...args);
403
+ });}
404
+
405
+ /**
406
+ * @param {string} selector
407
+ * @param {Function|string} pageFunction
408
+ * @param {!Array<*>} args
409
+ * @return {!Promise<(!Object|undefined)>}
410
+ */
411
+ /* async */ $$eval(selector, pageFunction, ...args) {return (fn => {
412
+ const gen = fn.call(this);
413
+ return new Promise((resolve, reject) => {
414
+ function step(key, arg) {
415
+ let info, value;
416
+ try {
417
+ info = gen[key](arg);
418
+ value = info.value;
419
+ } catch (error) {
420
+ reject(error);
421
+ return;
422
+ }
423
+ if (info.done) {
424
+ resolve(value);
425
+ } else {
426
+ return Promise.resolve(value).then(
427
+ value => {
428
+ step('next', value);
429
+ },
430
+ err => {
431
+ step('throw', err);
432
+ });
433
+ }
434
+ }
435
+ return step('next');
436
+ });
437
+ })(function*(){
438
+ return this.mainFrame().$$eval(selector, pageFunction, ...args);
439
+ });}
440
+
441
+ /**
442
+ * @param {string} selector
443
+ * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
444
+ */
445
+ /* async */ $$(selector) {return (fn => {
446
+ const gen = fn.call(this);
447
+ return new Promise((resolve, reject) => {
448
+ function step(key, arg) {
449
+ let info, value;
450
+ try {
451
+ info = gen[key](arg);
452
+ value = info.value;
453
+ } catch (error) {
454
+ reject(error);
455
+ return;
456
+ }
457
+ if (info.done) {
458
+ resolve(value);
459
+ } else {
460
+ return Promise.resolve(value).then(
461
+ value => {
462
+ step('next', value);
463
+ },
464
+ err => {
465
+ step('throw', err);
466
+ });
467
+ }
468
+ }
469
+ return step('next');
470
+ });
471
+ })(function*(){
472
+ return this.mainFrame().$$(selector);
473
+ });}
474
+
475
+ /**
476
+ * @param {string} expression
477
+ * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
478
+ */
479
+ /* async */ $x(expression) {return (fn => {
480
+ const gen = fn.call(this);
481
+ return new Promise((resolve, reject) => {
482
+ function step(key, arg) {
483
+ let info, value;
484
+ try {
485
+ info = gen[key](arg);
486
+ value = info.value;
487
+ } catch (error) {
488
+ reject(error);
489
+ return;
490
+ }
491
+ if (info.done) {
492
+ resolve(value);
493
+ } else {
494
+ return Promise.resolve(value).then(
495
+ value => {
496
+ step('next', value);
497
+ },
498
+ err => {
499
+ step('throw', err);
500
+ });
501
+ }
502
+ }
503
+ return step('next');
504
+ });
505
+ })(function*(){
506
+ return this.mainFrame().$x(expression);
507
+ });}
508
+
509
+ /**
510
+ * @param {!Array<string>} urls
511
+ * @return {!Promise<!Array<Network.Cookie>>}
512
+ */
513
+ /* async */ cookies(...urls) {return (fn => {
514
+ const gen = fn.call(this);
515
+ return new Promise((resolve, reject) => {
516
+ function step(key, arg) {
517
+ let info, value;
518
+ try {
519
+ info = gen[key](arg);
520
+ value = info.value;
521
+ } catch (error) {
522
+ reject(error);
523
+ return;
524
+ }
525
+ if (info.done) {
526
+ resolve(value);
527
+ } else {
528
+ return Promise.resolve(value).then(
529
+ value => {
530
+ step('next', value);
531
+ },
532
+ err => {
533
+ step('throw', err);
534
+ });
535
+ }
536
+ }
537
+ return step('next');
538
+ });
539
+ })(function*(){
540
+ return ((yield this._client.send('Network.getCookies', {
541
+ urls: urls.length ? urls : [this.url()]
542
+ }))).cookies;
543
+ });}
544
+
545
+ /**
546
+ * @param {Array<Network.CookieParam>} cookies
547
+ */
548
+ /* async */ deleteCookie(...cookies) {return (fn => {
549
+ const gen = fn.call(this);
550
+ return new Promise((resolve, reject) => {
551
+ function step(key, arg) {
552
+ let info, value;
553
+ try {
554
+ info = gen[key](arg);
555
+ value = info.value;
556
+ } catch (error) {
557
+ reject(error);
558
+ return;
559
+ }
560
+ if (info.done) {
561
+ resolve(value);
562
+ } else {
563
+ return Promise.resolve(value).then(
564
+ value => {
565
+ step('next', value);
566
+ },
567
+ err => {
568
+ step('throw', err);
569
+ });
570
+ }
571
+ }
572
+ return step('next');
573
+ });
574
+ })(function*(){
575
+ const pageURL = this.url();
576
+ for (const cookie of cookies) {
577
+ const item = Object.assign({}, cookie);
578
+ if (!cookie.url && pageURL.startsWith('http'))
579
+ item.url = pageURL;
580
+ (yield this._client.send('Network.deleteCookies', item));
581
+ }
582
+ });}
583
+
584
+ /**
585
+ * @param {Array<Network.CookieParam>} cookies
586
+ */
587
+ /* async */ setCookie(...cookies) {return (fn => {
588
+ const gen = fn.call(this);
589
+ return new Promise((resolve, reject) => {
590
+ function step(key, arg) {
591
+ let info, value;
592
+ try {
593
+ info = gen[key](arg);
594
+ value = info.value;
595
+ } catch (error) {
596
+ reject(error);
597
+ return;
598
+ }
599
+ if (info.done) {
600
+ resolve(value);
601
+ } else {
602
+ return Promise.resolve(value).then(
603
+ value => {
604
+ step('next', value);
605
+ },
606
+ err => {
607
+ step('throw', err);
608
+ });
609
+ }
610
+ }
611
+ return step('next');
612
+ });
613
+ })(function*(){
614
+ const pageURL = this.url();
615
+ const startsWithHTTP = pageURL.startsWith('http');
616
+ const items = cookies.map(cookie => {
617
+ const item = Object.assign({}, cookie);
618
+ if (!item.url && startsWithHTTP)
619
+ item.url = pageURL;
620
+ console.assert(
621
+ item.url !== 'about:blank',
622
+ `Blank page can not have cookie "${item.name}"`
623
+ );
624
+ console.assert(
625
+ !String.prototype.startsWith.call(item.url || '', 'data:'),
626
+ `Data URL page can not have cookie "${item.name}"`
627
+ );
628
+ return item;
629
+ });
630
+ (yield this.deleteCookie(...items));
631
+ if (items.length)
632
+ (yield this._client.send('Network.setCookies', { cookies: items }));
633
+ });}
634
+
635
+ /**
636
+ * @param {Object} options
637
+ * @return {!Promise<!Puppeteer.ElementHandle>}
638
+ */
639
+ /* async */ addScriptTag(options) {return (fn => {
640
+ const gen = fn.call(this);
641
+ return new Promise((resolve, reject) => {
642
+ function step(key, arg) {
643
+ let info, value;
644
+ try {
645
+ info = gen[key](arg);
646
+ value = info.value;
647
+ } catch (error) {
648
+ reject(error);
649
+ return;
650
+ }
651
+ if (info.done) {
652
+ resolve(value);
653
+ } else {
654
+ return Promise.resolve(value).then(
655
+ value => {
656
+ step('next', value);
657
+ },
658
+ err => {
659
+ step('throw', err);
660
+ });
661
+ }
662
+ }
663
+ return step('next');
664
+ });
665
+ })(function*(){
666
+ return this.mainFrame().addScriptTag(options);
667
+ });}
668
+
669
+ /**
670
+ * @param {Object} options
671
+ * @return {!Promise<!Puppeteer.ElementHandle>}
672
+ */
673
+ /* async */ addStyleTag(options) {return (fn => {
674
+ const gen = fn.call(this);
675
+ return new Promise((resolve, reject) => {
676
+ function step(key, arg) {
677
+ let info, value;
678
+ try {
679
+ info = gen[key](arg);
680
+ value = info.value;
681
+ } catch (error) {
682
+ reject(error);
683
+ return;
684
+ }
685
+ if (info.done) {
686
+ resolve(value);
687
+ } else {
688
+ return Promise.resolve(value).then(
689
+ value => {
690
+ step('next', value);
691
+ },
692
+ err => {
693
+ step('throw', err);
694
+ });
695
+ }
696
+ }
697
+ return step('next');
698
+ });
699
+ })(function*(){
700
+ return this.mainFrame().addStyleTag(options);
701
+ });}
702
+
703
+ /**
704
+ * @param {string} name
705
+ * @param {function(?)} puppeteerFunction
706
+ */
707
+ /* async */ exposeFunction(name, puppeteerFunction) {return (fn => {
708
+ const gen = fn.call(this);
709
+ return new Promise((resolve, reject) => {
710
+ function step(key, arg) {
711
+ let info, value;
712
+ try {
713
+ info = gen[key](arg);
714
+ value = info.value;
715
+ } catch (error) {
716
+ reject(error);
717
+ return;
718
+ }
719
+ if (info.done) {
720
+ resolve(value);
721
+ } else {
722
+ return Promise.resolve(value).then(
723
+ value => {
724
+ step('next', value);
725
+ },
726
+ err => {
727
+ step('throw', err);
728
+ });
729
+ }
730
+ }
731
+ return step('next');
732
+ });
733
+ })(function*(){
734
+ if (this._pageBindings[name])
735
+ throw new Error(`Failed to add page binding with name ${name}: window['${name}'] already exists!`);
736
+ this._pageBindings[name] = puppeteerFunction;
737
+
738
+ const expression = helper.evaluationString(addPageBinding, name);
739
+ (yield this._client.send('Page.addScriptToEvaluateOnNewDocument', {source: expression}));
740
+ (yield Promise.all(this.frames().map(frame => frame.evaluate(expression).catch(debugError))));
741
+
742
+ function addPageBinding(bindingName) {
743
+ window[bindingName] = /* async */(...args) => {return (fn => {
744
+ const gen = fn.call(this);
745
+ return new Promise((resolve, reject) => {
746
+ function step(key, arg) {
747
+ let info, value;
748
+ try {
749
+ info = gen[key](arg);
750
+ value = info.value;
751
+ } catch (error) {
752
+ reject(error);
753
+ return;
754
+ }
755
+ if (info.done) {
756
+ resolve(value);
757
+ } else {
758
+ return Promise.resolve(value).then(
759
+ value => {
760
+ step('next', value);
761
+ },
762
+ err => {
763
+ step('throw', err);
764
+ });
765
+ }
766
+ }
767
+ return step('next');
768
+ });
769
+ })(function*(){
770
+ const me = window[bindingName];
771
+ let callbacks = me['callbacks'];
772
+ if (!callbacks) {
773
+ callbacks = new Map();
774
+ me['callbacks'] = callbacks;
775
+ }
776
+ const seq = (me['lastSeq'] || 0) + 1;
777
+ me['lastSeq'] = seq;
778
+ const promise = new Promise(fulfill => callbacks.set(seq, fulfill));
779
+ // eslint-disable-next-line no-console
780
+ console.debug('driver:page-binding', JSON.stringify({name: bindingName, seq, args}));
781
+ return promise;
782
+ });};
783
+ }
784
+ });}
785
+
786
+ /**
787
+ * @param {?{username: string, password: string}} credentials
788
+ */
789
+ /* async */ authenticate(credentials) {return (fn => {
790
+ const gen = fn.call(this);
791
+ return new Promise((resolve, reject) => {
792
+ function step(key, arg) {
793
+ let info, value;
794
+ try {
795
+ info = gen[key](arg);
796
+ value = info.value;
797
+ } catch (error) {
798
+ reject(error);
799
+ return;
800
+ }
801
+ if (info.done) {
802
+ resolve(value);
803
+ } else {
804
+ return Promise.resolve(value).then(
805
+ value => {
806
+ step('next', value);
807
+ },
808
+ err => {
809
+ step('throw', err);
810
+ });
811
+ }
812
+ }
813
+ return step('next');
814
+ });
815
+ })(function*(){
816
+ return this._networkManager.authenticate(credentials);
817
+ });}
818
+
819
+ /**
820
+ * @param {!Object<string, string>} headers
821
+ */
822
+ /* async */ setExtraHTTPHeaders(headers) {return (fn => {
823
+ const gen = fn.call(this);
824
+ return new Promise((resolve, reject) => {
825
+ function step(key, arg) {
826
+ let info, value;
827
+ try {
828
+ info = gen[key](arg);
829
+ value = info.value;
830
+ } catch (error) {
831
+ reject(error);
832
+ return;
833
+ }
834
+ if (info.done) {
835
+ resolve(value);
836
+ } else {
837
+ return Promise.resolve(value).then(
838
+ value => {
839
+ step('next', value);
840
+ },
841
+ err => {
842
+ step('throw', err);
843
+ });
844
+ }
845
+ }
846
+ return step('next');
847
+ });
848
+ })(function*(){
849
+ return this._networkManager.setExtraHTTPHeaders(headers);
850
+ });}
851
+
852
+ /**
853
+ * @param {string} userAgent
854
+ */
855
+ /* async */ setUserAgent(userAgent) {return (fn => {
856
+ const gen = fn.call(this);
857
+ return new Promise((resolve, reject) => {
858
+ function step(key, arg) {
859
+ let info, value;
860
+ try {
861
+ info = gen[key](arg);
862
+ value = info.value;
863
+ } catch (error) {
864
+ reject(error);
865
+ return;
866
+ }
867
+ if (info.done) {
868
+ resolve(value);
869
+ } else {
870
+ return Promise.resolve(value).then(
871
+ value => {
872
+ step('next', value);
873
+ },
874
+ err => {
875
+ step('throw', err);
876
+ });
877
+ }
878
+ }
879
+ return step('next');
880
+ });
881
+ })(function*(){
882
+ return this._networkManager.setUserAgent(userAgent);
883
+ });}
884
+
885
+ /**
886
+ * @return {!Promise<!Object>}
887
+ */
888
+ /* async */ metrics() {return (fn => {
889
+ const gen = fn.call(this);
890
+ return new Promise((resolve, reject) => {
891
+ function step(key, arg) {
892
+ let info, value;
893
+ try {
894
+ info = gen[key](arg);
895
+ value = info.value;
896
+ } catch (error) {
897
+ reject(error);
898
+ return;
899
+ }
900
+ if (info.done) {
901
+ resolve(value);
902
+ } else {
903
+ return Promise.resolve(value).then(
904
+ value => {
905
+ step('next', value);
906
+ },
907
+ err => {
908
+ step('throw', err);
909
+ });
910
+ }
911
+ }
912
+ return step('next');
913
+ });
914
+ })(function*(){
915
+ const response = (yield this._client.send('Performance.getMetrics'));
916
+ return this._buildMetricsObject(response.metrics);
917
+ });}
918
+
919
+ /**
920
+ * @param {*} event
921
+ */
922
+ _emitMetrics(event) {
923
+ this.emit(Page.Events.Metrics, {
924
+ title: event.title,
925
+ metrics: this._buildMetricsObject(event.metrics)
926
+ });
927
+ }
928
+
929
+ /**
930
+ * @param {?Array<!Protocol.Performance.Metric>} metrics
931
+ * @return {!Object}
932
+ */
933
+ _buildMetricsObject(metrics) {
934
+ const result = {};
935
+ for (const metric of metrics || []) {
936
+ if (supportedMetrics.has(metric.name))
937
+ result[metric.name] = metric.value;
938
+ }
939
+ return result;
940
+ }
941
+
942
+ /**
943
+ * @param {!Protocol.Runtime.ExceptionDetails} exceptionDetails
944
+ */
945
+ _handleException(exceptionDetails) {
946
+ const message = helper.getExceptionMessage(exceptionDetails);
947
+ this.emit(Page.Events.PageError, new Error(message));
948
+ }
949
+
950
+ /* async */ _onConsoleAPI(event) {return (fn => {
951
+ const gen = fn.call(this);
952
+ return new Promise((resolve, reject) => {
953
+ function step(key, arg) {
954
+ let info, value;
955
+ try {
956
+ info = gen[key](arg);
957
+ value = info.value;
958
+ } catch (error) {
959
+ reject(error);
960
+ return;
961
+ }
962
+ if (info.done) {
963
+ resolve(value);
964
+ } else {
965
+ return Promise.resolve(value).then(
966
+ value => {
967
+ step('next', value);
968
+ },
969
+ err => {
970
+ step('throw', err);
971
+ });
972
+ }
973
+ }
974
+ return step('next');
975
+ });
976
+ })(function*(){
977
+ if (event.type === 'debug' && event.args.length && event.args[0].value === 'driver:page-binding') {
978
+ const {name, seq, args} = JSON.parse(event.args[1].value);
979
+ const result = (yield this._pageBindings[name](...args));
980
+ const expression = helper.evaluationString(deliverResult, name, seq, result);
981
+ this._client.send('Runtime.evaluate', { expression, contextId: event.executionContextId }).catch(debugError);
982
+
983
+ function deliverResult(name, seq, result) {
984
+ window[name]['callbacks'].get(seq)(result);
985
+ window[name]['callbacks'].delete(seq);
986
+ }
987
+ return;
988
+ }
989
+ if (!this.listenerCount(Page.Events.Console)) {
990
+ event.args.map(arg => helper.releaseObject(this._client, arg));
991
+ return;
992
+ }
993
+ const values = event.args.map(arg => this._frameManager.createJSHandle(event.executionContextId, arg));
994
+ const textTokens = [];
995
+ for (let i = 0; i < event.args.length; ++i) {
996
+ const remoteObject = event.args[i];
997
+ if (remoteObject.objectId)
998
+ textTokens.push(values[i].toString());
999
+ else
1000
+ textTokens.push(helper.valueFromRemoteObject(remoteObject));
1001
+ }
1002
+ const message = new ConsoleMessage(event.type, textTokens.join(' '), values);
1003
+ this.emit(Page.Events.Console, message);
1004
+ });}
1005
+
1006
+ _onDialog(event) {
1007
+ let dialogType = null;
1008
+ if (event.type === 'alert')
1009
+ dialogType = Dialog.Type.Alert;
1010
+ else if (event.type === 'confirm')
1011
+ dialogType = Dialog.Type.Confirm;
1012
+ else if (event.type === 'prompt')
1013
+ dialogType = Dialog.Type.Prompt;
1014
+ else if (event.type === 'beforeunload')
1015
+ dialogType = Dialog.Type.BeforeUnload;
1016
+ console.assert(dialogType, 'Unknown javascript dialog type: ' + event.type);
1017
+ const dialog = new Dialog(this._client, dialogType, event.message, event.defaultPrompt);
1018
+ this.emit(Page.Events.Dialog, dialog);
1019
+ }
1020
+
1021
+ /**
1022
+ * @return {!string}
1023
+ */
1024
+ url() {
1025
+ return this.mainFrame().url();
1026
+ }
1027
+
1028
+ /**
1029
+ * @return {!Promise<String>}
1030
+ */
1031
+ /* async */ content() {return (fn => {
1032
+ const gen = fn.call(this);
1033
+ return new Promise((resolve, reject) => {
1034
+ function step(key, arg) {
1035
+ let info, value;
1036
+ try {
1037
+ info = gen[key](arg);
1038
+ value = info.value;
1039
+ } catch (error) {
1040
+ reject(error);
1041
+ return;
1042
+ }
1043
+ if (info.done) {
1044
+ resolve(value);
1045
+ } else {
1046
+ return Promise.resolve(value).then(
1047
+ value => {
1048
+ step('next', value);
1049
+ },
1050
+ err => {
1051
+ step('throw', err);
1052
+ });
1053
+ }
1054
+ }
1055
+ return step('next');
1056
+ });
1057
+ })(function*(){
1058
+ return (yield this._frameManager.mainFrame().content());
1059
+ });}
1060
+
1061
+ /**
1062
+ * @param {string} html
1063
+ */
1064
+ /* async */ setContent(html) {return (fn => {
1065
+ const gen = fn.call(this);
1066
+ return new Promise((resolve, reject) => {
1067
+ function step(key, arg) {
1068
+ let info, value;
1069
+ try {
1070
+ info = gen[key](arg);
1071
+ value = info.value;
1072
+ } catch (error) {
1073
+ reject(error);
1074
+ return;
1075
+ }
1076
+ if (info.done) {
1077
+ resolve(value);
1078
+ } else {
1079
+ return Promise.resolve(value).then(
1080
+ value => {
1081
+ step('next', value);
1082
+ },
1083
+ err => {
1084
+ step('throw', err);
1085
+ });
1086
+ }
1087
+ }
1088
+ return step('next');
1089
+ });
1090
+ })(function*(){
1091
+ (yield this._frameManager.mainFrame().setContent(html));
1092
+ });}
1093
+
1094
+ /**
1095
+ * @param {string} url
1096
+ * @param {!Object=} options
1097
+ * @return {!Promise<?Puppeteer.Response>}
1098
+ */
1099
+ /* async */ goto(url, options = {}) {return (fn => {
1100
+ const gen = fn.call(this);
1101
+ return new Promise((resolve, reject) => {
1102
+ function step(key, arg) {
1103
+ let info, value;
1104
+ try {
1105
+ info = gen[key](arg);
1106
+ value = info.value;
1107
+ } catch (error) {
1108
+ reject(error);
1109
+ return;
1110
+ }
1111
+ if (info.done) {
1112
+ resolve(value);
1113
+ } else {
1114
+ return Promise.resolve(value).then(
1115
+ value => {
1116
+ step('next', value);
1117
+ },
1118
+ err => {
1119
+ step('throw', err);
1120
+ });
1121
+ }
1122
+ }
1123
+ return step('next');
1124
+ });
1125
+ })(function*(){
1126
+ const referrer = this._networkManager.extraHTTPHeaders()['referer'];
1127
+
1128
+ /** @type {Map<string, !Puppeteer.Request>} */
1129
+ const requests = new Map();
1130
+ const eventListeners = [
1131
+ helper.addEventListener(this._networkManager, NetworkManager.Events.Request, request => {
1132
+ if (!requests.get(request.url()))
1133
+ requests.set(request.url(), request);
1134
+ })
1135
+ ];
1136
+
1137
+ const mainFrame = this._frameManager.mainFrame();
1138
+ const timeout = typeof options.timeout === 'number' ? options.timeout : this._defaultNavigationTimeout;
1139
+ const watcher = new NavigatorWatcher(this._frameManager, mainFrame, timeout, options);
1140
+ const navigationPromise = watcher.navigationPromise();
1141
+ let error = (yield Promise.race([
1142
+ navigate(this._client, url, referrer),
1143
+ navigationPromise,
1144
+ ]));
1145
+ if (!error)
1146
+ error = (yield navigationPromise);
1147
+ watcher.cancel();
1148
+ helper.removeEventListeners(eventListeners);
1149
+ if (error)
1150
+ throw error;
1151
+ const request = requests.get(mainFrame._navigationURL);
1152
+ return request ? request.response() : null;
1153
+
1154
+ /**
1155
+ * @param {!Puppeteer.CDPSession} client
1156
+ * @param {string} url
1157
+ * @param {string} referrer
1158
+ * @return {!Promise<?Error>}
1159
+ */
1160
+ /* async */ function navigate(client, url, referrer) {return (fn => {
1161
+ const gen = fn.call(this);
1162
+ return new Promise((resolve, reject) => {
1163
+ function step(key, arg) {
1164
+ let info, value;
1165
+ try {
1166
+ info = gen[key](arg);
1167
+ value = info.value;
1168
+ } catch (error) {
1169
+ reject(error);
1170
+ return;
1171
+ }
1172
+ if (info.done) {
1173
+ resolve(value);
1174
+ } else {
1175
+ return Promise.resolve(value).then(
1176
+ value => {
1177
+ step('next', value);
1178
+ },
1179
+ err => {
1180
+ step('throw', err);
1181
+ });
1182
+ }
1183
+ }
1184
+ return step('next');
1185
+ });
1186
+ })(function*(){
1187
+ try {
1188
+ const response = (yield client.send('Page.navigate', {url, referrer}));
1189
+ return response.errorText ? new Error(`${response.errorText} at ${url}`) : null;
1190
+ } catch (error) {
1191
+ return error;
1192
+ }
1193
+ });}
1194
+ });}
1195
+
1196
+ /**
1197
+ * @param {!Object=} options
1198
+ * @return {!Promise<?Puppeteer.Response>}
1199
+ */
1200
+ /* async */ reload(options) {return (fn => {
1201
+ const gen = fn.call(this);
1202
+ return new Promise((resolve, reject) => {
1203
+ function step(key, arg) {
1204
+ let info, value;
1205
+ try {
1206
+ info = gen[key](arg);
1207
+ value = info.value;
1208
+ } catch (error) {
1209
+ reject(error);
1210
+ return;
1211
+ }
1212
+ if (info.done) {
1213
+ resolve(value);
1214
+ } else {
1215
+ return Promise.resolve(value).then(
1216
+ value => {
1217
+ step('next', value);
1218
+ },
1219
+ err => {
1220
+ step('throw', err);
1221
+ });
1222
+ }
1223
+ }
1224
+ return step('next');
1225
+ });
1226
+ })(function*(){
1227
+ const [response] = (yield Promise.all([
1228
+ this.waitForNavigation(options),
1229
+ this._client.send('Page.reload')
1230
+ ]));
1231
+ return response;
1232
+ });}
1233
+
1234
+ /**
1235
+ * @param {!Object=} options
1236
+ * @return {!Promise<!Puppeteer.Response>}
1237
+ */
1238
+ /* async */ waitForNavigation(options = {}) {return (fn => {
1239
+ const gen = fn.call(this);
1240
+ return new Promise((resolve, reject) => {
1241
+ function step(key, arg) {
1242
+ let info, value;
1243
+ try {
1244
+ info = gen[key](arg);
1245
+ value = info.value;
1246
+ } catch (error) {
1247
+ reject(error);
1248
+ return;
1249
+ }
1250
+ if (info.done) {
1251
+ resolve(value);
1252
+ } else {
1253
+ return Promise.resolve(value).then(
1254
+ value => {
1255
+ step('next', value);
1256
+ },
1257
+ err => {
1258
+ step('throw', err);
1259
+ });
1260
+ }
1261
+ }
1262
+ return step('next');
1263
+ });
1264
+ })(function*(){
1265
+ const mainFrame = this._frameManager.mainFrame();
1266
+ const timeout = typeof options.timeout === 'number' ? options.timeout : this._defaultNavigationTimeout;
1267
+ const watcher = new NavigatorWatcher(this._frameManager, mainFrame, timeout, options);
1268
+
1269
+ const responses = new Map();
1270
+ const listener = helper.addEventListener(this._networkManager, NetworkManager.Events.Response, response => responses.set(response.url(), response));
1271
+ const error = (yield watcher.navigationPromise());
1272
+ helper.removeEventListeners([listener]);
1273
+ if (error)
1274
+ throw error;
1275
+ return responses.get(this.mainFrame().url()) || null;
1276
+ });}
1277
+
1278
+ /**
1279
+ * @param {!Object=} options
1280
+ * @return {!Promise<?Puppeteer.Response>}
1281
+ */
1282
+ /* async */ goBack(options) {return (fn => {
1283
+ const gen = fn.call(this);
1284
+ return new Promise((resolve, reject) => {
1285
+ function step(key, arg) {
1286
+ let info, value;
1287
+ try {
1288
+ info = gen[key](arg);
1289
+ value = info.value;
1290
+ } catch (error) {
1291
+ reject(error);
1292
+ return;
1293
+ }
1294
+ if (info.done) {
1295
+ resolve(value);
1296
+ } else {
1297
+ return Promise.resolve(value).then(
1298
+ value => {
1299
+ step('next', value);
1300
+ },
1301
+ err => {
1302
+ step('throw', err);
1303
+ });
1304
+ }
1305
+ }
1306
+ return step('next');
1307
+ });
1308
+ })(function*(){
1309
+ return this._go(-1, options);
1310
+ });}
1311
+
1312
+ /**
1313
+ * @param {!Object=} options
1314
+ * @return {!Promise<?Puppeteer.Response>}
1315
+ */
1316
+ /* async */ goForward(options) {return (fn => {
1317
+ const gen = fn.call(this);
1318
+ return new Promise((resolve, reject) => {
1319
+ function step(key, arg) {
1320
+ let info, value;
1321
+ try {
1322
+ info = gen[key](arg);
1323
+ value = info.value;
1324
+ } catch (error) {
1325
+ reject(error);
1326
+ return;
1327
+ }
1328
+ if (info.done) {
1329
+ resolve(value);
1330
+ } else {
1331
+ return Promise.resolve(value).then(
1332
+ value => {
1333
+ step('next', value);
1334
+ },
1335
+ err => {
1336
+ step('throw', err);
1337
+ });
1338
+ }
1339
+ }
1340
+ return step('next');
1341
+ });
1342
+ })(function*(){
1343
+ return this._go(+1, options);
1344
+ });}
1345
+
1346
+ /**
1347
+ * @param {!Object=} options
1348
+ * @return {!Promise<?Puppeteer.Response>}
1349
+ */
1350
+ /* async */ _go(delta, options) {return (fn => {
1351
+ const gen = fn.call(this);
1352
+ return new Promise((resolve, reject) => {
1353
+ function step(key, arg) {
1354
+ let info, value;
1355
+ try {
1356
+ info = gen[key](arg);
1357
+ value = info.value;
1358
+ } catch (error) {
1359
+ reject(error);
1360
+ return;
1361
+ }
1362
+ if (info.done) {
1363
+ resolve(value);
1364
+ } else {
1365
+ return Promise.resolve(value).then(
1366
+ value => {
1367
+ step('next', value);
1368
+ },
1369
+ err => {
1370
+ step('throw', err);
1371
+ });
1372
+ }
1373
+ }
1374
+ return step('next');
1375
+ });
1376
+ })(function*(){
1377
+ const history = (yield this._client.send('Page.getNavigationHistory'));
1378
+ const entry = history.entries[history.currentIndex + delta];
1379
+ if (!entry)
1380
+ return null;
1381
+ const [response] = (yield Promise.all([
1382
+ this.waitForNavigation(options),
1383
+ this._client.send('Page.navigateToHistoryEntry', {entryId: entry.id}),
1384
+ ]));
1385
+ return response;
1386
+ });}
1387
+
1388
+ /* async */ bringToFront() {return (fn => {
1389
+ const gen = fn.call(this);
1390
+ return new Promise((resolve, reject) => {
1391
+ function step(key, arg) {
1392
+ let info, value;
1393
+ try {
1394
+ info = gen[key](arg);
1395
+ value = info.value;
1396
+ } catch (error) {
1397
+ reject(error);
1398
+ return;
1399
+ }
1400
+ if (info.done) {
1401
+ resolve(value);
1402
+ } else {
1403
+ return Promise.resolve(value).then(
1404
+ value => {
1405
+ step('next', value);
1406
+ },
1407
+ err => {
1408
+ step('throw', err);
1409
+ });
1410
+ }
1411
+ }
1412
+ return step('next');
1413
+ });
1414
+ })(function*(){
1415
+ (yield this._client.send('Page.bringToFront'));
1416
+ });}
1417
+
1418
+ /**
1419
+ * @param {!Object} options
1420
+ */
1421
+ /* async */ emulate(options) {return (fn => {
1422
+ const gen = fn.call(this);
1423
+ return new Promise((resolve, reject) => {
1424
+ function step(key, arg) {
1425
+ let info, value;
1426
+ try {
1427
+ info = gen[key](arg);
1428
+ value = info.value;
1429
+ } catch (error) {
1430
+ reject(error);
1431
+ return;
1432
+ }
1433
+ if (info.done) {
1434
+ resolve(value);
1435
+ } else {
1436
+ return Promise.resolve(value).then(
1437
+ value => {
1438
+ step('next', value);
1439
+ },
1440
+ err => {
1441
+ step('throw', err);
1442
+ });
1443
+ }
1444
+ }
1445
+ return step('next');
1446
+ });
1447
+ })(function*(){
1448
+ return Promise.all([
1449
+ this.setViewport(options.viewport),
1450
+ this.setUserAgent(options.userAgent)
1451
+ ]);
1452
+ });}
1453
+
1454
+ /**
1455
+ * @param {boolean} enabled
1456
+ */
1457
+ /* async */ setJavaScriptEnabled(enabled) {return (fn => {
1458
+ const gen = fn.call(this);
1459
+ return new Promise((resolve, reject) => {
1460
+ function step(key, arg) {
1461
+ let info, value;
1462
+ try {
1463
+ info = gen[key](arg);
1464
+ value = info.value;
1465
+ } catch (error) {
1466
+ reject(error);
1467
+ return;
1468
+ }
1469
+ if (info.done) {
1470
+ resolve(value);
1471
+ } else {
1472
+ return Promise.resolve(value).then(
1473
+ value => {
1474
+ step('next', value);
1475
+ },
1476
+ err => {
1477
+ step('throw', err);
1478
+ });
1479
+ }
1480
+ }
1481
+ return step('next');
1482
+ });
1483
+ })(function*(){
1484
+ (yield this._client.send('Emulation.setScriptExecutionDisabled', { value: !enabled }));
1485
+ });}
1486
+
1487
+ /**
1488
+ * @param {boolean} enabled
1489
+ */
1490
+ /* async */ setBypassCSP(enabled) {return (fn => {
1491
+ const gen = fn.call(this);
1492
+ return new Promise((resolve, reject) => {
1493
+ function step(key, arg) {
1494
+ let info, value;
1495
+ try {
1496
+ info = gen[key](arg);
1497
+ value = info.value;
1498
+ } catch (error) {
1499
+ reject(error);
1500
+ return;
1501
+ }
1502
+ if (info.done) {
1503
+ resolve(value);
1504
+ } else {
1505
+ return Promise.resolve(value).then(
1506
+ value => {
1507
+ step('next', value);
1508
+ },
1509
+ err => {
1510
+ step('throw', err);
1511
+ });
1512
+ }
1513
+ }
1514
+ return step('next');
1515
+ });
1516
+ })(function*(){
1517
+ (yield this._client.send('Page.setBypassCSP', { enabled }));
1518
+ });}
1519
+
1520
+ /**
1521
+ * @param {?string} mediaType
1522
+ */
1523
+ /* async */ emulateMedia(mediaType) {return (fn => {
1524
+ const gen = fn.call(this);
1525
+ return new Promise((resolve, reject) => {
1526
+ function step(key, arg) {
1527
+ let info, value;
1528
+ try {
1529
+ info = gen[key](arg);
1530
+ value = info.value;
1531
+ } catch (error) {
1532
+ reject(error);
1533
+ return;
1534
+ }
1535
+ if (info.done) {
1536
+ resolve(value);
1537
+ } else {
1538
+ return Promise.resolve(value).then(
1539
+ value => {
1540
+ step('next', value);
1541
+ },
1542
+ err => {
1543
+ step('throw', err);
1544
+ });
1545
+ }
1546
+ }
1547
+ return step('next');
1548
+ });
1549
+ })(function*(){
1550
+ console.assert(mediaType === 'screen' || mediaType === 'print' || mediaType === null, 'Unsupported media type: ' + mediaType);
1551
+ (yield this._client.send('Emulation.setEmulatedMedia', {media: mediaType || ''}));
1552
+ });}
1553
+
1554
+ /**
1555
+ * @param {!Page.Viewport} viewport
1556
+ */
1557
+ /* async */ setViewport(viewport) {return (fn => {
1558
+ const gen = fn.call(this);
1559
+ return new Promise((resolve, reject) => {
1560
+ function step(key, arg) {
1561
+ let info, value;
1562
+ try {
1563
+ info = gen[key](arg);
1564
+ value = info.value;
1565
+ } catch (error) {
1566
+ reject(error);
1567
+ return;
1568
+ }
1569
+ if (info.done) {
1570
+ resolve(value);
1571
+ } else {
1572
+ return Promise.resolve(value).then(
1573
+ value => {
1574
+ step('next', value);
1575
+ },
1576
+ err => {
1577
+ step('throw', err);
1578
+ });
1579
+ }
1580
+ }
1581
+ return step('next');
1582
+ });
1583
+ })(function*(){
1584
+ const needsReload = (yield this._emulationManager.emulateViewport(viewport));
1585
+ this._viewport = viewport;
1586
+ if (needsReload)
1587
+ (yield this.reload());
1588
+ });}
1589
+
1590
+ /**
1591
+ * @return {!Page.Viewport}
1592
+ */
1593
+ viewport() {
1594
+ return this._viewport;
1595
+ }
1596
+
1597
+ /**
1598
+ * @param {function()|string} pageFunction
1599
+ * @param {!Array<*>} args
1600
+ * @return {!Promise<*>}
1601
+ */
1602
+ /* async */ evaluate(pageFunction, ...args) {return (fn => {
1603
+ const gen = fn.call(this);
1604
+ return new Promise((resolve, reject) => {
1605
+ function step(key, arg) {
1606
+ let info, value;
1607
+ try {
1608
+ info = gen[key](arg);
1609
+ value = info.value;
1610
+ } catch (error) {
1611
+ reject(error);
1612
+ return;
1613
+ }
1614
+ if (info.done) {
1615
+ resolve(value);
1616
+ } else {
1617
+ return Promise.resolve(value).then(
1618
+ value => {
1619
+ step('next', value);
1620
+ },
1621
+ err => {
1622
+ step('throw', err);
1623
+ });
1624
+ }
1625
+ }
1626
+ return step('next');
1627
+ });
1628
+ })(function*(){
1629
+ return this._frameManager.mainFrame().evaluate(pageFunction, ...args);
1630
+ });}
1631
+
1632
+ /**
1633
+ * @param {function()|string} pageFunction
1634
+ * @param {!Array<*>} args
1635
+ */
1636
+ /* async */ evaluateOnNewDocument(pageFunction, ...args) {return (fn => {
1637
+ const gen = fn.call(this);
1638
+ return new Promise((resolve, reject) => {
1639
+ function step(key, arg) {
1640
+ let info, value;
1641
+ try {
1642
+ info = gen[key](arg);
1643
+ value = info.value;
1644
+ } catch (error) {
1645
+ reject(error);
1646
+ return;
1647
+ }
1648
+ if (info.done) {
1649
+ resolve(value);
1650
+ } else {
1651
+ return Promise.resolve(value).then(
1652
+ value => {
1653
+ step('next', value);
1654
+ },
1655
+ err => {
1656
+ step('throw', err);
1657
+ });
1658
+ }
1659
+ }
1660
+ return step('next');
1661
+ });
1662
+ })(function*(){
1663
+ const source = helper.evaluationString(pageFunction, ...args);
1664
+ (yield this._client.send('Page.addScriptToEvaluateOnNewDocument', { source }));
1665
+ });}
1666
+
1667
+ /**
1668
+ * @param {Boolean} enabled
1669
+ * @returns {!Promise}
1670
+ */
1671
+ /* async */ setCacheEnabled(enabled = true) {return (fn => {
1672
+ const gen = fn.call(this);
1673
+ return new Promise((resolve, reject) => {
1674
+ function step(key, arg) {
1675
+ let info, value;
1676
+ try {
1677
+ info = gen[key](arg);
1678
+ value = info.value;
1679
+ } catch (error) {
1680
+ reject(error);
1681
+ return;
1682
+ }
1683
+ if (info.done) {
1684
+ resolve(value);
1685
+ } else {
1686
+ return Promise.resolve(value).then(
1687
+ value => {
1688
+ step('next', value);
1689
+ },
1690
+ err => {
1691
+ step('throw', err);
1692
+ });
1693
+ }
1694
+ }
1695
+ return step('next');
1696
+ });
1697
+ })(function*(){
1698
+ (yield this._client.send('Network.setCacheDisabled', {cacheDisabled: !enabled}));
1699
+ });}
1700
+
1701
+ /**
1702
+ * @param {!Object=} options
1703
+ * @return {!Promise<!Buffer>}
1704
+ */
1705
+ /* async */ screenshot(options = {}) {return (fn => {
1706
+ const gen = fn.call(this);
1707
+ return new Promise((resolve, reject) => {
1708
+ function step(key, arg) {
1709
+ let info, value;
1710
+ try {
1711
+ info = gen[key](arg);
1712
+ value = info.value;
1713
+ } catch (error) {
1714
+ reject(error);
1715
+ return;
1716
+ }
1717
+ if (info.done) {
1718
+ resolve(value);
1719
+ } else {
1720
+ return Promise.resolve(value).then(
1721
+ value => {
1722
+ step('next', value);
1723
+ },
1724
+ err => {
1725
+ step('throw', err);
1726
+ });
1727
+ }
1728
+ }
1729
+ return step('next');
1730
+ });
1731
+ })(function*(){
1732
+ let screenshotType = null;
1733
+ // options.type takes precedence over inferring the type from options.path
1734
+ // because it may be a 0-length file with no extension created beforehand (i.e. as a temp file).
1735
+ if (options.type) {
1736
+ console.assert(options.type === 'png' || options.type === 'jpeg', 'Unknown options.type value: ' + options.type);
1737
+ screenshotType = options.type;
1738
+ } else if (options.path) {
1739
+ const mimeType = mime.getType(options.path);
1740
+ if (mimeType === 'image/png')
1741
+ screenshotType = 'png';
1742
+ else if (mimeType === 'image/jpeg')
1743
+ screenshotType = 'jpeg';
1744
+ console.assert(screenshotType, 'Unsupported screenshot mime type: ' + mimeType);
1745
+ }
1746
+
1747
+ if (!screenshotType)
1748
+ screenshotType = 'png';
1749
+
1750
+ if (options.quality) {
1751
+ console.assert(screenshotType === 'jpeg', 'options.quality is unsupported for the ' + screenshotType + ' screenshots');
1752
+ console.assert(typeof options.quality === 'number', 'Expected options.quality to be a number but found ' + (typeof options.quality));
1753
+ console.assert(Number.isInteger(options.quality), 'Expected options.quality to be an integer');
1754
+ console.assert(options.quality >= 0 && options.quality <= 100, 'Expected options.quality to be between 0 and 100 (inclusive), got ' + options.quality);
1755
+ }
1756
+ console.assert(!options.clip || !options.fullPage, 'options.clip and options.fullPage are exclusive');
1757
+ if (options.clip) {
1758
+ console.assert(typeof options.clip.x === 'number', 'Expected options.clip.x to be a number but found ' + (typeof options.clip.x));
1759
+ console.assert(typeof options.clip.y === 'number', 'Expected options.clip.y to be a number but found ' + (typeof options.clip.y));
1760
+ console.assert(typeof options.clip.width === 'number', 'Expected options.clip.width to be a number but found ' + (typeof options.clip.width));
1761
+ console.assert(typeof options.clip.height === 'number', 'Expected options.clip.height to be a number but found ' + (typeof options.clip.height));
1762
+ }
1763
+ return this._screenshotTaskQueue.postTask(this._screenshotTask.bind(this, screenshotType, options));
1764
+ });}
1765
+
1766
+ /**
1767
+ * @param {"png"|"jpeg"} format
1768
+ * @param {!Object=} options
1769
+ * @return {!Promise<!Buffer>}
1770
+ */
1771
+ /* async */ _screenshotTask(format, options) {return (fn => {
1772
+ const gen = fn.call(this);
1773
+ return new Promise((resolve, reject) => {
1774
+ function step(key, arg) {
1775
+ let info, value;
1776
+ try {
1777
+ info = gen[key](arg);
1778
+ value = info.value;
1779
+ } catch (error) {
1780
+ reject(error);
1781
+ return;
1782
+ }
1783
+ if (info.done) {
1784
+ resolve(value);
1785
+ } else {
1786
+ return Promise.resolve(value).then(
1787
+ value => {
1788
+ step('next', value);
1789
+ },
1790
+ err => {
1791
+ step('throw', err);
1792
+ });
1793
+ }
1794
+ }
1795
+ return step('next');
1796
+ });
1797
+ })(function*(){
1798
+ (yield this._client.send('Target.activateTarget', {targetId: this._target._targetId}));
1799
+ let clip = options.clip ? Object.assign({}, options['clip']) : undefined;
1800
+ if (clip)
1801
+ clip.scale = 1;
1802
+
1803
+ if (options.fullPage) {
1804
+ const metrics = (yield this._client.send('Page.getLayoutMetrics'));
1805
+ const width = Math.ceil(metrics.contentSize.width);
1806
+ const height = Math.ceil(metrics.contentSize.height);
1807
+
1808
+ // Overwrite clip for full page at all times.
1809
+ clip = { x: 0, y: 0, width, height, scale: 1 };
1810
+ const mobile = this._viewport.isMobile || false;
1811
+ const deviceScaleFactor = this._viewport.deviceScaleFactor || 1;
1812
+ const landscape = this._viewport.isLandscape || false;
1813
+ /** @type {!Protocol.Emulation.ScreenOrientation} */
1814
+ const screenOrientation = landscape ? { angle: 90, type: 'landscapePrimary' } : { angle: 0, type: 'portraitPrimary' };
1815
+ (yield this._client.send('Emulation.setDeviceMetricsOverride', { mobile, width, height, deviceScaleFactor, screenOrientation }));
1816
+ }
1817
+
1818
+ if (options.omitBackground)
1819
+ (yield this._client.send('Emulation.setDefaultBackgroundColorOverride', { color: { r: 0, g: 0, b: 0, a: 0 } }));
1820
+ const result = (yield this._client.send('Page.captureScreenshot', { format, quality: options.quality, clip }));
1821
+ if (options.omitBackground)
1822
+ (yield this._client.send('Emulation.setDefaultBackgroundColorOverride'));
1823
+
1824
+ if (options.fullPage)
1825
+ (yield this.setViewport(this._viewport));
1826
+
1827
+ const buffer = Buffer.from(result.data, 'base64');
1828
+ if (options.path)
1829
+ (yield writeFileAsync(options.path, buffer));
1830
+ return buffer;
1831
+ });}
1832
+
1833
+ /**
1834
+ * @param {!Object=} options
1835
+ * @return {!Promise<!Buffer>}
1836
+ */
1837
+ /* async */ pdf(options = {}) {return (fn => {
1838
+ const gen = fn.call(this);
1839
+ return new Promise((resolve, reject) => {
1840
+ function step(key, arg) {
1841
+ let info, value;
1842
+ try {
1843
+ info = gen[key](arg);
1844
+ value = info.value;
1845
+ } catch (error) {
1846
+ reject(error);
1847
+ return;
1848
+ }
1849
+ if (info.done) {
1850
+ resolve(value);
1851
+ } else {
1852
+ return Promise.resolve(value).then(
1853
+ value => {
1854
+ step('next', value);
1855
+ },
1856
+ err => {
1857
+ step('throw', err);
1858
+ });
1859
+ }
1860
+ }
1861
+ return step('next');
1862
+ });
1863
+ })(function*(){
1864
+ const scale = options.scale || 1;
1865
+ const displayHeaderFooter = !!options.displayHeaderFooter;
1866
+ const headerTemplate = options.headerTemplate || '';
1867
+ const footerTemplate = options.footerTemplate || '';
1868
+ const printBackground = !!options.printBackground;
1869
+ const landscape = !!options.landscape;
1870
+ const pageRanges = options.pageRanges || '';
1871
+
1872
+ let paperWidth = 8.5;
1873
+ let paperHeight = 11;
1874
+ if (options.format) {
1875
+ const format = Page.PaperFormats[options.format.toLowerCase()];
1876
+ console.assert(format, 'Unknown paper format: ' + options.format);
1877
+ paperWidth = format.width;
1878
+ paperHeight = format.height;
1879
+ } else {
1880
+ paperWidth = convertPrintParameterToInches(options.width) || paperWidth;
1881
+ paperHeight = convertPrintParameterToInches(options.height) || paperHeight;
1882
+ }
1883
+
1884
+ const marginOptions = options.margin || {};
1885
+ const marginTop = convertPrintParameterToInches(marginOptions.top) || 0;
1886
+ const marginLeft = convertPrintParameterToInches(marginOptions.left) || 0;
1887
+ const marginBottom = convertPrintParameterToInches(marginOptions.bottom) || 0;
1888
+ const marginRight = convertPrintParameterToInches(marginOptions.right) || 0;
1889
+
1890
+ const result = (yield this._client.send('Page.printToPDF', {
1891
+ landscape: landscape,
1892
+ displayHeaderFooter: displayHeaderFooter,
1893
+ headerTemplate: headerTemplate,
1894
+ footerTemplate: footerTemplate,
1895
+ printBackground: printBackground,
1896
+ scale: scale,
1897
+ paperWidth: paperWidth,
1898
+ paperHeight: paperHeight,
1899
+ marginTop: marginTop,
1900
+ marginBottom: marginBottom,
1901
+ marginLeft: marginLeft,
1902
+ marginRight: marginRight,
1903
+ pageRanges: pageRanges
1904
+ }));
1905
+ const buffer = Buffer.from(result.data, 'base64');
1906
+ if (options.path)
1907
+ (yield writeFileAsync(options.path, buffer));
1908
+ return buffer;
1909
+ });}
1910
+
1911
+ /**
1912
+ * @return {!Promise<string>}
1913
+ */
1914
+ /* async */ title() {return (fn => {
1915
+ const gen = fn.call(this);
1916
+ return new Promise((resolve, reject) => {
1917
+ function step(key, arg) {
1918
+ let info, value;
1919
+ try {
1920
+ info = gen[key](arg);
1921
+ value = info.value;
1922
+ } catch (error) {
1923
+ reject(error);
1924
+ return;
1925
+ }
1926
+ if (info.done) {
1927
+ resolve(value);
1928
+ } else {
1929
+ return Promise.resolve(value).then(
1930
+ value => {
1931
+ step('next', value);
1932
+ },
1933
+ err => {
1934
+ step('throw', err);
1935
+ });
1936
+ }
1937
+ }
1938
+ return step('next');
1939
+ });
1940
+ })(function*(){
1941
+ return this.mainFrame().title();
1942
+ });}
1943
+
1944
+ /**
1945
+ * @param {!{runBeforeUnload: (boolean|undefined)}=} options
1946
+ */
1947
+ /* async */ close(options = {runBeforeUnload: undefined}) {return (fn => {
1948
+ const gen = fn.call(this);
1949
+ return new Promise((resolve, reject) => {
1950
+ function step(key, arg) {
1951
+ let info, value;
1952
+ try {
1953
+ info = gen[key](arg);
1954
+ value = info.value;
1955
+ } catch (error) {
1956
+ reject(error);
1957
+ return;
1958
+ }
1959
+ if (info.done) {
1960
+ resolve(value);
1961
+ } else {
1962
+ return Promise.resolve(value).then(
1963
+ value => {
1964
+ step('next', value);
1965
+ },
1966
+ err => {
1967
+ step('throw', err);
1968
+ });
1969
+ }
1970
+ }
1971
+ return step('next');
1972
+ });
1973
+ })(function*(){
1974
+ console.assert(!!this._client._connection, 'Protocol error: Connection closed. Most likely the page has been closed.');
1975
+ const runBeforeUnload = !!options.runBeforeUnload;
1976
+ if (runBeforeUnload) {
1977
+ (yield this._client.send('Page.close'));
1978
+ } else {
1979
+ (yield this._client._connection.send('Target.closeTarget', { targetId: this._target._targetId }));
1980
+ (yield this._target._isClosedPromise);
1981
+ }
1982
+ });}
1983
+
1984
+ /**
1985
+ * @return {!Mouse}
1986
+ */
1987
+ get mouse() {
1988
+ return this._mouse;
1989
+ }
1990
+
1991
+ /**
1992
+ * @param {string} selector
1993
+ * @param {!Object=} options
1994
+ */
1995
+ click(selector, options = {}) {
1996
+ return this.mainFrame().click(selector, options);
1997
+ }
1998
+
1999
+ /**
2000
+ * @param {string} selector
2001
+ */
2002
+ focus(selector) {
2003
+ return this.mainFrame().focus(selector);
2004
+ }
2005
+
2006
+ /**
2007
+ * @param {string} selector
2008
+ */
2009
+ hover(selector) {
2010
+ return this.mainFrame().hover(selector);
2011
+ }
2012
+
2013
+ /**
2014
+ * @param {string} selector
2015
+ * @param {!Array<string>} values
2016
+ * @return {!Promise<!Array<string>>}
2017
+ */
2018
+ select(selector, ...values) {
2019
+ return this.mainFrame().select(selector, ...values);
2020
+ }
2021
+
2022
+ /**
2023
+ * @param {string} selector
2024
+ */
2025
+ tap(selector) {
2026
+ return this.mainFrame().tap(selector);
2027
+ }
2028
+
2029
+ /**
2030
+ * @param {string} selector
2031
+ * @param {string} text
2032
+ * @param {{delay: (number|undefined)}=} options
2033
+ */
2034
+ type(selector, text, options) {
2035
+ return this.mainFrame().type(selector, text, options);
2036
+ }
2037
+
2038
+ /**
2039
+ * @param {(string|number|Function)} selectorOrFunctionOrTimeout
2040
+ * @param {!Object=} options
2041
+ * @param {!Array<*>} args
2042
+ * @return {!Promise}
2043
+ */
2044
+ waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
2045
+ return this.mainFrame().waitFor(selectorOrFunctionOrTimeout, options, ...args);
2046
+ }
2047
+
2048
+ /**
2049
+ * @param {string} selector
2050
+ * @param {!Object=} options
2051
+ * @return {!Promise}
2052
+ */
2053
+ waitForSelector(selector, options = {}) {
2054
+ return this.mainFrame().waitForSelector(selector, options);
2055
+ }
2056
+
2057
+ /**
2058
+ * @param {string} xpath
2059
+ * @param {!Object=} options
2060
+ * @return {!Promise}
2061
+ */
2062
+ waitForXPath(xpath, options = {}) {
2063
+ return this.mainFrame().waitForXPath(xpath, options);
2064
+ }
2065
+
2066
+ /**
2067
+ * @param {function()} pageFunction
2068
+ * @param {!Object=} options
2069
+ * @param {!Array<*>} args
2070
+ * @return {!Promise}
2071
+ */
2072
+ waitForFunction(pageFunction, options = {}, ...args) {
2073
+ return this.mainFrame().waitForFunction(pageFunction, options, ...args);
2074
+ }
2075
+ }
2076
+
2077
+ /** @type {!Set<string>} */
2078
+ const supportedMetrics = new Set([
2079
+ 'Timestamp',
2080
+ 'Documents',
2081
+ 'Frames',
2082
+ 'JSEventListeners',
2083
+ 'Nodes',
2084
+ 'LayoutCount',
2085
+ 'RecalcStyleCount',
2086
+ 'LayoutDuration',
2087
+ 'RecalcStyleDuration',
2088
+ 'ScriptDuration',
2089
+ 'TaskDuration',
2090
+ 'JSHeapUsedSize',
2091
+ 'JSHeapTotalSize',
2092
+ ]);
2093
+
2094
+ /** @enum {string} */
2095
+ Page.PaperFormats = {
2096
+ letter: {width: 8.5, height: 11},
2097
+ legal: {width: 8.5, height: 14},
2098
+ tabloid: {width: 11, height: 17},
2099
+ ledger: {width: 17, height: 11},
2100
+ a0: {width: 33.1, height: 46.8 },
2101
+ a1: {width: 23.4, height: 33.1 },
2102
+ a2: {width: 16.5, height: 23.4 },
2103
+ a3: {width: 11.7, height: 16.5 },
2104
+ a4: {width: 8.27, height: 11.7 },
2105
+ a5: {width: 5.83, height: 8.27 },
2106
+ a6: {width: 4.13, height: 5.83 },
2107
+ };
2108
+
2109
+ const unitToPixels = {
2110
+ 'px': 1,
2111
+ 'in': 96,
2112
+ 'cm': 37.8,
2113
+ 'mm': 3.78
2114
+ };
2115
+
2116
+ /**
2117
+ * @param {(string|number|undefined)} parameter
2118
+ * @return {(number|undefined)}
2119
+ */
2120
+ function convertPrintParameterToInches(parameter) {
2121
+ if (typeof parameter === 'undefined')
2122
+ return undefined;
2123
+ let pixels;
2124
+ if (helper.isNumber(parameter)) {
2125
+ // Treat numbers as pixel values to be aligned with phantom's paperSize.
2126
+ pixels = /** @type {number} */ (parameter);
2127
+ } else if (helper.isString(parameter)) {
2128
+ const text = /** @type {string} */ (parameter);
2129
+ let unit = text.substring(text.length - 2).toLowerCase();
2130
+ let valueText = '';
2131
+ if (unitToPixels.hasOwnProperty(unit)) {
2132
+ valueText = text.substring(0, text.length - 2);
2133
+ } else {
2134
+ // In case of unknown unit try to parse the whole parameter as number of pixels.
2135
+ // This is consistent with phantom's paperSize behavior.
2136
+ unit = 'px';
2137
+ valueText = text;
2138
+ }
2139
+ const value = Number(valueText);
2140
+ console.assert(!isNaN(value), 'Failed to parse parameter value: ' + text);
2141
+ pixels = value * unitToPixels[unit];
2142
+ } else {
2143
+ throw new Error('page.pdf() Cannot handle parameter type: ' + (typeof parameter));
2144
+ }
2145
+ return pixels / 96;
2146
+ }
2147
+
2148
+ Page.Events = {
2149
+ Close: 'close',
2150
+ Console: 'console',
2151
+ Dialog: 'dialog',
2152
+ DOMContentLoaded: 'domcontentloaded',
2153
+ Error: 'error',
2154
+ // Can't use just 'error' due to node.js special treatment of error events.
2155
+ // @see https://nodejs.org/api/events.html#events_error_events
2156
+ PageError: 'pageerror',
2157
+ Request: 'request',
2158
+ Response: 'response',
2159
+ RequestFailed: 'requestfailed',
2160
+ RequestFinished: 'requestfinished',
2161
+ FrameAttached: 'frameattached',
2162
+ FrameDetached: 'framedetached',
2163
+ FrameNavigated: 'framenavigated',
2164
+ Load: 'load',
2165
+ Metrics: 'metrics',
2166
+ };
2167
+
2168
+ /**
2169
+ * @typedef {Object} Page.Viewport
2170
+ * @property {number} width
2171
+ * @property {number} height
2172
+ * @property {number=} deviceScaleFactor
2173
+ * @property {boolean=} isMobile
2174
+ * @property {boolean=} isLandscape
2175
+ * @property {boolean=} hasTouch
2176
+ */
2177
+
2178
+ /**
2179
+ * @typedef {Object} Network.Cookie
2180
+ * @property {string} name
2181
+ * @property {string} value
2182
+ * @property {string} domain
2183
+ * @property {string} path
2184
+ * @property {number} expires
2185
+ * @property {number} size
2186
+ * @property {boolean} httpOnly
2187
+ * @property {boolean} secure
2188
+ * @property {boolean} session
2189
+ * @property {("Strict"|"Lax")=} sameSite
2190
+ */
2191
+
2192
+
2193
+ /**
2194
+ * @typedef {Object} Network.CookieParam
2195
+ * @property {string} name
2196
+ * @property {string} value
2197
+ * @property {string=} url
2198
+ * @property {string=} domain
2199
+ * @property {string=} path
2200
+ * @property {number=} expires
2201
+ * @property {boolean=} httpOnly
2202
+ * @property {boolean=} secure
2203
+ * @property {("Strict"|"Lax")=} sameSite
2204
+ */
2205
+
2206
+ class ConsoleMessage {
2207
+ /**
2208
+ * @param {string} type
2209
+ * @param {string} text
2210
+ * @param {!Array<*>} args
2211
+ */
2212
+ constructor(type, text, args = []) {
2213
+ this._type = type;
2214
+ this._text = text;
2215
+ this._args = args;
2216
+ }
2217
+
2218
+ /**
2219
+ * @return {string}
2220
+ */
2221
+ type() {
2222
+ return this._type;
2223
+ }
2224
+
2225
+ /**
2226
+ * @return {string}
2227
+ */
2228
+ text() {
2229
+ return this._text;
2230
+ }
2231
+
2232
+ /**
2233
+ * @return {!Array<string>}
2234
+ */
2235
+ args() {
2236
+ return this._args;
2237
+ }
2238
+ }
2239
+
2240
+
2241
+ module.exports = Page;
2242
+ helper.tracePublicAPI(Page);