postdoc 0.1.2 → 0.2.0.beta4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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};