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