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,1621 @@
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 {helper} = require('./helper');
20
+ const {ExecutionContext, JSHandle} = require('./ExecutionContext');
21
+ const ElementHandle = require('./ElementHandle');
22
+
23
+ const readFileAsync = helper.promisify(fs.readFile);
24
+
25
+ class FrameManager extends EventEmitter {
26
+ /**
27
+ * @param {!Puppeteer.CDPSession} client
28
+ * @param {!Protocol.Page.FrameTree} frameTree
29
+ * @param {!Puppeteer.Page} page
30
+ */
31
+ constructor(client, frameTree, page) {
32
+ super();
33
+ this._client = client;
34
+ this._page = page;
35
+ /** @type {!Map<string, !Frame>} */
36
+ this._frames = new Map();
37
+ /** @type {!Map<number, !ExecutionContext>} */
38
+ this._contextIdToContext = new Map();
39
+
40
+ this._client.on('Page.frameAttached', event => this._onFrameAttached(event.frameId, event.parentFrameId));
41
+ this._client.on('Page.frameNavigated', event => this._onFrameNavigated(event.frame));
42
+ this._client.on('Page.navigatedWithinDocument', event => this._onFrameNavigatedWithinDocument(event.frameId, event.url));
43
+ this._client.on('Page.frameDetached', event => this._onFrameDetached(event.frameId));
44
+ this._client.on('Page.frameStoppedLoading', event => this._onFrameStoppedLoading(event.frameId));
45
+ this._client.on('Runtime.executionContextCreated', event => this._onExecutionContextCreated(event.context));
46
+ this._client.on('Runtime.executionContextDestroyed', event => this._onExecutionContextDestroyed(event.executionContextId));
47
+ this._client.on('Runtime.executionContextsCleared', event => this._onExecutionContextsCleared());
48
+ this._client.on('Page.lifecycleEvent', event => this._onLifecycleEvent(event));
49
+
50
+ this._handleFrameTree(frameTree);
51
+ }
52
+
53
+ /**
54
+ * @param {!Protocol.Page.lifecycleEventPayload} event
55
+ */
56
+ _onLifecycleEvent(event) {
57
+ const frame = this._frames.get(event.frameId);
58
+ if (!frame)
59
+ return;
60
+ frame._onLifecycleEvent(event.loaderId, event.name);
61
+ this.emit(FrameManager.Events.LifecycleEvent, frame);
62
+ }
63
+
64
+ /**
65
+ * @param {string} frameId
66
+ */
67
+ _onFrameStoppedLoading(frameId) {
68
+ const frame = this._frames.get(frameId);
69
+ if (!frame)
70
+ return;
71
+ frame._onLoadingStopped();
72
+ this.emit(FrameManager.Events.LifecycleEvent, frame);
73
+ }
74
+
75
+ /**
76
+ * @param {!Protocol.Page.FrameTree} frameTree
77
+ */
78
+ _handleFrameTree(frameTree) {
79
+ if (frameTree.frame.parentId)
80
+ this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId);
81
+ this._onFrameNavigated(frameTree.frame);
82
+ if (!frameTree.childFrames)
83
+ return;
84
+
85
+ for (const child of frameTree.childFrames)
86
+ this._handleFrameTree(child);
87
+ }
88
+
89
+ /**
90
+ * @return {!Frame}
91
+ */
92
+ mainFrame() {
93
+ return this._mainFrame;
94
+ }
95
+
96
+ /**
97
+ * @return {!Array<!Frame>}
98
+ */
99
+ frames() {
100
+ return Array.from(this._frames.values());
101
+ }
102
+
103
+ /**
104
+ * @param {!string} frameId
105
+ * @return {?Frame}
106
+ */
107
+ frame(frameId) {
108
+ return this._frames.get(frameId) || null;
109
+ }
110
+
111
+ /**
112
+ * @param {string} frameId
113
+ * @param {?string} parentFrameId
114
+ * @return {?Frame}
115
+ */
116
+ _onFrameAttached(frameId, parentFrameId) {
117
+ if (this._frames.has(frameId))
118
+ return;
119
+ console.assert(parentFrameId);
120
+ const parentFrame = this._frames.get(parentFrameId);
121
+ const frame = new Frame(this._client, this._page, parentFrame, frameId);
122
+ this._frames.set(frame._id, frame);
123
+ this.emit(FrameManager.Events.FrameAttached, frame);
124
+ }
125
+
126
+ /**
127
+ * @param {!Protocol.Page.Frame} framePayload
128
+ */
129
+ _onFrameNavigated(framePayload) {
130
+ const isMainFrame = !framePayload.parentId;
131
+ let frame = isMainFrame ? this._mainFrame : this._frames.get(framePayload.id);
132
+ console.assert(isMainFrame || frame, 'We either navigate top level or have old version of the navigated frame');
133
+
134
+ // Detach all child frames first.
135
+ if (frame) {
136
+ for (const child of frame.childFrames())
137
+ this._removeFramesRecursively(child);
138
+ }
139
+
140
+ // Update or create main frame.
141
+ if (isMainFrame) {
142
+ if (frame) {
143
+ // Update frame id to retain frame identity on cross-process navigation.
144
+ this._frames.delete(frame._id);
145
+ frame._id = framePayload.id;
146
+ } else {
147
+ // Initial main frame navigation.
148
+ frame = new Frame(this._client, this._page, null, framePayload.id);
149
+ }
150
+ this._frames.set(framePayload.id, frame);
151
+ this._mainFrame = frame;
152
+ }
153
+
154
+ // Update frame payload.
155
+ frame._navigated(framePayload);
156
+
157
+ this.emit(FrameManager.Events.FrameNavigated, frame);
158
+ }
159
+
160
+ /**
161
+ * @param {string} frameId
162
+ * @param {string} url
163
+ */
164
+ _onFrameNavigatedWithinDocument(frameId, url) {
165
+ const frame = this._frames.get(frameId);
166
+ if (!frame)
167
+ return;
168
+ frame._navigatedWithinDocument(url);
169
+ this.emit(FrameManager.Events.FrameNavigatedWithinDocument, frame);
170
+ this.emit(FrameManager.Events.FrameNavigated, frame);
171
+ }
172
+
173
+ /**
174
+ * @param {string} frameId
175
+ */
176
+ _onFrameDetached(frameId) {
177
+ const frame = this._frames.get(frameId);
178
+ if (frame)
179
+ this._removeFramesRecursively(frame);
180
+ }
181
+
182
+ _onExecutionContextCreated(contextPayload) {
183
+ const frameId = contextPayload.auxData && contextPayload.auxData.isDefault ? contextPayload.auxData.frameId : null;
184
+ const frame = frameId ? this._frames.get(frameId) : null;
185
+ const context = new ExecutionContext(this._client, contextPayload, this.createJSHandle.bind(this, contextPayload.id), frame);
186
+ this._contextIdToContext.set(contextPayload.id, context);
187
+ if (frame)
188
+ frame._setDefaultContext(context);
189
+ }
190
+
191
+ /**
192
+ * @param {!ExecutionContext} context
193
+ */
194
+ _removeContext(context) {
195
+ if (context.frame())
196
+ context.frame()._setDefaultContext(null);
197
+ }
198
+
199
+ /**
200
+ * @param {number} executionContextId
201
+ */
202
+ _onExecutionContextDestroyed(executionContextId) {
203
+ const context = this._contextIdToContext.get(executionContextId);
204
+ if (!context)
205
+ return;
206
+ this._contextIdToContext.delete(executionContextId);
207
+ this._removeContext(context);
208
+ }
209
+
210
+ _onExecutionContextsCleared() {
211
+ for (const context of this._contextIdToContext.values())
212
+ this._removeContext(context);
213
+ this._contextIdToContext.clear();
214
+ }
215
+
216
+ /**
217
+ * @param {number} contextId
218
+ * @param {*} remoteObject
219
+ * @return {!JSHandle}
220
+ */
221
+ createJSHandle(contextId, remoteObject) {
222
+ const context = this._contextIdToContext.get(contextId);
223
+ console.assert(context, 'INTERNAL ERROR: missing context with id = ' + contextId);
224
+ if (remoteObject.subtype === 'node')
225
+ return new ElementHandle(context, this._client, remoteObject, this._page, this);
226
+ return new JSHandle(context, this._client, remoteObject);
227
+ }
228
+
229
+ /**
230
+ * @param {!Frame} frame
231
+ */
232
+ _removeFramesRecursively(frame) {
233
+ for (const child of frame.childFrames())
234
+ this._removeFramesRecursively(child);
235
+ frame._detach();
236
+ this._frames.delete(frame._id);
237
+ this.emit(FrameManager.Events.FrameDetached, frame);
238
+ }
239
+ }
240
+
241
+ /** @enum {string} */
242
+ FrameManager.Events = {
243
+ FrameAttached: 'frameattached',
244
+ FrameNavigated: 'framenavigated',
245
+ FrameDetached: 'framedetached',
246
+ LifecycleEvent: 'lifecycleevent',
247
+ FrameNavigatedWithinDocument: 'framenavigatedwithindocument'
248
+ };
249
+
250
+ /**
251
+ * @unrestricted
252
+ */
253
+ class Frame {
254
+ /**
255
+ * @param {!Puppeteer.CDPSession} client
256
+ * @param {?Frame} parentFrame
257
+ * @param {string} frameId
258
+ */
259
+ constructor(client, page, parentFrame, frameId) {
260
+ this._client = client;
261
+ this._page = page;
262
+ this._parentFrame = parentFrame;
263
+ this._url = '';
264
+ this._id = frameId;
265
+
266
+ /** @type {?Promise<!ElementHandle>} */
267
+ this._documentPromise = null;
268
+ /** @type {?Promise<!ExecutionContext>} */
269
+ this._contextPromise = null;
270
+ this._contextResolveCallback = null;
271
+ this._setDefaultContext(null);
272
+
273
+ /** @type {!Set<!WaitTask>} */
274
+ this._waitTasks = new Set();
275
+ this._loaderId = '';
276
+ /** @type {!Set<string>} */
277
+ this._lifecycleEvents = new Set();
278
+
279
+ /** @type {!Set<!Frame>} */
280
+ this._childFrames = new Set();
281
+ if (this._parentFrame)
282
+ this._parentFrame._childFrames.add(this);
283
+ }
284
+
285
+ /**
286
+ * @param {?ExecutionContext} context
287
+ */
288
+ _setDefaultContext(context) {
289
+ if (context) {
290
+ this._contextResolveCallback.call(null, context);
291
+ this._contextResolveCallback = null;
292
+ for (const waitTask of this._waitTasks)
293
+ waitTask.rerun();
294
+ } else {
295
+ this._documentPromise = null;
296
+ this._contextPromise = new Promise(fulfill => {
297
+ this._contextResolveCallback = fulfill;
298
+ });
299
+ }
300
+ }
301
+
302
+ /**
303
+ * @return {!Promise<!ExecutionContext>}
304
+ */
305
+ executionContext() {
306
+ return this._contextPromise;
307
+ }
308
+
309
+ /**
310
+ * @param {function()|string} pageFunction
311
+ * @param {!Array<*>} args
312
+ * @return {!Promise<!Puppeteer.JSHandle>}
313
+ */
314
+ /* async */ evaluateHandle(pageFunction, ...args) {return (fn => {
315
+ const gen = fn.call(this);
316
+ return new Promise((resolve, reject) => {
317
+ function step(key, arg) {
318
+ let info, value;
319
+ try {
320
+ info = gen[key](arg);
321
+ value = info.value;
322
+ } catch (error) {
323
+ reject(error);
324
+ return;
325
+ }
326
+ if (info.done) {
327
+ resolve(value);
328
+ } else {
329
+ return Promise.resolve(value).then(
330
+ value => {
331
+ step('next', value);
332
+ },
333
+ err => {
334
+ step('throw', err);
335
+ });
336
+ }
337
+ }
338
+ return step('next');
339
+ });
340
+ })(function*(){
341
+ const context = (yield this._contextPromise);
342
+ return context.evaluateHandle(pageFunction, ...args);
343
+ });}
344
+
345
+ /**
346
+ * @param {Function|string} pageFunction
347
+ * @param {!Array<*>} args
348
+ * @return {!Promise<*>}
349
+ */
350
+ /* async */ evaluate(pageFunction, ...args) {return (fn => {
351
+ const gen = fn.call(this);
352
+ return new Promise((resolve, reject) => {
353
+ function step(key, arg) {
354
+ let info, value;
355
+ try {
356
+ info = gen[key](arg);
357
+ value = info.value;
358
+ } catch (error) {
359
+ reject(error);
360
+ return;
361
+ }
362
+ if (info.done) {
363
+ resolve(value);
364
+ } else {
365
+ return Promise.resolve(value).then(
366
+ value => {
367
+ step('next', value);
368
+ },
369
+ err => {
370
+ step('throw', err);
371
+ });
372
+ }
373
+ }
374
+ return step('next');
375
+ });
376
+ })(function*(){
377
+ const context = (yield this._contextPromise);
378
+ return context.evaluate(pageFunction, ...args);
379
+ });}
380
+
381
+ /**
382
+ * @param {string} selector
383
+ * @return {!Promise<?ElementHandle>}
384
+ */
385
+ /* async */ $(selector) {return (fn => {
386
+ const gen = fn.call(this);
387
+ return new Promise((resolve, reject) => {
388
+ function step(key, arg) {
389
+ let info, value;
390
+ try {
391
+ info = gen[key](arg);
392
+ value = info.value;
393
+ } catch (error) {
394
+ reject(error);
395
+ return;
396
+ }
397
+ if (info.done) {
398
+ resolve(value);
399
+ } else {
400
+ return Promise.resolve(value).then(
401
+ value => {
402
+ step('next', value);
403
+ },
404
+ err => {
405
+ step('throw', err);
406
+ });
407
+ }
408
+ }
409
+ return step('next');
410
+ });
411
+ })(function*(){
412
+ const document = (yield this._document());
413
+ const value = (yield document.$(selector));
414
+ return value;
415
+ });}
416
+
417
+ /**
418
+ * @return {!Promise<!ElementHandle>}
419
+ */
420
+ /* async */ _document() {return (fn => {
421
+ const gen = fn.call(this);
422
+ return new Promise((resolve, reject) => {
423
+ function step(key, arg) {
424
+ let info, value;
425
+ try {
426
+ info = gen[key](arg);
427
+ value = info.value;
428
+ } catch (error) {
429
+ reject(error);
430
+ return;
431
+ }
432
+ if (info.done) {
433
+ resolve(value);
434
+ } else {
435
+ return Promise.resolve(value).then(
436
+ value => {
437
+ step('next', value);
438
+ },
439
+ err => {
440
+ step('throw', err);
441
+ });
442
+ }
443
+ }
444
+ return step('next');
445
+ });
446
+ })(function*(){
447
+ if (this._documentPromise)
448
+ return this._documentPromise;
449
+ this._documentPromise = this._contextPromise.then(/* async */ context => {return (fn => {
450
+ const gen = fn.call(this);
451
+ return new Promise((resolve, reject) => {
452
+ function step(key, arg) {
453
+ let info, value;
454
+ try {
455
+ info = gen[key](arg);
456
+ value = info.value;
457
+ } catch (error) {
458
+ reject(error);
459
+ return;
460
+ }
461
+ if (info.done) {
462
+ resolve(value);
463
+ } else {
464
+ return Promise.resolve(value).then(
465
+ value => {
466
+ step('next', value);
467
+ },
468
+ err => {
469
+ step('throw', err);
470
+ });
471
+ }
472
+ }
473
+ return step('next');
474
+ });
475
+ })(function*(){
476
+ const document = (yield context.evaluateHandle('document'));
477
+ return document.asElement();
478
+ });});
479
+ return this._documentPromise;
480
+ });}
481
+
482
+ /**
483
+ * @param {string} expression
484
+ * @return {!Promise<!Array<!ElementHandle>>}
485
+ */
486
+ /* async */ $x(expression) {return (fn => {
487
+ const gen = fn.call(this);
488
+ return new Promise((resolve, reject) => {
489
+ function step(key, arg) {
490
+ let info, value;
491
+ try {
492
+ info = gen[key](arg);
493
+ value = info.value;
494
+ } catch (error) {
495
+ reject(error);
496
+ return;
497
+ }
498
+ if (info.done) {
499
+ resolve(value);
500
+ } else {
501
+ return Promise.resolve(value).then(
502
+ value => {
503
+ step('next', value);
504
+ },
505
+ err => {
506
+ step('throw', err);
507
+ });
508
+ }
509
+ }
510
+ return step('next');
511
+ });
512
+ })(function*(){
513
+ const document = (yield this._document());
514
+ const value = (yield document.$x(expression));
515
+ return value;
516
+ });}
517
+
518
+ /**
519
+ * @param {string} selector
520
+ * @param {Function|string} pageFunction
521
+ * @param {!Array<*>} args
522
+ * @return {!Promise<(!Object|undefined)>}
523
+ */
524
+ /* async */ $eval(selector, pageFunction, ...args) {return (fn => {
525
+ const gen = fn.call(this);
526
+ return new Promise((resolve, reject) => {
527
+ function step(key, arg) {
528
+ let info, value;
529
+ try {
530
+ info = gen[key](arg);
531
+ value = info.value;
532
+ } catch (error) {
533
+ reject(error);
534
+ return;
535
+ }
536
+ if (info.done) {
537
+ resolve(value);
538
+ } else {
539
+ return Promise.resolve(value).then(
540
+ value => {
541
+ step('next', value);
542
+ },
543
+ err => {
544
+ step('throw', err);
545
+ });
546
+ }
547
+ }
548
+ return step('next');
549
+ });
550
+ })(function*(){
551
+ const document = (yield this._document());
552
+ const value = (yield document.$eval(selector, pageFunction, ...args));
553
+ return value;
554
+ });}
555
+
556
+ /**
557
+ * @param {string} selector
558
+ * @param {Function|string} pageFunction
559
+ * @param {!Array<*>} args
560
+ * @return {!Promise<(!Object|undefined)>}
561
+ */
562
+ /* async */ $$eval(selector, pageFunction, ...args) {return (fn => {
563
+ const gen = fn.call(this);
564
+ return new Promise((resolve, reject) => {
565
+ function step(key, arg) {
566
+ let info, value;
567
+ try {
568
+ info = gen[key](arg);
569
+ value = info.value;
570
+ } catch (error) {
571
+ reject(error);
572
+ return;
573
+ }
574
+ if (info.done) {
575
+ resolve(value);
576
+ } else {
577
+ return Promise.resolve(value).then(
578
+ value => {
579
+ step('next', value);
580
+ },
581
+ err => {
582
+ step('throw', err);
583
+ });
584
+ }
585
+ }
586
+ return step('next');
587
+ });
588
+ })(function*(){
589
+ const context = (yield this._contextPromise);
590
+ const arrayHandle = (yield context.evaluateHandle(selector => Array.from(document.querySelectorAll(selector)), selector));
591
+ const result = (yield this.evaluate(pageFunction, arrayHandle, ...args));
592
+ (yield arrayHandle.dispose());
593
+ return result;
594
+ });}
595
+
596
+ /**
597
+ * @param {string} selector
598
+ * @return {!Promise<!Array<!ElementHandle>>}
599
+ */
600
+ /* async */ $$(selector) {return (fn => {
601
+ const gen = fn.call(this);
602
+ return new Promise((resolve, reject) => {
603
+ function step(key, arg) {
604
+ let info, value;
605
+ try {
606
+ info = gen[key](arg);
607
+ value = info.value;
608
+ } catch (error) {
609
+ reject(error);
610
+ return;
611
+ }
612
+ if (info.done) {
613
+ resolve(value);
614
+ } else {
615
+ return Promise.resolve(value).then(
616
+ value => {
617
+ step('next', value);
618
+ },
619
+ err => {
620
+ step('throw', err);
621
+ });
622
+ }
623
+ }
624
+ return step('next');
625
+ });
626
+ })(function*(){
627
+ const document = (yield this._document());
628
+ const value = (yield document.$$(selector));
629
+ return value;
630
+ });}
631
+
632
+ /**
633
+ * @return {!Promise<String>}
634
+ */
635
+ /* async */ content() {return (fn => {
636
+ const gen = fn.call(this);
637
+ return new Promise((resolve, reject) => {
638
+ function step(key, arg) {
639
+ let info, value;
640
+ try {
641
+ info = gen[key](arg);
642
+ value = info.value;
643
+ } catch (error) {
644
+ reject(error);
645
+ return;
646
+ }
647
+ if (info.done) {
648
+ resolve(value);
649
+ } else {
650
+ return Promise.resolve(value).then(
651
+ value => {
652
+ step('next', value);
653
+ },
654
+ err => {
655
+ step('throw', err);
656
+ });
657
+ }
658
+ }
659
+ return step('next');
660
+ });
661
+ })(function*(){
662
+ return (yield this.evaluate(() => {
663
+ let retVal = '';
664
+ if (document.doctype)
665
+ retVal = new XMLSerializer().serializeToString(document.doctype);
666
+ if (document.documentElement)
667
+ retVal += document.documentElement.outerHTML;
668
+ return retVal;
669
+ }));
670
+ });}
671
+
672
+ /**
673
+ * @param {string} html
674
+ */
675
+ /* async */ setContent(html) {return (fn => {
676
+ const gen = fn.call(this);
677
+ return new Promise((resolve, reject) => {
678
+ function step(key, arg) {
679
+ let info, value;
680
+ try {
681
+ info = gen[key](arg);
682
+ value = info.value;
683
+ } catch (error) {
684
+ reject(error);
685
+ return;
686
+ }
687
+ if (info.done) {
688
+ resolve(value);
689
+ } else {
690
+ return Promise.resolve(value).then(
691
+ value => {
692
+ step('next', value);
693
+ },
694
+ err => {
695
+ step('throw', err);
696
+ });
697
+ }
698
+ }
699
+ return step('next');
700
+ });
701
+ })(function*(){
702
+ (yield this.evaluate(html => {
703
+ document.open();
704
+ document.write(html);
705
+ document.close();
706
+ }, html));
707
+ });}
708
+
709
+ /**
710
+ * @return {string}
711
+ */
712
+ name() {
713
+ return this._name || '';
714
+ }
715
+
716
+ /**
717
+ * @return {string}
718
+ */
719
+ url() {
720
+ return this._url;
721
+ }
722
+
723
+ /**
724
+ * @return {?Frame}
725
+ */
726
+ parentFrame() {
727
+ return this._parentFrame;
728
+ }
729
+
730
+ /**
731
+ * @return {!Array.<!Frame>}
732
+ */
733
+ childFrames() {
734
+ return Array.from(this._childFrames);
735
+ }
736
+
737
+ /**
738
+ * @return {boolean}
739
+ */
740
+ isDetached() {
741
+ return this._detached;
742
+ }
743
+
744
+ /**
745
+ * @param {Object} options
746
+ * @return {!Promise<!ElementHandle>}
747
+ */
748
+ /* async */ addScriptTag(options) {return (fn => {
749
+ const gen = fn.call(this);
750
+ return new Promise((resolve, reject) => {
751
+ function step(key, arg) {
752
+ let info, value;
753
+ try {
754
+ info = gen[key](arg);
755
+ value = info.value;
756
+ } catch (error) {
757
+ reject(error);
758
+ return;
759
+ }
760
+ if (info.done) {
761
+ resolve(value);
762
+ } else {
763
+ return Promise.resolve(value).then(
764
+ value => {
765
+ step('next', value);
766
+ },
767
+ err => {
768
+ step('throw', err);
769
+ });
770
+ }
771
+ }
772
+ return step('next');
773
+ });
774
+ })(function*(){
775
+ if (typeof options.url === 'string') {
776
+ const url = options.url;
777
+ try {
778
+ const context = (yield this._contextPromise);
779
+ return ((yield context.evaluateHandle(addScriptUrl, url, options.type))).asElement();
780
+ } catch (error) {
781
+ throw new Error(`Loading script from ${url} failed`);
782
+ }
783
+ }
784
+
785
+ if (typeof options.path === 'string') {
786
+ let contents = (yield readFileAsync(options.path, 'utf8'));
787
+ contents += '//# sourceURL=' + options.path.replace(/\n/g, '');
788
+ const context = (yield this._contextPromise);
789
+ return ((yield context.evaluateHandle(addScriptContent, contents, options.type))).asElement();
790
+ }
791
+
792
+ if (typeof options.content === 'string') {
793
+ const context = (yield this._contextPromise);
794
+ return ((yield context.evaluateHandle(addScriptContent, options.content, options.type))).asElement();
795
+ }
796
+
797
+ throw new Error('Provide an object with a `url`, `path` or `content` property');
798
+
799
+ /**
800
+ * @param {string} url
801
+ * @param {string} type
802
+ * @return {!Promise<!HTMLElement>}
803
+ */
804
+ /* async */ function addScriptUrl(url, type) {return (fn => {
805
+ const gen = fn.call(this);
806
+ return new Promise((resolve, reject) => {
807
+ function step(key, arg) {
808
+ let info, value;
809
+ try {
810
+ info = gen[key](arg);
811
+ value = info.value;
812
+ } catch (error) {
813
+ reject(error);
814
+ return;
815
+ }
816
+ if (info.done) {
817
+ resolve(value);
818
+ } else {
819
+ return Promise.resolve(value).then(
820
+ value => {
821
+ step('next', value);
822
+ },
823
+ err => {
824
+ step('throw', err);
825
+ });
826
+ }
827
+ }
828
+ return step('next');
829
+ });
830
+ })(function*(){
831
+ const script = document.createElement('script');
832
+ script.src = url;
833
+ if (type)
834
+ script.type = type;
835
+ const promise = new Promise((res, rej) => {
836
+ script.onload = res;
837
+ script.onerror = rej;
838
+ });
839
+ document.head.appendChild(script);
840
+ (yield promise);
841
+ return script;
842
+ });}
843
+
844
+ /**
845
+ * @param {string} content
846
+ * @param {string} type
847
+ * @return {!HTMLElement}
848
+ */
849
+ function addScriptContent(content, type = 'text/javascript') {
850
+ const script = document.createElement('script');
851
+ script.type = type;
852
+ script.text = content;
853
+ let error = null;
854
+ script.onerror = e => error = e;
855
+ document.head.appendChild(script);
856
+ if (error)
857
+ throw error;
858
+ return script;
859
+ }
860
+ });}
861
+
862
+ /**
863
+ * @param {Object} options
864
+ * @return {!Promise<!ElementHandle>}
865
+ */
866
+ /* async */ addStyleTag(options) {return (fn => {
867
+ const gen = fn.call(this);
868
+ return new Promise((resolve, reject) => {
869
+ function step(key, arg) {
870
+ let info, value;
871
+ try {
872
+ info = gen[key](arg);
873
+ value = info.value;
874
+ } catch (error) {
875
+ reject(error);
876
+ return;
877
+ }
878
+ if (info.done) {
879
+ resolve(value);
880
+ } else {
881
+ return Promise.resolve(value).then(
882
+ value => {
883
+ step('next', value);
884
+ },
885
+ err => {
886
+ step('throw', err);
887
+ });
888
+ }
889
+ }
890
+ return step('next');
891
+ });
892
+ })(function*(){
893
+ if (typeof options.url === 'string') {
894
+ const url = options.url;
895
+ try {
896
+ const context = (yield this._contextPromise);
897
+ return ((yield context.evaluateHandle(addStyleUrl, url))).asElement();
898
+ } catch (error) {
899
+ throw new Error(`Loading style from ${url} failed`);
900
+ }
901
+ }
902
+
903
+ if (typeof options.path === 'string') {
904
+ let contents = (yield readFileAsync(options.path, 'utf8'));
905
+ contents += '/*# sourceURL=' + options.path.replace(/\n/g, '') + '*/';
906
+ const context = (yield this._contextPromise);
907
+ return ((yield context.evaluateHandle(addStyleContent, contents))).asElement();
908
+ }
909
+
910
+ if (typeof options.content === 'string') {
911
+ const context = (yield this._contextPromise);
912
+ return ((yield context.evaluateHandle(addStyleContent, options.content))).asElement();
913
+ }
914
+
915
+ throw new Error('Provide an object with a `url`, `path` or `content` property');
916
+
917
+ /**
918
+ * @param {string} url
919
+ * @return {!Promise<!HTMLElement>}
920
+ */
921
+ /* async */ function addStyleUrl(url) {return (fn => {
922
+ const gen = fn.call(this);
923
+ return new Promise((resolve, reject) => {
924
+ function step(key, arg) {
925
+ let info, value;
926
+ try {
927
+ info = gen[key](arg);
928
+ value = info.value;
929
+ } catch (error) {
930
+ reject(error);
931
+ return;
932
+ }
933
+ if (info.done) {
934
+ resolve(value);
935
+ } else {
936
+ return Promise.resolve(value).then(
937
+ value => {
938
+ step('next', value);
939
+ },
940
+ err => {
941
+ step('throw', err);
942
+ });
943
+ }
944
+ }
945
+ return step('next');
946
+ });
947
+ })(function*(){
948
+ const link = document.createElement('link');
949
+ link.rel = 'stylesheet';
950
+ link.href = url;
951
+ const promise = new Promise((res, rej) => {
952
+ link.onload = res;
953
+ link.onerror = rej;
954
+ });
955
+ document.head.appendChild(link);
956
+ (yield promise);
957
+ return link;
958
+ });}
959
+
960
+ /**
961
+ * @param {string} content
962
+ * @return {!Promise<!HTMLElement>}
963
+ */
964
+ /* async */ function addStyleContent(content) {return (fn => {
965
+ const gen = fn.call(this);
966
+ return new Promise((resolve, reject) => {
967
+ function step(key, arg) {
968
+ let info, value;
969
+ try {
970
+ info = gen[key](arg);
971
+ value = info.value;
972
+ } catch (error) {
973
+ reject(error);
974
+ return;
975
+ }
976
+ if (info.done) {
977
+ resolve(value);
978
+ } else {
979
+ return Promise.resolve(value).then(
980
+ value => {
981
+ step('next', value);
982
+ },
983
+ err => {
984
+ step('throw', err);
985
+ });
986
+ }
987
+ }
988
+ return step('next');
989
+ });
990
+ })(function*(){
991
+ const style = document.createElement('style');
992
+ style.type = 'text/css';
993
+ style.appendChild(document.createTextNode(content));
994
+ const promise = new Promise((res, rej) => {
995
+ style.onload = res;
996
+ style.onerror = rej;
997
+ });
998
+ document.head.appendChild(style);
999
+ (yield promise);
1000
+ return style;
1001
+ });}
1002
+ });}
1003
+
1004
+ /**
1005
+ * @param {string} selector
1006
+ * @param {!Object=} options
1007
+ */
1008
+ /* async */ click(selector, options = {}) {return (fn => {
1009
+ const gen = fn.call(this);
1010
+ return new Promise((resolve, reject) => {
1011
+ function step(key, arg) {
1012
+ let info, value;
1013
+ try {
1014
+ info = gen[key](arg);
1015
+ value = info.value;
1016
+ } catch (error) {
1017
+ reject(error);
1018
+ return;
1019
+ }
1020
+ if (info.done) {
1021
+ resolve(value);
1022
+ } else {
1023
+ return Promise.resolve(value).then(
1024
+ value => {
1025
+ step('next', value);
1026
+ },
1027
+ err => {
1028
+ step('throw', err);
1029
+ });
1030
+ }
1031
+ }
1032
+ return step('next');
1033
+ });
1034
+ })(function*(){
1035
+ const handle = (yield this.$(selector));
1036
+ console.assert(handle, 'No node found for selector: ' + selector);
1037
+ (yield handle.click(options));
1038
+ (yield handle.dispose());
1039
+ });}
1040
+
1041
+ /**
1042
+ * @param {string} selector
1043
+ */
1044
+ /* async */ focus(selector) {return (fn => {
1045
+ const gen = fn.call(this);
1046
+ return new Promise((resolve, reject) => {
1047
+ function step(key, arg) {
1048
+ let info, value;
1049
+ try {
1050
+ info = gen[key](arg);
1051
+ value = info.value;
1052
+ } catch (error) {
1053
+ reject(error);
1054
+ return;
1055
+ }
1056
+ if (info.done) {
1057
+ resolve(value);
1058
+ } else {
1059
+ return Promise.resolve(value).then(
1060
+ value => {
1061
+ step('next', value);
1062
+ },
1063
+ err => {
1064
+ step('throw', err);
1065
+ });
1066
+ }
1067
+ }
1068
+ return step('next');
1069
+ });
1070
+ })(function*(){
1071
+ const handle = (yield this.$(selector));
1072
+ console.assert(handle, 'No node found for selector: ' + selector);
1073
+ (yield handle.focus());
1074
+ (yield handle.dispose());
1075
+ });}
1076
+
1077
+ /**
1078
+ * @param {string} selector
1079
+ */
1080
+ /* async */ hover(selector) {return (fn => {
1081
+ const gen = fn.call(this);
1082
+ return new Promise((resolve, reject) => {
1083
+ function step(key, arg) {
1084
+ let info, value;
1085
+ try {
1086
+ info = gen[key](arg);
1087
+ value = info.value;
1088
+ } catch (error) {
1089
+ reject(error);
1090
+ return;
1091
+ }
1092
+ if (info.done) {
1093
+ resolve(value);
1094
+ } else {
1095
+ return Promise.resolve(value).then(
1096
+ value => {
1097
+ step('next', value);
1098
+ },
1099
+ err => {
1100
+ step('throw', err);
1101
+ });
1102
+ }
1103
+ }
1104
+ return step('next');
1105
+ });
1106
+ })(function*(){
1107
+ const handle = (yield this.$(selector));
1108
+ console.assert(handle, 'No node found for selector: ' + selector);
1109
+ (yield handle.hover());
1110
+ (yield handle.dispose());
1111
+ });}
1112
+
1113
+ /**
1114
+ * @param {string} selector
1115
+ * @param {!Array<string>} values
1116
+ * @return {!Promise<!Array<string>>}
1117
+ */
1118
+ select(selector, ...values){
1119
+ for (const value of values)
1120
+ console.assert(helper.isString(value), 'Values must be strings. Found value "' + value + '" of type "' + (typeof value) + '"');
1121
+ return this.$eval(selector, (element, values) => {
1122
+ if (element.nodeName.toLowerCase() !== 'select')
1123
+ throw new Error('Element is not a <select> element.');
1124
+
1125
+ const options = Array.from(element.options);
1126
+ element.value = undefined;
1127
+ for (const option of options) {
1128
+ option.selected = values.includes(option.value);
1129
+ if (option.selected && !element.multiple)
1130
+ break;
1131
+ }
1132
+ element.dispatchEvent(new Event('input', { 'bubbles': true }));
1133
+ element.dispatchEvent(new Event('change', { 'bubbles': true }));
1134
+ return options.filter(option => option.selected).map(option => option.value);
1135
+ }, values);
1136
+ }
1137
+
1138
+ /**
1139
+ * @param {string} selector
1140
+ */
1141
+ /* async */ tap(selector) {return (fn => {
1142
+ const gen = fn.call(this);
1143
+ return new Promise((resolve, reject) => {
1144
+ function step(key, arg) {
1145
+ let info, value;
1146
+ try {
1147
+ info = gen[key](arg);
1148
+ value = info.value;
1149
+ } catch (error) {
1150
+ reject(error);
1151
+ return;
1152
+ }
1153
+ if (info.done) {
1154
+ resolve(value);
1155
+ } else {
1156
+ return Promise.resolve(value).then(
1157
+ value => {
1158
+ step('next', value);
1159
+ },
1160
+ err => {
1161
+ step('throw', err);
1162
+ });
1163
+ }
1164
+ }
1165
+ return step('next');
1166
+ });
1167
+ })(function*(){
1168
+ const handle = (yield this.$(selector));
1169
+ console.assert(handle, 'No node found for selector: ' + selector);
1170
+ (yield handle.tap());
1171
+ (yield handle.dispose());
1172
+ });}
1173
+
1174
+ /**
1175
+ * @param {string} selector
1176
+ * @param {string} text
1177
+ * @param {{delay: (number|undefined)}=} options
1178
+ */
1179
+ /* async */ type(selector, text, options) {return (fn => {
1180
+ const gen = fn.call(this);
1181
+ return new Promise((resolve, reject) => {
1182
+ function step(key, arg) {
1183
+ let info, value;
1184
+ try {
1185
+ info = gen[key](arg);
1186
+ value = info.value;
1187
+ } catch (error) {
1188
+ reject(error);
1189
+ return;
1190
+ }
1191
+ if (info.done) {
1192
+ resolve(value);
1193
+ } else {
1194
+ return Promise.resolve(value).then(
1195
+ value => {
1196
+ step('next', value);
1197
+ },
1198
+ err => {
1199
+ step('throw', err);
1200
+ });
1201
+ }
1202
+ }
1203
+ return step('next');
1204
+ });
1205
+ })(function*(){
1206
+ const handle = (yield this.$(selector));
1207
+ console.assert(handle, 'No node found for selector: ' + selector);
1208
+ (yield handle.type(text, options));
1209
+ (yield handle.dispose());
1210
+ });}
1211
+
1212
+ /**
1213
+ * @param {(string|number|Function)} selectorOrFunctionOrTimeout
1214
+ * @param {!Object=} options
1215
+ * @param {!Array<*>} args
1216
+ * @return {!Promise}
1217
+ */
1218
+ waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
1219
+ const xPathPattern = '//';
1220
+
1221
+ if (helper.isString(selectorOrFunctionOrTimeout)) {
1222
+ const string = /** @type {string} */ (selectorOrFunctionOrTimeout);
1223
+ if (string.startsWith(xPathPattern))
1224
+ return this.waitForXPath(string, options);
1225
+ return this.waitForSelector(string, options);
1226
+ }
1227
+ if (helper.isNumber(selectorOrFunctionOrTimeout))
1228
+ return new Promise(fulfill => setTimeout(fulfill, selectorOrFunctionOrTimeout));
1229
+ if (typeof selectorOrFunctionOrTimeout === 'function')
1230
+ return this.waitForFunction(selectorOrFunctionOrTimeout, options, ...args);
1231
+ return Promise.reject(new Error('Unsupported target type: ' + (typeof selectorOrFunctionOrTimeout)));
1232
+ }
1233
+
1234
+ /**
1235
+ * @param {string} selector
1236
+ * @param {!Object=} options
1237
+ * @return {!Promise}
1238
+ */
1239
+ waitForSelector(selector, options = {}) {
1240
+ return this._waitForSelectorOrXPath(selector, false, options);
1241
+ }
1242
+
1243
+ /**
1244
+ * @param {string} xpath
1245
+ * @param {!Object=} options
1246
+ * @return {!Promise}
1247
+ */
1248
+ waitForXPath(xpath, options = {}) {
1249
+ return this._waitForSelectorOrXPath(xpath, true, options);
1250
+ }
1251
+
1252
+ /**
1253
+ * @param {Function|string} pageFunction
1254
+ * @param {!Object=} options
1255
+ * @return {!Promise}
1256
+ */
1257
+ waitForFunction(pageFunction, options = {}, ...args) {
1258
+ const timeout = helper.isNumber(options.timeout) ? options.timeout : 30000;
1259
+ const polling = options.polling || 'raf';
1260
+ return new WaitTask(this, pageFunction, 'function', polling, timeout, ...args).promise;
1261
+ }
1262
+
1263
+ /**
1264
+ * @return {!Promise<string>}
1265
+ */
1266
+ /* async */ title() {return (fn => {
1267
+ const gen = fn.call(this);
1268
+ return new Promise((resolve, reject) => {
1269
+ function step(key, arg) {
1270
+ let info, value;
1271
+ try {
1272
+ info = gen[key](arg);
1273
+ value = info.value;
1274
+ } catch (error) {
1275
+ reject(error);
1276
+ return;
1277
+ }
1278
+ if (info.done) {
1279
+ resolve(value);
1280
+ } else {
1281
+ return Promise.resolve(value).then(
1282
+ value => {
1283
+ step('next', value);
1284
+ },
1285
+ err => {
1286
+ step('throw', err);
1287
+ });
1288
+ }
1289
+ }
1290
+ return step('next');
1291
+ });
1292
+ })(function*(){
1293
+ return this.evaluate(() => document.title);
1294
+ });}
1295
+
1296
+ /**
1297
+ * @param {string} selectorOrXPath
1298
+ * @param {boolean} isXPath
1299
+ * @param {!Object=} options
1300
+ * @return {!Promise}
1301
+ */
1302
+ _waitForSelectorOrXPath(selectorOrXPath, isXPath, options = {}) {
1303
+ const waitForVisible = !!options.visible;
1304
+ const waitForHidden = !!options.hidden;
1305
+ const polling = waitForVisible || waitForHidden ? 'raf' : 'mutation';
1306
+ const timeout = helper.isNumber(options.timeout) ? options.timeout : 30000;
1307
+ return new WaitTask(this, predicate, `${isXPath ? 'XPath' : 'selector'} "${selectorOrXPath}"`, polling, timeout, selectorOrXPath, isXPath, waitForVisible, waitForHidden).promise;
1308
+
1309
+ /**
1310
+ * @param {string} selectorOrXPath
1311
+ * @param {boolean} isXPath
1312
+ * @param {boolean} waitForVisible
1313
+ * @param {boolean} waitForHidden
1314
+ * @return {?Node|boolean}
1315
+ */
1316
+ function predicate(selectorOrXPath, isXPath, waitForVisible, waitForHidden) {
1317
+ const node = isXPath
1318
+ ? document.evaluate(selectorOrXPath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
1319
+ : document.querySelector(selectorOrXPath);
1320
+ if (!node)
1321
+ return waitForHidden;
1322
+ if (!waitForVisible && !waitForHidden)
1323
+ return node;
1324
+ const element = /** @type {Element} */ (node.nodeType === Node.TEXT_NODE ? node.parentElement : node);
1325
+
1326
+ const style = window.getComputedStyle(element);
1327
+ const isVisible = style && style.visibility !== 'hidden' && hasVisibleBoundingBox();
1328
+ const success = (waitForVisible === isVisible || waitForHidden === !isVisible);
1329
+ return success ? node : null;
1330
+
1331
+ /**
1332
+ * @return {boolean}
1333
+ */
1334
+ function hasVisibleBoundingBox() {
1335
+ const rect = element.getBoundingClientRect();
1336
+ return !!(rect.top || rect.bottom || rect.width || rect.height);
1337
+ }
1338
+ }
1339
+ }
1340
+
1341
+ /**
1342
+ * @param {!Protocol.Page.Frame} framePayload
1343
+ */
1344
+ _navigated(framePayload) {
1345
+ this._name = framePayload.name;
1346
+ // TODO(lushnikov): remove this once requestInterception has loaderId exposed.
1347
+ this._navigationURL = framePayload.url;
1348
+ this._url = framePayload.url;
1349
+ }
1350
+
1351
+ /**
1352
+ * @param {string} url
1353
+ */
1354
+ _navigatedWithinDocument(url) {
1355
+ this._url = url;
1356
+ }
1357
+
1358
+ /**
1359
+ * @param {string} loaderId
1360
+ * @param {string} name
1361
+ */
1362
+ _onLifecycleEvent(loaderId, name) {
1363
+ if (name === 'init') {
1364
+ this._loaderId = loaderId;
1365
+ this._lifecycleEvents.clear();
1366
+ }
1367
+ this._lifecycleEvents.add(name);
1368
+ }
1369
+
1370
+ _onLoadingStopped() {
1371
+ this._lifecycleEvents.add('DOMContentLoaded');
1372
+ this._lifecycleEvents.add('load');
1373
+ }
1374
+
1375
+ _detach() {
1376
+ for (const waitTask of this._waitTasks)
1377
+ waitTask.terminate(new Error('waitForFunction failed: frame got detached.'));
1378
+ this._detached = true;
1379
+ if (this._parentFrame)
1380
+ this._parentFrame._childFrames.delete(this);
1381
+ this._parentFrame = null;
1382
+ }
1383
+ }
1384
+ helper.tracePublicAPI(Frame);
1385
+
1386
+ class WaitTask {
1387
+ /**
1388
+ * @param {!Frame} frame
1389
+ * @param {Function|string} predicateBody
1390
+ * @param {string|number} polling
1391
+ * @param {number} timeout
1392
+ * @param {!Array<*>} args
1393
+ */
1394
+ constructor(frame, predicateBody, title, polling, timeout, ...args) {
1395
+ if (helper.isString(polling))
1396
+ console.assert(polling === 'raf' || polling === 'mutation', 'Unknown polling option: ' + polling);
1397
+ else if (helper.isNumber(polling))
1398
+ console.assert(polling > 0, 'Cannot poll with non-positive interval: ' + polling);
1399
+ else
1400
+ throw new Error('Unknown polling options: ' + polling);
1401
+
1402
+ this._frame = frame;
1403
+ this._polling = polling;
1404
+ this._timeout = timeout;
1405
+ this._predicateBody = helper.isString(predicateBody) ? 'return ' + predicateBody : 'return (' + predicateBody + ')(...args)';
1406
+ this._args = args;
1407
+ this._runCount = 0;
1408
+ frame._waitTasks.add(this);
1409
+ this.promise = new Promise((resolve, reject) => {
1410
+ this._resolve = resolve;
1411
+ this._reject = reject;
1412
+ });
1413
+ // Since page navigation requires us to re-install the pageScript, we should track
1414
+ // timeout on our end.
1415
+ if (timeout)
1416
+ this._timeoutTimer = setTimeout(() => this.terminate(new Error(`waiting for ${title} failed: timeout ${timeout}ms exceeded`)), timeout);
1417
+ this.rerun();
1418
+ }
1419
+
1420
+ /**
1421
+ * @param {!Error} error
1422
+ */
1423
+ terminate(error) {
1424
+ this._terminated = true;
1425
+ this._reject(error);
1426
+ this._cleanup();
1427
+ }
1428
+
1429
+ /* async */ rerun() {return (fn => {
1430
+ const gen = fn.call(this);
1431
+ return new Promise((resolve, reject) => {
1432
+ function step(key, arg) {
1433
+ let info, value;
1434
+ try {
1435
+ info = gen[key](arg);
1436
+ value = info.value;
1437
+ } catch (error) {
1438
+ reject(error);
1439
+ return;
1440
+ }
1441
+ if (info.done) {
1442
+ resolve(value);
1443
+ } else {
1444
+ return Promise.resolve(value).then(
1445
+ value => {
1446
+ step('next', value);
1447
+ },
1448
+ err => {
1449
+ step('throw', err);
1450
+ });
1451
+ }
1452
+ }
1453
+ return step('next');
1454
+ });
1455
+ })(function*(){
1456
+ const runCount = ++this._runCount;
1457
+ /** @type {?JSHandle} */
1458
+ let success = null;
1459
+ let error = null;
1460
+ try {
1461
+ success = (yield ((yield this._frame.executionContext())).evaluateHandle(waitForPredicatePageFunction, this._predicateBody, this._polling, this._timeout, ...this._args));
1462
+ } catch (e) {
1463
+ error = e;
1464
+ }
1465
+
1466
+ if (this._terminated || runCount !== this._runCount) {
1467
+ if (success)
1468
+ (yield success.dispose());
1469
+ return;
1470
+ }
1471
+
1472
+ // Ignore timeouts in pageScript - we track timeouts ourselves.
1473
+ if (!error && (yield this._frame.evaluate(s => !s, success))) {
1474
+ (yield success.dispose());
1475
+ return;
1476
+ }
1477
+
1478
+ // When the page is navigated, the promise is rejected.
1479
+ // We will try again in the new execution context.
1480
+ if (error && error.message.includes('Execution context was destroyed'))
1481
+ return;
1482
+
1483
+ // We could have tried to evaluate in a context which was already
1484
+ // destroyed.
1485
+ if (error && error.message.includes('Cannot find context with specified id'))
1486
+ return;
1487
+
1488
+ if (error)
1489
+ this._reject(error);
1490
+ else
1491
+ this._resolve(success);
1492
+
1493
+ this._cleanup();
1494
+ });}
1495
+
1496
+ _cleanup() {
1497
+ clearTimeout(this._timeoutTimer);
1498
+ this._frame._waitTasks.delete(this);
1499
+ this._runningTask = null;
1500
+ }
1501
+ }
1502
+
1503
+ /**
1504
+ * @param {string} predicateBody
1505
+ * @param {string} polling
1506
+ * @param {number} timeout
1507
+ * @return {!Promise<*>}
1508
+ */
1509
+ /* async */ function waitForPredicatePageFunction(predicateBody, polling, timeout, ...args) {return (fn => {
1510
+ const gen = fn.call(this);
1511
+ return new Promise((resolve, reject) => {
1512
+ function step(key, arg) {
1513
+ let info, value;
1514
+ try {
1515
+ info = gen[key](arg);
1516
+ value = info.value;
1517
+ } catch (error) {
1518
+ reject(error);
1519
+ return;
1520
+ }
1521
+ if (info.done) {
1522
+ resolve(value);
1523
+ } else {
1524
+ return Promise.resolve(value).then(
1525
+ value => {
1526
+ step('next', value);
1527
+ },
1528
+ err => {
1529
+ step('throw', err);
1530
+ });
1531
+ }
1532
+ }
1533
+ return step('next');
1534
+ });
1535
+ })(function*(){
1536
+ const predicate = new Function('...args', predicateBody);
1537
+ let timedOut = false;
1538
+ setTimeout(() => timedOut = true, timeout);
1539
+ if (polling === 'raf')
1540
+ return (yield pollRaf());
1541
+ if (polling === 'mutation')
1542
+ return (yield pollMutation());
1543
+ if (typeof polling === 'number')
1544
+ return (yield pollInterval(polling));
1545
+
1546
+ /**
1547
+ * @return {!Promise<*>}
1548
+ */
1549
+ function pollMutation() {
1550
+ const success = predicate.apply(null, args);
1551
+ if (success)
1552
+ return Promise.resolve(success);
1553
+
1554
+ let fulfill;
1555
+ const result = new Promise(x => fulfill = x);
1556
+ const observer = new MutationObserver(mutations => {
1557
+ if (timedOut) {
1558
+ observer.disconnect();
1559
+ fulfill();
1560
+ }
1561
+ const success = predicate.apply(null, args);
1562
+ if (success) {
1563
+ observer.disconnect();
1564
+ fulfill(success);
1565
+ }
1566
+ });
1567
+ observer.observe(document, {
1568
+ childList: true,
1569
+ subtree: true,
1570
+ attributes: true
1571
+ });
1572
+ return result;
1573
+ }
1574
+
1575
+ /**
1576
+ * @return {!Promise<*>}
1577
+ */
1578
+ function pollRaf() {
1579
+ let fulfill;
1580
+ const result = new Promise(x => fulfill = x);
1581
+ onRaf();
1582
+ return result;
1583
+
1584
+ function onRaf() {
1585
+ if (timedOut) {
1586
+ fulfill();
1587
+ return;
1588
+ }
1589
+ const success = predicate.apply(null, args);
1590
+ if (success)
1591
+ fulfill(success);
1592
+ else
1593
+ requestAnimationFrame(onRaf);
1594
+ }
1595
+ }
1596
+
1597
+ /**
1598
+ * @param {number} pollInterval
1599
+ * @return {!Promise<*>}
1600
+ */
1601
+ function pollInterval(pollInterval) {
1602
+ let fulfill;
1603
+ const result = new Promise(x => fulfill = x);
1604
+ onTimeout();
1605
+ return result;
1606
+
1607
+ function onTimeout() {
1608
+ if (timedOut) {
1609
+ fulfill();
1610
+ return;
1611
+ }
1612
+ const success = predicate.apply(null, args);
1613
+ if (success)
1614
+ fulfill(success);
1615
+ else
1616
+ setTimeout(onTimeout, pollInterval);
1617
+ }
1618
+ }
1619
+ });}
1620
+
1621
+ module.exports = {FrameManager, Frame};