From 7f1aed53e5a8a6260634c5a3fa99c967ea2f30de Mon Sep 17 00:00:00 2001 From: Mark Wilson Date: Tue, 6 Oct 2015 13:28:33 -0700 Subject: [PATCH] Commit CasperJS and Rusha.js libs --- vendor/casperjs/.gitattributes | 1 + vendor/casperjs/.gitignore | 8 + vendor/casperjs/.gitmodules | 0 vendor/casperjs/.jshintignore | 11 + vendor/casperjs/.jshintrc | 25 + vendor/casperjs/.travis.yml | 60 + vendor/casperjs/CHANGELOG.md | 1 + vendor/casperjs/CONTRIBUTING.md | 93 + vendor/casperjs/CONTRIBUTORS.md | 109 + vendor/casperjs/LICENSE.md | 19 + vendor/casperjs/Makefile | 25 + vendor/casperjs/README.md | 94 + vendor/casperjs/batchbin/casperjs.bat | 5 + vendor/casperjs/bin/bootstrap.js | 395 +++ vendor/casperjs/bin/casperjs | 140 + vendor/casperjs/bin/casperjs.exe | Bin 0 -> 7168 bytes vendor/casperjs/bin/usage.txt | 14 + vendor/casperjs/casperjs.gemspec | 23 + vendor/casperjs/docs/Makefile | 13 + vendor/casperjs/docs/README.md | 5 + .../docs/_static/casperjs-favicon.ico | Bin 0 -> 1150 bytes vendor/casperjs/docs/_static/images/bg.png | Bin 0 -> 99 bytes .../_static/images/casperjs-logo-medium.png | Bin 0 -> 12546 bytes .../_static/images/casperjs-logo-small.png | Bin 0 -> 6665 bytes .../images/casperjs-logo-squared-inv.png | Bin 0 -> 12616 bytes .../_static/images/casperjs-logo-squared.png | Bin 0 -> 9254 bytes .../_static/images/casperjs-logo-xsmall.png | Bin 0 -> 2363 bytes .../docs/_static/images/casperjs-logo.png | Bin 0 -> 27460 bytes .../docs/_static/images/casperjs-rounded.png | Bin 0 -> 7363 bytes .../docs/_static/images/colorizer.png | Bin 0 -> 119414 bytes .../docs/_static/images/cow-test-ko.png | Bin 0 -> 57079 bytes .../docs/_static/images/cow-test-ok.png | Bin 0 -> 35652 bytes vendor/casperjs/docs/_static/images/demo.png | Bin 0 -> 44903 bytes .../docs/_static/images/evaluate-diagram.png | Bin 0 -> 7644 bytes .../casperjs/docs/_static/images/forkme.png | Bin 0 -> 4884 bytes .../docs/_static/images/logoutput.png | Bin 0 -> 37472 bytes .../_static/images/split-test-results.png | Bin 0 -> 32309 bytes vendor/casperjs/docs/_static/images/tar.png | Bin 0 -> 3920 bytes .../docs/_static/images/testsuiteok.png | Bin 0 -> 45169 bytes vendor/casperjs/docs/_static/images/zip.png | Bin 0 -> 3788 bytes .../casperjs/docs/_themes/casperjs/addon.html | 15 + .../docs/_themes/casperjs/layout.html | 7 + .../docs/_themes/casperjs/localtoc.html | 4 + .../docs/_themes/casperjs/sourcelink.html | 16 + .../_themes/casperjs/static/casperjs-dark.css | 991 +++++++ .../casperjs/static/casperjs-light.css | 887 ++++++ .../_themes/casperjs/static/style-switcher.js | 106 + .../casperjs/docs/_themes/casperjs/theme.conf | 2 + vendor/casperjs/docs/changelog.rst | 4 + vendor/casperjs/docs/cli.rst | 164 ++ vendor/casperjs/docs/conf.py | 259 ++ vendor/casperjs/docs/credits.rst | 64 + vendor/casperjs/docs/debugging.rst | 111 + vendor/casperjs/docs/events-filters.rst | 591 ++++ vendor/casperjs/docs/extending.rst | 138 + vendor/casperjs/docs/faq.rst | 360 +++ vendor/casperjs/docs/index.rst | 46 + vendor/casperjs/docs/installation.rst | 187 ++ vendor/casperjs/docs/license.rst | 29 + vendor/casperjs/docs/logging.rst | 69 + vendor/casperjs/docs/modules/casper.rst | 2289 +++++++++++++++ vendor/casperjs/docs/modules/clientutils.rst | 373 +++ vendor/casperjs/docs/modules/colorizer.rst | 102 + vendor/casperjs/docs/modules/index.rst | 14 + vendor/casperjs/docs/modules/tester.rst | 940 ++++++ vendor/casperjs/docs/modules/utils.rst | 250 ++ vendor/casperjs/docs/quickstart.rst | 191 ++ vendor/casperjs/docs/selectors.rst | 99 + vendor/casperjs/docs/testing.rst | 269 ++ vendor/casperjs/docs/upgrading/1.1.rst | 112 + vendor/casperjs/docs/upgrading/index.rst | 7 + vendor/casperjs/docs/writing_modules.rst | 76 + vendor/casperjs/modules/casper.js | 2578 +++++++++++++++++ vendor/casperjs/modules/cli.js | 149 + vendor/casperjs/modules/clientutils.js | 888 ++++++ vendor/casperjs/modules/colorizer.js | 134 + vendor/casperjs/modules/events.js | 272 ++ vendor/casperjs/modules/http.js | 75 + vendor/casperjs/modules/mouse.js | 116 + vendor/casperjs/modules/pagestack.js | 167 ++ vendor/casperjs/modules/querystring.js | 214 ++ vendor/casperjs/modules/tester.js | 1987 +++++++++++++ vendor/casperjs/modules/utils.js | 852 ++++++ vendor/casperjs/modules/xunit.js | 172 ++ vendor/casperjs/package.json | 35 + vendor/casperjs/rpm/build | 41 + vendor/casperjs/rpm/casperjs.spec | 82 + vendor/casperjs/rubybin/casperjs | 63 + vendor/casperjs/samples/bbcshots.coffee | 65 + vendor/casperjs/samples/bbcshots.js | 81 + vendor/casperjs/samples/cliplay.coffee | 19 + vendor/casperjs/samples/cliplay.js | 30 + vendor/casperjs/samples/customevents.coffee | 11 + vendor/casperjs/samples/customevents.js | 16 + vendor/casperjs/samples/customlogging.coffee | 31 + vendor/casperjs/samples/customlogging.js | 41 + vendor/casperjs/samples/download.coffee | 10 + vendor/casperjs/samples/download.js | 14 + vendor/casperjs/samples/dynamic.coffee | 60 + vendor/casperjs/samples/dynamic.js | 68 + vendor/casperjs/samples/each.coffee | 14 + vendor/casperjs/samples/each.js | 20 + vendor/casperjs/samples/events.coffee | 34 + vendor/casperjs/samples/events.js | 43 + vendor/casperjs/samples/extends.coffee | 29 + vendor/casperjs/samples/extends.js | 40 + vendor/casperjs/samples/googlelinks.coffee | 30 + vendor/casperjs/samples/googlelinks.js | 41 + vendor/casperjs/samples/googlematch.coffee | 47 + vendor/casperjs/samples/googlematch.js | 68 + .../casperjs/samples/googlepagination.coffee | 45 + vendor/casperjs/samples/googlepagination.js | 59 + vendor/casperjs/samples/googletesting.coffee | 28 + vendor/casperjs/samples/googletesting.js | 46 + vendor/casperjs/samples/logcolor.coffee | 10 + vendor/casperjs/samples/logcolor.js | 14 + vendor/casperjs/samples/metaextract.coffee | 23 + vendor/casperjs/samples/metaextract.js | 32 + vendor/casperjs/samples/multirun.coffee | 37 + vendor/casperjs/samples/multirun.js | 59 + vendor/casperjs/samples/screenshot.coffee | 28 + vendor/casperjs/samples/screenshot.js | 36 + vendor/casperjs/samples/statushandlers.coffee | 15 + vendor/casperjs/samples/statushandlers.js | 22 + vendor/casperjs/samples/steptimeout.coffee | 37 + vendor/casperjs/samples/steptimeout.js | 48 + vendor/casperjs/samples/timeout.coffee | 39 + vendor/casperjs/samples/timeout.js | 50 + vendor/casperjs/samples/translate.coffee | 23 + vendor/casperjs/samples/translate.js | 30 + vendor/casperjs/src/casperjs.cs | 175 ++ .../casperjs/tests/clitests/error/syntax.js | 1 + .../clitests/fail-fast/manual-abort/index.js | 16 + .../clitests/fail-fast/standard/test1.js | 4 + .../clitests/fail-fast/standard/test2.js | 4 + .../clitests/fail-fast/standard/test3.js | 4 + vendor/casperjs/tests/clitests/modules/mod.js | 4 + .../clitests/modules/node_modules/bar.js | 1 + .../clitests/modules/node_modules/baz/baz.js | 1 + .../modules/node_modules/baz/package.json | 3 + .../modules/node_modules/foo/index.js | 1 + .../clitests/modules/node_modules/json.json | 1 + .../clitests/modules/sub/coffeemod.coffee | 1 + .../tests/clitests/modules/sub/mod.js | 1 + .../casperjs/tests/clitests/modules/test.js | 4 + .../tests/clitests/modules/test_coffee.js | 4 + .../tests/clitests/modules/test_node_json.js | 4 + .../tests/clitests/modules/test_node_mod.js | 4 + .../clitests/modules/test_node_mod_index.js | 4 + .../modules/test_node_mod_json_package.js | 4 + .../clitests/modules/test_patched_require.js | 5 + vendor/casperjs/tests/clitests/runtests.py | 412 +++ .../casperjs/tests/clitests/scripts/script.js | 3 + .../tester/casper-instance-override.js | 9 + .../casperjs/tests/clitests/tester/dubious.js | 5 + vendor/casperjs/tests/clitests/tester/exit.js | 8 + .../casperjs/tests/clitests/tester/failing.js | 5 + .../casperjs/tests/clitests/tester/mytest.js | 14 + .../casperjs/tests/clitests/tester/passing.js | 5 + .../casperjs/tests/clitests/tester/skipped.js | 6 + .../tests/clitests/tester/step_throws.js | 10 + .../tests/clitests/tester/waitFor_timeout.js | 116 + vendor/casperjs/tests/run.js | 123 + .../casperjs/tests/sample_modules/config.json | 1 + .../tests/sample_modules/csmodule.coffee | 1 + .../casperjs/tests/sample_modules/jsmodule.js | 1 + vendor/casperjs/tests/selftest.js | 64 + vendor/casperjs/tests/site/alert.html | 10 + vendor/casperjs/tests/site/callback.html | 10 + vendor/casperjs/tests/site/click.html | 65 + vendor/casperjs/tests/site/confirm.html | 12 + vendor/casperjs/tests/site/dummy.js | 1 + .../casperjs/tests/site/elementattribute.html | 8 + vendor/casperjs/tests/site/error.html | 10 + vendor/casperjs/tests/site/field-array.html | 14 + vendor/casperjs/tests/site/form.html | 93 + vendor/casperjs/tests/site/frame1.html | 10 + vendor/casperjs/tests/site/frame2.html | 11 + vendor/casperjs/tests/site/frame3.html | 11 + vendor/casperjs/tests/site/frames.html | 12 + vendor/casperjs/tests/site/global.html | 14 + vendor/casperjs/tests/site/images/phantom.png | Bin 0 -> 4618 bytes .../casperjs/tests/site/includes/include1.js | 7 + .../casperjs/tests/site/includes/include2.js | 7 + vendor/casperjs/tests/site/index.html | 20 + vendor/casperjs/tests/site/mouse-events.html | 47 + .../casperjs/tests/site/multiple-forms.html | 16 + vendor/casperjs/tests/site/page1.html | 8 + vendor/casperjs/tests/site/page2.html | 8 + vendor/casperjs/tests/site/page3.html | 8 + vendor/casperjs/tests/site/popup.html | 18 + vendor/casperjs/tests/site/prompt.html | 12 + vendor/casperjs/tests/site/resources.html | 15 + vendor/casperjs/tests/site/result.html | 11 + vendor/casperjs/tests/site/test.html | 10 + vendor/casperjs/tests/site/urls.html | 14 + vendor/casperjs/tests/site/visible.html | 17 + vendor/casperjs/tests/site/waitFor.html | 29 + vendor/casperjs/tests/suites/.casper | 0 vendor/casperjs/tests/suites/casper/.casper | 0 vendor/casperjs/tests/suites/casper/agent.js | 32 + vendor/casperjs/tests/suites/casper/alert.js | 25 + vendor/casperjs/tests/suites/casper/auth.js | 26 + vendor/casperjs/tests/suites/casper/bypass.js | 107 + .../casperjs/tests/suites/casper/callback.js | 25 + .../casperjs/tests/suites/casper/callutils.js | 23 + .../casperjs/tests/suites/casper/capture.js | 50 + vendor/casperjs/tests/suites/casper/click.js | 126 + .../casperjs/tests/suites/casper/confirm.js | 53 + .../casperjs/tests/suites/casper/content.js | 21 + vendor/casperjs/tests/suites/casper/debug.js | 12 + .../tests/suites/casper/elementattribute.js | 21 + vendor/casperjs/tests/suites/casper/encode.js | 19 + .../casperjs/tests/suites/casper/evaluate.js | 112 + vendor/casperjs/tests/suites/casper/events.js | 29 + vendor/casperjs/tests/suites/casper/exists.js | 10 + .../casperjs/tests/suites/casper/fetchtext.js | 21 + .../casperjs/tests/suites/casper/flow.coffee | 38 + .../casperjs/tests/suites/casper/formfill.js | 231 ++ vendor/casperjs/tests/suites/casper/frames.js | 45 + vendor/casperjs/tests/suites/casper/global.js | 14 + .../casperjs/tests/suites/casper/headers.js | 33 + .../casperjs/tests/suites/casper/history.js | 23 + vendor/casperjs/tests/suites/casper/hooks.js | 65 + vendor/casperjs/tests/suites/casper/keys.js | 72 + .../casperjs/tests/suites/casper/location.js | 23 + .../casperjs/tests/suites/casper/logging.js | 41 + .../tests/suites/casper/mouseevents.js | 30 + .../tests/suites/casper/navigation.js | 50 + .../casperjs/tests/suites/casper/onerror.js | 25 + vendor/casperjs/tests/suites/casper/open.js | 264 ++ vendor/casperjs/tests/suites/casper/popup.js | 91 + vendor/casperjs/tests/suites/casper/prompt.js | 12 + .../tests/suites/casper/request.coffee | 103 + .../casperjs/tests/suites/casper/request.js | 48 + .../casperjs/tests/suites/casper/resources.js | 35 + .../casperjs/tests/suites/casper/scripts.js | 34 + vendor/casperjs/tests/suites/casper/scroll.js | 30 + vendor/casperjs/tests/suites/casper/start.js | 17 + vendor/casperjs/tests/suites/casper/steps.js | 54 + vendor/casperjs/tests/suites/casper/urls.js | 25 + .../casperjs/tests/suites/casper/viewport.js | 41 + .../casperjs/tests/suites/casper/visible.js | 19 + vendor/casperjs/tests/suites/casper/wait.js | 170 ++ vendor/casperjs/tests/suites/casper/xpath.js | 34 + vendor/casperjs/tests/suites/cli.js | 158 + vendor/casperjs/tests/suites/clientutils.js | 203 ++ vendor/casperjs/tests/suites/coffee.coffee | 20 + vendor/casperjs/tests/suites/fs.js | 35 + vendor/casperjs/tests/suites/http_status.js | 80 + vendor/casperjs/tests/suites/pagestack.js | 33 + vendor/casperjs/tests/suites/require.js | 37 + vendor/casperjs/tests/suites/tester/.casper | 0 vendor/casperjs/tests/suites/tester/assert.js | 222 ++ .../tests/suites/tester/begin-config.js | 35 + .../suites/tester/setup-teardown-async.js | 31 + .../tests/suites/tester/setup-teardown.js | 25 + vendor/casperjs/tests/suites/tester/skip.js | 23 + .../tests/suites/tester/test-order.js | 21 + .../casperjs/tests/suites/tester/testcase.js | 50 + .../casperjs/tests/suites/tester/testsuite.js | 56 + vendor/casperjs/tests/suites/utils.js | 485 ++++ vendor/casperjs/tests/suites/xunit.js | 77 + vendor/casperjs/tests/testdir/01_a/abc.js | 0 vendor/casperjs/tests/testdir/01_a/def.js | 0 vendor/casperjs/tests/testdir/02_b/abc.js | 0 vendor/casperjs/tests/testdir/03_a.js | 0 vendor/casperjs/tests/testdir/03_b.js | 0 vendor/casperjs/tests/testdir/04/01_init.js | 0 vendor/casperjs/tests/testdir/04/02_do.js | 0 vendor/rusha.js | 413 +++ 271 files changed, 25071 insertions(+) create mode 100755 vendor/casperjs/.gitattributes create mode 100755 vendor/casperjs/.gitignore create mode 100755 vendor/casperjs/.gitmodules create mode 100755 vendor/casperjs/.jshintignore create mode 100755 vendor/casperjs/.jshintrc create mode 100755 vendor/casperjs/.travis.yml create mode 100755 vendor/casperjs/CHANGELOG.md create mode 100755 vendor/casperjs/CONTRIBUTING.md create mode 100755 vendor/casperjs/CONTRIBUTORS.md create mode 100755 vendor/casperjs/LICENSE.md create mode 100755 vendor/casperjs/Makefile create mode 100755 vendor/casperjs/README.md create mode 100755 vendor/casperjs/batchbin/casperjs.bat create mode 100755 vendor/casperjs/bin/bootstrap.js create mode 100755 vendor/casperjs/bin/casperjs create mode 100755 vendor/casperjs/bin/casperjs.exe create mode 100755 vendor/casperjs/bin/usage.txt create mode 100755 vendor/casperjs/casperjs.gemspec create mode 100755 vendor/casperjs/docs/Makefile create mode 100755 vendor/casperjs/docs/README.md create mode 100755 vendor/casperjs/docs/_static/casperjs-favicon.ico create mode 100755 vendor/casperjs/docs/_static/images/bg.png create mode 100755 vendor/casperjs/docs/_static/images/casperjs-logo-medium.png create mode 100755 vendor/casperjs/docs/_static/images/casperjs-logo-small.png create mode 100755 vendor/casperjs/docs/_static/images/casperjs-logo-squared-inv.png create mode 100755 vendor/casperjs/docs/_static/images/casperjs-logo-squared.png create mode 100755 vendor/casperjs/docs/_static/images/casperjs-logo-xsmall.png create mode 100755 vendor/casperjs/docs/_static/images/casperjs-logo.png create mode 100755 vendor/casperjs/docs/_static/images/casperjs-rounded.png create mode 100755 vendor/casperjs/docs/_static/images/colorizer.png create mode 100755 vendor/casperjs/docs/_static/images/cow-test-ko.png create mode 100755 vendor/casperjs/docs/_static/images/cow-test-ok.png create mode 100755 vendor/casperjs/docs/_static/images/demo.png create mode 100755 vendor/casperjs/docs/_static/images/evaluate-diagram.png create mode 100755 vendor/casperjs/docs/_static/images/forkme.png create mode 100755 vendor/casperjs/docs/_static/images/logoutput.png create mode 100755 vendor/casperjs/docs/_static/images/split-test-results.png create mode 100755 vendor/casperjs/docs/_static/images/tar.png create mode 100755 vendor/casperjs/docs/_static/images/testsuiteok.png create mode 100755 vendor/casperjs/docs/_static/images/zip.png create mode 100755 vendor/casperjs/docs/_themes/casperjs/addon.html create mode 100755 vendor/casperjs/docs/_themes/casperjs/layout.html create mode 100755 vendor/casperjs/docs/_themes/casperjs/localtoc.html create mode 100755 vendor/casperjs/docs/_themes/casperjs/sourcelink.html create mode 100755 vendor/casperjs/docs/_themes/casperjs/static/casperjs-dark.css create mode 100755 vendor/casperjs/docs/_themes/casperjs/static/casperjs-light.css create mode 100755 vendor/casperjs/docs/_themes/casperjs/static/style-switcher.js create mode 100755 vendor/casperjs/docs/_themes/casperjs/theme.conf create mode 100755 vendor/casperjs/docs/changelog.rst create mode 100755 vendor/casperjs/docs/cli.rst create mode 100755 vendor/casperjs/docs/conf.py create mode 100755 vendor/casperjs/docs/credits.rst create mode 100755 vendor/casperjs/docs/debugging.rst create mode 100755 vendor/casperjs/docs/events-filters.rst create mode 100755 vendor/casperjs/docs/extending.rst create mode 100755 vendor/casperjs/docs/faq.rst create mode 100755 vendor/casperjs/docs/index.rst create mode 100755 vendor/casperjs/docs/installation.rst create mode 100755 vendor/casperjs/docs/license.rst create mode 100755 vendor/casperjs/docs/logging.rst create mode 100755 vendor/casperjs/docs/modules/casper.rst create mode 100755 vendor/casperjs/docs/modules/clientutils.rst create mode 100755 vendor/casperjs/docs/modules/colorizer.rst create mode 100755 vendor/casperjs/docs/modules/index.rst create mode 100755 vendor/casperjs/docs/modules/tester.rst create mode 100755 vendor/casperjs/docs/modules/utils.rst create mode 100755 vendor/casperjs/docs/quickstart.rst create mode 100755 vendor/casperjs/docs/selectors.rst create mode 100755 vendor/casperjs/docs/testing.rst create mode 100755 vendor/casperjs/docs/upgrading/1.1.rst create mode 100755 vendor/casperjs/docs/upgrading/index.rst create mode 100755 vendor/casperjs/docs/writing_modules.rst create mode 100755 vendor/casperjs/modules/casper.js create mode 100755 vendor/casperjs/modules/cli.js create mode 100755 vendor/casperjs/modules/clientutils.js create mode 100755 vendor/casperjs/modules/colorizer.js create mode 100755 vendor/casperjs/modules/events.js create mode 100755 vendor/casperjs/modules/http.js create mode 100755 vendor/casperjs/modules/mouse.js create mode 100755 vendor/casperjs/modules/pagestack.js create mode 100755 vendor/casperjs/modules/querystring.js create mode 100755 vendor/casperjs/modules/tester.js create mode 100755 vendor/casperjs/modules/utils.js create mode 100755 vendor/casperjs/modules/xunit.js create mode 100755 vendor/casperjs/package.json create mode 100755 vendor/casperjs/rpm/build create mode 100755 vendor/casperjs/rpm/casperjs.spec create mode 100755 vendor/casperjs/rubybin/casperjs create mode 100755 vendor/casperjs/samples/bbcshots.coffee create mode 100755 vendor/casperjs/samples/bbcshots.js create mode 100755 vendor/casperjs/samples/cliplay.coffee create mode 100755 vendor/casperjs/samples/cliplay.js create mode 100755 vendor/casperjs/samples/customevents.coffee create mode 100755 vendor/casperjs/samples/customevents.js create mode 100755 vendor/casperjs/samples/customlogging.coffee create mode 100755 vendor/casperjs/samples/customlogging.js create mode 100755 vendor/casperjs/samples/download.coffee create mode 100755 vendor/casperjs/samples/download.js create mode 100755 vendor/casperjs/samples/dynamic.coffee create mode 100755 vendor/casperjs/samples/dynamic.js create mode 100755 vendor/casperjs/samples/each.coffee create mode 100755 vendor/casperjs/samples/each.js create mode 100755 vendor/casperjs/samples/events.coffee create mode 100755 vendor/casperjs/samples/events.js create mode 100755 vendor/casperjs/samples/extends.coffee create mode 100755 vendor/casperjs/samples/extends.js create mode 100755 vendor/casperjs/samples/googlelinks.coffee create mode 100755 vendor/casperjs/samples/googlelinks.js create mode 100755 vendor/casperjs/samples/googlematch.coffee create mode 100755 vendor/casperjs/samples/googlematch.js create mode 100755 vendor/casperjs/samples/googlepagination.coffee create mode 100755 vendor/casperjs/samples/googlepagination.js create mode 100755 vendor/casperjs/samples/googletesting.coffee create mode 100755 vendor/casperjs/samples/googletesting.js create mode 100755 vendor/casperjs/samples/logcolor.coffee create mode 100755 vendor/casperjs/samples/logcolor.js create mode 100755 vendor/casperjs/samples/metaextract.coffee create mode 100755 vendor/casperjs/samples/metaextract.js create mode 100755 vendor/casperjs/samples/multirun.coffee create mode 100755 vendor/casperjs/samples/multirun.js create mode 100755 vendor/casperjs/samples/screenshot.coffee create mode 100755 vendor/casperjs/samples/screenshot.js create mode 100755 vendor/casperjs/samples/statushandlers.coffee create mode 100755 vendor/casperjs/samples/statushandlers.js create mode 100755 vendor/casperjs/samples/steptimeout.coffee create mode 100755 vendor/casperjs/samples/steptimeout.js create mode 100755 vendor/casperjs/samples/timeout.coffee create mode 100755 vendor/casperjs/samples/timeout.js create mode 100755 vendor/casperjs/samples/translate.coffee create mode 100755 vendor/casperjs/samples/translate.js create mode 100755 vendor/casperjs/src/casperjs.cs create mode 100755 vendor/casperjs/tests/clitests/error/syntax.js create mode 100755 vendor/casperjs/tests/clitests/fail-fast/manual-abort/index.js create mode 100755 vendor/casperjs/tests/clitests/fail-fast/standard/test1.js create mode 100755 vendor/casperjs/tests/clitests/fail-fast/standard/test2.js create mode 100755 vendor/casperjs/tests/clitests/fail-fast/standard/test3.js create mode 100755 vendor/casperjs/tests/clitests/modules/mod.js create mode 100755 vendor/casperjs/tests/clitests/modules/node_modules/bar.js create mode 100755 vendor/casperjs/tests/clitests/modules/node_modules/baz/baz.js create mode 100755 vendor/casperjs/tests/clitests/modules/node_modules/baz/package.json create mode 100755 vendor/casperjs/tests/clitests/modules/node_modules/foo/index.js create mode 100755 vendor/casperjs/tests/clitests/modules/node_modules/json.json create mode 100755 vendor/casperjs/tests/clitests/modules/sub/coffeemod.coffee create mode 100755 vendor/casperjs/tests/clitests/modules/sub/mod.js create mode 100755 vendor/casperjs/tests/clitests/modules/test.js create mode 100755 vendor/casperjs/tests/clitests/modules/test_coffee.js create mode 100755 vendor/casperjs/tests/clitests/modules/test_node_json.js create mode 100755 vendor/casperjs/tests/clitests/modules/test_node_mod.js create mode 100755 vendor/casperjs/tests/clitests/modules/test_node_mod_index.js create mode 100755 vendor/casperjs/tests/clitests/modules/test_node_mod_json_package.js create mode 100755 vendor/casperjs/tests/clitests/modules/test_patched_require.js create mode 100755 vendor/casperjs/tests/clitests/runtests.py create mode 100755 vendor/casperjs/tests/clitests/scripts/script.js create mode 100755 vendor/casperjs/tests/clitests/tester/casper-instance-override.js create mode 100755 vendor/casperjs/tests/clitests/tester/dubious.js create mode 100755 vendor/casperjs/tests/clitests/tester/exit.js create mode 100755 vendor/casperjs/tests/clitests/tester/failing.js create mode 100755 vendor/casperjs/tests/clitests/tester/mytest.js create mode 100755 vendor/casperjs/tests/clitests/tester/passing.js create mode 100755 vendor/casperjs/tests/clitests/tester/skipped.js create mode 100755 vendor/casperjs/tests/clitests/tester/step_throws.js create mode 100755 vendor/casperjs/tests/clitests/tester/waitFor_timeout.js create mode 100755 vendor/casperjs/tests/run.js create mode 100755 vendor/casperjs/tests/sample_modules/config.json create mode 100755 vendor/casperjs/tests/sample_modules/csmodule.coffee create mode 100755 vendor/casperjs/tests/sample_modules/jsmodule.js create mode 100755 vendor/casperjs/tests/selftest.js create mode 100755 vendor/casperjs/tests/site/alert.html create mode 100755 vendor/casperjs/tests/site/callback.html create mode 100755 vendor/casperjs/tests/site/click.html create mode 100755 vendor/casperjs/tests/site/confirm.html create mode 100755 vendor/casperjs/tests/site/dummy.js create mode 100755 vendor/casperjs/tests/site/elementattribute.html create mode 100755 vendor/casperjs/tests/site/error.html create mode 100755 vendor/casperjs/tests/site/field-array.html create mode 100755 vendor/casperjs/tests/site/form.html create mode 100755 vendor/casperjs/tests/site/frame1.html create mode 100755 vendor/casperjs/tests/site/frame2.html create mode 100755 vendor/casperjs/tests/site/frame3.html create mode 100755 vendor/casperjs/tests/site/frames.html create mode 100755 vendor/casperjs/tests/site/global.html create mode 100755 vendor/casperjs/tests/site/images/phantom.png create mode 100755 vendor/casperjs/tests/site/includes/include1.js create mode 100755 vendor/casperjs/tests/site/includes/include2.js create mode 100755 vendor/casperjs/tests/site/index.html create mode 100755 vendor/casperjs/tests/site/mouse-events.html create mode 100755 vendor/casperjs/tests/site/multiple-forms.html create mode 100755 vendor/casperjs/tests/site/page1.html create mode 100755 vendor/casperjs/tests/site/page2.html create mode 100755 vendor/casperjs/tests/site/page3.html create mode 100755 vendor/casperjs/tests/site/popup.html create mode 100755 vendor/casperjs/tests/site/prompt.html create mode 100755 vendor/casperjs/tests/site/resources.html create mode 100755 vendor/casperjs/tests/site/result.html create mode 100755 vendor/casperjs/tests/site/test.html create mode 100755 vendor/casperjs/tests/site/urls.html create mode 100755 vendor/casperjs/tests/site/visible.html create mode 100755 vendor/casperjs/tests/site/waitFor.html create mode 100755 vendor/casperjs/tests/suites/.casper create mode 100755 vendor/casperjs/tests/suites/casper/.casper create mode 100755 vendor/casperjs/tests/suites/casper/agent.js create mode 100755 vendor/casperjs/tests/suites/casper/alert.js create mode 100755 vendor/casperjs/tests/suites/casper/auth.js create mode 100755 vendor/casperjs/tests/suites/casper/bypass.js create mode 100755 vendor/casperjs/tests/suites/casper/callback.js create mode 100755 vendor/casperjs/tests/suites/casper/callutils.js create mode 100755 vendor/casperjs/tests/suites/casper/capture.js create mode 100755 vendor/casperjs/tests/suites/casper/click.js create mode 100755 vendor/casperjs/tests/suites/casper/confirm.js create mode 100755 vendor/casperjs/tests/suites/casper/content.js create mode 100755 vendor/casperjs/tests/suites/casper/debug.js create mode 100755 vendor/casperjs/tests/suites/casper/elementattribute.js create mode 100755 vendor/casperjs/tests/suites/casper/encode.js create mode 100755 vendor/casperjs/tests/suites/casper/evaluate.js create mode 100755 vendor/casperjs/tests/suites/casper/events.js create mode 100755 vendor/casperjs/tests/suites/casper/exists.js create mode 100755 vendor/casperjs/tests/suites/casper/fetchtext.js create mode 100755 vendor/casperjs/tests/suites/casper/flow.coffee create mode 100755 vendor/casperjs/tests/suites/casper/formfill.js create mode 100755 vendor/casperjs/tests/suites/casper/frames.js create mode 100755 vendor/casperjs/tests/suites/casper/global.js create mode 100755 vendor/casperjs/tests/suites/casper/headers.js create mode 100755 vendor/casperjs/tests/suites/casper/history.js create mode 100755 vendor/casperjs/tests/suites/casper/hooks.js create mode 100755 vendor/casperjs/tests/suites/casper/keys.js create mode 100755 vendor/casperjs/tests/suites/casper/location.js create mode 100755 vendor/casperjs/tests/suites/casper/logging.js create mode 100755 vendor/casperjs/tests/suites/casper/mouseevents.js create mode 100755 vendor/casperjs/tests/suites/casper/navigation.js create mode 100755 vendor/casperjs/tests/suites/casper/onerror.js create mode 100755 vendor/casperjs/tests/suites/casper/open.js create mode 100755 vendor/casperjs/tests/suites/casper/popup.js create mode 100755 vendor/casperjs/tests/suites/casper/prompt.js create mode 100755 vendor/casperjs/tests/suites/casper/request.coffee create mode 100755 vendor/casperjs/tests/suites/casper/request.js create mode 100755 vendor/casperjs/tests/suites/casper/resources.js create mode 100755 vendor/casperjs/tests/suites/casper/scripts.js create mode 100755 vendor/casperjs/tests/suites/casper/scroll.js create mode 100755 vendor/casperjs/tests/suites/casper/start.js create mode 100755 vendor/casperjs/tests/suites/casper/steps.js create mode 100755 vendor/casperjs/tests/suites/casper/urls.js create mode 100755 vendor/casperjs/tests/suites/casper/viewport.js create mode 100755 vendor/casperjs/tests/suites/casper/visible.js create mode 100755 vendor/casperjs/tests/suites/casper/wait.js create mode 100755 vendor/casperjs/tests/suites/casper/xpath.js create mode 100755 vendor/casperjs/tests/suites/cli.js create mode 100755 vendor/casperjs/tests/suites/clientutils.js create mode 100755 vendor/casperjs/tests/suites/coffee.coffee create mode 100755 vendor/casperjs/tests/suites/fs.js create mode 100755 vendor/casperjs/tests/suites/http_status.js create mode 100755 vendor/casperjs/tests/suites/pagestack.js create mode 100755 vendor/casperjs/tests/suites/require.js create mode 100755 vendor/casperjs/tests/suites/tester/.casper create mode 100755 vendor/casperjs/tests/suites/tester/assert.js create mode 100755 vendor/casperjs/tests/suites/tester/begin-config.js create mode 100755 vendor/casperjs/tests/suites/tester/setup-teardown-async.js create mode 100755 vendor/casperjs/tests/suites/tester/setup-teardown.js create mode 100755 vendor/casperjs/tests/suites/tester/skip.js create mode 100755 vendor/casperjs/tests/suites/tester/test-order.js create mode 100755 vendor/casperjs/tests/suites/tester/testcase.js create mode 100755 vendor/casperjs/tests/suites/tester/testsuite.js create mode 100755 vendor/casperjs/tests/suites/utils.js create mode 100755 vendor/casperjs/tests/suites/xunit.js create mode 100755 vendor/casperjs/tests/testdir/01_a/abc.js create mode 100755 vendor/casperjs/tests/testdir/01_a/def.js create mode 100755 vendor/casperjs/tests/testdir/02_b/abc.js create mode 100755 vendor/casperjs/tests/testdir/03_a.js create mode 100755 vendor/casperjs/tests/testdir/03_b.js create mode 100755 vendor/casperjs/tests/testdir/04/01_init.js create mode 100755 vendor/casperjs/tests/testdir/04/02_do.js create mode 100644 vendor/rusha.js diff --git a/vendor/casperjs/.gitattributes b/vendor/casperjs/.gitattributes new file mode 100755 index 0000000..176a458 --- /dev/null +++ b/vendor/casperjs/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/vendor/casperjs/.gitignore b/vendor/casperjs/.gitignore new file mode 100755 index 0000000..eecc4e2 --- /dev/null +++ b/vendor/casperjs/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/*.xml +/*.png +/docs/*.js +/docs/*.xml +/docs/_build +/tmp +*.pyc diff --git a/vendor/casperjs/.gitmodules b/vendor/casperjs/.gitmodules new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/.jshintignore b/vendor/casperjs/.jshintignore new file mode 100755 index 0000000..cc2233b --- /dev/null +++ b/vendor/casperjs/.jshintignore @@ -0,0 +1,11 @@ +docs +modules/vendors +modules/events.js +modules/querystring.js +samples/** +tests/clitests/** +tests/testdir/** +tmp +./*.js +./phantomjs*/* +./engine/* diff --git a/vendor/casperjs/.jshintrc b/vendor/casperjs/.jshintrc new file mode 100755 index 0000000..4533c38 --- /dev/null +++ b/vendor/casperjs/.jshintrc @@ -0,0 +1,25 @@ +{ + "asi": true, + "browser": true, + "debug": true, + "devel": true, + "eqeqeq": true, + "evil": true, + "maxparams": 5, + "maxdepth": 3, + "maxstatements": 15, + "maxcomplexity": 7, + "proto": true, + "regexdash": true, + "strict": true, + "sub": true, + "trailing": true, + "undef": true, + + "predef" : [ + "exports", + "phantom", + "window", + "require" + ] +} diff --git a/vendor/casperjs/.travis.yml b/vendor/casperjs/.travis.yml new file mode 100755 index 0000000..14097d9 --- /dev/null +++ b/vendor/casperjs/.travis.yml @@ -0,0 +1,60 @@ +branches: + only: + - "master" + +before_install: + - echo "Installing $ENGINE $ENGINE_VERSION from $ENGINE_ARCHIVE_URL" + - wget $ENGINE_ARCHIVE_URL --output-document=engine.tar.bz2 + - mkdir engine && tar --strip-components=1 -xvf engine.tar.bz2 -C engine + - if [[ $ENGINE == 'phantomjs' ]]; then + ENGINE_EXECUTABLE="engine/bin/phantomjs"; + elif [[ $ENGINE == 'slimerjs' ]]; then + ENGINE_EXECUTABLE="engine/slimerjs"; + else + echo "Unsupported engine $ENGINE"; + fi + - ls -la $ENGINE_EXECUTABLE && $ENGINE_EXECUTABLE --version; + - export ENGINE_EXECUTABLE="$ENGINE_EXECUTABLE $ENGINE_FLAGS" + +install: + - sudo apt-get install -qq mono-devel mono-mcs + +before_script: + - "npm install -g jshint@2.0.1" + +script: + - "make $MAKE_TEST_COMMAND" + +env: + global: + - ENGINE_FLAGS="--local-to-remote-url-access=yes --ignore-ssl-errors=yes" + matrix: + - ENGINE="phantomjs" ENGINE_VERSION="1.8.2" MAKE_TEST_COMMAND="test-dotNET" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.8.2-linux-x86_64.tar.bz2" + - ENGINE="phantomjs" ENGINE_VERSION="1.8.2" MAKE_TEST_COMMAND="test" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.8.2-linux-x86_64.tar.bz2" + - ENGINE="phantomjs" ENGINE_VERSION="1.9.0" MAKE_TEST_COMMAND="test-dotNET" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.9.0-linux-x86_64.tar.bz2" + - ENGINE="phantomjs" ENGINE_VERSION="1.9.0" MAKE_TEST_COMMAND="test" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.9.0-linux-x86_64.tar.bz2" + - ENGINE="phantomjs" ENGINE_VERSION="1.9.1" MAKE_TEST_COMMAND="test-dotNET" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.9.1-linux-x86_64.tar.bz2" + - ENGINE="phantomjs" ENGINE_VERSION="1.9.1" MAKE_TEST_COMMAND="test" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.9.1-linux-x86_64.tar.bz2" + - ENGINE="phantomjs" ENGINE_VERSION="1.9.2" MAKE_TEST_COMMAND="test-dotNET" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-x86_64.tar.bz2" + - ENGINE="phantomjs" ENGINE_VERSION="1.9.2" MAKE_TEST_COMMAND="test" + ENGINE_ARCHIVE_URL="https://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-x86_64.tar.bz2" + - ENGINE="slimerjs" ENGINE_VERSION="0.8.4" MAKE_TEST_COMMAND="test-dotNET" + ENGINE_ARCHIVE_URL="http://download.slimerjs.org/v0.8/0.8.4/slimerjs-0.8.4-linux-x86_64.tar.bz2" + - ENGINE="slimerjs" ENGINE_VERSION="0.8.4" MAKE_TEST_COMMAND="test" + ENGINE_ARCHIVE_URL="http://download.slimerjs.org/v0.8/0.8.4/slimerjs-0.8.4-linux-x86_64.tar.bz2" + - ENGINE="slimerjs" ENGINE_VERSION="0.8.5" MAKE_TEST_COMMAND="test-dotNET" + ENGINE_ARCHIVE_URL="http://download.slimerjs.org/v0.8/0.8.5/slimerjs-0.8.5-linux-x86_64.tar.bz2" + - ENGINE="slimerjs" ENGINE_VERSION="0.8.5" MAKE_TEST_COMMAND="test" + ENGINE_ARCHIVE_URL="http://download.slimerjs.org/v0.8/0.8.5/slimerjs-0.8.5-linux-x86_64.tar.bz2" + +notifications: + irc: + channels: + - "irc.freenode.org#casperjs" diff --git a/vendor/casperjs/CHANGELOG.md b/vendor/casperjs/CHANGELOG.md new file mode 100755 index 0000000..92f799c --- /dev/null +++ b/vendor/casperjs/CHANGELOG.md @@ -0,0 +1 @@ +[This file has moved to Github](https://github.com/n1k0/casperjs/releases) diff --git a/vendor/casperjs/CONTRIBUTING.md b/vendor/casperjs/CONTRIBUTING.md new file mode 100755 index 0000000..e92e404 --- /dev/null +++ b/vendor/casperjs/CONTRIBUTING.md @@ -0,0 +1,93 @@ +# Contribution Guide + +*Note: this guide has been heavily inspired by [PhantomJS' one](https://github.com/ariya/phantomjs/blob/master/CONTRIBUTING.md).* + +**This page describes how to contribute changes to the [CasperJS](http://casperjs.org/) project.** + +Please do **not** create a pull request without reading this guide first. Failure to do so may result in the **rejection** of the pull request. + +## For The Impatients + +**Work on a feature branch**. +If your changes need to be modified due to some reviews, it is less clutter to tweak an isolated feature branch and push it again. + +**Create a ticket in the [issue tracker](https://github.com/n1k0/casperjs/issues/)**. +This serves as a placeholder for important feedback, review, or any future updates. **Please ensure searching the bugtracker for an already opened issue matching your case before filing a new issue.** + +In the commit message(s): + +* **Keep the first line short**. Write additional paragraphs if necessary. +* **Reference an opened issue**, by referencing the issue ID prefixed by a `#` and the keyword `refs`, eg. `refs #123` + +Sample commit message: + +> refs #123 - fixed error message formatting +> +> (optional: a short explanation of what the patch actually does) + +**Run tests** + +Run CasperJS' test suite to see you didn't break something: + + $ casperjs selftest + +The result status bar **must be green** before sending your PR. + +## Communicate + +**Improvement and feature request**. If you have an improvement idea, please send an email to the [mailing list](http://groups.google.com/group/casperjs) (preferable than contacting the developers directly) so that other people can give their insights and opinions. This is also important to avoid duplicate work. + +**Help request**. If you're stuck using CasperJS and don't understand how to achieve something, please [ask on the mailing-list](https://groups.google.com/forum/#!forum/casperjs) first. Please don't ask for all the kind people to write your scripts for you. + +**Ensure the issue is related to CasperJS**. Please try to reproduce the issue using plain PhantomJS. If it works with the native PhantomJS API but doesn't with CasperJS, then the issue is probably valid. In the opposite case, please file an issue on [PhantomJS issue tracker](http://code.google.com/p/phantomjs/issues/list). + +**Extending with new API**. Whenever you want to introduce a new API, please send an email to the mailing list along with the link to the issue if any. It may require few iterations to agree on the final API and hence it is important to engage all interested parties as early as possible. + +## Get Ready + +### Use Feature Branch + +To isolate your change, please avoid working on the master branch. Instead, work on a *feature branch* (often also known as *topic branch*). You can create a new branch (example here crash-fix) off the master branch by using: + + git checkout -b crash-fix master + +Refer to your favorite Git tutorial/book for further detailed help. + +Some good practices for the feature branch: + +* Give it a meaningful name instead of, e.g. `prevent-zero-divide` instead of just `fix` +* Make *granular* and *atomic* commits, e.g. do not mix a typo fix with some major refactoring +* Keep one branch for one specific issue. If you need to work on other unrelated issues, create another branch. + +### Write tests + +CasperJS being partly a testing framework, how irrelevant would be to send a pull request with no test? So, please take the time to write and attach tests to your PR. Furthermore, testing with CasperJS is quite [exhaustively documented](http://casperjs.org/testing.html). + +### Run tests! + +This may sound obvious but **don't send pull requests which break the casperjs test suite**. + +To see if your modifications broke the suite, just run: + + $ casperjs selftest + +### Write documentation + +Do you appreciate the [CasperJS documentation](http://casperjs.org/)? I do too. As the documentation contents are managed and generated using Github, Markdown and CasperJS itself, take the time to read the [Documentation Contribution Guide](https://github.com/n1k0/casperjs/blob/gh-pages/README.md#casperjs-documentation) and write the documentation related to your PR whenever applicable. + +**Note:** As the documentation is handled in a [dedicated separated `gh-pages` branch](https://github.com/n1k0/casperjs/tree/gh-pages), you'll have to send a dedicated PR for doc patches. I'm working on a more comfortable solution, but it's no easy task though. + +## Review and Merge + +When your branch is ready, send the pull request. + +While it is not always the case, often it is necessary to improve parts of your code in the branch. This is the actual review process. + +Here is a check list for the review: + +* It does not break the test suite +* There is no typo +* The coding style follows the existing one +* There is a reasonable amount of comment +* The license header is intact +* All examples are still working diff --git a/vendor/casperjs/CONTRIBUTORS.md b/vendor/casperjs/CONTRIBUTORS.md new file mode 100755 index 0000000..86c046e --- /dev/null +++ b/vendor/casperjs/CONTRIBUTORS.md @@ -0,0 +1,109 @@ +# CasperJS contributors + +You can check out the [contribution graphs on github](https://github.com/n1k0/casperjs/graphs/contributors). + +``` +$ git shortlog -s -n | cut -c8- +Nicolas Perriault +Mickaël Andrieu +Laurent Jouanneau +hexid +Brikou CARRE +oncletom +Matt DuVall +Nathan Black +hannyu +Julien Muetton +Chris Bosco +Matt Bowman +Shiryaev Andrey +mickaelandrieu +Clochix +Chris Lorenzo +Victor Yap +JF Paradis +Matthew DuVall +Rob Barreca +Oleg Pudeyev +pborreli +nrabinowitz +Darrell Hamilton +Tyler Ritchie +Andrew Childs +Eric Bouchut +Dave Lee +Solomon White +Luke Rodgers +reina.sweet +renatodarrigo +Donovan Hutchinson +Sean Massa +Vladimir Chizhov +Samuel Gabel +Reina Sweet +Jan Schaumann +fwebdev +Reid Lynch +Justin Collum +Philip Hansen +Michael Geers +Orchestrator81 +Nick Currier +Julien Moulin +Elmar Langholz +Jason Funk +Lee Byrd +Thomas Rosenau +V Sreekanth +Patrick Reagan +Andrew de Andrade +Andy Shinn +Ben Johnson +Ben Lowery +Bert Pareyn +Brandon Bethke +Charlie Park +Chris Winters +Christophe Benz +Dharrya +Dmitry Menshikov +Florent DUBOST +Harrison Reiser +Itamar Nabriski +Ivan +Jamey J. DeOrio +Jan Pochyla +Jan-Martin Fruehwacht +John F. Douthat +Julian Gruber +Justin Marsan +Justin Slattery +Justine Tunney +KaroDidi +Leandro Boscariol +Maisons du monde +Marcel Duran +Mathieu Agopian +Mehdi Kabab +Miguel González +Mikhail Korobov +Mikko Peltonen +Narno +Pascal Borreli +Phillip Alexander +Rafael +Rafael Garcia +Raphaël Benitte +Rock Li +Scott +Thomas Parisot +Tim Bunce +Tzvi Friedman +Yasuo Ohgaki +Yevgeny Smirnov +alfetopito +jayseeg +jean-philippe serafin +shekyan +snkashis +``` diff --git a/vendor/casperjs/LICENSE.md b/vendor/casperjs/LICENSE.md new file mode 100755 index 0000000..5c308cb --- /dev/null +++ b/vendor/casperjs/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (c) 2011-2012 Nicolas Perriault + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/casperjs/Makefile b/vendor/casperjs/Makefile new file mode 100755 index 0000000..2e26ff0 --- /dev/null +++ b/vendor/casperjs/Makefile @@ -0,0 +1,25 @@ +.PHONY: default test test-dotNET docs selftest compile-dotNET selftest-dotNET clitest jshint + +default: test + +test: selftest clitest jshint + +test-dotNET: compile-dotNET selftest-dotNET + +docs: + sphinx-build -b html ./docs docs/_build + +selftest: + bin/casperjs selftest + +compile-dotNET: + mcs -langversion:3 -out:bin/casperjs.exe src/casperjs.cs + +selftest-dotNET: + bin/casperjs.exe selftest + +clitest: + python tests/clitests/runtests.py + +jshint: + jshint . diff --git a/vendor/casperjs/README.md b/vendor/casperjs/README.md new file mode 100755 index 0000000..f6c56e7 --- /dev/null +++ b/vendor/casperjs/README.md @@ -0,0 +1,94 @@ +# CasperJS + +>**Important note:** the `master` branch hosts the development version of CasperJS, which is now pretty stable and should be the right version to use if you ask me. +> +>Use the [`1.0` branch](https://github.com/n1k0/casperjs/tree/1.0) if you want to keep in sync with the stable old version, or [use tagged versions](https://github.com/n1k0/casperjs/tags). +> +>Currently, available documentation is: +> +>- **hosted on [docs.casperjs.org](http://docs.casperjs.org/) for the development branch** +>- hosted on [casperjs.org](http://casperjs.org/) for the 1.0 branch +> +>[Travis-CI](http://travis-ci.org/n1k0/casperjs) build status: +> +>- ![Build Status](https://travis-ci.org/n1k0/casperjs.png?branch=master) `master` branch +>- 1.0 tests unfortunately have to be run manually using the `casperjs selftest` command + +CasperJS is a navigation scripting & testing utility for [PhantomJS](http://www.phantomjs.org/) +and [SlimerJS](http://slimerjs.org/). It eases the process of defining a full navigation +scenario and provides useful high-level functions, methods & syntaxic sugar for doing common +tasks such as: + +- defining & ordering [navigation steps](http://docs.casperjs.org/en/latest/quickstart.html) +- [filling forms](http://docs.casperjs.org/en/latest/modules/casper.html#fill) +- [clicking links](http://docs.casperjs.org/en/latest/modules/casper.html#click) +- [capturing screenshots](http://docs.casperjs.org/en/latest/modules/casper.html#captureselector) of a page (or an area) +- [making assertions on remote DOM](http://docs.casperjs.org/en/latest/modules/tester.html) +- [logging](http://docs.casperjs.org/en/latest/logging.html) & [events](http://docs.casperjs.org/en/latest/events-filters.html) +- [downloading](http://docs.casperjs.org/en/latest/modules/casper.html#download) resources, even binary ones +- catching errors and react accordingly +- writing [functional test suites](http://docs.casperjs.org/en/latest/testing.html), exporting results as JUnit XML (xUnit) + +Browse the [sample examples repository](https://github.com/n1k0/casperjs/tree/master/samples). +Don't hesitate to pull request for any cool example of yours as well! + +**Read the [full documentation](http://docs.casperjs.org/) on casperjs documentation website.** + +Subscribe to the [project mailing-list](https://groups.google.com/forum/#!forum/casperjs) + +Follow the CasperJS project [on twitter](https://twitter.com/casperjs_org) and [Google+](https://plus.google.com/b/106641872690063476159/). + +## Show me some code! + +First [install CasperJS](http://docs.casperjs.org/en/latest/installation.html), we'll use 1.1 beta here. + +Sample test to see if some dropdown can be opened: + +```javascript +casper.test.begin('a twitter bootstrap dropdown can be opened', 2, function(test) { + casper.start('http://getbootstrap.com/2.3.2/javascript.html#dropdowns', function() { + test.assertExists('#navbar-example'); + this.click('#dropdowns .nav-pills .dropdown:last-of-type a.dropdown-toggle'); + this.waitUntilVisible('#dropdowns .nav-pills .open', function() { + test.pass('Dropdown is open'); + }); + }).run(function() { + test.done(); + }); +}); +``` + +Run the script: + +![](http://cl.ly/image/271e2i403A0F/Capture%20d%E2%80%99%C3%A9cran%202013-01-20%20%C3%A0%2009.26.15.png) + +##Support + +Need help with getting CasperJS up and running? Got a time-consuming problem you want to get solved quickly? + +Get CasperJS support on CodersClan. + + +## Contributing + +### Contributing code + +Please read the [CONTRIBUTING.md](https://github.com/n1k0/casperjs/blob/master/CONTRIBUTING.md) file contents. + +### Contributing documentation + +CasperJS's documentation is written using the [Markdown format](http://daringfireball.net/projects/markdown/), and hosted on Github thanks to the [Github Pages Feature](http://pages.github.com/). + +To view the source files on github, head to [the gh-pages branch](https://github.com/n1k0/casperjs/tree/gh-pages), and check the [documentation's README](https://github.com/n1k0/casperjs/tree/gh-pages#readme) for further instructions. + +## Team + +- Nicolas Perriault ([@n1k0](https://github.com/n1k0)) +- Nick Currier ([@hexid](https://github.com/hexid)) +- Laurent Jouanneau ([@laurentj](https://github.com/laurentj)) +- Mickaël Andrieu ([@mickaelandrieu](https://github.com/mickaelandrieu)) +- Matt DuVall ([@mduvall](https://github.com/mduvall)) + +## License + +MIT diff --git a/vendor/casperjs/batchbin/casperjs.bat b/vendor/casperjs/batchbin/casperjs.bat new file mode 100755 index 0000000..dd86a98 --- /dev/null +++ b/vendor/casperjs/batchbin/casperjs.bat @@ -0,0 +1,5 @@ +@ECHO OFF +set CASPER_PATH=%~dp0.. +set CASPER_BIN=%CASPER_PATH%\bin\ +set ARGV=%* +call phantomjs "%CASPER_BIN%bootstrap.js" --casper-path="%CASPER_PATH%" --cli %ARGV% \ No newline at end of file diff --git a/vendor/casperjs/bin/bootstrap.js b/vendor/casperjs/bin/bootstrap.js new file mode 100755 index 0000000..61d1b62 --- /dev/null +++ b/vendor/casperjs/bin/bootstrap.js @@ -0,0 +1,395 @@ +/*! + * Casper is a navigation utility for PhantomJS. + * + * Documentation: http://casperjs.org/ + * Repository: http://github.com/n1k0/casperjs + * + * Copyright (c) 2011-2012 Nicolas Perriault + * + * Part of source code is Copyright Joyent, Inc. and other Node contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +/*global process, console, phantom, slimer, require:true*/ +/*jshint maxstatements:34, maxcomplexity:10*/ + +// node check +if ('process' in this && process.title === "node") { + console.error('CasperJS cannot be executed within a nodejs environment'); + process.exit(1); +} + +// phantom check +if (!('phantom' in this)) { + console.error('CasperJS needs to be executed in a PhantomJS environment http://phantomjs.org/'); +} + +// Common polyfills +if (typeof Function.prototype.bind !== "function") { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Compatibility + Function.prototype.bind = function (oThis) { + "use strict"; + /* jshint -W055 */ + if (typeof this !== "function") { + // closest thing possible to the ECMAScript 5 internal IsCallable function + throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); + } + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function() {}, + fBound = function() { + return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + fNOP.prototype = this.prototype; + fBound.prototype = new fNOP(); + return fBound; + }; +} + +// Custom base error +var CasperError = function CasperError(msg) { + "use strict"; + Error.call(this); + this.message = msg; + this.name = 'CasperError'; +}; +CasperError.prototype = Object.getPrototypeOf(new Error()); + +// casperjs env initialization +(function(global, phantom){ + "use strict"; + // phantom args + // NOTE: we can't use require('system').args here for some very obscure reason + // do not even attempt at using it as it creates infinite recursion + var phantomArgs = phantom.args; + + if (phantom.casperLoaded) { + return; + } + + function __die(message) { + if (message) { + console.error(message); + } + phantom.exit(1); + } + + function __terminate(message) { + if (message) { + console.log(message); + } + phantom.exit(); + } + + (function(version) { + // required version check + if (version.major !== 1) { + return __die('CasperJS needs PhantomJS v1.x'); + } if (version.minor < 8) { + return __die('CasperJS needs at least PhantomJS v1.8 or later.'); + } + if (version.minor === 8 && version.patch < 1) { + return __die('CasperJS needs at least PhantomJS v1.8.1 or later.'); + } + })(phantom.version); + + // Hooks in default phantomjs error handler + phantom.onError = function onPhantomError(msg, trace) { + phantom.defaultErrorHandler.apply(phantom, arguments); + // print a hint when a possible casperjs command misuse is detected + if (msg.indexOf("ReferenceError: Can't find variable: casper") === 0) { + console.error('Hint: you may want to use the `casperjs test` command.'); + } + // exits on syntax error + if (msg.indexOf('SyntaxError: Parse error') === 0) { + __die(); + } + }; + + // Patching fs + var fs = (function patchFs(fs) { + if (!fs.hasOwnProperty('basename')) { + fs.basename = function basename(path) { + return path.replace(/.*\//, ''); + }; + } + if (!fs.hasOwnProperty('dirname')) { + fs.dirname = function dirname(path) { + if (!path) return undefined; + return path.toString().replace(/\\/g, '/').replace(/\/[^\/]*$/, ''); + }; + } + if (!fs.hasOwnProperty('isWindows')) { + fs.isWindows = function isWindows() { + var testPath = arguments[0] || this.workingDirectory; + return (/^[a-z]{1,2}:/i).test(testPath) || testPath.indexOf("\\\\") === 0; + }; + } + if (fs.hasOwnProperty('joinPath')) { + fs.pathJoin = fs.joinPath; + } else if (!fs.hasOwnProperty('pathJoin')) { + fs.pathJoin = function pathJoin() { + return Array.prototype.join.call(arguments, '/'); + }; + } + return fs; + })(require('fs')); + + // CasperJS root path + if (!phantom.casperPath) { + try { + phantom.casperPath = phantom.args.map(function _map(arg) { + var match = arg.match(/^--casper-path=(.*)/); + if (match) { + return fs.absolute(match[1]); + } + }).filter(function _filter(path) { + return fs.isDirectory(path); + }).pop(); + } catch (e) { + return __die("Couldn't find nor compute phantom.casperPath, exiting."); + } + } + + /** + * Prints CasperJS help. + */ + function printHelp() { + var engine = phantom.casperEngine === 'slimerjs' ? slimer : phantom; + var version = [engine.version.major, engine.version.minor, engine.version.patch].join('.'); + return __terminate([ + 'CasperJS version ' + phantom.casperVersion.toString() + + ' at ' + phantom.casperPath + ', using ' + phantom.casperEngine + ' version ' + version, + fs.read(fs.pathJoin(phantom.casperPath, 'bin', 'usage.txt')) + ].join('\n')) + } + + /** + * Patched require to allow loading of native casperjs modules. + * Every casperjs module have to first call this function in order to + * load a native casperjs module: + * + * var require = patchRequire(require); + * var utils = require('utils'); + * + * Useless for SlimerJS + */ + function patchRequire(require) { + if (require.patched) { + return require; + } + function fromPackageJson(module, dir) { + var pkgPath, pkgContents, pkg; + pkgPath = fs.pathJoin(dir, module, 'package.json'); + if (!fs.exists(pkgPath)) { + return; + } + pkgContents = fs.read(pkgPath); + if (!pkgContents) { + return; + } + try { + pkg = JSON.parse(pkgContents); + } catch (e) { + return; + } + if (typeof pkg === "object" && pkg.main) { + return fs.absolute(fs.pathJoin(dir, module, pkg.main)); + } + } + function resolveFile(path, dir) { + var extensions = ['js', 'coffee', 'json']; + var basenames = [path, path + '/index']; + var paths = []; + var nodejsScript = fromPackageJson(path, dir); + if (nodejsScript) { + return nodejsScript; + } + basenames.forEach(function(basename) { + paths.push(fs.absolute(fs.pathJoin(dir, basename))); + extensions.forEach(function(extension) { + paths.push(fs.absolute(fs.pathJoin(dir, [basename, extension].join('.')))); + }); + }); + for (var i = 0; i < paths.length; i++) { + if (fs.isFile(paths[i])) { + return paths[i]; + } + } + return null; + } + function getCurrentScriptRoot() { + if ((phantom.casperScriptBaseDir || "").indexOf(fs.workingDirectory) === 0) { + return phantom.casperScriptBaseDir; + } + return fs.absolute(fs.pathJoin(fs.workingDirectory, phantom.casperScriptBaseDir)); + } + function casperBuiltinPath(path) { + return resolveFile(path, fs.pathJoin(phantom.casperPath, 'modules')); + } + function nodeModulePath(path) { + return resolveFile(path, fs.pathJoin(getCurrentScriptRoot(), 'node_modules')); + } + function localModulePath(path) { + return resolveFile(path, phantom.casperScriptBaseDir || fs.workingDirectory); + } + var patchedRequire = function patchedRequire(path) { + try { + return require(casperBuiltinPath(path) || + nodeModulePath(path) || + localModulePath(path) || + path); + } catch (e) { + throw new CasperError("Can't find module " + path); + } + }; + patchedRequire.cache = require.cache; + patchedRequire.extensions = require.extensions; + patchedRequire.stubs = require.stubs; + patchedRequire.patched = true; + return patchedRequire; + } + + /** + * Initializes the CasperJS Command Line Interface. + */ + function initCasperCli(casperArgs) { + /* jshint maxcomplexity:99 */ + var baseTestsPath = fs.pathJoin(phantom.casperPath, 'tests'); + + function setScriptBaseDir(scriptName) { + var dir = fs.dirname(scriptName); + if (dir === scriptName) { + dir = '.'; + } + phantom.casperScriptBaseDir = dir; + } + + if (!!casperArgs.options.version) { + return __terminate(phantom.casperVersion.toString()) + } else if (casperArgs.get(0) === "test") { + phantom.casperScript = fs.absolute(fs.pathJoin(baseTestsPath, 'run.js')); + phantom.casperTest = true; + casperArgs.drop("test"); + setScriptBaseDir(casperArgs.get(0)); + } else if (casperArgs.get(0) === "selftest") { + phantom.casperScript = fs.absolute(fs.pathJoin(baseTestsPath, 'run.js')); + phantom.casperSelfTest = phantom.casperTest = true; + casperArgs.options.includes = fs.pathJoin(baseTestsPath, 'selftest.js'); + if (casperArgs.args.length <= 1) { + casperArgs.args.push(fs.pathJoin(baseTestsPath, 'suites')); + } + casperArgs.drop("selftest"); + phantom.casperScriptBaseDir = fs.dirname(casperArgs.get(1) || fs.dirname(phantom.casperScript)); + } else if (casperArgs.args.length === 0 || !!casperArgs.options.help) { + return printHelp(); + } + + if (!phantom.casperScript) { + phantom.casperScript = casperArgs.get(0); + } + + if (phantom.casperScript !== "/dev/stdin" && !fs.isFile(phantom.casperScript)) { + return __die('Unable to open file: ' + phantom.casperScript); + } + + if (!phantom.casperScriptBaseDir) { + setScriptBaseDir(phantom.casperScript); + } + + // filter out the called script name from casper args + casperArgs.drop(phantom.casperScript); + } + + // CasperJS version, extracted from package.json - see http://semver.org/ + phantom.casperVersion = (function getCasperVersion(path) { + var parts, patchPart, pkg, pkgFile; + pkgFile = fs.absolute(fs.pathJoin(path, 'package.json')); + if (!fs.exists(pkgFile)) { + throw new CasperError('Cannot find package.json at ' + pkgFile); + } + try { + pkg = JSON.parse(require('fs').read(pkgFile)); + } catch (e) { + throw new CasperError('Cannot read package file contents: ' + e); + } + parts = pkg.version.trim().split("."); + if (parts.length < 3) { + throw new CasperError("Invalid version number"); + } + patchPart = parts[2].split('-'); + return { + major: ~~parts[0] || 0, + minor: ~~parts[1] || 0, + patch: ~~patchPart[0] || 0, + ident: patchPart[1] || "", + toString: function toString() { + var version = [this.major, this.minor, this.patch].join('.'); + if (this.ident) { + version = [version, this.ident].join('-'); + } + return version; + } + }; + })(phantom.casperPath); + + if ("slimer" in global) { + // for SlimerJS, use the standard API to declare directories + // where to search modules + require.paths.push(fs.pathJoin(phantom.casperPath, 'modules')); + require.paths.push(fs.workingDirectory); + + // declare a dummy patchRequire function + require.globals.patchRequire = global.patchRequire = function(req) { return req;}; + require.globals.CasperError = CasperError; + phantom.casperEngine = "slimerjs"; + } + else { + // patch require + global.__require = require; + global.patchRequire = patchRequire; // must be called in every casperjs module as of 1.1 + global.require = patchRequire(global.require); + phantom.casperEngine = "phantomjs"; + } + + // casper cli args + phantom.casperArgs = require('cli').parse(phantomArgs); + + if (true === phantom.casperArgs.get('cli')) { + initCasperCli(phantom.casperArgs); + } + + if ("slimer" in global && phantom.casperScriptBaseDir) { + // initCasperCli has set casperScriptBaseDir + // use it instead of fs.workingDirectory + require.paths.pop(); + require.paths.push(phantom.casperScriptBaseDir); + } + + // casper loading status flag + phantom.casperLoaded = true; + + // passed casperjs script execution + if (phantom.casperScript && !phantom.injectJs(phantom.casperScript)) { + return __die('Unable to load script ' + phantom.casperScript + '; check file syntax'); + } +})(this, phantom); diff --git a/vendor/casperjs/bin/casperjs b/vendor/casperjs/bin/casperjs new file mode 100755 index 0000000..d0e3031 --- /dev/null +++ b/vendor/casperjs/bin/casperjs @@ -0,0 +1,140 @@ +#!/usr/bin/env python + +import os +import sys + +def resolve(path): + if os.path.islink(path): + path = os.path.join(os.path.dirname(path), os.readlink(path)) + return resolve(path) + return path + +SUPPORTED_ENGINES = { + 'phantomjs' : { + 'native_args': [ + 'cookies-file', + 'config', + 'debug', + 'disk-cache', + 'ignore-ssl-errors', + 'load-images', + 'load-plugins', + 'local-storage-path', + 'local-storage-quota', + 'local-to-remote-url-access', + 'max-disk-cache-size', + 'output-encoding', + 'proxy', + 'proxy-auth', + 'proxy-type', + 'remote-debugger-port', + 'remote-debugger-autorun', + 'script-encoding', + 'ssl-protocol', + 'ssl-certificates-path', + 'web-security', + 'webdriver', + 'webdriver-logfile', + 'webdriver-loglevel' + 'webdriver-selenium-grid-hub', + 'wd', + 'w', + ], + 'env_varname': 'PHANTOMJS_EXECUTABLE', + 'default_exec' : 'phantomjs' + }, + 'slimerjs': { + 'native_args': [ + 'P', + 'jsconsole', + 'CreateProfile', + 'profile', + #phantomjs options + 'cookies-file', + 'config', + 'debug', + 'disk-cache', + 'ignore-ssl-errors', + 'load-images', + 'load-plugins', + 'local-storage-path', + 'local-storage-quota', + 'local-to-remote-url-access', + 'max-disk-cache-size', + 'output-encoding', + 'proxy', + 'proxy-auth', + 'proxy-type', + 'remote-debugger-port', + 'remote-debugger-autorun', + 'script-encoding', + 'ssl-protocol', + 'ssl-certificates-path', + 'web-security', + 'webdriver', + 'webdriver-logfile', + 'webdriver-loglevel' + 'webdriver-selenium-grid-hub', + 'wd', + 'w', + ], + 'env_varname': 'SLIMERJS_EXECUTABLE', + 'default_exec' : 'slimerjs' + }, +} + +ENGINE = 'phantomjs' +ENGINE_ARGS = [] +ENGINE_NATIVE_ARGS = [] +ENGINE_EXECUTABLE = '' + +CASPER_ARGS = [] +CASPER_PATH = os.path.abspath(os.path.join(os.path.dirname(resolve(__file__)), + '..')) +SYS_ARGS = sys.argv[1:] + +# retrieve the engine name +for arg in SYS_ARGS: + if arg.startswith('--engine='): + ENGINE = arg[9:].lower() + break + +if not ENGINE in SUPPORTED_ENGINES: + print('Bad engine name. Only phantomjs and slimerjs are supported') + sys.exit(1) + +ENGINE_NATIVE_ARGS = SUPPORTED_ENGINES[ENGINE]['native_args'] +ENGINE_EXECUTABLE = os.environ.get(SUPPORTED_ENGINES[ENGINE]['env_varname'], + SUPPORTED_ENGINES[ENGINE]['default_exec']) + +def extract_arg_name(arg): + "parse out any option name" + try: + return arg.split('=', 1)[0].replace('--', '', 1) + except IndexError: + return arg + +for arg in SYS_ARGS: + arg_name = extract_arg_name(arg) + found = False + for native in ENGINE_NATIVE_ARGS: + if arg_name == native: + ENGINE_ARGS.append(arg) + found = True + if not found and arg_name != 'engine': + CASPER_ARGS.append(arg) + +CASPER_COMMAND = ENGINE_EXECUTABLE.split(' ') +CASPER_COMMAND.extend(ENGINE_ARGS) +CASPER_COMMAND.extend([ + os.path.join(CASPER_PATH, 'bin', 'bootstrap.js'), + '--casper-path=%s' % CASPER_PATH, + '--cli' +]) +CASPER_COMMAND.extend(CASPER_ARGS) + +try: + os.execvp(CASPER_COMMAND[0], CASPER_COMMAND) +except OSError as err: + print('Fatal: %s; did you install %s?' % (err, ENGINE)) + sys.exit(1) diff --git a/vendor/casperjs/bin/casperjs.exe b/vendor/casperjs/bin/casperjs.exe new file mode 100755 index 0000000000000000000000000000000000000000..4adeee3380af9fe3acfa93f881f734576558c51b GIT binary patch literal 7168 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 K@BSbB@AY3ZTK0qh literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/bg.png b/vendor/casperjs/docs/_static/images/bg.png new file mode 100755 index 0000000000000000000000000000000000000000..6b37e8640096b0bae538a0ad48e3f65f3dfa9dc4 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|Y3?y$c)pCP40X`wF^78U(YHAbgiY5R>Bs^Ul sLn`8U4>s}uc}yFUpZE(!y{&q}!+(Zxqf5Yd7N97Dr>mdKI;Vst0EjLYumAu6 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/casperjs-logo-medium.png b/vendor/casperjs/docs/_static/images/casperjs-logo-medium.png new file mode 100755 index 0000000000000000000000000000000000000000..a30e4b0c22caff417afe6435c909edd44eb97886 GIT binary patch literal 12546 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 Y4~AABS6SuISpWb407*qoM6N<$f=ci|I{*Lx literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/casperjs-logo-small.png b/vendor/casperjs/docs/_static/images/casperjs-logo-small.png new file mode 100755 index 0000000000000000000000000000000000000000..1e36b5c87978dc16496df37ea23ed564f0a7935f GIT binary patch literal 6665 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 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/casperjs-logo.png b/vendor/casperjs/docs/_static/images/casperjs-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..421dd8ef9b2bf6822eeaf91dfb3e2f873e2e81af GIT binary patch literal 27460 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 T?PV4e00000NkvXXu0mjf#4vb9 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/casperjs-rounded.png b/vendor/casperjs/docs/_static/images/casperjs-rounded.png new file mode 100755 index 0000000000000000000000000000000000000000..de8807ec27f2cfe600632fe3460b21e5ae7b005a GIT binary patch literal 7363 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 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/colorizer.png b/vendor/casperjs/docs/_static/images/colorizer.png new file mode 100755 index 0000000000000000000000000000000000000000..def5b3cd28b805f2aabbf9605417f428bc7e9648 GIT binary patch literal 119414 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

NJi$c+_w+{bn@h|iZW9T~bfE#q86mZG3Mvum0(> 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 s$n;=(!1RFW0n-Df2TTu`9xy%p1TgQ!zcbtZ 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 IDOd*m55{H|$N&HU literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/cow-test-ok.png b/vendor/casperjs/docs/_static/images/cow-test-ok.png new file mode 100755 index 0000000000000000000000000000000000000000..09eaf9f7637c50666afc6a5ac5541bf5f58aa2fd GIT binary patch literal 35652 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

FaxZJ*z^3+Zh33qKbNC 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 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/demo.png b/vendor/casperjs/docs/_static/images/demo.png new file mode 100755 index 0000000000000000000000000000000000000000..a7b544ae75189700f77e17f41a49ea0d8ad9260e GIT binary patch literal 44903 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

>f+}(=rfxslW1I!LiY^F)?{mgPa^~> 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 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/evaluate-diagram.png b/vendor/casperjs/docs/_static/images/evaluate-diagram.png new file mode 100755 index 0000000000000000000000000000000000000000..aad59ea5cb41908f2e2e1dda028d7a07dddeba36 GIT binary patch literal 7644 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 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/forkme.png b/vendor/casperjs/docs/_static/images/forkme.png new file mode 100755 index 0000000000000000000000000000000000000000..d48529cce187402c708e5608e40cd18fdfb1b198 GIT binary patch literal 4884 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 N^sl0IO0?`F{{#JrFwg)1 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/logoutput.png b/vendor/casperjs/docs/_static/images/logoutput.png new file mode 100755 index 0000000000000000000000000000000000000000..2e61d816d09b4be03cd861f176b3d20c609cf57e GIT binary patch literal 37472 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 N8vspotF<3T{SW03+d}{V literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/split-test-results.png b/vendor/casperjs/docs/_static/images/split-test-results.png new file mode 100755 index 0000000000000000000000000000000000000000..ae6c108c89779f03cd746c8dfd95952a969d87b5 GIT binary patch literal 32309 zcmZU)WmFtd(>0nPL4pK#mk`_?26uNScyJ3Y6WlF8a0n6z?kk z-F4q}PxYGVH9zKbb=BUdYuD*0H5FNORASV3@7|%y%Smaxdk2^CcHV^i;qCM1=&$s5 z?*gFmQsP?PD<=VuUMbpbPOrbZI-g!$bgMmZ4UH?s+*=qKIFa9H>L*c|<>I19!cn16 zX`3O_1|eYYCHm01)0K{23nvPged~0*7r3vQwF58gpLvy#ufO~;uQ7Dk2?PkAbb=oP z^3IvY%Cu53-{nn-KA(VbCCCARYtM%zdE1!42l$puzd!pMsG}40-D_E#gN3=ZttxmS zT_*PRqbT!PKm0~Z%3^rIi&@%EmC3FQS(8J=U_(=Dqw>>~+f1&S$zXPYn#bn5%)}lG_8+h zWn>Ui^aF@i87+i!OQJvfafQz(G%d6&vZ9TLXGum(yj^D1*Vk8ZhzcdfM<2E2n)Ix2Luz<_P0^4qIJC}z;6q4Ds zu=01&ugaSI+F{~e3hEbe2$OtlKB{ns4Aph~4)kTK|qjE_HcTfxPF5L{y(73XwRoNhr2pZsK3T2N&K?`C5oSIxnN@WVhw-@-wo z_x(SThto`gTDq_BZdY6rB*C{CuF`{CrxlOhzqFssK-Q#BnXh{pp8$iu^LQ3hUS`3e z0)9*c#nmGdI2TiEnzudI$ycf(Rtti**G16TjTLx{e`l?`u!BEBOWShY18a6t`vFL> zVW|fJoSKOYWSrHUMFd~qiQCN7FQ6`TNU!rVMkNgUb@dap_oFuz`?c&Ih>VJ@i@_Cm z^$cP^p=Vsc*adu6mV*Nf5`&C6!O|4FiIFpi|ZOD+h3#LKdae)Pnynw z&zImm*nT%)dSfHLrG@`x=j!S9*f%aZI>agaM2u#8|!#4+g%+PcCkA)po2LPJHNbKilbqotBo=Ais!-# zMI^UA=_bhA-8=@p%5P0Q9L*XDkFQY)I%+~Zqd@VJz=g5Qv6P8o$zyi+F{a2$jDdr^ z=F_dq{!TI=!j_dr?VqvLC=7Pk*3zP3blhQjXO z6b3c^xq(iqzZ1}q{ zF!6>>#stB}za5=&k*$N}T?GXNZyxsszDlvaB8C?bY{hJRd~l=0FujxcXjyGZAYJ0< zB%No8=00ERtuAFE7?zO*3<=3FRDWehIh&eMdpL*}yQ9`@V_6x*!Wn%c>_f#!BM=k^ zIP(SRXLTP*`c0;DK4pex3J=4+r1xiXbWUav;MzDo>G@ey**@%VtR(Z$Un>s*+_7e8 zjxWOxA8Z^3o1bQX`Md>SSH8IXoWp1xQ`nw@*JIsqMiuvlyN z#nNv~J}y(}3e9@-!10{$(JO)Chv7rEhAE#S2GzZ+vZ8qi_{vV6!GX}XB}d?b;?t)e z9|>3wn#T$Y3wQC9UP5ONzpIpu4bf)y5e(}uTz8EnLXS-$3C>e}x+Du*$2qG(3HKi@ z**GiPp8~B8$Q^e5hK|<{@S$UBlzW4gHx2Cv%UxCarhE zFuqH{YA8W}`CFKGV?QCTXTOBHo zx<_v(0Nr~06(1o$8q_%^QdZ}fzs^uLk?9+WczmFSKbRckGU7s-c2EpUR6 z$GvNN6(*m3#Fm%fh7jzwmH+TOM%Of8J|u3~;Y{i<$Avko+=|#TY;v<<#?3^LyX1lxccXjsxxtwxu`1YFL ziAN!R&E2arTsjrHZx;x+@wIcDb4^1q6<-_S`MTB}T2SH(Yp*_?Z=EdBvCsO+)XuX{ z$3m8wHJn-&PiHf|aM%j-Yx~qFHPY0dZ*1O7U>;F5Pa&WTUWd(>ZV8_C;$-05@>*Kd z3P$Yk02gJovzt&RDw_Yxt~TAkuU{$6&CPGXUu9%uqD{{GdVA?F&uK7NSXj0h@`$$) zX*mN#pRbs{`91PI9C_6Td4b>SJi(DHpuA!8T-b!5T^h{3&$*OY|r zgAp{Zo#|5h6(8E@&-SY0AxG(#6s6+Ouk*~!#~0$N&ty>rJ#c*ZQ!#Y85)kPi5S%{w zwcjgmCh`zDy#A3re(@yC^vbsa`at%ty0kQ^aYP}b0&YY;xL@XbMTn@dri_5NX?gbJ zcq;pKriY$iiPG1}kN~wk9*O{I06Od>C~ys@p~Ok>6=k9OEbJY|b z%&-rVxFQ&TQ!H-DjY(xpRcVV{dX&A!9y#~)ey#L)=yc_|<&R5Y8|ETj)jWp9Sm{{u zqw|;EszsANXW%n_wyl+dNz8Z(w^nl_#N-4ewBM#c{PGt;Jz4da_IiQ1w%p7cwcTsO zete#S`uVu=8^3Q?{o}3ZEH;*ZI?$6^WX;= z*lAoOsPXLfTy7aYos5^MKM@dOz-T$KDu zF9@2@6q<%%^8hn6Whuzf+iOit`PviL*TRn)GzBO9#7hZDPjmkMVI@&aae!n9U%Waq zB`kUdsteq`I0If+p#U0a`}*0J$Em3)Sv9p!lQ}|2*Om9PC9101YqGCfE)%JU17%r2 z%gOVbWcdms4F4MPi&eM>XGC77cRH2t@H=CYfG{$1Q=l^DpW0e1+8>uu2MPNHuq$eR z^%fMiH zLyMU+`>fbW<-(Y=RH4~aq3Tc6x0KAVx4V2I36&n~}WWVrobJws{jnf?8UruF?zgF<*J^Hdff=TgX ziUv7o=hxG88F?Oxu8Mna?E;TF2y~hJTm~vB?dRX|=CpA~!A6T9=>qQba2i7FGi=V7 z9);(D6f0T8(_Gx)wOjAG7w7Xw0tl{CjlcP}?iJC~C_SHwdZ1gO=MWOMBzR6Kxn6WCxKrVRs9U`eTs}<#^KfC+=J`;xIU7-U00Jk}Vi7Eq34(=^Do%vh`FZ1e zHZZIV6Z$*3E}xFe6SclT`5!&csgK)eivUW-sda+Y3B3DR-W`Dq&SvkI_I+Tdj4?$mbggODq4^4 zHBjw}+jsl#stJ^N0CxoljgF4qv^F&0QUIYGO%BV{34B*Y8eQ*9x(ej{33WllcDvw` z;$j&bV?)DobyL&oxRwpQ_79HNd++Ua;e}p;EF#{^@^1>GBak6_p1xbCmR=2Rc6FSv zo134XHodE}Q_JKb1DO|GBx@L76X>5>nwb+ zAv+f<0*J~lN2gChT7*cWph&JRfG)a!&q9(aQcUZgOATGSx2m&BKtx$K84+`gi2x_7 zQ@H7o3=g%T`Z*e#Bjih*j6~@i+rE~Y)YO-#c+M3$(kISp0h?q+d*PsE*!{)Sat$yy zBl%^R(RZ-^>fCXvK4WNw!d-a)5Fp@Hb+VWpVf(yx2{Ze~%&Lt^ldl1Y(n{B>X6SGA zb1Cikm^RjqWw;PV7^f2V5fA=>@?o3ywcNdc-F|@?p``WmWgd_QZ7fyg=K9z8;&JKt zXjEI9VA9!AzE!==)ZkUXzWPxq*K93rJy;;5?ZagK`-~uGi#yKGWox#2kSKXmeem*k z3_J}@55Zqw^dC9})1fv3X=V$n7+Pa%B!d4m2;of=&MTzbU0zK75WF&BbvncA1k`Ag zv-31Lt)un|J8x8+Yyd*%6r7>D-K`G1{(bdb5D>5CeJwY)^2n&`V`yGUo=-ZgX|56f z5Klu9zD;lxtHBfhFThto)9s)o{!jg;U(+W?@>eeE1%`H>;lJ7AK&LgV3WM9Os;rv3 zo|orxoh>zosK2n$fc;dyVxW0dJ6wM5iVCgn-)txTU!{UCY=uXw&meq)ersEX zwY?Y9#puBucyf$1s`5r8bf6cEufVwhb0j{%+i-b2_dH^(d1{NS5s+gKhTTElD$M#` zPzPNX5Ef`@Wi{gUb<}X{DRqoY$Wv(mw73rx{VAoUtvvu|)dI(&ijFS+S|I&kKIOFO zP5Fu7V^Iklk!^RXqL>SN*AfWxF@_+90cuINxut+m9Oud}~e3OSTsNFH; zq`D~{`|Cw^UDPo-^OH>7tsO@8tqh%D&Hc;=+J*>9FIwWpJoLW3aT^^SkmhP&G zx$}u{wkrPwxquNy2nS-tvadDZra9OZdF4upWRz%#c=p7LQ2>%o06IA2vJz!l1owf4 zl|+2F_xlK~t2Hm37o<#-0e9V^-vD^9y=8-}Ws+0E`&J0-C7C1A?RMMTHewJFvjBIJ zDVxa&$#rl^_Lrwc=T+mC=`ZYP0r$Pl;l={cK8P9xr0WL$M;bepoaD;4Q0}g05LOcL z;YDG;aLZ(;pY$IGoD;si@h^9QJ!Y4JpYA_Dv)b=}jjx8UDr0ugY5Is^^ZMd^9FO_i zMZVDs$523;)lvLuCA6fWdRLD+N& z_tj(LFbWDcNMO4z4`urNZ+T{VTdT5byssoXQYp3$RPtea6VF21(pio=Fb0!RnKm5$0J@9DvO)6cm zG0iPL*X7`i;(BDm`y( zRI}j&IxbanPJFIwkp_7vXvfp1$YA9OrefdB2zsv#KP7=tw;PbQ?hQT_P?m3MbyX-M zvmEpv;SkVYnt~0&`rP-;&(^g016bh0?%fgzNn*ygwJLP4@P@WsswqkK0gvz8=O5+F zo2o#}T;%aftHVsLh18JPg)qO|AH_mV2iHxBOf9+^;d3pJrw*Pf1dn+Z2A7J({g+7+ z1_o9clR@MD0lFR*k+#_yiNjtE#jlgxeYJ4z1Tw#s9=vQQshLp^A6e%mS>cLa1EN%u zU>e!RY+MHDvJxLgN6)rSUjH0*eDbo_0xV)21*(9D#Y_}Pn+|-c#3bV9bYqv2KVzl+ z3>$r7Ttn0Q`#md3lU2ajrAmzpLlM#4`e3rk8vkmX~WVaQgO(@g@}=8Ejhy%2wv z2ErcOxRQ*W=X-@Q#U#IL?hSR(k0CSD%W97Qr8TZzpqyN!f3T70zrN4u)DWh0)p1Zl z$D)ae3F~>MBK2}iVfff?<~Mc`G9n~^%xhQYw}kjX8jrw~r2IRMVK7Mb5aYMeNV=B! z=x9qF>QYNNJ6>sRdtzP*o&Pon!RM> zSW4(NAm|}{D?dP(vAxsTDhO6Ql95bLhQ7*j!0B`a@qztuoI5VVdkxlDOC=Q!bOh`xM7)VVL+Njjs(1TR&;I$D?{4wW z@hXo~^O%SH>`Wj#Zs;5g|4sYdgYT$AxpQ64>&&_<%EN*`+VYIft5$r3)RvBYKgHiy zWW$IwNMj51zzU^ft^GzYQ=au!vsy*!eevP_+M2YOWSmeH&N#P_x>>^k>b^G9D|O_h z`BOnUy-NRmE@GWg(mi!frvOrgrug1|Qm|Qj*-_eHV73ibKCP1$XBnwRfEFAvVwFtkfH=d?TlcbN_9v~y63F8gEX71CR=N`lW?G_9W^EiLU^4faYa zhCmYWKK)qD;zN1UGNz-@uR;Fg(|5xM7dBCuSX%6sucO+`Xi1up+;UG|5+?jed1`R#8m13YMR z9={N<7tc`(Cb|B>MA^!9yEIdJLKzpx zIQmRy)zjsM0++d1J+fI&Ed!h$P4NiBLQ3QKGmV1!Mw}2B4tV4%QB%lnHzRFCQa1kP z{?5Ih1bW~+h0FY7GEJRcO-Q=L;?{1Po)Ibn6wOSFL~gyB++g11mzQI%E2lD)ANMc0 z0G`^~{w?wa*Y=RldGF<6U;2$3db}5*fgI>^v_E}d_XnY;g0IeH?9V9&wZ>KcoS#w* zE~)XYX~eXnNEQ|z*t(EF(|TKd$TtkIgC#N&+Oa|`EXtZpN@YP4>qfi2(a`qkX+H`{ z8c9N;q)IZ>aSGtMy3BB6s$Gm*1Ty}ahyN2sd9f^FA&>T? zAtQkF<#Go{9y{dn!-o$$7FV%D26`?24!H!s`Ux^BVm~*^2}jX!?0$};jp&CUb_XKt z4fJwF@wvyuw|-+{lHWdA`W!$QBDgRqvTN-a%OtoUBjAUBF-}YrBMMh-a~yXO3LR6( z5#V})sl6gvPb@q_)m~8s%>Zzv*R6ZN0j$q^rug_;N4HQiG za$svr-muf%i`7=~fvjpk(h2W_*CA5#RbD7CP1wc$RirvLMemU7ZP0u+^SMG@>++@S?$5ej`g!9`80tU}&-w>%8EQ+sNWq7|&IZ z{U{Ja(G9p4j)~iOk$vQ|$f$pneJoLd9?HJBPXIOC7=Ql!`M|^T#ALq>fml@o!>D+9 zbplhxC*R5`)gOn|&8_=azRHJfz(1Ne`LH<&$>l zGeq>RC~+dr&E^Hp$-h`T&EDpPXxU1`B79&Yj3I2PD4u#>F7?EK-wG5%OpU~p6HM2zWOwt&Tj`PFFU zTXXFHYp~f(aKwA5?o`eo`EN2Z;U8{|q8b{wr!`BabjV`z(ILgf#nEvKNlH)p?$=7j zzP^GQ8X8iczp|bo)_p!;>f~fSF3vkBqEB+=vA3=);IcP+iKT1IsQ=1BP0+cdDI?;D zvha0+jk8qKTwT?Lb}y8N#3fAyD}AA!Ws=ZEL#zNsn9x+?;j9p*&SsLhPur%jHl zZ{7zTmg^3#cKFm+m`mpT;DtLoR5i?<=+sT`3MIZm-<&t4iBGBIluO^+j2@ zn?k!oQjy3>i`=Pm)Brc(WlD($bPJ`}Bi&nNXRTrZaFvI<4XlSAZoj*ft*|{-eozq- zXCvTT&~bc9ZYg7K43uM1Of}S>vs;${8NQr*PdQi#x-Mbxqf?L^RxkOTc3MxIP`z4J zb`D(^0XMh*@0d{-b@^Gn^ZImLeL2Ag-W+2CNpWVRP^|xwOH`I9)k5WS-jL$W8mKgE z9#%bEUFElQbN%nwO=}>E5$?TObp{P20A3^W0-vIwDPNO?Svhl5aNfPVKA&H{{oQ6W zIIwRD0L!+AB#sR5l&q*l?@lPHaT>m|z&QkmncA?vjVh#%oan12;xHG&({?^v2kQpU z+wF(^Vn4y!@O31Yit>*+IVKHF4!I3PeEGGd@2#IqW_h14iPS-kB*b_;bI!r}{K=(p z=SiSecRLp?iIXa+5GPM4TSKM9{IVS(n~p`!OVr5SFYUkn)!5qShc$NtbY5HS2v&~A zY93{%+UE+Q7}eQu$%?PCn2^Nx<;^L7yWJ7XBtH;N>T<-7{aObEt>OggS+fsXUQ-fd z_Su@<)IYN)sZed!;aia#nSXj;{gU4fBs0f7)WXHUfq}*c25vVciz$(p+B}%v)T7{% zTwhdlbad~h!;;H!uBqR(wYA=fwj1kVwU>lXD-G-oC?eB@gDMm)_L1&6gj8M6s(JmT zT~t?3qfxrZEwtJZKF$j75FH zYkDslS|7?juZ9SwOkS*2U|@}`HoF@BNtb1CsQAoyJJoC7=?;itQi9S$B|J)to@kmXY$P9&0%!K%^oVmxpM2z*PEVdgg8t(l}LeBG{R99Q*A?XdV zI{1p1RsLMo<|u&-OapYEDrQt+_~d2Hf`6>t1gO?{r<#CAVs%ii^F#H14F~Zd5Ux$U z6*v!M(_SI(+b+R36ZJ7h6}i-n^Kc%^7;mgBSKHF#L=0wXvudve=AivX9EtbFU{0p; zhPql}2QHDZ@*`@RB_77hsil~SsdLa#{u~(~3AH5$v3*R&OFD71EX)Rx#VogtbdUP<5TE6IVG*3Su`!OCf(Sc4K7R9Hg`ov2~*$D{z3fO2>a*!(Ac1ri! zuS@-0J3o!M5?DHxA2hBXs|uf?D?OP8Edn=d|A5xg^}#uoPhYsDzm9trlf_u zvlB*dE7Gq*Hb-aElOLj5_x$p+aupdo>2?p{wjRzrS69(HT~nv z3Ep2+o}1UxAJKLzCY7@T{isIG!tkyb>tdakpacct<2@OT?46eh08H`ZA@Xl(wr? zm#)q5%tjV8QHMVJZ0If{>Umphg;>@1orX@_n)fVZGn$g@USk!Fk_)~0YY5;MEzzKZ zHJoU>^yRq(bt%m#Zlsv8n`g8c?JSXHJyDUSEiL4|-aH*FiknC=MVaPrzpdLtlETnd!=4C08sA&e z)iUL>R0^5*wie#C2okt-V$!ckG$0G-^s#X$QKe* zd_W=a@S~0nbR5D3CHO3=%O2$YFG5Ud@*>((C>V$6N^rAg%`EU?#hkV38IiNSy?sO% zUokP`dByw+Z*VAqg6$Khy;USJO0sIyQsPXV*yf4N^^_Y5KukK2 z7gqe?_LeH?PzRo=5OKtedg466Wckr$Yv{F9`i-MAHTxLhR82i(mKBL|f4yvEb7AQ_ zr@#EB=RftJP9!F(C-kM#l+F8Oi1f96wm-=2+ zeba^7-|WjJys8=hlR%|VgbAfzN{zP+O(Gf#ZWbAEg}#KS;|#3c;vbgE(#C$%*o*95 z9>1z9)MujdYiL`9nH+yswZ4_eUsl3_qQKcmW&HIUOq3tAa))q54q*>te~Ri+p_~bF zVGh?b`Y`;r3C;PIlBH3TKUTKj>RAb4!S)9~nWw!u@)(2*1wk6?_4f`<797i#PzY*A zF%EJBb^7q|E8;E`eqyc5#$x8N)ZAidDCM)vzD_wIf($ekQvU+B_dl{vn@AK;Gf5`2 zFbU!SK;iRZj>Xy1a3b5JHmwk>YAv6=$p&FqQUvNY0N3vLfE!`z})hngYfWAWzq0?ywK%0A=e!P2`_<163cD|8L~T2+0;Ru4Kfgq!b5{|t{_Uwl>i zo|7~Fje^(^;>^}d?X>ee^mrY4-LcA8M>D2oh*Fr~5&U;BkM#bb&yG`SYM`2kJGo^_aT`{VFPydv=b9YL}5r@ z{w`}h4q-&+*{pfltXYUQ$>(eT6u)R6taC_~itA$@C1v{0bJga7Xf=aqfg`hVOj!5+ zcAF|^Mv>CS+nyzhq4=a30iop5FG%;DZE;OWZrl^;rO(pEK`oFz#&_)pVd7Tc&+(sr zXv62X?m7w_dmniG96`G=?pxaRaxHRK3$F-jc9kNfTAr&^V4m8q%Qkl7y?)5*#O1W% z65Wn5qToC;ZXowY7g1Oinmc5$6ds$5PN>Y}B)VGpW~=)#iu2!TqaE+!U$IHgNK3&e ze_4;EFU*;68E1PVytAHULF0RwYsVhH>7JaXk=3!kWZ@ud+i;>URTXw?po;4iyr)|6 z>iiEn!z7Ez$F6@EXZ*F~TxGI)hpTIz8;FQ@bS2o1tJ=_X$uYwVa*flFFpYaG>x#iF z4QfDT;#I+MmJ8o@i_4+QV&l!2j(z-^`QB1S>*AZM?Sd^Md&UT627()QfiXlg9O2YD z?=PP-eabu8*9Xhr*Q-2P_F9zt7|K6#y*SB(7Qf*72jc4@bAQZIC`tN7oAWs?k6bm} z8b`#2BwIy@*@y4dQmd9@n@LY6lw;f;pvJ3$CV;L`3dYA z_@9SZ5wt}4Er(=cP8$r@X)JS!_LUeiP0F(mMz_h1;l&t;btYnY2wzW;1YM-RAR?(? z2LB36;LhMVW+N-BF!$Dh%u4LxP3JGg@y~ck*4-BbiR4<@^n0Br+OC(UdD&;tuX>WF zD$dv?mam!wdCs@Vg10zPGc*ScJ$2M0X*~rLOG9Q`@sTh!w7bhRgJ?u@4U~p0-|!-V z>gdCjVRf!m-mRKo_2k3g<5XEE|2Oy$*dvO<*{H8-;EDMqQQ`Tu^Jl;MpA-5;kVYn8 zBL)@sxRLix>W7j?yT{Xn6t`hU!SZk~)$Cb4yq1FFvnhpMg}G-4ptUgHfsG~4T(O0u zaGx@4_i7D^SFi6Fv$v5lbD43Rp&1kGB-cZA<@S*hdla9*^emRxjk#Sir z8E>>y#(g{!MHd7()JI~nG+2k^l8Pyx*uqc;Zb)>_K z{1Gwew#qiTdulbb^V91V^h;vB zd1r)9uSvTe0+qKy-yL9NE_Ngt+ikjE{4FK;+6zb>CYl6kV|z0L)V@3ee(q;F{!2N^ z;Or?Hj~gMA7TgZrGz*kdMU;p^MV@W8)%RmmYGaudD`rQxwBvjJW+fS$;y!;&$kUxq zZhuV`5W(X|UyhTcHAx<(HvFjHN&6ZK7S(jIytf+EeV_@3!x50fw5^+seb67WdCv3k zR~m+{+Ydr7F#X@EqZ_jmhvB(jV_zJ?`uS>{VS(HWdtkj;CBCZc0Qk3Cd;*!j{^n>W zRwy}QU?LLb`*Z&K=j%D??_FP-TxUOYq47sb&729+N6Br?w6S}EyTY8aZqQN>`BYOq zq|nYAy-=eatvS;pHX?;5L6pp)m(#(y>PNdVl6Wv?at+2@llznb5qs3|AjwaZ(>oHE zVfFCvHjO!b-2&yH7GjT9e`li5Q!AI}o%JnQGTcP+p&pgxlGR#l4-dtffPI4pU$nQX z1kRFkJ4^S+udaMu&gAmzrL^Cf5_^h@HNV3wId1C}F|I-pWb!$(ZWEFj6?Mb_be55!0KY?+5Ojh;1uk;WHkNsp4yh@3bQ zsmk+fH_d1^ap--|nFKp__-yZgFj5Tji#wl8%!uF-mMC^JxV!8rq*Cplse3`W81ivX-yEIESlg;9C*eunv zZVh`_!j+$Ui&SA*EOnq?d^@#Tx>II(W&RzId6Tww#LK z>u{#K9XFT=LgeY`zk=OvEr~zxe}>es&VReHfbnEc`*k2hm+S{1g!KWw0a+QP(#>+M7@ zBymYwS4Orm;*E@fPx)=}rgU&97yT(%)A#~99`X=D}M>Snt)EKMx--)wEG@=E^Zl-?CW#D)J z9K&5;$z=8^9o_Xi+EWZ5UwoP;4~ebjSbq^daWGX?+!}va8pVv7-zH{$(Tplq>O|gU ztCSeXcVk|E&@-WkabQwg=pei zrj4E}{QJ1O?i-JPWX4yVrbu-1YTK;Adm5K!a^NLF=n#N0?s~nS9}q*C&}?w_>fc$*%p%RT-7cg*;!)GvADtKA-vkVgW;YQ6K;OR@8M#-8 zQNDZI^pl@Y1($6znN8&g4-en+{SZ4mB7#FuFcV%~LkIQ%Nf?Ngs zg{P^b`rVT+DV-Eqn&#r!A2}4qZJD7L^l1Izx{vSC#dRG(t*>A!LjP!dx9$a=_Qn9{D$rK;(f%|^_AFIpy&j=Tw%?oK(du5T9P*rX5Z^=feo3~vm~5J_8NU)>S!yFK z$4DzoNh#VlQ2n|)R<73Men|tYo(NZZlSZ^iS;rj2ixsu$C(WskBG?m5?=z+_LHI^S zq@1lS{~i36_y`&2xBpixa}^QXev`lcJ8pkSSf6Hmy33^)Wg2Sjc|Hmz^kt*r7mO!? zaI6uM$nLBlkI#AT!Cb7E!$cC$fxqg5U z*(CUV0%tb3BKM!&9hCs?6oB&chHFVYDcPM5y}A)*xdRX5L1X+JoY9-}>e*!RoAX`o zW&H1_Zv!H4*8VXRSU?Vrj@c$}x31wCuMaWgzNSY)LqXZLKiz(x$3sV`XsNQ*PW zNs8{6WBb$!6*LcuFa{qovfS8m9a|Do(ytGh&kyJoud|bw+JN92ldL}vuU!5#Q=I|m zjj<1e_vfTWU?kH@8pzICI4cJJ{?qsqbo}LV`8C8_fE2N_8U6)+Af4j%{hQQARgau8 zJ{$6Iy!_Go=tdeXb_7)Pdi#p#AcE6d-#PGP-$WtOf6s65;!0qBifp#uC z$Icf)+)cD=!2g1+_MtktrK)VZz_I83VC$q0bfA@Q5(~JfF2r=A|{|3tC2?E{)=DE1Ku45)K4ltw;vjj#>uC>^;!f7+y~c9?u^ z0~Fa(4abTSTd*d0)%hglk6{ewW(4V5; z3ceJIMF%&or<)PC|FF~)`dq4Y*BGfrS%td5y!|BB(v{X*xXvxQB!5TvM;%d|A2H$e zqfqX|X6LESQ|K?zbV>Dz_R^Wmy%Ba4=J^Uwiu-qP{T{Q=9t6ZA>rwOom5Y9kPJlXwc%w3)++HHoQ5}iGY}Fi?CeCL zVHs$ocIx<8R4j`ZLUh6__53kY0p2t$Os?qkV^PxL>Z#SzcM&U!d7v%K@UD6%up#uP z`LJZ;Es`YBlpBxM?R6PhK_?6+e|52|KA|pCmpi!+bKdj$&(#d(!tJ6HQ_OGS zW=YEwNsotJuRnA%msm%7G9@ceCqNVKrXH&3w(4!I z*U*=`0K0JBQohW;$9XSFgwvvffw~0L*CWoFtEgQ|b~&oltZ9OCcF3u#`vCN$JCu%j z&lfK)A`9YP(K47pC&0HJX3~JFZ(U_HP;I3gdVUCy*h3q8k2?QhG#b}O>N&cDNiDu1 z56%bl(ty*r1`1_Y)T#liAv8)BI^w@bHYa4io~qObBT2nfrox8e^QK}x<7ZTZMVUE? z!lkWErL5UYFon@Osww;mFs=PAThc{;9t#5Fzso$FN~tYy@LPW%*@y;;W_9b?k(Ktfrrc8$entw= z_IaRBHVF5fV*bKRP}@VU3icz;-N#@=tv~NZ?ctmlE2aIYFA>&7>%d=l{D0ZXz5jB8 zi`5aj7h~PH6yLGKqptnMTK?IRD2qpuwn2Xg&;Uhwj(k;o2A2VMZz}l74}JwQC1g6S zrWyJ^o<`zpcXhBK94aX&R^O*-h*~rPGe)^qo8DT}-=F1@TJy%fcCrF#i?QZ_OTv^# z&ZW?xguGwUd-AIh6r*T;)b${0cWMngKsH@*_{l-(Ad38+FV9wVIcrkElO<}T6*1JxTm zfu=7Vd@hI}m;|r_O`i{~s>Uci zUWkN(Yseksqm?AJmb=_3rRi-=Kg$otVMo!L{U1o*JIf_#F}^LyfVslKTD>*Oig6OL zgI7&1=x}S^KboY&qQ+Ng@X&vCO=HSCkMD7$Z1XV=@~bfJa<2%)B2@knzm9ExA~I zE%N<~e+v%qbV3v$>b_H4n81`LqSK$@ks%o@f{czE$tV){hC4)g& zw&%;D=S^f}*_n-?lvriTxi!UzmPWg%%Bt**>G3_1BM{C_`3Th9E@hLP$;LPX*rMKP zYs+C+2Cm#obF6ZRP(U8{l zb?O+>1N+Y*oyH)F`|SX{3?7d3#jUZ_ov|h%8r0iNewZUQx{y9Vl69|VnM$~O8{r(5&{ zDW}3>cn(Qg_YxRE0jAt`5A=-*-jb?d2D9KUKt;5Y{cHYe#HS1oVd^92Mrcn$p89wR zMokivnQn8Z9%Ek`K|neoh`AXPQ1l;WI;VCwhUUsiXNDGTLj-y98f|W>KjR zX}3(1hxydkre#&mKO|bRs@#pL9*4H+fYBZ9^mI~vNToGKkP)_nxx8$s#ndr`ph!1=b*wz zN|WxzT3nBuCF!6+u6-#ltyp?GpsdXAKVYCY9>M77SFTUq+B+4t+B z9i?vbqp!Ko;&q1C1KR<;(!tgUx7TM{^DyM8V-7x#aNf3s1*w?D4W-s3ag4y5I{(l3)$7j=5N>D{ z*VAquVzVB9`zOY+mdgUis){WZt^3l32s3WsBhDD``TG ze=_HPJc?1GndQU600$Yq2sd(uUkrNu`+#mX0Mw1dJg>h_9J0|l*-i($w>sl_jc;I6 zTL-$SP5v499$AK&^NQX$)dqCr;!O&Sm!|(em+rvP$(5IQ}b9jKSKUyLXG zqjuM9=RIl1$l~`THxcOs-lFFEoLoFRq;vlH=@0Z#Z0Gy2r5X_SnV4V85&QH#9{~idB97 z9DNsD`McZ#%7+_h+ME$;3XoIvu1etzHce{=51xi>kv*`3*$edd|jz5cTm5v~Ns zqzGRS=k52X{5UfFG~kMjn;!zSK@I%#IN_{S9H?3qQ?=h)kZ)zy9Z{z4urXrpWYN_{~loR{q1uy*nR<471O1&TAHw?A9n`Fml*15^^`!nk+&cI4#SO@v8P zXR7wD;9;fp>bpmUNW_%fDj)V_3@Z+C`{^xo6!%kV&m8n;d$d8+Qynh&3hmCE(WE$s z-0Y_F?9w|zsk-CTh0NSmLAh7qKiyn@wQ`dX$4k_q#S9^n5f1P;D7$2WFE2UBAP?1H zlPDi%?7W2i%ehTSt!Ilp_by}7GJNJY=Pp5=6*$O4N<7I&q_GH5$=V>J#UiRS%2jT_D{*oJ3CJ!sp#v4O$DDqr4ZPnzmq3;g}Bw`~7Re`Q0i=prBM z8|hHW8jfnQGs2i7nbhyH71Ydq*uwY!DpApwheuN^oDc1g?~-KjtrI08r;8~3C@gAV zH?FH2<#9tx2#IEn6diF`95^bP5~@IMnI#N4SB4*xwgN|}r_Nihgs%A5pUf%qeH_#5 zFe?ny21RnF5&HA2eVQc4b5^&);`gzh0`su}Z?A@)9jDU9j>CH`Tqk676x677#eBTy z+pu?%I3fILAES^7$-yXo=u{hjT-cgl@=ld}E|3Y1u>YdS8H{>m^n=f5SbOi<#?eu{ ztbGG%vQ;eIyL#=ym)nuj;UhBzo0qW^J{O^VRtVc@wfJLt1;``(=a>~=JCSS*=~QFK1^rx7lAtWng#Q%Xt-k^bAM!WY{!69Ia5 zzBxGX=QY65N)i%5Wq>_Y-jm>Fp zIILIsX{wDJ^D{2Dwzu%YT8bQ^`8}~ea}AYKh6)6<1v@@cBVHkjPw%Gv=KZw)@3Q$9 zl`HN~QxZ?n%&ME%`+=P<%vJA9nVkW)a#qF`2g}$;uF&oZmwtc1x0a3-ouY@q@gtHq zomkNkRo8I2@UXBjDqPajLg&k6?3J{etLOCzSIS(m7D!^g+(AV~TNXMJ1bPa|rTZnG zZ}xcKGedj#lIm~O?hS3OMjh|Y4WN`n*x1;TJ0NndjuEQ5s_+cZRR0H5YGjJXix1{) z8I-#{oX!v2&VH7J-p;Mxgcxef?v(6u?AX-XX%EJ;ccG5AI9Y^tyeqYMrtKV!|Q*J~u#BDan2QwynZxpA3Z1!T^ z2cszhvXO?$^ZC$w*P^;a$^6yIwZ<{?XR84NhtxzoCbX82U%x53&b4dFuk{pQb!78E zjz?2^-mJQhpvKT4dgi}jJ+m~Xq!osW{B`gnALMNiO zclUKZFG-r{?z$7qYpISazUhO)V_sUHjGeO-H|via$C!JiPX(i^#pECxi(>*j`Mt?= zZ51VBBPYD@+LHY}B%)-q8vT8Vf^!^j4QnDNYI6Yo1FB*pRo4;#y&yr(kPoQ zV~YJA=>gUcE!`TOX6z90Z^qPkr<)&aA+8&-XJauEZ2#+aTP7{pv!zJA_D^w`)FKFbMdZpVa3;Ya{_UEG@SG`QEfVG5s^V3fqx zX+z3;t*Hs3C{Bv{+>sPI$&s}6v9Og44Rr7(KM%2n>dK9sYI*M4w3u@3Y_@L7m`z^- z{4dA$73>m4R&*)jEiNejNqwHjz*dA@(bG^oVfZ8ZJJ~B?e46m-z^S*TZTIDuQf5f8(^!)}g`yRaKW6!1*N2TU%9s%AX@f)-g(di0TCkMl zaz%67$*_b0<#hb(MVoh6r_#s<2(`NiAmpI&Hm#u`c3u~c%kdp_#15q34L66_T%1DY zgmhZdeAjD+%Yf2%@jO$~M#9ppSzU2dCFCsHqe(n}o6osi=e~AcggVa5e%eEq&DTd& z@lPCW(5FCR5vXB+zTI+W3Nlh3Jz`y6Vf3A_QZT_RZ>qZA9NKn4I7Qeoq{aa3z#07r zI@wq$CO*n$(E|WNY&y9xtat5-BR!g%V=THFgNn0xm%rIaKOUw`8m4S-JbnVP=e%cl za<2d9TL0&3pDy!DiMZfnD@_kF&K4%ZLbO5SQn9g$IGNw;=e_unQ?Bh;UJpb@@uj|I zl!z*m62}sMGtS?S*rEenQPyQ63RgvrOu(&K5jp`n@Vsg%{Z)FG(QdQ)OCjkP73|hj z6*#uRuwbBZlkGeDQ_pBw_JX7Hzd(VEOxye)!0zVgP>&O6j_>|$-kCyrnC8D7`&m(P z(7Iq65S2VF)27oMD_pN8)9VxUNn_D%WZVazZc3up4u!husNH%9+)J-k_kL7nvN3(o zj4Ry@B+J!U?%*ezTyt}suzL>%(*;)?vL=#fpkIx*=V@Sc%%J}uc{B6N{ed}-{%BDa z=KuXxuk)Kt-MPBNGCADIPYQT0Uymxi)evJ8Ng@*n4yF8qh@ZGi`XA76j=_}xT(cCx z2|Sp3LvDuPsBANf17a1*@Hg-(XdAK zuaWimkhJAO(0t^`OIM%%lOaBvbdvgUd2X#pl)&d{dlp<>s1PX zlux+!%dSvQ2EG|-Z$TMfQzHWJ^R>D&OdChqaL+{Z(+j@F$0ZaT7}dtbi@z#K6&oH! zL6{VUORh@LCErXj^zNgo{!8yUy~f|St@2uW)*{{t^&Ab!5Jj_;Setn;ZL~};1$IOU zd8h8T1LV0oDFVV-m&Vrg`E^DmS*)IFWFf~nTPl#J)`xNxnyuD>6d{WS!BkCB-KI6Y zQR^;>pObCW2@W|5wcq0TSNc3lH?*}f*;Dgls*{Qp<#^3areO7+*cMHW<U#du2*#x z%v-GIzuab4#r&=&acDCu>#EJo@`W7R^us41!ZbH%>(t3c=EteIiG1#DM`H;;*$Bn1 z4xt*j&pc`1hryVNFTeb{0K}B1ZdoSv#{4-c8%$iH4lBeG=7!!}b@uC1+tHiEB`!Y$ z%O!udfF0le@DG?TT7=d4t@vV?P$qSVpMtXH#nSC0W^~H<&PyC3&w?&+xVClPezr|7 z(No*PKF7DL>}n9l*2`aUr&9_mEF@Y@#M)jeWzY(l0W3G zb(2w_gSXG1Ypw<>JSL?66M*-O`_qfOMk?5-MHmDH`g#HMYI967XOs2px+B#>ko@`lU#e`e*8_qC?qhP+Lw{C}5x)+5D14-x>o~bQ zGLw2JH=4;6s`qa{`dcx7#m+ErI|!AC9kL>avg(ys-~GAUp4qn2qs|5H-O9!3Fzs+U z_NVla<&Q>=2;@J0KLCzC?mmVjY|8u=dM=0XI#0y5tEcqN=hhw3OgcT8ONV5=6M^L5 z)FKn>L(=-1qCJlkp`vZ;f$FhxStgHRHW{w)>tmSZ^S0)BwrQON9mHM&wFu(OV6||Y zWX$?a&JSMwDEe@SJT!RKy$Pkutb=SIf3rZ4`je@>ZlqVsLUOy48ND60MclQwK*q1U z`ybf^t zP_Y51CG$7it?V~~bS0~{J6a|Xn*>a4|H)cCL2%ptE$upMt`?C7qc2BFz5=KdF4^rn zW<5n;WHIJcuU{BG;3@H~$*7WUH~UC;!&7q`2GRDuSL7T}$a zrTjEW$?y~C#b}B1`$C_fX)}fup)tzki+I-$$5B!{T%C}}cF@cF(3r8}==vHwn(a(8 znOBh+U0}EEfxfz36T@bQoS4~ zF+;s*eq1K}1d_IFyLF4x!KM+Ff<6%YB=$l}ZD%w5e-$oWbK$z{8S~a2isnwZ$*d=BFn;e8A3~*zei zT!8UxrT>MO-$spE+8Ocu0Ge9#yStala{-s2`TBDoL@Ig$w+Q_moZ#c<=Mlr92mx9H zEAM?*fz70gx~T{Ga8x`>7^~7#el5DcwZQJ=BakaInsDTeLoeEG^_*0}vW#$6$kMIq zPd+EHBrwuB&ZIKK<;W+O#nX!ELycC-*~%rJb2Eu$jkuqYqf37zs^|fBi=I-QUy~QH#qNE-Pee6BvxD&O56pM{ zH9MT??CV4Nw>?G+%Y(8{P6;`dzW(qi5()R-vRDv|f1v zb>m?47&hbmhfxLlFXa%g3I)Vv>iNFW0_>0ui2X4|Ws$u%ZJ%$s;#clwfvNY93emEC zEuRuRy6@{~9oxBn$aRGltzDk}#NI>RMG6G?5&kLu)^lV*v(M)fKDcYr=mpy9w)k!gyn6zf@!#bc1_f-^YeBdG1kC8Px>Ehy`n;_0(#W? zb4zxK#Dic~{RraZx$%ZJY=uFQoH+)u6Fh9?yS?Y0$FJdlu+_%a=ImZM^A7%Whn%g7 z!`F)7whk3pR~^>%p)bjTDo4~=%ATXka~yfJPo(zL__puys+n5sb+nA%gMtAm`&x}6 z@l6dWtnjelBIOLo{y-|f88~`%+H&Q4uu?h1z!!dB*w6Eo1V*M|(PXegII>*CjoOxu zzLAsrh&B&fyE?Uj%U>FaZ+8D9wOy^K6S9UmkWweiYZ~CVnzWJDQ$f1+YpRkla~b>{ zVv9hI+|BL`AEN)`sspffSqm)d;@Eb4X-y&h-bFfknrKEn@zAG7?;gw-4ShMPAnf4?N(s zr$TYN)*CoUMZ?28SM@Sf-U-i!4v4pRASgs_a}QQ7(7N~$x+S}N&)S?`SnnGSUPWTJ zSL>s^RjZ~ah}59pi$R$tb=e#?MYhZEuRD(9Xgjpch>~@wHcPJq`#3Sm!3QdVDAM(* z)C>UK$2JjGqpkD&{zJg<%CV%EXwY4nR{sM@rXMaQfuy$Ds9a8~TovsCVhth^Y{i%; zL?D&g6+&x@SQl{Wm)*DsnhWIfq+baE8Jlm(?XH?3%Z`3bd!z|L;%gULxVynJBoY2D zcZA-hF5KnJ5gX9$FP|q6;5$gnxQ_e$08w5Lm||DuZuVmcTfB<_nzXJ!(Gm!S|5+tP zFqKH3%$1dMaMXdA$!~h(dN#Ujtp0AJck#uDEC$lLyoqDQ#9`t(RU!x1`4%5zD_fZ9 z9+$X2;19Eh@5^>xZkfQDT7m(dL0|U4QNp0y*=?g#f#9aJSx%8fc9|xJsE(+#;OFPw zJ{!p8!IIj#d)@s6MkB*FX6rRt;Sf*TRTID4d8TzM?C!e+qD3wZ5tnrgmO0K7j(2wH zvAgILU;~vqv~@m?>H#3tQo3*mY4+_1|9OI<-z@FbvO>;eSnMV#eKE$``oOS$cHOdx<3$mA$IJE3c=DXWUVw0_ zFK)LGLE2*@4+Lo`9RmfL*l$zy5Ns{B4_~{PHQ@qUP&V+~yy@#R>R#ITHWi}Y$Rl?v zRstM&5SF^a>_Kb?v-Y0;X!l3&nICfjvB0Ul&C&e-CY(X z>UUqisYIcs|8vzP@*@B*tu8oYmDj4Lrj56&o$A8MaY#^TF01>#@5K^;VsHwO_wK?y zwMWLJ`9}GLhUbLq_ZX8|*XO#5~|+|pQ-i>bGojRL)r#i ztmD#_@o~+bp>dQzCa&|Qise)~{U!bK{o|++DK@t<43*3;3Hg9)OzFqC?VE-y$=Oo) zGOd0EJYDKe9x8ikWDdP5&a+z!<8(l|<1vAkTo*1f@QPwRf(}-NO}Nl67?-vyg0NUf z{2RQ1e?C#ubf2i2vzf4R(<04CKz2mg?O#m)k@vw9asWP4`4eT_$hbe1u*NkLrD{jk zAO2@Xwo*f*o~S!J_1l{Si5We7Jwy{PiicdtPn0n4775>EmS`|NFOv39Ls>oADw zQ@@D=CL+~Y*wIMK(>YU_+iugapJc#oen)MpD6d*AhP0g1UP?u7Xddyfg@F%@J3$mp zoE8A%j6cy&l!8t^rjSsE!93f57q135hH3E9((EMAb(2Zf-q*Nr zv{S}0y;*lLIl{m#cPT|unY>O;<$0APg5k|v_R;J1^0>Y2+A3&B3H{o)qSvv5RdXi6 zg<78+CjijVVS9vC4vD>+(%Q|_6nOhfq2zimNj>~o9Zo*PC9tf<&1_n=VQ2bako1r} zhoEDcmePcB6}kT9!dnB;E>ZLQ^{T9ACNd4|lk{$P`Em7yxw?Ge)mYS11NVyv!juWR zss+zqsCZw2XOTYm6+M~vO;+vy>(1`sYU^r}NvbR@myKsKNn?JbqWjsdGPQb~PF7#J zqmjCWkm3r3pg+^#^0NGD51+H7x#(0+4;8%vH}jBT|7V-2yNk$Yo<@>Y{Grhpy*!Gn zQT<<-r30-N2Fucagx{+Nn4#z_r_4$~l#zgMvr4^x49U)iDvP!D>jSXjCz`tED`AdXgo*uBgDP`kK2NRw)$#{2c@45QYKG%%zT^ZvC2@BqD$I*EO}~}e zDZQhCX>~+x9Hcs-SWZgbFmlOuhb#J~I#sj>OnGKBg=6_PpNRSU;IzUPcTK;%fEi~u z2lDvACe`!xx34%~fx}H^lTP?Ig%}1b%B;%6kn05HXN&|(y-PW|4}MXui{4bQO`sPv zvLEN)<=}49983OyzoVX_e+%35WH;)IFzZELX3#J&#Ai*LwN-J;g(i>QFlO3z01~wG z236+&b%9;gGw88kAq4>~Za;!@V6YKf+HMYzqWLco`QBmfz4_OslCZ~!VZZw#y|#_v zcNtkhY1hjtdu*nq9N|fdibtml=WlF$=;%%Fu^Gg*9@;&|@&zkD7Lk7dcF)bF>w&SM;O5GttWA|n85W#n|NzJjLXw4my_9vFftKE*! z$p%7@OjC@;^6u=;Un(5;GrHCmKYyH=1KP}pOTQ!hzCB37HE5|L>{{V3xeYw*$!Bmr z`HZ9ge8$Vj;aU;?J+sK?{t^AJnkv|wAkIf|?+EqJnA|#i z#X$Mb6f#afgdCw~JMBYtZR1D)JU7^1p_OTti0%kDY68_(gF5Vt8HsdqCTi@1OV=pL z`XT$FUa<4cuE}nlUZmnks?sk*1`J(Y@R+RjoNg^kd(Csg-W1%U^P zeNLBw@2Sb-#Pa=q`0rg(;=4Vj9WvDgT(!-DiZCQ+L%SD_*N;_dSFNu>mWUxQLrJ*@ z8%dz+MgTbA7J4_^?cDh)JF8eZ9L z+BYD%YPo$S@D<|rYYYSYIM9jG%4%n@5*_RjV#`@^X}2MYd& zo0?K;9+yuC*uBS%@)1OtF_Z z1DroOy3|$RV2tSqJn2D50R6%veAp2;OvE=Pg%X@MttNrY2D`%l>&q^t5N5S;x4Pvz zKoq~>jfzX@H5Na1z7e=<(j{reA8nY|QljgrAG|1xO;#6;uwcy*WTodctf<$#95nJuAf^(3?abT0}obVLzKb) zwE>DhTM(=}(YSnLvv(_l4Q@ZX2thlvSLM|3s zdo9oO{jHq^}P@$L_+=tZ2H4ahHFe&X)VH|&v# z2~Z3Z-ci^!7=|k}&e6e@-?8a$y75Q99U9H^nCZ2+!OIXJMO5nwEaFmW65CUyA8@qt zXMm4aS{SIbCRuoz{lEYH$o835kor-%CdvwS$xPMwiKfb%HrY!>E%06tS%$74oQ0=31_f{mx z`DX>-7^-(f1<0lbz8+(YJGqGx;{ps z-794;J11AOw7^j7OWYJq1fs{UzWC8`wUlTFdR|E=g%20o16NW8o{|qLUsZ~7@^Z%R z-acINAFPLuB64S*2JH`z0eEpa?eDq@A{9%Q5{t9#Pty$IP8J<-o8HAqHfp=qge61* z9^SAxs+h{^izL!Oh}6sl`;OaHKK70^S#^n)`}bN72E!7M;4_|pCnLU74Id8g7)l!I zS!fB2oCXSNFmc0PiZ(a5f{3GGNdM#Uu~$WHa%9PDz9B>Z~0IBHU(FIze# zvF~x>64x*j9;x;-C^Jd{nDZ^lksksW8YLclO)5}KZ~qsY`h;mQr$W*cVYsPa)_9LM3bH)+lL)PolOtYRn}xs5O|0TzGpsVjO17Zbpwinh!7U@Y zK<5|^^X@40RvA+i3yJ2tdtqqaNxiy8xi4x<^7D8xAL&bO%`JYqsJ}yws6X#+#Z*Ja zs!Lqc5j__$S`5EOh;92`es^l8P;8U$w7FyWkzK5nwNGnK#HIW`L2`@V8>vC*`jT^V z9=MU(q=|os#n+B*0C97UT3ksBxHD=pfS}*oPY5JHA1=il62Ln68tNIX2C#(g)zuq%i&X*Kb#SsU6nnPsjUoJD>ewaV9ddxz6#NuowElZwb^WFW_=j?=HM(Kt%Jh_7 zs86%S*i6W94xU9W#92Qh4_zekcsSy0^e=||w1k6CJK%3^j2_bOgeGq3o&mPJ6 zNe`aoBoxc3%I3VrYiXEzagb&L*+f+2V7i>1Ct@s8>|NIbx0il0Bg5A`og zj8(c?qXp0oX!qgHir*gtMI^E|yX&|MMo2<~B@$X@^5?+AWd6hDwTQK$zgdc^(bZ4B zooun$Eu}9?X}@kCvq{$uOw zat&Slb6)2c{5GGy9f|s9?oDd7eq&OytkIwVk{W34)^hU;93uOqQ=GI%oHXM8(T&e+ z;EqbY6e*6tMiV!3gWMl`E|7e6lSLuzFu?$=1wIg2#c&_Dli-mBoT`-)iYGu7KrjWZ zhP`!Z zjf{R%Rvs+pA+^s=Jh~)4<>7HJ*qAgv_fRrVfXa;9HafGwY5!8}M?m`pvp^+Tu*1zx zYJPu5^&M{5>Nf|y{<7f>%@!Kd!+dRl&ZBs#}3B-YRnlweK_)QHRaY3mcj$7kxXeMLrd* z8w|r|>AVCP@%!{b^~_pQ42M!}tPv{YRhH6tG~}U@t#T`PU^`D2Sv^VL$Nyig6 znIERlOE=M!a{EPHsd6oFVjBWwlVJHDt@2|xewKmHq$)Vp(+!!c*9Gc3_8Tz-mO18N zDqJ*x3+5mf6v*w>DC&XctY_Sf7|`6I(JPL~l2om1iEv1Uz7(VX&cHq;Z&Aep@MYG> zWcB_b>+Af6en1-?x2F07sV2L3_;C0A-Cf?O(XAwH6g^2175waqjmtB<)We7yhAtoz_l8(UUPr;e5kY%21|;*o z(O`b}j;0sQ%-ceuXLUoO&gIohh27pecPD^+rcoj5ML{zR6*{wfN_m8dO1j(qve5>@ zU(shZVVbX0SFS6poys2~w1GLIc14{-x&N{(;pb@1(Z?KfsE%#iz8KK0CG($I;HE`m z7`(y7y!)-$r(Zf$Zv-mG53Xp8t&$)`y>hyaF)MrjHneSFIuk2+`2!7+Pu$z&k+H8n z%baz8+p=$uJp?vf^EjwumiLa$8nAx*Js(-TMFsL6+?w-Q64x&ol3krprb%a@yqOtT zDeJ$?TFrAyT-3b~>5Lt@Z0IlD1?if55cuvUuAjT789YJumLAy+WZF#z$Vknx z{`|@0QB%&%un_cZB_CmX<(i%Z0jbTshHi`s@~!y*C6~ zhY}INsyF$DjGVq~V%0h=&_K!RKX+ceqo$!?KdNfyk<|U8;btr+7@0s!R4*8{IPl9KA4J_>Dcr=aN!dxl9(yR=={ta^kvSv*}&iEP}np*C8n|kDvM7Z(3>U zu@miRXmnG}a;a(L^x>S1>uc*2eF|ZJacL-;^m$(}%@RdhR7{vyHnFM!Fv)-Df-h4^ zGGaK9$gz6CJco2T5FlMd4P>KM&ryBgxQMUuLbTowB|Iwxr<2ntk(UltDHc`HGgVGsw__GlM46bZ=z9|I;E9s zUsMC59@(EY+O{dqq4?eyo){C)?Zo;9{^GGEnOVEr8-AflnL9u9K}MTrBKu_U(J<`W zVU_sRtu63%#4UwVF3apCofbH9HI#MMLZW-+ zJXQZFpf-68jPt{F@UWuV(HoX|!K^dakq&}Z-k#5qd@`a|&k`%{-}=A|%Gef4RRJ{` zG0^lL@j(*wTcKl=4EGpi<(W6MJP42xx36lhoYxsqsmH(_Mwj8)uN;)MoJUhq&AvoJ zPs9BX=}lgDpUL>bTGMm+_6;yt#rlPf?`GBF zu^y2csNz~HH{!I`0a6~nX|peX2k~Wop|s9UIeJ_D(=m)Q4TEd3u6}>6oMv+Ckd*RA z0N`TiXqUuJSez8|{p$&NRKcEpvwnZ{#}}(7K$sU|RRB88f!F@SJ2u3M;2hS)x7NAT!U5dvHi*QdaJ=%#N>jMf2K*%J(>lvNrvPy^vH<6iy*ibko%FbVOM&;j-;58h;EX+Pqe92gm~*#M|ugbvkO!XI1l^? z2wKxuKvmqF8NcO2ji0$))m%T{JRd~W|tozug%K7hS-&T=$U4s*zZ*b6%Xc$$X*D%9rSkM&vkn!CYOrw|9CKUR z-{jm^gy#%rbnW-KDEYnNb5#1d^iicvT`T_WWsHf>H5(gQ1@_m!W_#~THMz>8vZaVy zW`dospr7^7Mpq^u@*_I1NBfNHAi~!^ezBW;{@EM@OLGsk@dC#w7o{8&@rqe@&CZVx zweXysX{g~%CtY7Hp4P7MpAJ$pGvMcW4EVPf_Cxc>svISKFQ4;%umc+#v7t&UGVyi^ zA>>E=Txel=(R(;4(4^z_Nf#~I0b<`sK*wC<;4h(eof>1O_W)RLKs=N>M=P}th}k@n$Kt&-F1W9= zOrR1S>BR6^VZdYI(e$s({0N(n^HbCWC9}?h!)?I8sl7-R$)@Nq+e2-2z&13{iLxz_ z;Rb4>LXQYh&p*+++S=Ok4w&a$(bWVgBtAT@IK#bR{?}xmQkVW3?`;sV>2JIcoK&OG z*!bZ_&hMHQxgo{=DJan(b@waik^-?P8BADy-K9BMRG)9fv4vJH()&Ki9oCZCvZs3L zi|)BIw#lx@X!RGWQU%n@dNU^x-&A#H!<<%@b=*^2pnkNFO~Qcgb8)rdb0_Vf^|^_; z9wmseOrz27=f=#*Kwq8*?!$9Z64coBiu1lp$0&@1=lyn?AD2so1Y_Z>6LjVhxtS zcnk0!R*k)fXhp8w9dHn0`feHwly_G?YmWEHi5~lh5!Efv4x*~R^Ks64sO6tn zI_%z$xvxBza(i9KY5bkpwvZVYmfMK2)k)R&OX&FE3Kg~2&+#22ke(`9^|hvS(u}FV zYF|)-d_GO!Z?VY)6iI7;5C7kipNdMpMUW-h;zHTz)N#@>0D$|WZ~J;|o_+cKULl~< z&|wyicb*bQg-aRFNpVG_wJz0~hdWk>?%YdoZ10U3%-`M-mZg7%#5LRUa%1ltwnB)Z zE5oQ!>@ZrX3juNzdS#*Iqa>qeho4*&mR!=oaOJnHuB-o=>4hGU!h;aFh#TB;ilqO(Fb0e z%&8!p9dLY%*KzLeQu!(*VTR$~O7|PTY4X7C()wEDtp`b=xy&%T0|#2TxwC5F7pGe% ziiJhG`I65(8;qyL(pp?s7gJWnvGsdNikmv6G7l_rbwpTj!)$)q#NRCdiJDkN`)T$1 zWdL8Z#oAbS)b~Xfv3znmWuX*~V#I2POZ~UE4srua zK@ZnK3iJh68wS@T1%fRner=5o0NqRrwnTw$aKd=^!oY%mRGh>f6TVrY&e_+SFClq& zMR{NOiTLtT<%>#m1$mCWfuAp>eA_t^G}xe+bQL;eR~6G^W4S{g%t6lK!~ULn=5&x; zroSt&*oFpmm5bzts~n~dv8@YbF14GGEPkNuQC_P*u&uXCf7uuill@ANNSc+%`Z0unolebWr$)`Inui40xdvM0Om2!)s!0u5-n0Fbd<+TGR`Ctl zSuw>px1}EFH{QelRF~zk?BRX+n16q_PlGvyd=6#gq^2+;zN>aqpL2Ik5=eh3Vlq9P z@21^*kCP!5c?zzjmAw1ZUuZrV(E75~_I;eMK;fDtUL~hL8I;o-&Pk}y$3?N46I7h~ z7WPCBXRxGIU@{EO4b2P{fU~yev{u8K)8F$SSMYXVq*YMP7MJ~clVmYEU7?DD&`i+A z#w$h>PFZK1Pmv83f?CeBx%}EpEJ{I=F<%$9l?t5?co(~8FglQOjQY2(x2^Z)S#{SD zO~*CB`3=+maYo<~79eF#F(Ba~ORpADFKs|m^?|&v*&s}B`eRKZCNuF?pCx{A^TH>y z9qd|HMl1bt-x5XYQgQ29W87BsQ}e^I-}0DN{S@)h&EHicPvw7(@0C3L`A$J&H7CEF zc%4}REjRh&_s^t$e=@pDQ%U8zR(Q;7*X&cu(B% zcuh*9$Q1~%@lvqxDHW6YN97~p9l4!a-FX&{XJrU=Bj!OzCF6qnB(4Y|s2SHJW}Wk0>M(WZR&^%TjQ*8A2R{B=_rHI4n*R9CcX!fI zC=?2XLZMJ76bgkxq4-50?Hm3(d?;IJ9nlmI@=gi#^U33jBFM;PWHZveM4|@|9z>>0 znG&HE#Ia+?iU$rHxQmO8jCw{j;{)RpqZakR&nJ=+C=ew~!K+uVo_bI{C_6hlZRpUU zR8UYr?b@{?L}OzkH8q*n<|+92@gr4MR#I768GZQhp{cH}uF>c7RdfCGyLa!NUAuN| z+2_xnUl36xqeh6-T1n*l2LF6NBZHAco(oq6r%#_wn>TN!0|yS!zJ2>>&z?QBckf=> zv}qGfn>LNo(oA#m`~5&#AQ12qQ8*Y34k#)r`s0~1XRef%maggCx$_VrYRd>n`c?uZ zuRv`WLGo}2F;=WtK@%rVr19g&Q*Lf9<>%*9MMVW2K75!iUc5*R4Gn}~)d4^vDGLIH zg@tpD9zA+!!h{Jw5>dOT0{fFAkrK$y$Yf+u3dGi}Tj|uPQ*`$1S$g;G9U-7dCr_TF z^73*a8;BE+Ja}hP-Pf;QyDne8eA}EkbABHsQ6O0oDSqIHdD_2!Ki#}} zlR9?nNQky=+tPpm1E@=vF2pHIQdlf3MG_L#)YNpCIdkTpSkcCTL`kJHC6JH^@P1sm zas@ps+PHBeA)rF=LmM`1Kzai?;-xTo;=QyHC2Ge?^yf*FCjB7kOh}{zYH3&A;{kQ) z)~y@$@89334gx9!HG(QZouE=eAc3VmE`d-CE?v5G*W}5Qe+xmgNTdX6U0Akkne@WM z0~s|sapDBjNeB|p|2PUHBto~Jduf3sOO_O~5{*leL`tAk_CP#nNL{;j6%Uk%IF<^@ z*b$Ev8RZIvLWV@_iCT>k1-^M#+4~*{YC+epUl$K#2=emfOS*smKJDDO)9Q(VAb1aA zp^R>Rj5^7nBnBO+d-v|fe{(u3$;`~0$6fsk(b4O=R2^&#kcQ)dcn}aH(c*#3sPomU zS3x52K#q~-_8=ANEDr=o8tdD)uYBrXxNzZau8*)`FLOxLdQ+HsAPFHzoUXh>B1vOV zC#YLiRu+ZBVgI5wofY#l zE{R$zfz$&DY%)0tBmotws;VM3&r;=(hzS_sIX4*V_b!Q)KuxLQfd&m4gdP(}1Ogck z^!oK{`t<1&_3G7&;)FvUsF9S#2Z2Bt85xuy{PX9}FXnIN9XfRAVtf*53TrJMC^mgb z*_qOivH%_^Jw2U%BK(m^1fD2?5@`x+E#p9mU@MUAlO+B9FC9q3LQ023i9OLS_Dm688R?|6)F+UR z135&JX99DL^+Bj=5s7Banq|@%FROLZS*jCAJ&;SDMBREoR4N$~l`y&I96WgNl0%|j zk_YneKw`^0kn4LK!bG2rCqg7aA|HFAzwt9JiBy47dmKoVMN}qk_Z}h7WJxr4?%Wb? zGnaRYI3!AK0;vZAgftdetlxGdmCksLHPYE^p6tEsOnc}+VoG@+Cq>DU4j{%rTiCX3 z8wM0%s14ydbm)NZq&;TpG2x2YdTeq8dGWMJ#7b1k<4m*JSUV(2Jp$=mn5a*)en^&m zK*fOC+FGPW%+$;GXbYu7d#DlG;R$aB6+}wKPFnx$*|STTc(Zu*Z;)lb z&%QHJAnk=EJr^bshd7SnfD}+LQ8&B;S@1hS`jhXi?L!#R=5q!>xBzd(E@lObFyXI6 zm8eP5nJSQn_JyrqzaIO-n)7rniEPyorGeK0;I{xQxX07^&28ixQ6)guW20x7#j6_s z!pmj*5mDG)+30-*QV*1vI1YKRm`r+Vs2BB-I)s!Hq(V_5A(5S`e zDkzYS1Gx$$L;(pwAd5Tz`xYSKkbtz8NI)v9p1c1)4jVS?uh*_!tCFt0_#tl-NXLQX zx3x!16h!L9G>ehOJ3M2E;0!##5f!v)L@|~Dm zz)Cx!Jn}Av2o@w_+6dvCIzY(QvuDpSTr7$9$ZA0%RiJO6j4ky*LJBMFDGVVMNGFC` z$Rk8clm;zw3gkN==C}3C$;s(LL?Nd)=6M3?T$nS4BOxg$hCqo%uj8f0c;vB&7z2!M zXG9P5N{dage#=f)YvQ%}wM7nr40-I|Qij_3ggmLDKspZOF6EG( zlwEHV$oamRbT1?kFC|JO3MV~2IoQ+(Xg59;_Jz45a_SPKt(K^?m~=qO&aMwmlh%P= zURNOXK+O*-+U4Y7_4F8`KB7RPqShz6ttXZCg}DQM{}1oy7<2$+k_Bns7L=(6@&Ft^B&jk5 z2&Cgco+XiZt<+mkrgLE)NN3+8g=s+cTk3)Eji;5!`@1r9O*G(D5;ZA-Ja|{expU{l z11Z!4B|Q%0bx)V}T~nBPpyuz&kZ&|RL?HD*n!skHZsT z^x4`Quh6~m&U#~9$As;~yLayffy^DLd;$h;*fF;?_v_b>PM(;HK z)vH%SSoTzGgUw!)Y#yAjC81|pr%ShD&X-L{K2VZ8U z8{c#9-aUHw@F92cgIpKDJG6a!p;8nQ*PF{FmD)P!p}G3r}>@ zLs=oJttZOP3G?p^0A;RA6GUNz`gH*@MIr8#zp+Er2sKYzcM%rs= z3X@bM=L=FO7&4c^`F#ONVbnnUzM&EC(8fAiPRD^Xg~{orn5w`O2Ijxuhp?~=KpAy- zXI71yaalsVrs1n2$5> z1@*zQS1WW)w2nf{4av`+KbLDHaXt|4-vUrZ9p0f0+G-EXKov+XfitNIaryFP8as9@ zuGThNoMYqCrAw$sTl0+)NEJvfLqU3i-!bL#@^Ysg>hKP2&=zGSkSdT|AAm6)7-fw4 zn6rQ`T)03zdh{R!(iRk_Q>RX7gSO@yC6IRG4a5V5!(mBjFv}p4Z27?%K{%-c`{&Wt zC65wF1H=G9ke)y$sFBnoZ9#cZ)=&b)Qz20wkOkLt%LOJNlyl9t16@$25VD9bicuS> z`*(Y1%-b{+MPV1Hids+^P?5?McIISGB*tV;=I+T)A$#`h%&@m}egFefrKCuJf(ed| z%{}N|MaDHwB4f#U=N%nA$Bvye`Fihtwxj2<@mg4s07}7(f)tDBz27Uv^FR~ld^IG)#eXrZ?rq+$eV@&yEzsm4Bolfq)_cUD9 z$1!0>AlKykzQF@w+Jn80F`Z5^zXk!SnGiAX<)w_9w4!1f zz~PjEfe4Ts0Ehw@1^^;Q##p~CXrs}{7BLGV(jI5)aR8uA@tl>_GnVR#>K~*s1Ma|5 z8E+`V`^YVx@r%^^8s-l}orCCu=MM%00GE5*UayDe0U*GMeGjsz{@>r|iTJ7bx%g$0 zB=0@8D*i#a$9nfeWY@!fUUx4h7Tk1N4=eX1q%9Hq9}@@D2k#e eilQirV*3rjU-}gA)c~U7NFY{j0Yw6hE#%)?BrEvV0>t45CTAb@&+qcuMhnaxs!qVpYFZ(ah)RVd? zyS}|%c!@3a659;N)T5HuEA@p?lwOQpbd2X>3c23T^4_18gDsqA>;?s&lna^_Wi){O$r9+;>H@zGvhW~?Lj`oYK>&^8!xIZR8RrWkNj zYBG6O9dhA?bhl7EVEM+l3DeZI<4^XZ649I=?$A17`6Zwok9v)Ij|@g&!3ZwtcBBS? z@hH$}n@%f88FAtWgcCoZrx$>2MRAX)WJ{n8c83$>4&}+kbzET)&`zYga~!rOU0gU5 z&0PQv^108hvLnm;G((+d>nIZ+Xr%%q^aAXbCr~wrMSU!o6P4r zqb9RePKt*{|GyPMXJcto#TU5p-Of*)n=GouhXN?d`jV+0VFfuZ}DZ{7+^>Bqf|(-*Gj^@B9b!IU&}0uGPO#p?XdK;bm3ThbFJ72BIlUApOmOe+?tc8-NE9ZVc$c46sjAKqGsDh{ z?n~3Cm59+^8IFEGRCvZ9c6?Uw z#=lwja79_+x72n?c;Z3!U*+naaZGaMnZV?AGa=M7atx-G*$mqe~EFT*pl zeY?8aGv!Q;{r&x;JH`5bOV$Y==4w}YjfwICwoBRrn=aZjuZsHA<^wPOcA~!gxd*eN z-XxkOw6dZC0|EuHU^zcgfVAP$yw-|c(hcAf_gz?$Z9Hn@;St}SB1S@@nYX?E9SB;+ zSAhs`fI*nMFc^=w5A(ha`O4|oYg8wkZU<$sm&41?&!3Q-9NOY}_PNOwg3rgtm%S|& zLhu|ncses?6f^XbQ8N*|{fctzVLMJ$%n|ML2l9<$f`AYe)Sh5IhaSF00NSGKr8-4o zm5-0l&WdgV?r8f*5ndE{qpxq?R07Eyk%m&4nxtJ+^wRaNAo^YU_QT8tc56EfD-C#P zZ#SeL6C

nU$t@cM!fVw-a&0TFRwOfC(ww`l;OZlDKzUFh-MLzI3Y+bO@@@8;Ijw z;O3djzo`Mg{dR`Yr0TEb@V8T{Kf4UySS1y>W|eiAHz#C-Tm)1;>oaZ9iAEXkgR;6x zM5Q`a0=5zd8f~4xGRT-zeDm2gTkB+4Ej_YOs#nGQGnf~p)MrS&OdH!9MQ$-UgiQ_B z{83N72c{AHxH!>w(!15bm}{#6UySvdBp7m6NBYuyT5TU#ZxQ`5Ec8%%v2Nr^Oi1Wl zd3^_StmwJGeq}I}`7vQY$o*%|)D>_PeikCchyE%Isslkb=rD?zlj47!YrTfAs}VAK zv)aH@&VU*Cr7|l)dyeObGuGbmp0;QtwtZ`(RkT;NdqOer9;$xph~n7g^9WpZ|wDRhpb)*~(YlU^+~FX}w7jf-)QKoO4PZvXU1;F#KMsXG?*mUL@9G|{m&@YbSQ z^{kqa+l=2B_~0Ir_14=4LB%)sd_<=43xL)-wLP|A@ZPZpIN0>*7o=}`-n4Sjv}B-< zS*@Q+N*vn)j(dJK#zYM+3vJgbFMegCu--A1A1Qz5*c&Y(OX#UXubCo$2g0kDknb0E;iU};61ta}h^YeF2@ zG}h!ra&Q)Edb|~P-h$-6>#igNpQ*gbZJOwv&aQ3pJfN^B%In$cv##jfzKH{V&zdDH z@=nL=PW8-%OGJh2Z0SAR%6I#oxgT+2<$0tvos*h@t>70znoZG ztDyZv>iP%3-?U;oYt^-6of!mlujnJ_+3|XmZk2A4?3fk9uSj6uSHwGD{ca=ZC8}+o z#{0Vo!2A1Vu35CyX}AaM#fUB?0YqU73`Fot_}{;jREKmfTJl$NG;P^lIkq=r@P8fY zz=OXA_+CGez6Q_B_FXJORzG>k?X*MYu3=|{Q@7Z`&=-MCFGy*Vfx=U)^ZAz%u!fZ+ zZ)&!~p8a=HvUGUcF8M!DogW3jZb%vtVlfQ5b%*b%cIlrl+JCemTJZ>E!+H6jPjV#v zBe8-dryTb;xh==rs*zvwv6o-r>~h~AbqXDOqAg$j0fHtTZt=IsbAYkqv@hB-;h@79 zo68r;zU^)BvkJvzt8?XHo@Vgi71$`w5}l>#FGiV$C`kUVWqv^oo1zs3$ z!qGfvd#XU;l4Vh+!tlMm{*o&qyr|a&{Y~xPi>W_M6AzHHtp*_KS*6pf$^ha@cX6Ci zd6wJHsACnL^~Fy;R;HJr%FRU%ntM1`^G=rz6wBcV@#&|*nlvBV!o!+~ zQtx8-qDK#@S1Rrsm!0tBz1EgV*(`OsGXSB~+9ZJ!Gra@muoq9UQ;{Cb`V!L4<`-HP zI~LNN1N`M7{(*74i_Q1!{ZgcGl|=DMYH%sZWT|x37Zv7}07KhJ?=pg95p`((PDeLF znAEIz!p0VhcWxc8ke=L1Lp`3E7I6C_i-K+rH^(#HzCa>t;D=!l&ER4qZOd95dE~;e zJ`>8}+N))wVkWX}m({aWusPRAxk>x!-rMz0Iz~&(eqCxus0ehkSL30$tIYcn?Q6+} zAGbya1Ox&!kTjlOkhdAW{=Vg;*o8iTp?BL)5jvTxfvSY_OnU``YC8)435a8n(%VI` zBHB||*0B}AU<)0qehZv~ho6Q^6dgdupDAq-=SO62Y~IU}T(1u$p~Tgj9MoIUbE_)v z)4C3PoB@;wn9qp!4`aG}JMMxRU_H%G@W9>hr{$WbnUE?f!OwJA1FJ7W$&7o;$yew$+cZU}+e>>aZ%B z)(WIZkg^Du?fcVJaK4@|hlrhR<$goN0$M--=-B;FTNV(vo_Yzv>IYslmhe^cXO7TdcT_TN$Z^eA0IIyBBFozA|#xgoVD-Q^LLnkDpzm^ zoMG+bdE;TjOgh$)Bwnsu=VQL=I|yG;RNGlD%MNg3YyIK7Up|k+hJ?l0?PTg54T9?o z4^jM$7ip)5B_Q*2BGau_PUs7}e|knnXJaP2MTG=q# zeEG`YgH&vF=Of@ed0<^>dLnmK&fvkw$H2->&yJrr@LT#rk7A%Fb{!f*_^__a0n;t! zEs86@+z*$%)@PCq1HYAjI`wFRXDL*viP^A>QT5nwPRDl4EJ9;u|0r?Ofe%`+B6lUc zv+iY)+M)Ela5%@cg`BC1-O}-EJ8@|A3S|*OM|B(m_gULw?N&BxFg0QR_TpJuMmpwK zCa9{(pRw-ElXo`v{phxU>O+~>)8}?fD~wJ1hxWmGg~6S#I>5VJd$=gySO+J=ROO?y z8^R?0jE$;U2H`@*Ifurqkh`M-C(q|=TxUrhkhiPo!!a2-?M&up;kh+fO3acaN0LYp zswqhAxQa%)!+Th!8EMmA=eby_geZvpBviZlS%E&61VmeZj7Wc6EPhbqU5p zZoz15TU_NsJh{^#$1+f$u}NS$C9$GlL*;jumo9C}D<9)%M{L6zFx`W6@`iyZqk8#kgN~2X6I`9^FzSFWUHz$SA zW#0B^>6GUMDC}+0ne87ETwryhcaWmh+M_i~(dRbJJWN*pup3BmqKKk;7ctFxG1tr4 zG1h$Z;{^WH#v64$5z|cGS)keU^@v>>XR-kDCle? z;X>W_D;hW^U(U@F{;u6v9!d3inimMQ8(DLC)s`nYy$3d=3S6w|R-KTDoD2lKfX*@~ zZoEle$hZHv^mfEJ=~;O6Joadbp02wXaUr7>E*OJ{K=Peu6oD|e1LoJ!C7k(SGp~cd zDXGZx9v-s>yk0!*{PN70r_wCxS)yrDwq(!SRCpded|O!xvMjD-ie$FZmkHWj>(;iy zBYkBzul553!UEgTW=xhCDz&%TA4(D8!*vX&Z<7Q|5G}ur1gT25xagJlnoV}ZVo$Xf zHPmi>a-)LUHaqTaheUDT`qpP%DqjFn!A| zYi34&d39AlLPGKyR7r9ZX< z$tODh^^I7heZ0hj0bvE92TDKG0-slWoXm)3R_)F-cp#=8K z46v%d4>M}t#NQF=*>oB(&r&WVNgZY)-sE-sNZ|vNAii5PH#K@%>C63+3O7>>^LUjY z#1Z{N>TgKS*X@c*dpo-?!1QU>(3^&zsok!YLdb)!y?iZ|D0o>Ld;(1mawuekXnf^zS;5MFsXC5Yr~nDb()Y(*SYw_hkEZ?E$~ zo0mfBWt>bokO(=u=Je3Imu5&1Q#TK5u=35>ujB!xs;)pJS%Wt|6h?8+mW8mSuQUYYudNdt5zEmKl{E zEb8i4z1vJPHQQC#abHW2&w^EThKM%8z?ZPAEJ*9h+|ydmM8e46s7L$a`ILdRGW2)z$() z#+WzqOh*GNy_CO7|9J4hvL(K}ffXU{w!>V#F zuE7-cL6kXJzt@B!x@G92p9DW+?YtMAiDHO=9309NdyrFDoCIF+4Eh|#*Cw3niu7rdh_4`# zoPGYoHE@$NDd}Dza>}8)F5?lZjGR?9jrtyWj{5lW9))S~>=sl-EPj$T0IlDs1tk$p zyoUOg8DB>t<%x2nHevUV+Y>M!SUz0#tj`Vg+Rer>KGR%e%I?+=(fW{T*gFoKgwHzi z*Y~(5F-K*t_j2a(-yw4DVRU{E1ea3wNDFiGO2>7;zMI(bQXOtYM8vhF+*0@}_Vy0>=+?5ZO$@7;_?+6VHVoWkLL zIMQRYUrARaa2{a4?yA|)QI1~Z=OTo6Th%JrZ$7Q2o;ulRq|tO^4y#GJWjfwxeK~Gy zA|r?6=bg(x=Kv3VxN?jvn2GX6CVny8mkf!kncG-7k-6MNX!21chPdJzx=J3?u|{`y z)gOMeY>OoRQ9LL9E8BSn>xpaMz5I5uA&L|!UwFzN_YFuPUGC0@oXt$rnT@mE5L*a% z?6{jce6zRfZv?$S{ax`I$r2~Wau77PtE3tu-vMjZP`ajCtBqgS_3Cn-6FpaSF=4qC zEJ{VB=jut4QwiS2`@2O%`|{L`aKBBaC4W;!)?7ZZIP%G``sw_O4cG-8TJhsks!Tbm20lLIMal_)(kZHms$;IKaEU5iAe8F-6*2vgIe< zcBy-ec|skvRGd&$n>5#uB=7I8=^IG#`1-JKlkeM5O@nGvR`WML(bu()y-}kFfN@Mi z5y1%ix?X3*Aj+_EXbmL)_L;@}Q7yVB-e`}euW^@&S_OmM#iJ=JWs1xs;d5*F~s9nFam&)j)^}rxtjVghN7*h3T zL<6A&wRvj0f$$Ch@x{2W03>Qakf*}OS#v}u7^pxGoggm^F>C}9%!3RQz@V!>Bbu^m zxw?r{-3ZTy{0S~ie*6DU+~&LYUeo^_5nCC{^w?iU@* zJf|`DcJpw0_dfBCs)+BGYD!`dQ_}h*dhL&gjO7ni5LrA*YRoBzqX;i*V>yZsLYX}< z*YF-cat?bXbPzt}tI~MUmrZsga4KhTEKFEhr%Zax^3ouR{nnk8%r^13co34K8F<=h z{Kes_SJXp`<-(B0gF3GyHbCOirW&)21Y$uZSM_4vAcg0QuP!Ptcuo&Xesed4E2O%Z@sgS|?t1LMbtC;aAkwm>Xv2Q}@5#4clJ=VVb*|{a zPWE7YKbB(eZ)*AcHEV$(hM{j!FFjr9%v~4~jOfBYpOLcZnFnk+kSJT7$=N8O5qGD( z(PYFib6w-el){0lN}S@(%cNy8(miJS{4Es$GjG0`==M9mN`xFM*hZ@GTIZb1COo7` zlLlKP7|)4gqDr{?RjafVe-_{A$dQ_yR8iW#MdAb>(W_mVtMMAsAeFoqgn)oO++V_u zv|gFF#xF|VpuXnYlN{Y@m}Q2brd;XF)~YpUTvq@3`LQ|)Ftw*gjXMy-*=o7{UQDz~ z5uCBCkyGI9zdCq#FE{+fP$`fwHpO_sg~$@0<0#fhTF#`UvY|_lki~7X$j(~YU{r~E zv57q0kiD^<0yQq7p>2t;mLO<8_52%1*IT=|lo*c{tqFUL`Y%EA?xF#uS7eW;*a5|}w zVx2p_?U;MAwiY)QQrci-o>V~0LYejkB_xnk7<__nrPXQfZuWaPT7&NX+g@8ptNy}K z)Oi)1&QSF#tHb$sZ?L!Fc^w2l^TwnN<>4uuKEzk4*qH&Q$4L%?1ck(Pcv0aOY$So> z!mHVxHn%}@327Qw4KZVOoMZNX?#?XOws9ttnkFW#ll|=uuKs+g$*A(DP-82)$QgzW zYnZ8?fiD0;qls2sw=dYHSRuyyy?VBG^(y`-8hadIvr&ksKM z%2O3M{-z!*$p@al1Vx`f>K4OohEn|}Niq=Q!1YzVRLy2&xT z0T!B*1U&Mwk51KPg=&Yp5HHFjwbJQ7BJ4z>ug>Bp4ELudcFGtf4!XUfJF!BXZEbD+ zQNx{Qw`)i^i}1RE8|=XPU0)n>ptoU-jD*tzpVYyarZT^Wm+;!r5` zQ$Hh|2PR=937aUomsf)q(JplOCxhSF)f2RO9j*!7>9}s*)%N>9bGT5M#LFe*p|*^_ zxKILChHKkv)ig06G87p>Sbsk+?Q4rXW8E))?9Fl^4z*ZN`8!YF@KAqYyAg0XX19gK zxscxO(yU;}1uvA`t2>Y4$o9fQ;J53$J6!mfY*dfk;ePLe6Bu>-1K&I!jEi>zursK^ zI@rXmavHXwkjSE-pp%0StXo1ua*MLbM)_&Ogv z>!3es_*k2c4(R&su(R@fYH#tPM2z;2U-hZxkYfa6ptsPi(qb*$%kiw7MG5loaoyQn z-WEO^JR&nUY9_SUX5{OqO#n4Cy>CJZb&=KG4sqY!M5W~gXK6N|R=mx$PNjBHxdT%7 zvIS=qjm-yTYIcF#m-|QG{nH=K2G^Jk7~$W=a7OR;jJE<_-~bG0v~@E?SPlm(M+Su!9~!(Sl00AFlKK6})aRF2GlTUO z^X@86@4Mrkawz?r2Y}{t#$W4aA%!ut31s`2PyqnWt+hDVSu9$_5xIHi1$_TkytRG8S;RCi83ZEphU^B)`m+;R$W^g`e-WRg9a;#i_PTt@&$#Hk(hD>T=!IG zmmeL!e0lot&`xfI)Sm(g((Uql`@uNY660Tm%zo+|qJ+1HQ-&hzZd`BcKHEuCt6iWbu6 zQ}K&{cDaamA^c01`-WK>GfLnxdx;+kR71+oWMaUt{vb-LX4(@~vmf)5WGHt8x5r!! z7;iOr^b^WD0Wp1)LoF42jeGD()E`?;P!uJEpi)GVQ(P%Pq;3)PWh=hK%5WLPe5WDz z{g;MrhZ@CE@Z{~EFZdhl=5_bu^N;uKd!V_wDs0|zGp|?tx2p&k|B}g!_5(AQm}b>y6q4|s)vo;3rpDGDUkE7Q0;F7?6#i_R)om7Q;N13f;&2%NL%iSu5f0o zJ%AuN*Gjj@BZm!DH|FO1Wm9Yb>M?`yn7hbAsYpGLOioUU_}x`f6VQmgS+{mvYyH*! zTGSpXy)Q*dN~-zv)u0+^USZSS-CdA{BWim*%V}$OclV2Q{TFGlNqoqjA;(EV?C~dS z<-3sn9LvpoHlgh*DM*J;AER2vAgcMbBIRNZbRY%6Y63MgqpshjX#MI-xtJnXCnxZe z<|YZzXgoLl>846$gZAiEjveeZPkVYzb4tA-)tPgg?)XI$Id_NDxVMrJ$?ef4$h^1> z*^IcNh1JlVV8KxJcc2P6NC&q5;pbdQ_ZL`s1X~LiGAnP35d{6dgTCIRqtU4I=v58lOa+4LLBc8tHy5pKKX-}A@a}M zu!-xMBwkL5M&YSHOq=i3TaAbA;`UYl`cu~y(e>_wc7nnHM)*4NJyKX+zM1M4)rgXV zqsXB18=z;Y_QjosZA%1*)?<_J=B&lolw|Witt@!N-<=d{p7#y+G!T!69BpV3IC2=j zaI3*k|4rw!zpwGY>3DeUn^j97O7XmX;=Q!Ei*;}u`aMs8cwEwXU~H9sz~7xp0q zHI=FOeu53TY%Q=BCAEz7q#GHk!2}$@KhTaVKCZ%G5fwHf5x@|4s`7An1GMnaW3a|AW+$)Dmia40&j6i=8Qt*+~?F+}t!{>M-Teo&fX)Dtp@$i_9dL!Mbo6 zc|Kh~`7QnIw~M!|u#?Ta(9$GYTY}|shtZvaxk$sdC?3YVBkbMNV&Fx|c3 zB9^85{_`^~;CWE#XSNABqnu&`{re3YybnfjFSb_#59i?o+*D!{Ytz%xQuhpW=g*{5 z1d05`R6MHCHcF_kzm{#-QgM^H>_c|VD%xT<__?1C$fo3Yw%i4Pp!1%>A40GR8DxIE z+%&<*ybq;n3o!t37FSf@k1zeb#XPJ@xwoYLxHq2)>&@TD5;zipnP3e`XVFo2Y5HYy z-)(Q``;|&NI&$L|orJR>HgSOGt&F&iyHTeiRdazo2Qtr?#y8k?t#XJSCS$Bje2mIp zD1=LRZQJn!+-|PA(yBn7LBBHA%O7r5ceD1|_Vm_$*PQQbmEKD=l<3@7$~MYr9Mx)R zYj+J}+?{{K`us%$vY2YDL$EO!L9z9Gwb-Ad(G@Gi*ykdqr^3b`cMz2zG?q)k>Fzfg z`FE*tgl&gdxpA2L8~dG^%Qx!BG&-4I@A5^fB@D1Mvm}=6lhTRWv{JI@tRs?aXIA9e ze+l=!ql$f7s||Rt!3S(GPL*KYe~9DAw7mz$J#u-zeVIc5tXFBxsv(RIMyv8Dy0Y7~ z5s%Wbsl(^Qy__l5*tk<#a2&DIoY03|TR8+>Pp3fcZ!;)b>*$O<{AQ;2#_Qi>a6JJ^ z#RVu%1Y(%ieXIpmnE* zzY${rjH*o=UmfCSt_)GvH4&3vI~!mFFFFi)o>7gy11@o>2&t$H^IN7PtWp09mQ}z& zAqu9p3pLd&(oD)D>Pyy(UWCOEIQ139OMudWe%nJ zZf>gQ%T2im>Z2JL#lOb8&3Zj9mrELaR6OG1HQLD$r>cZpk>kfa{GM+x;DOTog=v2>6Fgx^$>`^>2-R4?Yo|njXMq)|9zM@IBdK$L}lm92TmQH z33K!*4lQ*!*C$YZ^>Xhr;U*}fEI_UV8*4EZ4 zlv9j+62B|Kjszo<6ytK;1dl=)k`O7hk|lBySGwuLIEV&W$iJjQ2Hp$zeWK z_~NcB3Jg87O?Dg}+S%##xPa1GmnP%ltqxlPsqM*r#F0E{MFGq^YF6L%hlxzn)PeqmhU~#A=L!3ZlrewISHLgRr4J1aRi73{Z=d}o=8BGb0_|WB$a_fLeb6f1 zDeu;4UEBDB;rD@N^_bd>%J=0Y-P1O=ja3VwepY>gn!Z>I>|UCC;3iyUUm;3$01ot}(L~j&P5|M+(zdk{B(5h)1Ie8b7NbFkBsGN8964u-=6;)#$ zJzZw4+La#c-SuQ4Zk?o>vOP6c93~BCQM0`6vw3=UZ(VxK`SxcFi|?nzO3`VgP}~SM zz+PtkRh&Cgd>lysSX`3A-}GvaiU!Z2{-Iy4VxVHne9_BivH}`D+tX823sg%IxqugV zpPM)U{XM-mVS?j-%&NR9qecLQocpz{Ja>OT;vtsIuP#x~6vSifg{gt*;y2_H_5&B& zgBB0I0pD{}b{0ej!~z`&a4hZJHa;A=Uo}OKSS+o4{15$d@PBY%>REq2FNHtzpBUop zGl9KD+Q{w;wEn&IZ#D#V-ugKz#~PRwv)ThG!a4)Cpf<8U1-p3uQ}ZsLg_y_n=Larh zr6Ku_gPY$<*-|;ro*^c5wAX2tK-BCBq(@Q-7Nl6aqwnB9u7)eE_0+D@`cbE^({Jd)1@b%6Sd0pO2^+4FXVkCd+HwPIdMMmb%!jhksbN zrK3$e4S~#FnGA;?p@Vs#7D`ZByS*A6WjimUNT^}LMKRl}S9bAn#DGx8HYT8MgR+qQ z(i@g`tk`=~fDZTudx^EdohvxbC}ba2hp2=xL^ zjB^_ZJePBA{WU>0f^{21^k5{0kXJ=1n1a?i{zRDi?WJJ|4?CbbcDLAatCj9+t{EE^(b$qn3Q0~6F z@gdo3KAbB5jdPHvb{ywN2-Z%YwQ`@sTGChvk$ZfiGfhhU-}su z_gx~jLr%CckSnIL-k?alB(0CGnxy@inOKt1#AQA$j)UD^=?2n@a>mpv0V1t#%GamiN~@ z=p;_dB#c_(yj9Wb?&n28min!?%YPlbK_uIMjYP)G2FiT@k|JWrWY{!7#na80s7=!S zAKwiMYj+2*I?>8$a}o~@Y<{Ju>)#_0m2Se>i68*V5Q&_;|9+*lZ928a?QRgY8za0H zk6NnIQ8uzmeD4yg;;69Hps-HBy#qf3ryevv1fG6U0BPDA&}5E`n$RXhf&jQDj;VFb zh-U@u`K-C(Z0lejrpNmEPSJ9>mwix;0T)5^pzdk4tQW=ubR0>4lclhI)bv};lVMyT zVb5KCT9UO5ui$;(X}bJlseP=39}g=~#cggTVG=0@^Rn*(>SV3lpSFA%Nt~)I6>nP1GFEZFHr5bC zaLEVqyi~(g=}+?mhF5ekzKYc23=L64wAdLKvQpQ0a z)iNchwrp_K5VVKb^DTOk1UOAc%Yhqh5;Pl^1A;pw* zE54@7qQVi#EpJfHI~w$=mxnx%A2x%jGM!D;x;yq$=Q_gF3&|QuO##aqKBU4OFVH_^FQmLMM zD)NONsiu^jN*yG+U0KBD%L9CG$3%|%8Vq)S$>~F<4JUYTy zM?nsy>x=A#M_dEBN})T}EMETVH`%fS4Fko0jSp;!)%(Raef51<;L;`(a=T1TK6M`t zxrK%%&ILtHw78>vgD=;NIVDfQgp7=m>NWHS@IUWeC<({v29aG|FJsn?_*t{EPNpU% z-q83U- zf=0TT$)v__&b)QAY5@Er&+rN8cs~uVD-4TY6B3CBc=?>`sQ$PAQrpS06Wn3?iKf#V zir;`j2)k1|W;z3%eir3{4}$me{|X$>A~v#SBl0{LL;?)hTfTfdOi`@&%X5z*2^Wa& zPW81!3`x!8;@QJLgI_2g4K>7lK2xnpdLt59sAl9ImeEK1w2)j5{&1^f1KjYgzcqFW zI9ms^Wm(FCHW2#5;|C9fIUfw8XvVzXT3!EiyVEuk z*P&Vh5Y8CZ%=rz;j(onD9c{JT(DptjG~D8H^mKy!x7RYxs|RQL>oz|Du4Dy&dd}U^ zZoYWigjIQ?X^mPV_i1NW3oIM5x3|Xqlkq10$DhGFK8FINA0d3Tys;Q{t5f<_8aZ{G zJEmu1Ys}J#iIo2H*Ti)y8}c$OtKD7( zM6oRbrF>2fROvb-v#JVavJo(yH}VrBuB`W)r9NUrV@3OKo6A7JVQK)-UoHEH?!Ihv zeQz74acKK5r@A(4<|;88}}`BxsdQIaP!2TwN;iiG@Q3% z^nRxVw5-y6ZvwZ$ofxjS-+*;fK}Bmu(W?>n6-7l(g=1IxsLzQvn@_=N)$)bAC%LI~ zSZ+J}Y+es(DtBF2YeGJo-v4_8`qvFW(P|DNx{ zeilf_&ev5aQ_%@_7Bi4a+Z3_mHDo(=hl+U}A|^q13a~Y*f<~`Wf!MVf08k`OyjoJ_ zN)HNPd$9PC5{`X}42ysMAw>UTVqDH50?8N`H_O8e92YPFexU}4jTxft57Zp0{JQ@I zU0gh4n*TNJMo}@r*o!H;9}Nu1kGv;{-s^fvJU%J1-?d27a8$3oWnNtB?$OSApreYK?E!3=Jr)7+ ze2m`I!mD&wJJ8l0N1)2;Zez`JY)3N<$rdQ=FN49%{|Tx|Ej@5@+nN*TzK;4f9C@@p}WB-&M8O%NO^&D0O%+ z*bvI{=VaZv#RitRX6LuDR2T2wyv(J({?%r`u-4m6<{5`09n(N_^}z7>{S3E2lHQS2 z4sQ*NkE`zm0r&iv@WcL=>sDC+Uj5^PkQUR9DOb!IW#UN1!{T_#xzFYmUa$2%ab9*2<$m$6xj#zVI;)A{Ehwb^jZ;L z!2YY`&WBfyv06FLoyArQ;fmvag>W|lSPnu3$$|o6p?q6k5xq3mN;5@Md(&rf1pg+3b!2g9NYcvkoI zP>!6mL~>%fuT)t;euJnT;HA_*X+b$4v2sWIJH70q&|BhO_QZXtnO#IAQ2-}5a;{r)vyL_@%iL-l{qB)liKu^0i1NIVIu^SuPcAp#-JG_Kli_`x1Inb>o-WIUnfZpL z3GZ~Pp#5NZ5)8Zy3?o-z=9cSV8SX#Ai5SP7y1>8k%8U1eY-ADSFl3JR_`inLJ1o)n z&Nlytl7G*Gin>4*DAQfM!47);*nUK9{CpVycL#gRk3LuF<9e! z5l`R8Pe5hnMj^$8S~)Wpc)KxgG9nq&#A|u0%N79NUMslKs)PSIrqIhJ^$8A&(EBGi z_5>uZ67Yi#p6Gj--@d_1c{FOHAt!X(X`w!2G5;~NpIk0yaWl-V z6=@p*)LOWOa+E$K1Se93RcX?xBG3HLAZ8gixX)?m|2YycbPDB?7;$Veo0#$SOtq+} z)C%nUS%1O@P*Z7Ot+)!>wX&T=<_M{DX=q-3z3ZLx3n>38(DPtu-uMTb@yqR2&F*g4 zhLyPu7t9NilPNjB?Yi4^=L8F|^Pn2i|BPyyXAHqH#E-RW9ju_vOd_o)>SEp6c5^t3 zShKfzm>g}|t&?W4-&|FD=MhIx=rWt^*Pb%^mB7%L?wttw)K_Yk4nKPcIL)NENr;2) z|M2w|KyftDzi12z1otcw+@0VqfuJEFxVyW{65N6(5IjI|cXxNUMHcsEfyEbj%Xk0x z)_qm4-quv@Y|l&|=`-DD`~3QJ)6Nc-`niLR1d=Lyu*gmIsV+ueWK^{37=cihB3;eI zc_zgXvqb7zd=YzGKZ7rSDw@G^ph-B-e)SJ~tn6sZ9$pyImGG}IpCK$ED79Z6vs9Jw zNh4N!`K3+5oFu^8k^CW0S^&{%Q#g`l$TA=#!EsgNAzz~a=lNp z=tfxWETo`G*D0%((cZ_&$=ppLy5jU|yt(}^DpNRjTA&69UA z@Vs9l9rInYp!S{;UqJSUUBjEp@HmT7M6`+Mcl~ym;h#F%?>DhOy>y_NXJW}h5siRn z7@u!?3U}yp|5Vf4BeZ|yH94+Md-!pz+(V!4TY%}8o?&g7zaPoY$(}0;I9a{h4fhkr zb|6lhQ0&xoBo{6J9byvhO?fQwD+Fa&em)j*CQ`W);*{V+E@w}&ZsMt#Y6!uMBEYfY zFry6S&B0h6A-aKKkMHO{1U&tVeMr!*sBWL8rd-BWIeG|W>qqnk(ghGfDn^mrheaLK zzRHljxw0Cz@Vj(i<8@hW@}~F3Mj@ z*#|HQR5iQCQHFmUC}->)I;6*Usr~jFU*hGG;3y1te>ybclWe856~(KzfopGmk`WFq zAzCA^DxD8;zw?~WVdglw*)V(BQTlUWxHqdP$9&%L4M1Iz3moeHhmi7=ARl9Sf~c`s zqJvoMS5xi6<}KG^khPR>*)@7IF&;tyGI;m<&wSsy_o=ikCstM;bW{m-R@@z$9c)af z8#?wyv)tIV7CF%-V#Il*SUmh0w9}Q@ApyisagE<^5%Y6=!B<({$!=7EgokIEzCKLk z>;rfa^67s4)H~$2wX1=RUFc}RV`XTN-*mi`har_H-v~3=9wNS5F8-4H$21NO(U9c` zWcv6?u>eJYl3tkDX!^sj=o8$gUrL%EA=(VJTmr3I=hqSNrO*ED_%*o{_dOm#k%Y5Q9*G1zwmD(#kc%+#}cS7 z*%>_HC;9Wm*n-{UgliuUUwFMukDdIq3!zj2sp$gQ0L zl@Z(1FJ2=LvA7fMQX{@SfuUBzWT9RMlty9&(>lPE=1U58C$;eU&yw^Aky(GSbwj1| z!#?b4yXp6LQ;g)1YkV9;iAVmP6bDYcI3yc`!O7{kABC&JF z3i=wdx7j#CQ$k_KL>I`P5o3A|OutKXy*==OG~bor`^S%frXs`S^ev{Jf4x2oMHX47 z<}o?Xa1hWjm=>^%;m?Hc6cwApI-u^SGjhA=EG$x>6+uHj#SZFcGuI%*Ma>!Sg1Rz|_-*Be<%6qp|I7r0zCz?vd&(i)k|qI`%K3 zIL-{N#`hYcw<5P5EPVH}?_U2r{bk}c7a*?u8xtZU$|LT~l$vAtJ1X}DtM*^k;C#C; zxiY%{I=)gn1r=s%9L-^+CRxhY+K#h)E_1&%Y3j(=O`xtA0PV}@JM`@fb)qE6VsXRP zgmDcpz?d&ztf!$t$Su4apgYoKGJX%=C*17fAC4c+l-@?swl`kjJuck55ou?_7~(P8 zK!)#0H$F_Z1C{!Z1>s%rhSCGFMR1LCIy%@iRpQ-QGa@0<3%1S`p}+Gn!_89~gAK{R zAu)~NSHK7Jq6b!*Z#n(`+6ATO*WiamtwA@o<35D}>S| z@9f2k$sd!?*_jX@Ng;He=-)r#rG*)nEqdKW0}ty`OK2OPOSQ z-(s7mzB4kHLG_PI^ z+RukvkTw%j0h(CP^;F}6#5{tj+lw!;yi?fA?|#8FTcbyf4rmAN3_sjS+Ubw53eywA zcWb~RPUu6xyt!25U|vd5ffJuA7aV75l<*@7@>hs@z?#`)7Zhe}wFZgCRL5`FJ&X&g zd;(5)7~KUfPlCG*4iMV<{w^!ASAu4dEO(eKa?^h{5a5k(7%p<8pnv;BEQ%F~`eiaLs zuNH`E2=65BpY+#nO1y1zYlQ6i_b2+H-sOO&$N1Yyc(>=B$-ELy0zQ~Fq>YUz!o2|) z@LmVah_w(m*w-Qh zq}02ikKvHmt;uUrXirbU?&E=H<|04H&L2XYFEuge3RWG#K!~Y(5=QBE6@rf^F~H9F z`mq*IbF*~U$-!F3h$6c8OZpP>CK+qF7+IZ+HF{qd@?00IyBMx2i2vwQv(o-7S?Xjy zynKFPc%DDOM0IKroWQBJygd_w22W&3R!v(b?UhV@W-0CF%hfYW+o2ar%47osHi9Cd zd*Yf{U5EvXuMteRP}TM*f04(@X&*rz@eX1A2&orVdW3Fot6OAwb*H&XE7$6Cds@LM z;bAi#qE@!4iFgKEFMS&H_dJwk3{~#4t1QZS4|hQunOf8Pv>1H-Tla;)-fJlw#Xikt zACHQ04M2-IrBMxGEcm!SPm*LRgm=}$O2^Fi54Ib{0@HTlr|&Cnpt&v0A0*Qqz#5J8 z^hJ>FATL*#!*`o|d&wVmyeBF6fNtHCzOYKDz%DT*AAW~4Px#|pX@i4MJhx8vje=WH zqOshM>P(n#$GL+iLZ(h%G`q{}#xK1TQP=1-y#2AP5rO-Nd7FDvcKi3t+04vvH!<(E;8Kj6mWJ3Aw$Sh8k$ zZ`9V)R#ZyEjHUiC*W6%Vi6oQe?u8!Kh@NfKg_=a7_i~WkdACnrmpq!IAQ%~Km;};s z1aiDvA!++?x&@jY>#?A>W*$?9PeuvH+fIGHsHY12^@vWjP#T%wN~uHyas?+E@0%}+ z+P_2glbV-G{9=;Jt5WJf|E5Uzd&Widl6{qt@x%Yohu03V2%lP(*)cn@R0;r*i9r*> zQ`+6<{Bae*LFj)Rlkc_4?7@P5>&nZ<9SuDZsH#wdcB=@y zr4Fw~Gv)r`lhe&71xr9|O2%nLsg-S$wPP_9*K3n;IR-z>l;;Yn6@dcPX=8_&z-O+u zwg~i^luYJH3l8v^2(AD+i$em8yunReQCLP`*htm85MIjA;FZ6-*3HnyCo+UW{=Cli zW2dYg*;~{)N_5}LgExq^ZDc@^?s~?%lWPxl4we{+d@(s$dZRK3d2q-}9dnqRW zRwm8-nbVD8y zPMtBqwjx#Lz7IYnVi+=Uz=B%|6@A76AYgYA@^1U1=NrJZZc1-hBlLDp)7!qVZhDy= z72@daMlBM0u`)ScI3)`95PtU-!Jn>qwvw#L4y26pT8pwT-_lmeR=(MNJYx#9jjlQz zN_yn%E1__#6Tj&bImT7>j;^h>li;XsNn-;_=0umT^zgdy?@?mYw%#7v0q;dqb!==i z6qaIgL7d=h6193*TUzHG-C=Rn((ZkjaU!&~kD&NNfu$CwkTe^;;mf<$fR>|0NC{`fde%5mTD186R0PfmGBJrXC^g6*kRY-5&_fXy1F-!Lt@l zT?Ovu9Ul>OUC~!BW0iE$i;X9$F*wdy+hT zw7ni&zR|ETP_vA8Q@eGIWeT>vcx-Rq*b}5M0JN0{W9RT@w|Qx}?{SnG+CK>XBHZJy z%yipC7mBs9muUS6(%PxqH~5_N3GbpHzuI9W*b6tOyQj2MX8k;D$w4FT(d<_qaru<_ z+0YrhY1`OvH22=j{+<4xF`y;MWGk#C6ph$RHGUE!i*0LVc z?2Md*ntPAiy3)!;X})JU^*Cd&0d;Mc{_K`9iJMMxVnx5D58B3K-#U z$Q>%Ua% z9Q&<(RcGtc*6(4}G|xcN-|ywTIy8!UtoU52)~C!b6AF-x8}H*NfOLJN*lew1x`6}h^y19dDF-_vDwp1$DJ*rpR2{t=t_`t5Q79@OZ z8UHTv$D7tGtFt6-k3Et0aus^z?;yyBdvAapy7<4agB3#h{KPh!<9a*gRB&x1UbF@v z%^hV_IlJ6aj>I_b;&O(W5NXv6#u`!CHpZ&h5Zy)SnJl!w=ESX^KDcN3x3%deG^51u zovqs8mk}Kr4pL=qG=i076}dv72Oto?yTDebioZ?8CM{ruN=bc`yLL3vz~Na~AXxL4 z9P_lu`{m4u3FYms*r*oX1xn>c&+vBDs!3keE8fylokT!#$bk&}{2_%T$X4eR7K(1& zqUwqDYNA6&tnh=FY0JXg-fjB^pUT?2Q*vO9WzANJ8*qDzJs2D7L#+!-udLB6x6RZH zHk}1$fI*iu=^C-5R=)C94gUtfUX_RWsF?NN=bu7e)yfp&-ipKq*pc%~N`nmrD(H5k zEhD|U)yInk4zF7Xes%SZ2KN14u~6=rt|v2NOjO6rHl3#jw_oxDBrN@Y^1`;nZ!)f@ z$Yol%&Gu%tM#w{CQfkBN3t(G*XV%`1wl4cY(!z@1LVZgUmUo8tjSlX7cX;6Z6@D{N zpdAH8!(;j&NqP-*4eRFq7c}hSl~=oi8hfpY@4aw--#1iBRFJ0mtH(+Lhz&`D^Hz_* zYGp#>B@-K_eYAP^q7!>>5S%?*P=6JdD`U1IeGE zEU~u#G>zSP2K)1s_%clMZ<(#CWdmMr7bL*@Xwb59GYJo9cC-}o<61vx|+* z8n`(9hb_rb`*=p&i%=o*^3{##S4$b9uuXOQmFDZuYo+3SWrLqdTd@CjuY01`+dytu z!y~mcqs$%C8}M`*dD$5D62TS=uR9uuSGJ58E3oKT4O&?h&sH*VC6^oKwgQ)zOLZ(= z%wmntymus9bb-DF=E!^^3Mcd8y*<~_=U7r};mc2kXkHO)gz5(F2-w4_i%F$&ww?rV z@T#~D5ib4YsB!LcO#t#6z1f82dbprd_P$1g;9)zrcmDPZt9K|%V@MB`F(n;%oJ<(F z);)ju_yT=^qjbH3mMAXm@dq|Z|AR$A+#Y2xN&WR8D9Nj)&-mnwas?O;8wjkMAU6j^ z9ie>lE@>}Jyy@n9TeAG2UOOxSJ*H1&^dG?*{66wGx=~C|4rthI8wk9J#V7Br4wDM2 zrz~6d_hNYqX)T@HJ?~j?DGWOJ1%0b4v_dmY73`jJpYBXV?x4U+-t6GG-FQNP3iP>I z0H2y*l`b^};H$(SU=jJZcNFp_Lk`%e;hb`{G9i*Jf%kEc?-p5m@K7j!<|iSjc;juL zjjZyR+vtt)dCdmV7s_BusWc53m9dvCz<4c ze!nl&Woy39|0*%whb%AJ74Nwtj@13*!5Z_na-2e z5@S737S0K;n+vOf#veRis8GLbAoc;yj}ANLCGJdMGHd+duYod~#lm-Ytin}5p! zn9qB^V>Z@>Osw4)ctP|ii8{r2v`2AHm^f+Q=-FHF^l&=2b?0OBpZ7zVtryApl$g;; z;NwvFUi&{kNX}Ah@#-e=w2LfEWzYS_bJv?m|9>t#yG&1&9>5MIQw`EAu|Ndi?h}0S zH=$LEJS38L=4(+#A-uCNr^QB_ciz3{Lx9GrCY1z>>e;Jk-g{IrQr?%ZFx}>{zv1EH z+NM(=qx=(v^oSm#V+p(VyBps#tCIF*2yJcs#9*W^;%2%L_QkjGbvbFe&P;=kT{iLk zzam#3{;y~j810ROnoQNtP6vBEZ?ab^e)i0*e`8r4q-+;YxciulbXdZ3CQl#4v8Ace zAg`g;y36j-LVsuSJJuTPFkb7Z*))9|Nxu=_LiW$tX7h_%-)3Fpa^Offj2%!oL&KwO zsMK?lpT9M0$MM;GHv`qHMM3<8zS~#1-O}oSpLl~n0d>5h#d>q8%aPErC-SR5{0*J9LvtD~st|7<@|uOvU7YbHB#r38C+Y*L zaZNBUwm18CMxi!#z00)=m6`7?vo6D%C6HrQr{yZMHQP7WW75K+T7t$wlY|U^pJYux z{zadXee5vj^jCcQDz?(Z!1jY*eHj*`I>14H9Y@X*F{>__2Dtw`?dg8up}n(&)iIoE z)=;GD{q*%W|2TxL9JJJAz1O71kvRk{S%I}7o%E_>=$MNfL*L7ZFhD^{VLb{6@M08J z&P*TN&(4a$Wq)*%^jE|HdHK6bUjZyA5c`KhZGxE|dz3g+)6N_lpnL-GI| z&{S8B>@{Qe@xE~68k_rIYp5L&^mzJ27D^P<6(Q{7&*a*4>H*E*S-g|%h5Ih@C6U0~ zER?Z+wub+HNFi;jo}|)*h0tDVPORTQ?B{M4XPlHa#sJH8DA3q0>+RE)KElndX-oYn zFlCeTbDvn6Wxf%+qEO!+Sk?}%aW}PX6V6){}ti zH5d?;?zPSU#bk{HdNZAJcuXuO*vbWfC zzb|4afL3UBUK&m5HNDXfM&;+;6pP*(JCS9~ziSgIJoXyv?J7MfN7my-dKj738+l6!eX|6PuKWF(>a?1yp!LUwsaCD4P&GJ+!1%|I@%cDr5U#v zl2iSWMR5qrci1JrZsp&-xDs{H5o7ZD=_@Mn>ftvP~@7fNo~R5Z{I zQ%U%50!wr#sEq6M?PU9f|II9}V}W8;NH~TS;RuT~aRFQQRLUwlHQt6?Yn@EfG21=y zF3)gth#4=&{L&RRS3GkgBlSED6iJ&y@-_h1)v98>wF~_4UfGr8_Pry!FCC62_W9(-t%_?i*6lPmz;zKVdNG(3X z)`_w>Jih21zCi%FJ~krqX6NfIcr31qzt4G>!&dqy;d=)gsYO9(QWvJwAzI#FVRg$O ze~SzuCcmqO_0skmWCd2?e7$vgyxAPKLOrJCRdlaj{8sZ<#9Q3Q+SSbjz`9YsY|jAJ zb=f!A=G7poppJK8-cd`)6gUq*AyUGnS(-W>qpjsE&_JiY z!bY~+8hl_m?PwBN5*6LYU?cmTBm%P^7ts^IX$hYib%)9xJ&q)4lf6%SO!G!p!lJ%k zmG47$MA_As?@D{g)_H76S|`a_n}(w%Ff}?TNjr`#mAg-rent$ixmcja4Y%YIrMHGM z1{I>y=l4=u|7#8M9ayA9+g)1V^gA=!5$e0#wY=8YX#*ZanRge)DZHWD))vi7E9g`!Z9li$9a|1gY1_Ql>Bw?zg(zg^Jx7+y?Yxt?~mKc!+u( zx9E*Bt`2e!=1w&svqAFiHA+p@ITeyuwD2-U2!8lSLIy<=MLkbWGteo|v z)@4A1`~{! zVeU-WBYh?d>eAbPsP32I)p!k6?b~U{ZwNmux002Tz&po8F^hZg_v=6Abpo-C{@||JXp*g9aS@?|> z6njm3S?cJfbbqt_GWmi%*7q3g7u0_PmW3MDxEA|sFMf`4<8T)4Js|}K+>1|Cc^wc$ zAuV@puue=w_Y)C_@veg$E4p*Jo3iH@_JkJ7ch(1|%9CJSs{z~kU^(sUc zag#ZLHWRGk%7f_Ho$@@9;K;_}(EOeV%_ z%Knw^hUKI0U3OAE28Dl)p4Uym&^3}jMi=mszfl#BVJv4OMz=)iUHp(2g9x{tO2UWV zOD0E{P>aEHf6whfHNYR7y;U|lPP|9bBbjZk8dhzT@J7evJ=w=htgd~d{RjOYle~E z{-L5Sg@3E&XEKRP?slxR9|rMXI|^8L)O58Qu6?y}aB>LD2F4dV?`+ZXmWqT%ECjJ= z$*M~Q^yqOL-aSE+@Z0tM!XxIq>&Wn6?sq{AFsI}c5bjldz7eLHdypy&-9V#e2iv4V zKz&j+t|FHBo3vh%ROR)Zu$7EJPM5ERpUP8Z=!bA*JdhA#R-~a~4gY-0!TFT*yuRd( zr=bU$J#&%Z{vxu*HRbS!_?A!6NX1DYJow%){Y8M>sj)t?P&n6ObLkaZ%`*94#W_se zih3`HJd^Ld#(6qx^%vg3?iKCfW1rwr#%`I6;YeyN?v3Su9B6g7jV+N+H#W!^H<(!G zMpabDA*pg(e`0?jR>1Sf%`h1cCn{QV-+CkA$%xRsk>lYfR7zN>e6811N$;UN|08CT z$4kr^L-#h;0`FL$Q+Oz`_tE>u6=r1{sbQ zOeN@ajj!oUXYGDjHQKLuQEbFU}-1Zpt zKVoy}`?YjBP^}6^_?fU`hR9+DRO`eoo2@tv7DpZn)(P|+rjcs8`Fj|qG>NNTU3fyN z{IoWoz-h6mUkB!g<&ZZ}?qgi8Gb-^G86zb?4$T1+26#WCbR<u`8|ORW|8!RB6b>A2gA-Y$Sb(MtoAy^E3i)ZG;0`*cV31fCna9*z)VghaZbHmEuaIj`HD@z5U{fl2n(qVIs%0D3}>l7?|}h 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 XaD^T8OsgaAf8mi5lM}5F{^|ceV3ku$ literal 0 HcmV?d00001 diff --git a/vendor/casperjs/docs/_static/images/zip.png b/vendor/casperjs/docs/_static/images/zip.png new file mode 100755 index 0000000000000000000000000000000000000000..2099c7cfbb4c8cc385493936428623d3de957790 GIT binary patch literal 3788 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 +

diff --git a/vendor/casperjs/docs/_themes/casperjs/layout.html b/vendor/casperjs/docs/_themes/casperjs/layout.html new file mode 100755 index 0000000..23c6623 --- /dev/null +++ b/vendor/casperjs/docs/_themes/casperjs/layout.html @@ -0,0 +1,7 @@ +{%- extends "basic/layout.html" %} +{% block extrahead %} + + + + +{% endblock extrahead %} diff --git a/vendor/casperjs/docs/_themes/casperjs/localtoc.html b/vendor/casperjs/docs/_themes/casperjs/localtoc.html new file mode 100755 index 0000000..ea535a6 --- /dev/null +++ b/vendor/casperjs/docs/_themes/casperjs/localtoc.html @@ -0,0 +1,4 @@ +{%- if display_toc %} +

{{ _('Document Outline') }}

+ {{ toc }} +{%- endif %} diff --git a/vendor/casperjs/docs/_themes/casperjs/sourcelink.html b/vendor/casperjs/docs/_themes/casperjs/sourcelink.html new file mode 100755 index 0000000..223d8ab --- /dev/null +++ b/vendor/casperjs/docs/_themes/casperjs/sourcelink.html @@ -0,0 +1,16 @@ +

Index

+

Thesaurus

+ +{%- if show_source and has_source and sourcename %} +

{{ _('This Page') }}

+ +{%- endif %} diff --git a/vendor/casperjs/docs/_themes/casperjs/static/casperjs-dark.css b/vendor/casperjs/docs/_themes/casperjs/static/casperjs-dark.css new file mode 100755 index 0000000..ebc9552 --- /dev/null +++ b/vendor/casperjs/docs/_themes/casperjs/static/casperjs-dark.css @@ -0,0 +1,991 @@ +/** + * casper.css + * ~~~~~~~~~~~~~~~ + * + * CasperJS stylesheet, based on RTD one: + * + * Sphinx stylesheet -- sphinxdoc theme. Originally created by + * Armin Ronacher for Werkzeug. + * + * Customized for ReadTheDocs by Eric Pierce & Eric Holscher + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* PAGE LAYOUT -------------------------------------------------------------- */ + +body { + font: 100%/1.5 Asap, "ff-meta-web-pro-1", "ff-meta-web-pro-2", Arial, "Helvetica Neue", sans-serif; + text-align: center; + color: #fff; + background-color: #222; + padding: 0; + margin: 0; +} + +img { + border: 0; + max-width: 100%; +} + +.body > .admonition.note { + margin: 0 0 2em 0; +} + .body > .admonition.note .first { + display: none; + } + +div.document { + text-align: left; + background-color: #333; +} + +div.bodywrapper { + background: #111 url(images/bg.png); + border-left: 1px solid #333; + border-bottom: 1px solid #333; + margin: 0 18em 0 0; +} + +div.body { + margin: 0; + padding: 0.5em 1.3em; + min-width: 20em; +} + +div.related { + font-size: 1em; + background-color: #465158; +} + +div.documentwrapper { + float: left; + width: 100%; + background-color: #333; +} + + +/* HEADINGS --------------------------------------------------------------- */ + +h1 { + margin: 0; + padding: 0 0 0.3em 0; + font-size: 2em; + line-height: 1.15; + color: #fff; + clear: both; +} + +h2 { + margin: 2em 0 0.2em 0; + font-size: 1.35em; + padding: 0; + color: #fff; +} + .section h2 { + border-bottom: 3px solid #777; + margin-top: 2.5em + } + +h3 { + margin: 1em 0 -0.3em 0; + font-size: 1.2em; + color: #fff; +} + +div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { + color: #fff; +} + +h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { + display: none; + margin: 0 0 0 0.3em; + padding: 0 0.2em 0 0.2em; + color: #333 !important; +} + +h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, +h5:hover a.anchor, h6:hover a.anchor { + display: inline; +} + +h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, +h5 a.anchor:hover, h6 a.anchor:hover { + color: #777; + background-color: #eee; +} + + +/* LINKS ------------------------------------------------------------------ */ + +/* Normal links get a pseudo-underline */ +a { + color: #0bc; + text-decoration: none; +} +a.reference, a.internal { + color: #abf; +} + +a.reference em, a.internal em { + font-style: normal; +} + +/* Links in sidebar, TOC, index trees and tables have no underline */ +.sphinxsidebar a, +.toctree-wrapper a, +.indextable a, +#indices-and-tables a { + color: #0bc; + text-decoration: none; + border-bottom: none; +} + +/* Most links get an underline-effect when hovered */ +a:hover, +div.toctree-wrapper a:hover, +.indextable a:hover, +#indices-and-tables a:hover { + color: #2be; + text-decoration: none; +} + +/*toctree dedicated styles*/ +div.toctree-wrapper ul { + list-style-type: none; + padding-left: 2em; +} + +div.toctree-wrapper ul ul { + margin-top: .5em; +} + +div.toctree-wrapper li { + margin-bottom: .5em; +} + div.toctree-wrapper a, .toctree-wrapper a:visited { + padding: .2em .4em; + background-color: #555; + color:#fff; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + div.toctree-wrapper a:hover { + color: #eee; + background-color: #777; + } + +/* Footer links */ +div.footer a { + color: #0bc; + text-decoration: none; + border: none; +} +div.footer a:hover { + color: #2be; + border: none; +} + +/* Permalink anchor (subtle grey with a red hover) */ +div.body a.headerlink { + color: #ccc; + font-size: 1em; + margin-left: 6px; + padding: 0 4px 0 4px; + text-decoration: none; + border: none; +} +div.body a.headerlink:hover { + color: #fff; + border: none; +} + + +/* NAVIGATION BAR --------------------------------------------------------- */ + +div.related ul { + height: 2.5em; + min-height: 2.5em; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(to bottom, #333333, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff333333', endColorstr='#ff222222', GradientType=0); + border-bottom: 1px solid #222; + -moz-border-radius: 4px; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + *zoom: 1; +} + +div.related ul li { + margin: 0; + padding: 0.65em 0; + float: left; + display: block; + color: white; /* For the >> separators */ + font-size: 0.8em; +} + +div.related ul li.right { + float: right; + margin-right: 5px; + color: transparent; /* Hide the | separators */ +} + +/* "Breadcrumb" links in nav bar */ +div.related ul li a { + order: none; + background-color: inherit; + font-weight: bold; + margin: 6px 0 6px 4px; + line-height: 1.75em; + color: #ffffff; + padding: 0.4em 0.8em; + border: none; + border-radius: 3px; +} +/* previous / next / modules / index links look more like buttons */ +div.related ul li.right a { + margin: 0.375em 0; + background-color: #555; + text-shadow: 0 1px rgba(0, 0, 0, 0.5); + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +/* All navbar links light up as buttons when hovered */ +div.related ul li a:hover { + background-color: #777; + color: #fff; + text-decoration: none; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +/* Take extra precautions for tt within links */ +a tt, +div.related ul li a tt { + background: inherit !important; + color: inherit !important; +} + +.sphinxsidebar a tt span.pre { + color: #eee; + background-color: #444; + padding: 0 .5em; + border-radius: 4px; +} + +.sphinxsidebar a:active tt span.pre { + color: #f66; +} + + +/* SIDEBAR ---------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebar { + margin: 0; + margin-left: -100%; + float: right; + top: 3em; + left: 0; + padding: 0 1em; + width: 18em; + font-size: 90%; + +} + +div.sphinxsidebar img { + max-width: 12em; +} + +div.sphinxsidebar input[type="image"] { + display: inline; + float: none; + border: 0; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4, +div.sphinxsidebar p.logo { + margin: 1.2em 0 0.3em 0; + font-size: 1em; + padding: 0; + color: #fff; + font-family: Asap, Arial, "ff-meta-web-pro-1", "ff-meta-web-pro-2", "Arial", "Helvetica Neue", sans-serif; +} + +div.sphinxsidebar h3 a { + color: #fff; +} + +div.sphinxsidebar ul, +div.sphinxsidebar p { + margin-top: 0; + padding-left: 0; + line-height: 130%; + +} + +/* No bullets for nested lists, but a little extra indentation */ +div.sphinxsidebar ul ul { + list-style-type: none; + margin-left: 1.2em; + padding: 0; +} + +/* A little top/bottom padding to prevent adjacent links' borders + * from overlapping each other */ +div.sphinxsidebar ul li { + padding: 0; + margin: 2px 0; +} + +/* A little left-padding to make these align with the ULs */ +div.sphinxsidebar p.topless { + padding-left: 0 0 0 1em; +} + +/* Make these into hidden one-liners */ +div.sphinxsidebar ul li, +div.sphinxsidebar p.topless { + white-space: nowrap; + overflow: hidden; + border: 1px solid transparent; /* To prevent things jumping around on hover */ +} +/* ...which become visible when hovered */ +div.sphinxsidebar ul li:hover, +div.sphinxsidebar p.topless:hover { + background-color: #333; + overflow: visible; + + +} + +/* Search text box and "Go" button */ +#searchbox { + margin-top: 2em; + margin-bottom: 1em; + background: #666; + padding: 0.5em; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + margin-right: 0; +} +#searchbox h3 { + margin-top: 0; +} + +/* Make search box and button abut and have a border */ +input, +div.sphinxsidebar input { + border: 1px solid #999; + float: left; +} + +/* Search textbox */ +input[type="text"] { + margin: 0; + padding: 0 3px; + height: 20px; + width: 144px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-topleft: 3px; + -moz-border-radius-bottomleft: 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; +} +/* Search button */ +input[type="submit"] { + margin: 0 0 0 -1px; /* -1px prevents a double-border with textbox */ + height: 22px; + color: #444; + background-color: #e8ecef; + padding: 1px 4px; + font-weight: bold; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; +} +input[type="submit"]:hover { + color: #000; + background-color: #ddd; +} + +div.sphinxsidebar p.searchtip { + clear: both; + padding: 0.5em 0 0 0; + color: #fff; + font-size: 0.9em; +} + +/* Sidebar links are unusual */ +div.sphinxsidebar li a, +div.sphinxsidebar p a { + color: #eee; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border: 1px solid transparent; /* To prevent things jumping around on hover */ + padding: 0 5px 0 5px; +} +div.sphinxsidebar li a:hover, +div.sphinxsidebar p a:hover { + color: #fff; + background-color: #333; +} +div.sphinxsidebar p.logo a { + border: 0; +} + +/* Tweak any link appearing in a heading */ +div.sphinxsidebar h3 a { +} + + +/* OTHER STUFF ------------------------------------------------------------ */ + +/* labels */ +.versionmodified { + font-style: normal; +} + +.bookmarklet, .versionadded, .versionchanged { + display: inline-block; + padding: 4px 6px; + font-size: 13.536px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + text-align: center; + font-style: normal; +} + .bookmarklet a, .versionadded a, .versionchanged a { + color: #fff; + } + +.bookmarklet { + background-color: #2d6987; +} + +.versionadded { + background-color: #468847; +} + div.admonition p.versionadded, + div.warning p.versionadded { + padding: 4px 6px; + } + +.versionchanged { + background-color: #b04040; +} + div.admonition p.versionchanged, + div.warning p.versionchanged { + padding: 4px 6px; + } + +/* Standard tags */ +cite, code, tt { + font-family: 'Source Code Pro', 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +tt { + color: #f66; + background-color: #444; + padding: 0 5px; + font-size: 95%; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt { + padding: 0; + background: none; +} + +tt.descname, tt.descclassname, tt.xref { + border: 0; +} + +hr { + border-top: 1px solid #777; + border-bottom: none; + margin: 2em auto; + width: 50%; +} + + +pre, #_fontwidthtest { + font-family: 'Source Code Pro', 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + margin: 1em 2em; + font-size: 0.95em; + letter-spacing: 0.015em; + line-height: 120%; + padding: 0.5em; + border: 1px solid #ccc; + background-color: #eee; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; +} + +pre a { + color: inherit; + text-decoration: underline; +} + +td.linenos pre { + margin: 1em 0em; +} + +td.code pre { + margin: 1em 0em; +} + +div.quotebar { + background-color: #f8f8f8; + max-width: 250px; + float: right; + padding: 2px 7px; + border: 1px solid #ccc; +} + +div.topic { + background-color: #333; + border: 0; + padding-bottom: .5em; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; +} + +table { + border-collapse: collapse; + margin: 0 -0.5em 0 -0.5em; +} + +table td, table th { + padding: 0.2em 0.5em 0.2em 0.5em; +} + + +/* ADMONITIONS AND WARNINGS ------------------------------------------------- */ + +/* Shared by admonitions, warnings and sidebars */ +div.admonition, +div.warning, +div.sidebar { + font-size: 0.9em; + margin: 2em; + padding: 0; + /* + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + */ +} +div.admonition p, +div.warning p, +div.sidebar p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} +div.admonition pre, +div.warning pre, +div.sidebar pre { + margin: 0.4em 1em 0.4em 1em; +} +div.admonition p.admonition-title, +div.warning p.admonition-title, +div.sidebar p.sidebar-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + font-weight: bold; + font-size: 1.1em; + text-shadow: 0 1px rgba(0, 0, 0, 0.5); +} +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol, +div.sidebar ul, div.sidebar ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + + +/* Admonitions and sidebars only */ +div.admonition, div.sidebar { + border: none; + background-color: #555; + color: #fff; + padding: .5em; + margin-bottom: 1em; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + +} +div.admonition p.admonition-title, +div.sidebar p.sidebar-title { + padding-bottom: .5em; + border-bottom: 1px solid #888; +} + + +/* Warnings only */ +div.warning { + background-color: #333; +} +div.warning p.admonition-title { + background-color: #b04040; + border-bottom: 1px solid #900000; + border-radius: 4px; +} + + +/* Sidebars only */ +div.sidebar { + max-width: 30%; +} + + + +div.versioninfo { + margin: 1em 0 0 0; + border: 1px solid #ccc; + background-color: #DDEAF0; + padding: 8px; + line-height: 1.3em; + font-size: 0.9em; +} + +.viewcode-back { + font-family: Asap, 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +dl { + margin: 1em 0 2.5em 0; +} + +/* Highlight target when you click an internal link */ +dt:target { + background: #ffe080; +} +/* Don't highlight whole divs */ +div.highlight { + background: transparent; +} + div.highlight pre, + div.highlight-javascript pre, + div.highlight-html pre { + background-color: #4b4b4b; + background-color: rgba(75, 75, 75, 0.5); + color: #eee; + font-size: 15px; + line-height: 21px; + white-space: pre; + overflow: auto; + border: none; + } + div.admonition pre { + background-color: #333; + } + +/* But do highlight spans (so search results can be highlighted) */ +span.highlight { + background: #111; +} + +div.highlight .c1 { + color: #999; +} +div.highlight .cp { + color: #3aC; +} + +div.highlight .s, +div.highlight .s1, +div.highlight .s2 { + color: orange; +} + +div.highlight .kc { + color: red; +} +div.highlight .k, +div.highlight .kd { + color: #3aC; +} + +div.highlight .nb { + color: #e88; +} +div.highlight .nx { + color: #fff; +} + +div.highlight .p { + color: #eee; +} + +div.footer { + color: #eeeeee; + padding: 1em 2em 1em 2em; + clear: both; + font-size: 0.8em; + text-align: center; + background-color: #222; +} + +p { + margin: 0.8em 0 0.5em 0; +} + +.section p img.math { + margin: 0; +} + + +.section p img { + margin: 1em 2em; +} + + +/* MOBILE LAYOUT -------------------------------------------------------------- */ + +@media screen and (max-width: 600px) { + + h1, h2, h3, h4, h5 { + position: relative; + } + + ul { + padding-left: 1.25em; + } + + div.bodywrapper a.headerlink, #indices-and-tables h1 a { + color: #e6e6e6; + font-size: 80%; + float: right; + line-height: 1.8; + position: absolute; + right: -0.7em; + visibility: inherit; + } + + div.bodywrapper h1 a.headerlink, #indices-and-tables h1 a { + line-height: 1.5; + } + + pre { + font-size: 0.7em; + overflow: auto; + word-wrap: break-word; + white-space: pre-wrap; + } + + div.related ul { + height: 2.5em; + padding: 0; + text-align: left; + } + + div.related ul li { + clear: both; + color: #465158; + padding: 0.2em 0; + } + + div.related ul li:last-child { + border-bottom: 1px dotted #8ca1af; + padding-bottom: 0.4em; + margin-bottom: 1em; + width: 100%; + } + + div.related ul li a { + color: #fff; + padding-right: 0; + } + + div.related ul li a:hover { + background: inherit; + color: inherit; + } + + div.related ul li.right { + clear: none; + padding: 0.65em 0; + margin-bottom: 0.5em; + } + + div.related ul li.right a { + color: #fff; + padding-right: 0.8em; + } + + div.related ul li.right a:hover { + background-color: #8ca1af; + } + + div.body { + clear: both; + min-width: 0; + word-wrap: break-word; + } + + div.bodywrapper { + margin: 0 0 0 0; + } + + div.sphinxsidebar { + float: none; + margin: 0; + width: auto; + } + + div.sphinxsidebar input[type="text"] { + height: 2em; + line-height: 2em; + width: 70%; + } + + div.sphinxsidebar input[type="submit"] { + height: 2em; + margin-left: 0.5em; + width: 20%; + } + + div.sphinxsidebar p.searchtip { + background: inherit; + margin-bottom: 1em; + } + + div.sphinxsidebar ul li, div.sphinxsidebar p.topless { + white-space: normal; + } + + .bodywrapper img { + display: block; + margin-left: auto; + margin-right: auto; + max-width: 100%; + } + + div.documentwrapper { + float: none; + } + + div.admonition, div.warning, pre, blockquote { + margin-left: 0em; + margin-right: 0em; + } + + .body p img { + margin: 0; + } + + #searchbox { + background: transparent; + } + + .related:not(:first-child) li { + display: none; + } + + .related:not(:first-child) li.right { + display: block; + } + + div.footer { + padding: 1em; + } + + .rtd_doc_footer .rtd-badge { + float: none; + margin: 1em auto; + position: static; + } + + .rtd_doc_footer .rtd-badge.revsys-inline { + margin-right: auto; + margin-bottom: 2em; + } + + table.indextable { + display: block; + width: auto; + } + + .indextable tr { + display: block; + } + + .indextable td { + display: block; + padding: 0; + width: auto !important; + } + + .indextable td dt { + margin: 1em 0; + } + + ul.search { + margin-left: 0.25em; + } + + ul.search li div.context { + font-size: 90%; + line-height: 1.1; + margin-bottom: 1; + margin-left: 0; + } + +} + +.donate { + text-align: center; +} + +.donate .flattr { + margin-top: 1.5em; +} diff --git a/vendor/casperjs/docs/_themes/casperjs/static/casperjs-light.css b/vendor/casperjs/docs/_themes/casperjs/static/casperjs-light.css new file mode 100755 index 0000000..96510b8 --- /dev/null +++ b/vendor/casperjs/docs/_themes/casperjs/static/casperjs-light.css @@ -0,0 +1,887 @@ +/* + * rtd.css + * ~~~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- sphinxdoc theme. Originally created by + * Armin Ronacher for Werkzeug. + * + * Customized for ReadTheDocs by Eric Pierce & Eric Holscher + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* RTD colors + * light blue: #e8ecef + * medium blue: #8ca1af + * dark blue: #465158 + * dark grey: #444444 + * + * white hover: #d1d9df; + * medium blue hover: #697983; + * green highlight: #8ecc4c + * light blue (project bar): #e8ecef + */ + +@import url("basic.css"); + +/* PAGE LAYOUT -------------------------------------------------------------- */ + +body { + font: 100%/1.5 "ff-meta-web-pro-1","ff-meta-web-pro-2",Arial,"Helvetica Neue",sans-serif; + text-align: center; + color: black; + background-color: #465158; + padding: 0; + margin: 0; +} + +img { + border: 0; + max-width: 100%; +} + +div.document { + text-align: left; + background-color: #e8ecef; +} + +div.bodywrapper { + background-color: #ffffff; + border-left: 1px solid #ccc; + border-bottom: 1px solid #ccc; + margin: 0 0 0 16em; +} + +div.body { + margin: 0; + padding: 0.5em 1.3em; + min-width: 20em; +} + +div.related { + font-size: 1em; + background-color: #465158; +} + +div.documentwrapper { + float: left; + width: 100%; + background-color: #e8ecef; +} + + +/* HEADINGS --------------------------------------------------------------- */ + +h1 { + margin: 0; + padding: 0.7em 0 0.3em 0; + font-size: 1.5em; + line-height: 1.15; + color: #111; + clear: both; +} + +h2 { + margin: 2em 0 0.2em 0; + font-size: 1.35em; + padding: 0; + color: #465158; +} + +h3 { + margin: 1em 0 -0.3em 0; + font-size: 1.2em; + color: #6c818f; +} + +div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { + color: black; +} + +h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { + display: none; + margin: 0 0 0 0.3em; + padding: 0 0.2em 0 0.2em; + color: #aaa !important; +} + +h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, +h5:hover a.anchor, h6:hover a.anchor { + display: inline; +} + +h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, +h5 a.anchor:hover, h6 a.anchor:hover { + color: #777; + background-color: #eee; +} + + +/* LINKS ------------------------------------------------------------------ */ + +/* Normal links get a pseudo-underline */ +a { + color: #444; + text-decoration: none; + border-bottom: 1px solid #ccc; +} + +/* Links in sidebar, TOC, index trees and tables have no underline */ +.sphinxsidebar a, +.toctree-wrapper a, +.indextable a, +#indices-and-tables a { + color: #444; + text-decoration: none; + border-bottom: none; +} + +/* Most links get an underline-effect when hovered */ +a:hover, +div.toctree-wrapper a:hover, +.indextable a:hover, +#indices-and-tables a:hover { + color: #111; + text-decoration: none; + border-bottom: 1px solid #111; +} + +/* Footer links */ +div.footer a { + color: #86989B; + text-decoration: none; + border: none; +} +div.footer a:hover { + color: #a6b8bb; + text-decoration: underline; + border: none; +} + +/* Permalink anchor (subtle grey with a red hover) */ +div.body a.headerlink { + color: #ccc; + font-size: 1em; + margin-left: 6px; + padding: 0 4px 0 4px; + text-decoration: none; + border: none; +} +div.body a.headerlink:hover { + color: #c60f0f; + border: none; +} + + +/* NAVIGATION BAR --------------------------------------------------------- */ + +div.related ul { + height: 2.5em; +} + +div.related ul li { + margin: 0; + padding: 0.65em 0; + float: left; + display: block; + color: white; /* For the >> separators */ + font-size: 0.8em; +} + +div.related ul li.right { + float: right; + margin-right: 5px; + color: transparent; /* Hide the | separators */ +} + +/* "Breadcrumb" links in nav bar */ +div.related ul li a { + order: none; + background-color: inherit; + font-weight: bold; + margin: 6px 0 6px 4px; + line-height: 1.75em; + color: #ffffff; + padding: 0.4em 0.8em; + border: none; + border-radius: 3px; +} +/* previous / next / modules / index links look more like buttons */ +div.related ul li.right a { + margin: 0.375em 0; + background-color: #697983; + text-shadow: 0 1px rgba(0, 0, 0, 0.5); + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +/* All navbar links light up as buttons when hovered */ +div.related ul li a:hover { + background-color: #8ca1af; + color: #ffffff; + text-decoration: none; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; +} +/* Take extra precautions for tt within links */ +a tt, +div.related ul li a tt { + background: inherit !important; + color: inherit !important; +} + + +/* SIDEBAR ---------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebar { + margin: 0; + margin-left: -100%; + float: left; + top: 3em; + left: 0; + padding: 0 1em; + width: 14em; + font-size: 1em; + text-align: left; + background-color: #e8ecef; +} + +div.sphinxsidebar img { + max-width: 12em; +} + +div.sphinxsidebar input[type="image"] { + display: inline; + float: none; + border: 0; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4, +div.sphinxsidebar p.logo { + margin: 1.2em 0 0.3em 0; + font-size: 1em; + padding: 0; + color: #222222; + font-family: "ff-meta-web-pro-1", "ff-meta-web-pro-2", "Arial", "Helvetica Neue", sans-serif; +} + +div.sphinxsidebar h3 a { + color: #444444; +} + +div.sphinxsidebar ul, +div.sphinxsidebar p { + margin-top: 0; + padding-left: 0; + line-height: 130%; + background-color: #e8ecef; +} + +/* No bullets for nested lists, but a little extra indentation */ +div.sphinxsidebar ul ul { + list-style-type: none; + margin-left: 1.5em; + padding: 0; +} + +/* A little top/bottom padding to prevent adjacent links' borders + * from overlapping each other */ +div.sphinxsidebar ul li { + padding: 1px 0; +} + +/* A little left-padding to make these align with the ULs */ +div.sphinxsidebar p.topless { + padding-left: 0 0 0 1em; +} + +/* Make these into hidden one-liners */ +div.sphinxsidebar ul li, +div.sphinxsidebar p.topless { + white-space: nowrap; + overflow: hidden; +} +/* ...which become visible when hovered */ +div.sphinxsidebar ul li:hover, +div.sphinxsidebar p.topless:hover { + overflow: visible; +} + +/* Search text box and "Go" button */ +#searchbox { + margin-top: 2em; + margin-bottom: 1em; + background: #ddd; + padding: 0.5em; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; +} +#searchbox h3 { + margin-top: 0; +} + +/* Make search box and button abut and have a border */ +input, +div.sphinxsidebar input { + border: 1px solid #999; + float: left; +} + +/* Search textbox */ +input[type="text"] { + margin: 0; + padding: 0 3px; + height: 20px; + width: 144px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-topleft: 3px; + -moz-border-radius-bottomleft: 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; +} +/* Search button */ +input[type="submit"] { + margin: 0 0 0 -1px; /* -1px prevents a double-border with textbox */ + height: 22px; + color: #444; + background-color: #e8ecef; + padding: 1px 4px; + font-weight: bold; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; +} +input[type="submit"]:hover { + color: #ffffff; + background-color: #8ecc4c; +} + +div.sphinxsidebar p.searchtip { + clear: both; + padding: 0.5em 0 0 0; + background: #ddd; + color: #666; + font-size: 0.9em; +} + +/* Sidebar links are unusual */ +div.sphinxsidebar li a, +div.sphinxsidebar p a { + background: #e8ecef; /* In case links overlap main content */ + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border: 1px solid transparent; /* To prevent things jumping around on hover */ + padding: 0 5px 0 5px; +} +div.sphinxsidebar li a:hover, +div.sphinxsidebar p a:hover { + color: #111; + text-decoration: none; + border: 1px solid #888; +} +div.sphinxsidebar p.logo a { + border: 0; +} + +/* Tweak any link appearing in a heading */ +div.sphinxsidebar h3 a { +} + + + + +/* OTHER STUFF ------------------------------------------------------------ */ + +cite, code, tt { + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +tt { + background-color: #f2f2f2; + color: #444; +} + +tt.descname, tt.descclassname, tt.xref { + border: 0; +} + +hr { + border: 1px solid #abc; + margin: 2em; +} + + +pre, #_fontwidthtest { + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + margin: 1em 2em; + font-size: 0.95em; + letter-spacing: 0.015em; + line-height: 120%; + padding: 0.5em; + border: 1px solid #ccc; + background-color: #eee; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; +} + +pre a { + color: inherit; + text-decoration: underline; +} + +td.linenos pre { + margin: 1em 0em; +} + +td.code pre { + margin: 1em 0em; +} + +div.quotebar { + background-color: #f8f8f8; + max-width: 250px; + float: right; + padding: 2px 7px; + border: 1px solid #ccc; +} + +div.topic { + background-color: #f8f8f8; +} + +table { + border-collapse: collapse; + margin: 0 -0.5em 0 -0.5em; +} + +table td, table th { + padding: 0.2em 0.5em 0.2em 0.5em; +} + + +/* ADMONITIONS AND WARNINGS ------------------------------------------------- */ + +/* Shared by admonitions, warnings and sidebars */ +div.admonition, +div.warning, +div.sidebar { + font-size: 0.9em; + margin: 2em; + padding: 0; + /* + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + */ +} +div.admonition p, +div.warning p, +div.sidebar p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} +div.admonition pre, +div.warning pre, +div.sidebar pre { + margin: 0.4em 1em 0.4em 1em; +} +div.admonition p.admonition-title, +div.warning p.admonition-title, +div.sidebar p.sidebar-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + font-weight: bold; + font-size: 1.1em; + text-shadow: 0 1px rgba(0, 0, 0, 0.5); +} +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol, +div.sidebar ul, div.sidebar ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + + +/* Admonitions and sidebars only */ +div.admonition, div.sidebar { + border: 1px solid #609060; + background-color: #e9ffe9; +} +div.admonition p.admonition-title, +div.sidebar p.sidebar-title { + background-color: #70A070; + border-bottom: 1px solid #609060; +} + + +/* Warnings only */ +div.warning { + border: 1px solid #900000; + background-color: #ffe9e9; +} +div.warning p.admonition-title { + background-color: #b04040; + border-bottom: 1px solid #900000; +} + + +/* Sidebars only */ +div.sidebar { + max-width: 30%; +} + + + +div.versioninfo { + margin: 1em 0 0 0; + border: 1px solid #ccc; + background-color: #DDEAF0; + padding: 8px; + line-height: 1.3em; + font-size: 0.9em; +} + +.viewcode-back { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +dl { + margin: 1em 0 2.5em 0; +} + +/* Highlight target when you click an internal link */ +dt:target { + background: #ffe080; +} +/* Don't highlight whole divs */ +div.highlight { + background: transparent; +} +/* But do highlight spans (so search results can be highlighted) */ +span.highlight { + background: #ffe080; +} + +div.footer { + background-color: #465158; + color: #eeeeee; + padding: 0 2em 2em 2em; + clear: both; + font-size: 0.8em; + text-align: center; +} + +p { + margin: 0.8em 0 0.5em 0; +} + +.section p img.math { + margin: 0; +} + + +.section p img { + margin: 1em 2em; +} + + +/* MOBILE LAYOUT -------------------------------------------------------------- */ + +@media screen and (max-width: 600px) { + + h1, h2, h3, h4, h5 { + position: relative; + } + + ul { + padding-left: 1.25em; + } + + div.bodywrapper a.headerlink, #indices-and-tables h1 a { + color: #e6e6e6; + font-size: 80%; + float: right; + line-height: 1.8; + position: absolute; + right: -0.7em; + visibility: inherit; + } + + div.bodywrapper h1 a.headerlink, #indices-and-tables h1 a { + line-height: 1.5; + } + + pre { + font-size: 0.7em; + overflow: auto; + word-wrap: break-word; + white-space: pre-wrap; + } + + div.related ul { + height: 2.5em; + padding: 0; + text-align: left; + } + + div.related ul li { + clear: both; + color: #465158; + padding: 0.2em 0; + } + + div.related ul li:last-child { + border-bottom: 1px dotted #8ca1af; + padding-bottom: 0.4em; + margin-bottom: 1em; + width: 100%; + } + + div.related ul li a { + color: #465158; + padding-right: 0; + } + + div.related ul li a:hover { + background: inherit; + color: inherit; + } + + div.related ul li.right { + clear: none; + padding: 0.65em 0; + margin-bottom: 0.5em; + } + + div.related ul li.right a { + color: #fff; + padding-right: 0.8em; + } + + div.related ul li.right a:hover { + background-color: #8ca1af; + } + + div.body { + clear: both; + min-width: 0; + word-wrap: break-word; + } + + div.bodywrapper { + margin: 0 0 0 0; + } + + div.sphinxsidebar { + float: none; + margin: 0; + width: auto; + } + + div.sphinxsidebar input[type="text"] { + height: 2em; + line-height: 2em; + width: 70%; + } + + div.sphinxsidebar input[type="submit"] { + height: 2em; + margin-left: 0.5em; + width: 20%; + } + + div.sphinxsidebar p.searchtip { + background: inherit; + margin-bottom: 1em; + } + + div.sphinxsidebar ul li, div.sphinxsidebar p.topless { + white-space: normal; + } + + .bodywrapper img { + display: block; + margin-left: auto; + margin-right: auto; + max-width: 100%; + } + + div.documentwrapper { + float: none; + } + + div.admonition, div.warning, pre, blockquote { + margin-left: 0em; + margin-right: 0em; + } + + .body p img { + margin: 0; + } + + #searchbox { + background: transparent; + } + + .related:not(:first-child) li { + display: none; + } + + .related:not(:first-child) li.right { + display: block; + } + + div.footer { + padding: 1em; + } + + .rtd_doc_footer .rtd-badge { + float: none; + margin: 1em auto; + position: static; + } + + .rtd_doc_footer .rtd-badge.revsys-inline { + margin-right: auto; + margin-bottom: 2em; + } + + table.indextable { + display: block; + width: auto; + } + + .indextable tr { + display: block; + } + + .indextable td { + display: block; + padding: 0; + width: auto !important; + } + + .indextable td dt { + margin: 1em 0; + } + + ul.search { + margin-left: 0.25em; + } + + ul.search li div.context { + font-size: 90%; + line-height: 1.1; + margin-bottom: 1; + margin-left: 0; + } +} + +.donate { + text-align: center; +} + +.donate .flattr { + margin-top: 1.5em; +} + + +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #303030 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0040D0 } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .nx { color: #111111 } /* Std */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ + +/* https://github.com/n1k0/casperjs-docs/issues/2 */ +#casperjs-documentation img { + -webkit-filter: drop-shadow(0 1px 20px rgba(0,0,0,.5)); + -moz-filter: drop-shadow(0 1px 20px rgba(0,0,0,.5)); + -ms-filter: drop-shadow(0 1px 20px rgba(0,0,0,.5)); + -o-filter: drop-shadow(0 1px 20px rgba(0,0,0,.5)); + filter: drop-shadow(0 1px 20px rgba(0,0,0,.5)); +} diff --git a/vendor/casperjs/docs/_themes/casperjs/static/style-switcher.js b/vendor/casperjs/docs/_themes/casperjs/static/style-switcher.js new file mode 100755 index 0000000..1691df5 --- /dev/null +++ b/vendor/casperjs/docs/_themes/casperjs/static/style-switcher.js @@ -0,0 +1,106 @@ +/** + * http://www.alistapart.com/articles/alternate/ + * + * var cookie = readCookie("style"); + * var title = cookie ? cookie : getPreferredStyleSheet(); + * setActiveStyleSheet(title); + */ +(function(exports, $) { + function setActiveStyleSheet(title) { + var i, a, main; + for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) { + if (a.getAttribute("rel").indexOf("style") !== -1 && a.getAttribute("title")) { + a.disabled = true; + if (a.getAttribute("title") === title) { + a.disabled = false; + } + } + } + } + exports.setActiveStyleSheet = setActiveStyleSheet; + + function getActiveStyleSheet() { + var i, a; + for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) { + if (a.getAttribute("rel").indexOf("style") !== -1 && a.getAttribute("title") && !a.disabled) { + return a.getAttribute("title"); + } + } + return null; + } + exports.getActiveStyleSheet = getActiveStyleSheet; + + function getPreferredStyleSheet() { + var i, a; + for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) { + if (a.getAttribute("rel").indexOf("style") !== -1 && + a.getAttribute("rel").indexOf("alt") === -1 && + a.getAttribute("title")) { + return a.getAttribute("title"); + } + } + return null; + } + exports.getPreferredStyleSheet = getPreferredStyleSheet; + + function createCookie(name, value, days) { + var expires = ""; + if (days) { + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = "; expires=" + date.toGMTString(); + } + document.cookie = name + "=" + value + expires + "; path=/"; + } + + function readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1, c.length); + } + if (c.indexOf(nameEQ) === 0) { + return c.substring(nameEQ.length, c.length); + } + } + return null; + } + + function createSwitcher() { + var $nav = $('.related').find('ul'); + var styles = $('link').filter(function(i, link){ + return $(link).attr('rel').indexOf('style') > -1 && $(link).attr('title'); + }).map(function(i, link) { + return $(link).attr('title'); + }); + $(styles).each(function(i, style) { + var $link = $('').attr('href', '#') + .attr('title', style) + .addClass('style-switch') + .text(style); + $nav.prepend($('
  • ').addClass('right').append($link)); + }); + $('.style-switch').bind('click', function(event) { + event.preventDefault(); + setActiveStyleSheet($(this).attr('title')); + }); + } + + exports.onload = function(e) { + var cookie = readCookie("style"); + var title = cookie ? cookie : getPreferredStyleSheet(); + setActiveStyleSheet(title); + createSwitcher(); + } + + exports.onunload = function(e) { + var title = getActiveStyleSheet(); + createCookie("style", title, 365); + } + + var cookie = readCookie("style"); + var title = cookie ? cookie : getPreferredStyleSheet(); + setActiveStyleSheet(title); +})(window, window.jQuery); diff --git a/vendor/casperjs/docs/_themes/casperjs/theme.conf b/vendor/casperjs/docs/_themes/casperjs/theme.conf new file mode 100755 index 0000000..89e03bb --- /dev/null +++ b/vendor/casperjs/docs/_themes/casperjs/theme.conf @@ -0,0 +1,2 @@ +[theme] +inherit = basic diff --git a/vendor/casperjs/docs/changelog.rst b/vendor/casperjs/docs/changelog.rst new file mode 100755 index 0000000..8cc6b47 --- /dev/null +++ b/vendor/casperjs/docs/changelog.rst @@ -0,0 +1,4 @@ +Changelog +========= + +The CasperJS changelog is `hosted on github `_. diff --git a/vendor/casperjs/docs/cli.rst b/vendor/casperjs/docs/cli.rst new file mode 100755 index 0000000..fa7fc3b --- /dev/null +++ b/vendor/casperjs/docs/cli.rst @@ -0,0 +1,164 @@ +.. _cli: + +.. index:: Command line, CLI, PhantomJS, Shell, arguments, options + +====================== +Using the command line +====================== + +CasperJS ships with a built-in command line parser on top of PhantomJS' one, located in the ``cli`` module; it exposes passed arguments as **positional ones** and **named options** + +But no worries for manipulating the ``cli`` module parsing API, a ``Casper`` instance always contains a ready to use ``cli`` property, allowing easy access of all these parameters. + +Let's consider this simple casper script:: + + var casper = require("casper").create(); + + casper.echo("Casper CLI passed args:"); + require("utils").dump(casper.cli.args); + + casper.echo("Casper CLI passed options:"); + require("utils").dump(casper.cli.options); + + casper.exit(); + +.. note:: + + Please note the two ``casper-path`` and ``cli`` options; these are passed to the casper script through the ``casperjs`` Python executable. + +Execution results:: + + $ casperjs test.js arg1 arg2 arg3 --foo=bar --plop anotherarg + Casper CLI passed args: [ + "arg1", + "arg2", + "arg3", + "anotherarg" + ] + Casper CLI passed options: { + "casper-path": "/Users/niko/Sites/casperjs", + "cli": true, + "foo": "bar", + "plop": true + } + +Getting, checking or dropping parameters:: + + var casper = require("casper").create(); + casper.echo(casper.cli.has(0)); + casper.echo(casper.cli.get(0)); + casper.echo(casper.cli.has(3)); + casper.echo(casper.cli.get(3)); + casper.echo(casper.cli.has("foo")); + casper.echo(casper.cli.get("foo")); + casper.cli.drop("foo"); + casper.echo(casper.cli.has("foo")); + casper.echo(casper.cli.get("foo")); + casper.exit(); + +Execution results: + +.. code-block:: text + + $ casperjs test.js arg1 arg2 arg3 --foo=bar --plop anotherarg + true + arg1 + true + anotherarg + true + bar + false + undefined + +.. hint:: + + What if you want to check if any arg or option has been passed to your script? Here you go:: + + // removing default options passed by the Python executable + casper.cli.drop("cli"); + casper.cli.drop("casper-path"); + + if (casper.cli.args.length === 0 && Object.keys(casper.cli.options).length === 0) { + casper.echo("No arg nor option passed").exit(); + } + +`casperjs` native options +------------------------- + +.. versionadded:: 1.1 + +.. index:: Logging, log levels, SlimerJS + +The `casperjs` command has three available options: + +- ``--direct``: to prints out log messages to the console +- ``--log-level=[debug|info|warning|error]`` to set the :ref:`logging level ` +- ``--engine=[phantomjs|slimerjs]`` to select the browser engine you want to use. CasperJS + supports PhantomJS (default) that runs Webkit, and SlimerJS that runs Gecko. + +.. warning:: + + .. deprecated:: 1.1 + + ``--direct`` option has been renamed to ``--verbose``, though ``--direct`` will still works, while is to be considered deprecated. + +Example: + +.. code-block:: text + + $ casperjs --verbose --log-level=debug myscript.js + +Last but not least, you can still use all PhantomJS standard CLI options as you would do with any other phantomjs script: + +.. code-block:: text + + $ casperjs --web-security=no --cookies-file=/tmp/mycookies.txt myscript.js + +.. hint:: + + To remember what the native phantomjs available cli options are, run the ``phantomjs --help`` command. + SlimerJS supports almost same options as PhantomJS. + +.. index:: Raw values + +Raw parameter values +-------------------- + +.. versionadded:: 1.0 + +By default, the cli object will process every passed argument & cast them to the appropriate detected type; example script:: + + var casper = require('casper').create(); + var utils = require('utils'); + + utils.dump(casper.cli.get('foo')); + + casper.exit(); + +If you run this script: + +.. code-block:: text + + $ casperjs c.js --foo=01234567 + 1234567 + +As you can see, the ``01234567`` value has been cast to a *Number*. + +Sometimes, you just want the original string; then you can use the ``raw`` property of the ``cli`` object, which contains the raw values passed parameters:: + + var casper = require('casper').create(); + var utils = require('utils'); + + utils.dump(casper.cli.get('foo')); + utils.dump(casper.cli.raw.get('foo')); + + casper.exit(); + +Sample usage: + +.. code-block:: text + + $ casperjs c.js --foo=01234567 + 1234567 + "01234567" + diff --git a/vendor/casperjs/docs/conf.py b/vendor/casperjs/docs/conf.py new file mode 100755 index 0000000..d1513dc --- /dev/null +++ b/vendor/casperjs/docs/conf.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- +# +# CasperJS documentation +# +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +from datetime import date + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.extlinks'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +highlight_language = 'javascript' + +# The suffix of source filenames. +source_suffix = '.rst' + +# Prolog +rst_prolog = None + +# The encoding of source files. +source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'CasperJS' +copyright = (u'2011-%d Nicolas Perriault and contributors. CasperJS logo by Jeremy Forveille' + % date.today().year) + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.1' +# The full version, including alpha/beta/rc tags. +release = '1.1.0-DEV' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build', 'README.md'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +#pygments_style = 'default' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'casperjs' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = ['_themes'] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +html_favicon = 'casperjs-favicon.ico' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +html_sidebars = { + '*': [ + 'globaltoc.html', + 'relations.html', + 'sourcelink.html', + 'searchbox.html', + 'addon.html' + ], + 'modules/*': [ + 'localtoc.html', + 'globaltoc.html', + 'relations.html', + 'sourcelink.html', + 'searchbox.html', + 'addon.html' + ], +} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'casper-docs' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'casperjs.tex', 'CasperJs Documentation', + 'Nicolas Perriault', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'casperjs', u'casperjs documentation', [u'Nicolas Perriault'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'CasperJS', u'CasperJS Documentation', + u'Nicolas Perriault', 'CasperJS', 'CasperJS docs.', 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +extlinks = { + 'issue': ('https://github.com/n1k0/casperjs/issues/%s', '#'), + 'repo': ('https://github.com/n1k0/casperjs/%s', ''), +} diff --git a/vendor/casperjs/docs/credits.rst b/vendor/casperjs/docs/credits.rst new file mode 100755 index 0000000..f0131d5 --- /dev/null +++ b/vendor/casperjs/docs/credits.rst @@ -0,0 +1,64 @@ +Credits +======= + +Author +------ + +CasperJS is mainly developed by `Nicolas Perriault `_ on its free time. + +If you want to thank him and/or sponsor the development of CasperJS, please consider donating (see links in the sidebar). + +Contributors +------------ + +These people have contributed to CasperJS: + +- Brikou CARRE +- Thomas Parisot +- Han Yu +- Chris Lorenzo +- Victor Yap +- Rob Barreca +- Tyler Ritchie +- Nick Rabinowitz +- Pascal Borreli +- Dave Lee +- Andrew Childs +- Solomon White +- Reina Sweet +- Jan Schaumann +- Elmar Langholz +- Clochix +- Donovan Hutchinson +- Julien Moulin +- Michael Geers +- Jason Funk +- Vladimir Chizhov +- Jean-Philippe Serafin +- snkashis +- Rafael +- Andrew de Andrade +- Ben Lowery +- Chris Winters +- Christophe Benz +- Harrison Reiser +- Jan Pochyla +- Jan-Martin Fruehwacht +- Julian Gruber +- Justin Slattery +- Justine Tunney +- KaroDidi +- Leandro Boscariol +- Maisons du monde +- Marcel Duran +- Mathieu Agopian +- Mehdi Kabab +- Mikko Peltonen +- Rafael Garcia +- Raphaël Benitte +- Tim Bunce + +Logo +---- + +CasperJS logo designed by `Jeremy Forveille `_ diff --git a/vendor/casperjs/docs/debugging.rst b/vendor/casperjs/docs/debugging.rst new file mode 100755 index 0000000..6cbbb4f --- /dev/null +++ b/vendor/casperjs/docs/debugging.rst @@ -0,0 +1,111 @@ +.. _debugging: + +.. index:: Bugs, Debugging + +========= +Debugging +========= + +.. contents:: A few tips for debugging your casper scripts: + :local: + + +Use the :index:`verbose` mode +----------------------------- + +By default & by design, a ``Casper`` instance won't print anything to the console. This can be very limitating & frustrating when creating or debugging scripts, so a good practice is to always start coding a script using these :index:`settings`:: + + var casper = require('casper').create({ + verbose: true, + logLevel: "debug" + }); + +The ``verbose`` setting will tell Casper to write every logged message at the ``logLevel`` logging level onto the standard output, so you'll be able to trace every step made. + +.. warning:: + + Output will then be pretty verbose, and will potentially display sensitive informations onto the console. **Use with care on production.** + + +Hook in the deep using :index:`events` +-------------------------------------- + +:doc:`Events ` are a very powerful features of CasperJS, and you should probably give it a look if you haven't already. + +Some interesting events you may eventually use to debug your scripts: + +- The ``http.status.XXX`` event will be emitted everytime a resource is sent with the `HTTP code `_ corresponding to ``XXX``; +- The ``remote.alert`` everytime an ``alert()`` call is performed client-side; +- ``remote.message`` everytime a message is sent to the client-side console; +- ``step.added`` everytime a step is added to the stack; +- etc… + +Listening to an event is dead easy:: + + casper.on('http.status.404', function(resource) { + this.log('Hey, this one is 404: ' + resource.url, 'warning'); + }); + +Ensure to check the :ref:`full list ` of all the other available events. + + +.. _debugging_dump: + +Dump serialized values to the console +------------------------------------- + +Sometimes it's helpful to inspect a variable, especially Object contents. The :ref:`utils_dump() ` function can achieve just that:: + + require('utils').dump({ + foo: { + bar: 42 + }, + }); + +.. note:: + + :ref:`utils_dump() ` won't be able to serialize function nor complex cyclic structures though. + + +Localize yourself in modules +---------------------------- + +.. warning:: + + .. deprecated:: 1.1 + + As of 1.1, CasperJS uses PhantomJS' builtin `require` and won't expose the `__file__` variable anymore. + +If you're creating Casper modules, a cool thing to know is that there's a special built-in variable available in every module, ``__file__``, which contains the absolute path to current javascript file (the module file). + + +Name your closures +------------------ + +Probably one of the most easy but effective best practice, always name your closures: + +**Hard to track:** + +:: + + casper.start('http://foo.bar/', function() { + this.evaluate(function() { + // ... + }); + }); + +**Easier:** + +:: + + casper.start('http://foo.bar/', function afterStart() { + this.evaluate(function evaluateStuffAfterStart() { + // ... + }); + }); + +That way, everytime one is failing, its name will be printed out in the :index:`stack trace`, **so you can more easily locate it within your code**. + +.. note:: + + This one also applies for all your other Javascript works, of course ;) diff --git a/vendor/casperjs/docs/events-filters.rst b/vendor/casperjs/docs/events-filters.rst new file mode 100755 index 0000000..3299fa3 --- /dev/null +++ b/vendor/casperjs/docs/events-filters.rst @@ -0,0 +1,591 @@ +.. _events_filters: + +Events & filters +================ + +CasperJS provides an `event handler <#events>`_ very similar to the `nodejs `_' `one `_; actually it borrows most of its codebase. CasperJS also adds `filters <#filters>`_, which are basically ways to alter values asynchronously. + + +.. index:: ! events + +Events +------ + +Using events is pretty much straightforward if you're a node developer, or if you worked with any evented system before:: + + var casper = require('casper').create(); + + casper.on('resource.received', function(resource) { + casper.echo(resource.url); + }); + +Emitting you own events ++++++++++++++++++++++++ + +Of course you can emit your own events, using the ``Casper.emit()`` method:: + + var casper = require('casper').create(); + + // listening to a custom event + casper.on('google.loaded', function() { + this.echo('Google page title is ' + this.getTitle()); + }); + + casper.start('http://google.com/', function() { + // emitting a custom event + this.emit('google.loaded'); + }); + + casper.run(); + +.. _events_list: + +Events reference +++++++++++++++++ + +``back`` +~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when the embedded browser is asked to go back a step in its history. + +``capture.saved`` +~~~~~~~~~~~~~~~~~ + +**Arguments:** ``targetFile`` + +Emitted when a :index:`screenshot` image has been captured. + +.. index:: click + +``click`` +~~~~~~~~~ + +**Arguments:** ``selector`` + +Emitted when the ``Casper.click()`` method has been called. + +``complete.error`` +~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``error`` + +.. versionadded:: 1.1 + +Emitted when a complete callback has errored. + +By default, CasperJS doesn't listen to this event, you have to declare your own listeners by hand:: + + casper.on('complete.error', function(err) { + this.die("Complete callback has failed: " + err); + }); + +``die`` +~~~~~~~ + +**Arguments:** ``message, status`` + +Emitted when the ``Casper.die()`` method has been called. + +.. index:: download + +``downloaded.file`` +~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``targetPath`` + +Emitted when a file has been downloaded by :ref:`Casper.download() `; ``target`` will contain the path to the downloaded file. + +.. index:: error + +``error`` +~~~~~~~~~ + +**Arguments:** ``msg, backtrace`` + +.. versionadded:: 0.6.9 + +Emitted when an error hasn't been explicitly caught within the CasperJS/PhantomJS environment. Do basically what PhantomJS' ``onError()`` native handler does. + +.. index:: exit + +``exit`` +~~~~~~~~ + +**Arguments:** ``status`` + +Emitted when the ``Casper.exit()`` method has been called. + +.. index:: fill + +``fill`` +~~~~~~~~ + +**Arguments:** ``selector, vals, submit`` + +Emitted when a form is filled using the ``Casper.fill()`` method. + +``forward`` +~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when the embedded browser is asked to go forward a step in its history. + +.. index:: auth + +``http.auth`` +~~~~~~~~~~~~~ + +**Arguments:** ``username, password`` + +Emitted when http authentication parameters are set. + +.. index:: HTTP + +``http.status.[code]`` +~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``resource`` + +Emitted when any given HTTP reponse is received with the status code specified by ``[code]``, eg.:: + + casper.on('http.status.404', function(resource) { + casper.echo(resource.url + ' is 404'); + }) + +``load.started`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when PhantomJS' ``WebPage.onLoadStarted`` event callback is called. + +``load.failed`` +~~~~~~~~~~~~~~~ + +**Arguments:** ``Object`` + +Emitted when PhantomJS' ``WebPage.onLoadFinished`` event callback has been called and failed. + +``load.finished`` +~~~~~~~~~~~~~~~~~ + +**Arguments:** ``status`` + +Emitted when PhantomJS' ``WebPage.onLoadFinished`` event callback is called. + +.. index:: log + +``log`` +~~~~~~~ + +**Arguments:** ``entry`` + +Emitted when the ``Casper.log()`` method has been called. The ``entry`` parameter is an Object like this:: + + { + level: "debug", + space: "phantom", + message: "A message", + date: "a javascript Date instance" + } + +..index:: click + +``mouse.click`` +~~~~~~~~~~~~~~~ + +**Arguments:** ``args`` + +Emitted when the mouse left-click something or somewhere. + +``mouse.down`` +~~~~~~~~~~~~~~ + +**Arguments:** ``args`` + +Emitted when the mouse presses on something or somewhere with the left button. + +``mouse.move`` +~~~~~~~~~~~~~~ + +**Arguments:** ``args`` + +Emitted when the mouse moves onto something or somewhere. + +``mouse.up`` +~~~~~~~~~~~~ + +**Arguments:** ``args`` + +Emitted when the mouse releases the left button over something or somewhere. + +``navigation.requested`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``url, navigationType, navigationLocked, isMainFrame`` + +.. versionadded:: 1.0 + +Emitted each time a navigation operation has been requested. Available navigation types are: ``LinkClicked``, ``FormSubmitted``, ``BackOrForward``, ``Reload``, ``FormResubmitted`` and ``Other``. + +.. index:: HTTP + +``open`` +~~~~~~~~ + +``location, settings`` + +Emitted when an HTTP request is sent. First callback arg is the location, second one is a request settings Object of the form:: + + { + method: "post", + data: "foo=42&chuck=norris" + } + +``page.created`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``page`` + +Emitted when PhantomJS' ``WebPage`` object used by CasperJS has been created. + +``page.error`` +~~~~~~~~~~~~~~ + +**Arguments:** ``message, trace`` + +Emitted when retrieved page leaves a Javascript error uncaught:: + + casper.on("page.error", function(msg, trace) { + this.echo("Error: " + msg, "ERROR"); + }); + +``page.initialized`` +~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``WebPage`` + +Emitted when PhantomJS' ``WebPage`` object used by CasperJS has been initialized. + +.. index:: HTTP + +``page.resource.received`` +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``response`` + +Emitted when the HTTP response corresponding to current required url has been received. + +.. index:: HTTP + +``page.resource.requested`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``request`` + +Emitted when a new HTTP request is performed to open the required url. + +.. versionadded:: 1.1 + +**Arguments:** ``requestData, request`` + +You can also abort requests:: + + casper.on('page.resource.requested', function(requestData, request) { + if (requestData.url.indexOf('http://adserver.com') === 0) { + request.abort(); + } + }); + +``popup.created`` +~~~~~~~~~~~~~~~~~ + +**Arguments:** ``WebPage`` + +Emitted when a new window has been opened. + +``popup.loaded`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``WebPage`` + +Emitted when a new window has been loaded. + +``popup.closed`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``WebPage`` + +Emitted when a new opened window has been closed. + +``popup.created`` +~~~~~~~~~~~~~~~~~ + +**Arguments:** ``WebPage`` + +Emitted when a new window has been opened. + +``remote.alert`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``message`` + +Emitted when a remote ``alert()`` call has been performed. + +``remote.callback`` +~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``data`` + +Emitted when a remote `window.callPhantom(data) `_ call has been performed. + +``remote.message`` +~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``msg`` + +Emitted when any remote console logging call has been performed. + +``resource.error`` +~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``resourceError`` + +Emitted when any requested resource fails to load properly. The received ``resourceError`` object has the following properties: + +- ``errorCode``: HTTP status code received +- ``url``: resource url + +``resource.received`` +~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``resource`` + +Emitted when any resource has been received. + +``resource.requested`` +~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``request`` + +Emitted when any resource has been requested. + +``run.complete`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when the whole series of steps in the stack have been executed. + +``run.start`` +~~~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when ``Casper.run()`` is called. + +``starting`` +~~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when ``Casper.start()`` is called. + +``started`` +~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when Casper has been started using ``Casper.start()``. + +``step.added`` +~~~~~~~~~~~~~~ + +**Arguments:** ``step`` + +Emitted when a new navigation step has been added to the stack. + +``step.complete`` +~~~~~~~~~~~~~~~~~ + +**Arguments:** ``stepResult`` + +Emitted when a navigation step has been executed. + +``step.created`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``fn`` + +Emitted when a new navigation step has been created. + +``step.error`` +~~~~~~~~~~~~~~ + +**Arguments:** ``error`` + +.. versionadded:: 1.1 + +Emitted when a step function has errored. + +By default, CasperJS doesn't listen to this event, you have to declare your own listeners by hand:: + + casper.on('step.error', function(err) { + this.die("Step has failed: " + err); + }); + +``step.start`` +~~~~~~~~~~~~~~ + +**Arguments:** ``step`` + +Emitted when a navigation step has been started. + +``step.timeout`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``[step, timeout]`` + +Emitted when a navigation step has been executed. + +``timeout`` +~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when the execution time of the script has reached the ``Casper.options.timeout`` value. + +``url.changed`` +~~~~~~~~~~~~~~~ + +**Arguments:** ``url`` + +.. versionadded:: 1.0 + +Emitted each time the current page url changes. + +.. index:: viewport + +``viewport.changed`` +~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``[width, height]`` + +Emitted when the viewport has been changed. + +``wait.done`` +~~~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when a ``Casper.wait()``\ *operation ends.* + +``wait.start`` +~~~~~~~~~~~~~~ + +**Arguments:** ``None`` + +Emitted when a ``Casper.wait()`` operation starts. + +``waitFor.timeout`` +~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``[timeout, details]`` + +Emitted when the execution time of a ``Casper.wait*()`` operation has exceeded the value of ``timeout``. + +``deatils`` is a property bag describing what was being waited on. For example, if ``waitForSelector`` timed out, ``details`` will have a ``selector`` string property that was the selector that did not show up in time. + + +.. index:: filters + +Filters +------- + +Filters allow you to alter some values asynchronously. Sounds obscure? Let's take a simple example and imagine you would like to alter every single url opened by CasperJS to append a ``foo=42`` query string parameter:: + + var casper = require('casper').create(); + + casper.setFilter('open.location', function(location) { + return /\?+/.test(location) ? location += "&foo=42" : location += "?foo=42"; + }); + +There you have it, every single requested url will have this appended. Let me bet you'll find far more interesting use cases than my silly one ;) + +Here'a the list of all available filters with their expected return value: + +Filters reference ++++++++++++++++++ + +.. index:: screenshot + +``capture.target_filename`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments:** ``args`` + +**Return type:** ``String`` + +Allows to alter the value of the filename where a screen capture should be stored. + +``echo.message`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``message`` + +**Return type:** ``String`` + +Allows to alter every message written onto stdout. + +``log.message`` +~~~~~~~~~~~~~~~ + +**Arguments:** ``message`` + +**Return type:** ``String`` + +Allows to alter every log message. + +``open.location`` +~~~~~~~~~~~~~~~~~ + +**Arguments:** ``args`` + +**Return type:** ``String`` + +Allows to alter every url before it being opened. + +``page.confirm`` +~~~~~~~~~~~~~~~~ + +**Arguments:** ``message`` + +**Return type:** ``Boolean`` + +.. versionadded:: 1.0 + +Allows to react on a javascript ``confirm()`` call:: + + casper.setFilter("page.confirm", function(msg) { + return msg === "Do you like vbscript?" ? false : true; + }); + +``page.prompt`` +~~~~~~~~~~~~~~~ + +**Arguments:** ``message, value`` + +**Return type:** ``String`` + +.. versionadded:: 1.0 + +Allows to react on a javascript ``prompt()`` call:: + + casper.setFilter("page.prompt", function(msg, value) { + if (msg === "What's your name?") { + return "Chuck"; + } + }); diff --git a/vendor/casperjs/docs/extending.rst b/vendor/casperjs/docs/extending.rst new file mode 100755 index 0000000..2455a68 --- /dev/null +++ b/vendor/casperjs/docs/extending.rst @@ -0,0 +1,138 @@ +.. _extending: + +.. index:: extending, inheritance, prototype + +========= +Extending +========= + +Sometimes it can be convenient to add your own methods to a ``Casper`` object instance; you can easily do so as illustrated in the example below:: + + var casper = require('casper').create({ + verbose: true, + logLevel: "debug" + }); + + var links = { + 'http://edition.cnn.com/': 0, + 'http://www.nytimes.com/': 0, + 'http://www.bbc.co.uk/': 0, + 'http://www.guardian.co.uk/': 0 + }; + + casper.countLinks = function() { + return this.evaluate(function() { + return __utils__.findAll('a[href]').length; + }); + }; + + casper.renderJSON = function(what) { + return this.echo(JSON.stringify(what, null, ' ')); + }; + + casper.start(); + + casper.each(Object.keys(links), function(casper, link) { + this.thenOpen(link, function() { + links[link] = this.countLinks(); + }); + }); + + casper.run(function() { + this.renderJSON(links).exit(); + }); + +But that's just plain old *monkey-patching* the ``casper`` object, and you may probably want a more OO approach… That's where the ``inherits()`` function from the ``utils`` module and ported from `nodejs `_ comes handy:: + + var Casper = require('casper').Casper; + var utils = require('utils'); + var links = { + 'http://edition.cnn.com/': 0, + 'http://www.nytimes.com/': 0, + 'http://www.bbc.co.uk/': 0, + 'http://www.guardian.co.uk/': 0 + }; + + function Fantomas() { + Fantomas.super_.apply(this, arguments); + } + + // Let's make our Fantomas class extending the Casper one + // please note that at this point, CHILD CLASS PROTOTYPE WILL BE OVERRIDEN + utils.inherits(Fantomas, Casper); + + Fantomas.prototype.countLinks = function() { + return this.evaluate(function() { + return __utils__.findAll('a[href]').length; + }); + }; + + Fantomas.prototype.renderJSON = function(what) { + return this.echo(JSON.stringify(what, null, ' ')); + }; + + var fantomas = new Fantomas({ + verbose: true, + logLevel: "debug" + }); + + fantomas.start(); + + Object.keys(links).forEach(function(url) { + fantomas.thenOpen(url, function() { + links[url] = this.countLinks(); + }); + }); + + fantomas.run(function() { + this.renderJSON(links).exit(); + }); + +.. note:: + + The use of the ``super_`` child class property which becomes available once its parent has been defined using ``inherits()``; it contains a reference to the parent constructor. + + **Don't forget to call ``Casper``'s parent constructor!** + + Of course this approach is bit more verbose than the easy *monkey-patching* one, so please ensure you're not just overengineering stuff by subclassing the ``Casper`` class. + + +.. index:: coffeescript + +Using CoffeeScript +~~~~~~~~~~~~~~~~~~ + +If you're writing your casper scripts using `CoffeeScript `_, extending casper is getting a bit more straightforward: + +.. code-block:: coffeescript + + links = + 'http://edition.cnn.com/': 0 + 'http://www.nytimes.com/': 0 + 'http://www.bbc.co.uk/': 0 + 'http://www.guardian.co.uk/': 0 + + class Fantomas extends require('casper').Casper + countLinks: -> + @evaluate -> + __utils__.findAll('a').length + + renderJSON: (what) -> + @echo JSON.stringify what, null, ' ' + + fantomas = new Fantomas + loadImages: false + logLevel: "debug" + verbose: true + + fantomas.start() + + for url of links + do (url) -> + fantomas.thenOpen url, -> + links[url] = @countLinks() + + fantomas.run -> + @renderJSON links + @exit() + diff --git a/vendor/casperjs/docs/faq.rst b/vendor/casperjs/docs/faq.rst new file mode 100755 index 0000000..43c5a40 --- /dev/null +++ b/vendor/casperjs/docs/faq.rst @@ -0,0 +1,360 @@ +.. _faq: + +.. index:: FAQ, Help + +=== +FAQ +=== + +.. contents:: Here's a selection of the most frequently asked questions by CasperJS newcomers: + :local: + :backlinks: top + +.. index:: Node.js + +Is CasperJS a `node.js `_ library? +------------------------------------------------------ + +**No.** CasperJS is written on top of PhantomJS_, which is a node-independent Qt_/WebKit_ based library. If you try to run your CasperJS script with node, it just won't work out of the box. + +.. hint:: If you want to drive CasperJS from node, try `SpookyJS `_. + + +.. index:: Bugs, Contributing, error + +I'm stuck! I think there's a bug! What can I do? +------------------------------------------------ + +Before rage-tweeting: + +1. Read the `docs `_ +2. Check if an `issue `_ has been open about your problem already +3. Check you're running the `latest stable tag `_ +4. Check you're running the `latest version `_ of PhantomJS_ +5. Ask on the `project mailing list `_: + + a. try to post a reproducible, minimal test case + b. compare casperjs results with native phantomjs ones + c. if the problem also occurs with native phantomjs, ask on `phantomjs mailing list `_ + +6. Eventually, `file an issue `_. + + +.. index:: Testing + +The ``casper.test`` property is undefined, I can't write any test! +------------------------------------------------------------------ + +That's because as of 1.1, the ``casper.test`` property is only set to a :doc:`Tester ` instance when using the ``casperjs test`` subcommand. + +You may want to read the :doc:`testing documentation ` for more information. + + +.. index:: Code reuse + +I keep copy and pasting stuff in my test scripts, that's boring +--------------------------------------------------------------- + +Have a look at `this gist `_, it might help. + +Also, don't forget that CasperJS supports a `CommonJS-compliant module pattern `_ implementation. + +.. note:: + + CasperJS' implementation of ``require()`` differs a bit from the one provided by PhantomJS_, but I personnaly never really encountered any functional difference. + + +.. index:: Versionning + +What is the versioning policy of CasperJS? +------------------------------------------ + +Releases will follow the `SemVer standard `_; they +will be numbered with the follow format: + +.. code-block:: text + + ..[-] + +And constructed with the following guidelines: + +- Breaking backwards compatibility bumps the major +- New additions without breaking backwards compatibility bumps the minor +- Bug fixes and misc changes bump the patch +- Unstable, special and trunk versions will have a proper identifier + + +.. index:: jQuery + +Can I use jQuery with CasperJS? +------------------------------- + +Sure, you can use `jQuery `_, as every single other javascript library on Earth. + +A first solution is to inject it into the remote DOM environment by hand using the standard ``WebPage.injectJs()`` method:: + + casper.page.injectJs('/path/to/jquery.js'); + +If you need jQuery being available everytime, you can also make it being injected in every received response by setting the ``clientScripts`` option of CasperJS:: + + var casper = require('casper').create({ + clientScripts: ["includes/jquery.min.js"] + }); + +.. note:: + + You can't *inject* scripts using the HTTP protocol, you actually have to use a relative/absolute filesystem path to the script resource. + + +.. index:: Windows, Python, Ruby + +Can I use CasperJS without using the ``casperjs`` executable? +------------------------------------------------------------- + +Yes, you can call a CasperJS script directly with the ``phantomjs`` +executable, but if you do so, you must set the ``phantom.casperPath`` +property to the path where the library root is located on your system:: + + // casperscript.js + phantom.casperPath = '/path/to/casperjs'; + phantom.injectJs(phantom.casperPath + '/bin/bootstrap.js'); + + var casper = require('casper').create(); + // ... + +You can run such a script like any other standard PhantomJS_ script:: + + $ phantomjs casperscript.js + +**If you're on Windows**, this is the way you may manage to get casper +working the most easily:: + + phantom.casperPath = 'C:\\path\\to\\your\\repo\\lib\\casperjs-0.6.X'; + phantom.injectJs(phantom.casperPath + '\\bin\\bootstrap.js'); + + var casper = require('casper').create(); + + // do stuff + + +.. index:: HTTP + +How can I catch HTTP 404 and other status codes? +------------------------------------------------ + +You can define your own `HTTP status +code `_ handlers +by using the ``httpStatusHandlers`` option of the Casper object. You can +also catch other HTTP status codes as well, as demoed below:: + + var casper = require('casper').create(); + + casper.on('http.status.404', function(resource) { + this.echo('wait, this url is 404: ' + resource.url); + }); + + casper.on('http.status.500', function(resource) { + this.echo('woops, 500 error: ' + resource.url); + }); + + casper.start('http://mywebsite/404', function() { + this.echo('We suppose this url return an HTTP 404'); + }); + + casper.thenOpen('http://mywebsite/500', function() { + this.echo('We suppose this url return an HTTP 500'); + }); + + casper.run(function() { + this.echo('Done.').exit(); + }); + +.. hint:: + + Check out all the other cool :doc:`events ` you may use as well. + + +.. index:: log, Logging + +Where does CasperJS write its logfile? +-------------------------------------- + +Nowhere. CasperJS doesn't write logs on the filesystem. You have to implement this by yourself if needed. + + +.. index:: __utils__, AJAX + +What's this mysterious ``__utils__`` object? +-------------------------------------------- + +The ``__utils__`` object is actually a :ref:`ClientUtils object ` which have been automatically injected into the page DOM and is therefore alway available. + +So everytime to perform an :ref:`evaluate() ` call, you have this instance available to perform common operation like: + +- fetching nodes using CSS3 or XPath selectors, +- retrieving information about element properties (attributes, size, bounds, etc.), +- sending AJAX requests, +- triggering DOM events + +Check out the :doc:`whole API `. You even have :ref:`a bookmarklet ` to play around with this ``__utils__`` instance right within your browser console! + +.. note:: + + You're not obliged at all to use the ``__utils__`` instance in your scripts. It's just there because it's used by CasperJS internals. + + +.. index:: Step stack, Asynchronicity + +How does ``then()`` and the step stack work? +-------------------------------------------- + +Disclaimer This entry is based on an `answer I made on Stack Overflow `_. + +The ``then()`` method basically adds a new navigation step in a stack. A step is a javascript function which can do two different things: + +1. waiting for the previous step - if any - being executed +2. waiting for a requested url and related page to load + +Let's take a simple navigation scenario:: + + var casper = require('casper').create(); + + casper.start(); + + casper.then(function step1() { + this.echo('this is step one'); + }); + + casper.then(function step2() { + this.echo('this is step two'); + }); + + casper.thenOpen('http://google.com/', function step3() { + this.echo('this is step 3 (google.com is loaded)'); + }); + +You can print out all the created steps within the stack like this:: + + require('utils').dump(casper.steps.map(function(step) { + return step.toString(); + })); + +That gives:: + + $ casperjs test-steps.js + [ + "function step1() { this.echo('this is step one'); }", + "function step2() { this.echo('this is step two'); }", + "function _step() { this.open(location, settings); }", + "function step3() { this.echo('this is step 3 (google.com is loaded)'); }" + ] + +Notice the ``_step()`` function which has been added automatically by CasperJS to load the url for us; when the url is loaded, the next step available in the stack — which is ``step3()`` — is *then* called. + +When you have defined your navigation steps, ``run()`` executes them one by one sequentially:: + + casper.run(); + +.. note:: The callback/listener stuff is an implementation of the `Promise pattern `_. + +.. _faq_web_security: + +.. index:: Web security, download, CORS + +I'm having hard times downloading files using ``download()`` +------------------------------------------------------------ + +You should try to disable `web security`. Using the ``--web-security`` command line option: + +.. code-block:: text + + $ casperjs --web-security=no myscript.js + +Within code:: + + var casper = require('casper').create({ + pageSettings: { + webSecurityEnabled: false + } + }); + +Or anytime:: + + casper.page.settings.webSecurityEnabled = false; + +Is it possible to achieve parallel browsing using CasperJS? +----------------------------------------------------------- + +`Officially no `_, but you may want to try. + + +Can I access & manipulate DOM elements directly from the CasperJS environment? +------------------------------------------------------------------------------ + +No. Like in PhantomJS, you have to use :ref:`Casper#evaluate() ` to access actual page DOM and manipulate elements. + +For example, you **can't** do this:: + + // this won't work + casper.then(function() { + var titleNode = document.querySelector('h1'); + this.echo('Title is: ' + titleNode.textContent); + titleNode.textContent = 'New title'; + this.echo('Title is now: ' + titleNode.textContent); + }); + +You have to use the :ref:`Casper#evaluate() ` method in order to communicate with the page DOM:: + + // this will + casper.then(function() { + var titleText = this.evaluate(function() { + return document.querySelector('h1').textContent; + }); + this.echo('Title is: ' + titleText); + this.evaluate(function() { + document.querySelector('h1').textContent = 'New title'; + }); + this.echo('Title is now: ' + this.evaluate(function() { + return document.querySelector('h1').textContent; + })); + }); + +Of course, it's a whole lot more verbose, but Casper provides convenient methods to ease accessing elements properties, eg. :ref:`Casper#fetchText() ` and :ref:`Casper#getElementInfo() `:: + + // this will + casper.then(function() { + this.echo('Title is: ' + this.fetchText('h1')); + this.evaluate(function() { + document.querySelector('h1').textContent = 'New title'; + }); + this.echo('Element HTML is now: ' + this.getElementInfo('h1').html); + }); + +.. _faq_test_casper_instance: + +Why can't I create a new `casper` instance in a test environment? +----------------------------------------------------------------- + +The `casperjs test` :ref:`subcommand ` is a convenient utility which bootstraps and configures a :ref:`test environment ` for you, so a preconfigured `casper` object is already available in your test script when using this command. + +As of 1.1-beta3, you're prevented to override this preconfigured instance at this practice prevents the test runner to work properly. If you try to create a new casper instance in a test script, you'll get an error and CasperJS will exit with an error message with a link pointing to the documentation. + +One may argue this is mostly related to some hostorical bad design decision, and she might be true. This behavior is not likely exist anymore in a future 2.0. + +.. _faq_javascript: + +Okay, honestly, I'm stuck with Javascript. +------------------------------------------ + +Don't worry, you're not alone. Javascript is a great language, but it's far more difficult to master than one might expect at first look. + +Here are some great resources to get started efficiently with the language: + +- Learn and practice Javascript online at `Code Academy `_ +- `Eloquent Javascript `_ +- `JavaScript Enlightenment `_ (PDF) +- last, a `great tutorial on Advanced Javascript Techniques `_ by John Resig, the author of jQuery. If you master this one, you're almost done with the language. + +.. _PhantomJS: http://phantomjs.org/ +.. _Qt: http://qt.digia.com/ +.. _WebKit: http://www.webkit.org/ diff --git a/vendor/casperjs/docs/index.rst b/vendor/casperjs/docs/index.rst new file mode 100755 index 0000000..334dd7f --- /dev/null +++ b/vendor/casperjs/docs/index.rst @@ -0,0 +1,46 @@ +====================== +CasperJS documentation +====================== + +CasperJS_ is a navigation scripting & testing utility for the PhantomJS_ (WebKit) and SlimerJS_ (Gecko) headless browsers, written in Javascript. + +.. figure:: _static/images/casperjs-logo.png + :align: right + +.. toctree:: + :maxdepth: 2 + + installation + quickstart + cli + selectors + testing + modules/index + writing_modules + events-filters + logging + extending + debugging + faq + changelog + upgrading/index + credits + license + +You can also search the :ref:`genindex` if you're looking for something particular. + +.. index:: Community, Contributing, Help, Support + +Community +--------- + +- `get the code `_ and `contribute `_ +- join the `mailing list `_ +- check out `the ecosystem `_ +- follow `@casperjs\_org `_ on Twitter +- there's also a `Google+ account `_ (not much updated though) + + +.. _CasperJS: http://casperjs.org/ +.. _PhantomJS: http://phantomjs.org/ +.. _SlimerJS: http://slimerjs.org/ diff --git a/vendor/casperjs/docs/installation.rst b/vendor/casperjs/docs/installation.rst new file mode 100755 index 0000000..4766a50 --- /dev/null +++ b/vendor/casperjs/docs/installation.rst @@ -0,0 +1,187 @@ +.. _installation: +.. index:: Installation + +============ +Installation +============ + +CasperJS can be installed on Mac OSX, Windows and most Linuxes. + +Prerequisites +------------- + +.. index:: PhantomJS, Python, SlimerJS + +- PhantomJS_ 1.8.1 or greater. Installation instructions can be found `here `_ +- Python_ 2.6 or greater for ``casperjs`` in the ``bin/`` directory +- .NET Framework 3.5 or greater (or Mono_ 2.10.8 or greater) for ``casperjs.exe`` in the ``bin/`` directory + +.. versionadded:: 1.1 + +- **Experimental:** as of 1.1-beta1, SlimerJS_ 0.8 or greater to run your tests against Gecko (Firefox) instead of Webkit. To see PhantomJS API compatibility of SlimerJS, please `refer to this page `_. + +.. warning:: + + .. deprecated:: 1.1 + + The `Ruby `_ version of the ``casperjs`` executable also available in the ``rubybin/`` directory has been deprecated as of 1.1-beta, and is not compatible with SlimerJS_. + + The batch version of the ``casperjs`` executable also available in the ``batchbin/`` directory has been deprecated as of 1.1-beta, and is not compatible with SlimerJS_. + +.. index:: Homebrew + +Installing from Homebrew (OSX) +------------------------------ + +Installation of both PhantomJS and CasperJS can be achieved using Homebrew_, a popular package manager for Mac OS X. + +Above all, don't forget to update Formulaes:: + + $ brew update + +For the 1.1 development version (recommended):: + + $ brew install casperjs --devel + +For the 1.0.x stable version:: + + $ brew install casperjs + +If you have already installed casperjs and want to have the last release (stable|devel), use ``upgrade``:: + + $ brew upgrade casperjs + +Upgrade only update to the latest release branch (1.0.x|1.1-dev). + +.. index:: git + +Installing from git +------------------- + +Installation can be achieved using `git `_. The code is mainly hosted on `Github `_. + +From the master branch +~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: text + + $ git clone git://github.com/n1k0/casperjs.git + $ cd casperjs + $ ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs + +Once PhantomJS and CasperJS installed on your machine, you should obtain something like this: + +.. code-block:: text + + $ phantomjs --version + 1.8.1 + $ casperjs + CasperJS version 1.1.0-DEV at /Users/niko/Sites/casperjs, using phantomjs version 1.8.1 + # ... + +Or if SlimerJS is your thing: + +.. code-block:: text + + $ slimerjs --version + Innophi SlimerJS 0.8pre, Copyright 2012-2013 Laurent Jouanneau & Innophi + $ casperjs + CasperJS version 1.1.0-DEV at /Users/niko/Sites/casperjs, using slimerjs version 0.8.0 + +You are now ready to write your :doc:`first script `! + + +Installing from an archive +-------------------------- + +You can download tagged archives of CasperJS code: + +**Latest stable version:** + +- https://github.com/n1k0/casperjs/zipball/1.0.3 (zip) +- https://github.com/n1k0/casperjs/tarball/1.0.3 (tar.gz) + +**Latest development version (master branch):** + +- https://github.com/n1k0/casperjs/zipball/master (zip) +- https://github.com/n1k0/casperjs/tarball/master (tar.gz) + +Operations are then the same as with a git checkout. + + +.. index:: Windows + +CasperJS on Windows +------------------- + +Phantomjs installation additions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Append ``";C:\phantomjs"`` to your ``PATH`` environment variable. +- Modify this path appropriately if you installed PhantomJS to a different location. + +Casperjs installation additions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**CasperJS, as of 1.1-beta3, ships with a .NET application so you don't need Python nor Ruby to use it.** + +.. versionadded:: 1.1-beta3 + +- Append ``";C:\casperjs\bin"`` to your ``PATH`` environment variable. +- Modify this path appropriately if you installed CasperJS to a different location. + +You can now run any regular casper scripts that way: + +.. code-block:: text + + C:> casperjs myscript.js + +Earlier versions of CasperJS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**CasperJS, as of 1.0.0-RC3, ships with a Batch script so you don't need Python nor Ruby to use it.** + +- Append ``";C:\casperjs\batchbin"`` to your ``PATH`` environment variable. +- Modify this path appropriately if you installed CasperJS to a different location. + +You can now run any regular casper scripts that way: + +.. code-block:: text + + C:> casperjs.bat myscript.js + +**Before 1.0.0-RC3, you had to setup your casper scripts that way::** + + phantom.casperPath = 'C:\\casperjs-1.1'; + phantom.injectJs(phantom.casperPath + '\\bin\\bootstrap.js'); + + var casper = require('casper').create(); + + // do stuff + +Run the script using the ``phantom.exe`` program: + +.. code-block:: text + + C:> phantomjs.exe myscript.js + +.. note:: + + .. versionadded:: 1.1-beta1 + + Windows users will get colorized output if ansicon_ is installed. + + +.. index:: Bugs, REPL + +Known Bugs & Limitations +------------------------ + +- Due to its asynchronous nature, CasperJS doesn't work well with `PhantomJS' REPL `_. + +.. _Homebrew: http://mxcl.github.com/homebrew/ +.. _PhantomJS: http://phantomjs.org/ +.. _Python: http://python.org/ +.. _SlimerJS: http://slimerjs.org/ +.. _ansicon: https://github.com/adoxa/ansicon +.. _Mono: http://www.mono-project.com/ diff --git a/vendor/casperjs/docs/license.rst b/vendor/casperjs/docs/license.rst new file mode 100755 index 0000000..ab826fb --- /dev/null +++ b/vendor/casperjs/docs/license.rst @@ -0,0 +1,29 @@ +.. _license: + +.. index:: Licensing + +======= +License +======= + +`CasperJS `_ is released under the terms of the +`MIT license `_. + +:: + + Copyright (c) 2011-{{year}} Nicolas Perriault + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. diff --git a/vendor/casperjs/docs/logging.rst b/vendor/casperjs/docs/logging.rst new file mode 100755 index 0000000..6864f32 --- /dev/null +++ b/vendor/casperjs/docs/logging.rst @@ -0,0 +1,69 @@ +.. _logging: + +.. index:: Logging, log levels + +======= +Logging +======= + +CasperJS allows logging using the :ref:`casper.log() ` method and these standard event levels: + +- ``debug`` +- ``info`` +- ``warning`` +- ``error`` + +Sample use:: + + var casper = require('casper').create(); + casper.log('plop', 'debug'); + casper.log('plip', 'warning'); + +.. index:: verbose + +Now, there are two things to distinguish: log *storage* and log *display*; by default CasperJS won't print the logs to the standard output. In order to do so, you must enable the ``verbose`` Casper option:: + + var casper = require('casper').create({ + verbose: true + }); + +Also, by default Casper is configured to filter logging which is under the ``error`` level; you can override this setting by configuring the ``logLevel`` option:: + + var casper = require('casper').create({ + verbose: true, + logLevel: 'debug' + }); + +You can also dump a JSON log of your Casper suite just by rendering the contents of the ``Casper.logs`` property:: + + var casper = require('casper').create({ + // ... + casper.run(function() { + require('utils').dump(this.logs); + this.exit(); + }); + +Last, if you print log messages to the standard output using the ``verbose`` option, you'll get some fancy colors:: + + var casper = require('casper').create({ + verbose: true, + logLevel: 'debug' + }) + casper.log('this is a debug message', 'debug'); + casper.log('and an informative one', 'info'); + casper.log('and a warning', 'warning'); + casper.log('and an error', 'error'); + casper.exit(); + +This will give the following output: + +.. figure:: _static/images/logoutput.png + :align: center + :alt: image + + image + + +.. hint:: + + CasperJS doesn't write logs on the filesystem. You have to implement this by yourself if needed. diff --git a/vendor/casperjs/docs/modules/casper.rst b/vendor/casperjs/docs/modules/casper.rst new file mode 100755 index 0000000..bdafbf4 --- /dev/null +++ b/vendor/casperjs/docs/modules/casper.rst @@ -0,0 +1,2289 @@ +.. _casper_module: + +===================== +The ``casper`` module +===================== + +.. index:: Casper + +The ``Casper`` class +++++++++++++++++++++ + +The easiest way to get a casper instance is to use the module's ``create()`` method:: + + var casper = require('casper').create(); + +But you can also retrieve the main Function and instantiate it by yourself:: + + var casper = new require('casper').Casper(); + +.. hint:: + + Also, check out :doc:`how to extend Casper with your own methods <../extending>`. + +Both the ``Casper`` constructor and the ``create()`` function accept a single ``options`` argument which is a standard javascript object:: + + var casper = require('casper').create({ + verbose: true, + logLevel: "debug" + }); + +.. _casper_options: + +.. index:: Casper options, options + +``Casper.options`` +++++++++++++++++++ + +An ``options`` object can be passed to the ``Casper`` constructor, eg.:: + + var casper = require('casper').create({ + clientScripts: [ + 'includes/jquery.js', // These two scripts will be injected in remote + 'includes/underscore.js' // DOM on every request + ], + pageSettings: { + loadImages: false, // The WebPage instance used by Casper will + loadPlugins: false // use these settings + }, + logLevel: "info", // Only "info" level messages will be logged + verbose: true // log messages will be printed out to the console + }); + +You can also alter options at runtime:: + + var casper = require('casper').create(); + casper.options.waitTimeout = 1000; + +The whole list of available options is detailed below. + +.. index:: Client scripts + +.. _casper_option_clientscripts: + +``clientScripts`` +------------------------------------------------------------------------------- + +**Type:** ``Array`` + +**Default:** ``[]`` + +A collection of script filepaths to include in every page loaded + +.. index:: exit, error + +``exitOnError`` +------------------------------------------------------------------------------- + +**Type:** ``Boolean`` + +**Default:** ``true`` + +Sets if CasperJS must exit when an uncaught error has been thrown by the script. + +.. index:: HTTP + +``httpStatusHandlers`` +------------------------------------------------------------------------------- + +**Type:** ``Object`` + +**Default:** ``{}`` + +A javascript Object containing functions to call when a requested resource has a given HTTP status code. A dedicated sample is provided as an example. + +.. index:: Logging + +``logLevel`` +------------------------------------------------------------------------------- + +**Type:** ``String`` + +**Default:** ``"error"`` + +Logging level (see the logging section for more information) + +``onAlert`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +A function to be called when a javascript alert() is triggered + +``onDie`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +A function to be called when Casper#die() is called + +.. index:: error, Error handling + +``onError`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +A function to be called when an "error" level event occurs + +.. index:: error, Error handling + +``onLoadError`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +A function to be called when a requested resource cannot be loaded + +``onPageInitialized`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +A function to be called after ``WebPage`` instance has been initialized + +.. index:: HTTP + +``onResourceReceived`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +Proxy method for PhantomJS' ``WebPage#onResourceReceived()`` callback, but the current Casper instance is passed as first argument. + +.. index:: HTTP + +``onResourceRequested`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +Proxy method for PhantomJS' WebPage#onResourceRequested() callback, but the current Casper instance is passed as first argument. + +.. index:: Step stack + +``onStepComplete`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``null`` + +A function to be executed when a step function execution is finished. + +.. index:: Step stack, Error handling, timeout + +``onStepTimeout`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``Function`` + +A function to be executed when a step function execution time exceeds the value of the stepTimeout option, if any has been set. + +By default, on timeout the script will exit displaying an error, except in test environment where it will just add a failure to the suite results. + +.. index:: Error handling, timeout + +``onTimeout`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``Function`` + +A function to be executed when script execution time exceeds the value of the timeout option, if any has been set. + +By default, on timeout the script will exit displaying an error, except in test environment where it will just add a failure to the suite results. + +.. index:: Error handling, timeout + +``onWaitTimeout`` +------------------------------------------------------------------------------- + +**Type:** ``Function`` + +**Default:** ``Function`` + +A function to be executed when a ``waitFor*`` function execution time exceeds the value of the waitTimeout option, if any has been set. + +By default, on timeout the script will exit displaying an error, except in test environment where it will just add a failure to the suite results. + +``page`` +------------------------------------------------------------------------------- + +**Type:** ``WebPage`` + +**Default:** ``null`` + +An existing PhantomJS ``WebPage`` instance + +.. index:: settings, PhantomJS, SSL, auth, XSS + +``pageSettings`` +------------------------------------------------------------------------------- + +**Type:** ``Object`` + +**Default:** ``{}`` + +PhantomJS's WebPage settings object. Available settings are: + +- ``javascriptEnabled`` defines whether to execute the script in the page or not (default to ``true``) +- ``loadImages`` defines whether to load the inlined images or not +- ``loadPlugins`` defines whether to load NPAPI plugins (Flash, Silverlight, …) or not +- ``localToRemoteUrlAccessEnabled`` defines whether local resource (e.g. from file) can access remote URLs or not (default to ``false``) +- ``userAgent`` defines the user agent sent to server when the web page requests resources +- ``userName`` sets the user name used for HTTP authentication +- ``password`` sets the password used for HTTP authentication +- ``XSSAuditingEnabled`` defines whether load requests should be monitored for cross-site scripting attempts (default to ``false``) + +.. index:: Remote scripts + +``remoteScripts`` +------------------------------------------------------------------------------- + +**Type:** ``Array`` + +**Default:** ``[]`` + +.. versionadded:: 1.0 + +A collection of remote script urls to include in every page loaded + +.. index:: Logging + +``safeLogs`` +------------------------------------------------------------------------------- + +**Type:** ``Boolean`` + +**Default:** ``true`` + +.. versionadded:: 1.0 + +When this option is set to true — which is the default, any password information entered in will be obfuscated in log messages. Set safeLogs to false to disclose passwords in plain text (not recommended). + +.. index:: Step stack, timeout + +``silentErrors`` +------------------------------------------------------------------------------- + +**Type:** ``Boolean`` + +**Default:** ``false`` + +When this option is enabled, caught step errors are not thrown (though related events are still emitted). Mostly used internally in a testing context. + +.. index:: timeout + +``stepTimeout`` +------------------------------------------------------------------------------- + +**Type:** ``Number`` + +**Default:** ``null`` + +Max step timeout in milliseconds; when set, every defined step function will have to execute before this timeout value has been reached. You can define the onStepTimeout() callback to catch such a case. By default, the script will die() with an error message. + +.. index:: timeout + +``timeout`` +------------------------------------------------------------------------------- + +**Type:** ``Number`` + +**Default:** ``null`` + +Max timeout in milliseconds + +.. index:: verbose + +``verbose`` +------------------------------------------------------------------------------- + +**Type:** ``Boolean`` + +**Default:** ``false`` + +Realtime output of log messages + +.. index:: viewport + +``viewportSize`` +------------------------------------------------------------------------------- + +**Type:** ``Object`` + +**Default:** ``null`` + +Viewport size, eg. ``{width: 800, height: 600}`` + +.. note:: + + PhantomJS ships with a default viewport of 400x300, and CasperJS won't override it by default. + +.. index:: timeout + +``retryTimeout`` +------------------------------------------------------------------------------- + +**Type:** ``Number`` + +**Default:** ``100`` + +Default delay between attempts, for ``wait*`` family functions. + +``waitTimeout`` +------------------------------------------------------------------------------- + +**Type:** ``Number`` + +**Default:** ``5000`` + +Default wait timeout, for ``wait*`` family functions. + + +``Casper`` prototype +++++++++++++++++++++ + +``back()`` +------------------------------------------------------------------------------- + +**Signature:** ``back()`` + +Moves back a step in browser's history:: + + casper.start('http://foo.bar/1') + casper.thenOpen('http://foo.bar/2'); + casper.thenOpen('http://foo.bar/3'); + casper.back(); + casper.run(function() { + console.log(this.getCurrentUrl()); // 'http://foo.bar/2' + }); + +Also have a look at `forward()`_. + +.. _casper_base64encode: + +.. index:: Base64 + +``base64encode()`` +------------------------------------------------------------------------------- + +**Signature:** ``base64encode(String url [, String method, Object data])`` + +Encodes a resource using the base64 algorithm synchronously using +client-side XMLHttpRequest. + +.. note:: + + We cannot use ``window.btoa()`` because it fails miserably in the version of WebKit shipping with PhantomJS. + +Example: retrieving google logo image encoded in base64:: + + var base64logo = null; + casper.start('http://www.google.fr/', function() { + base64logo = this.base64encode('http://www.google.fr/images/srpr/logo3w.png'); + }); + + casper.run(function() { + this.echo(base64logo).exit(); + }); + +You can also perform an HTTP POST request to retrieve the contents to +encode:: + + var base64contents = null; + casper.start('http://domain.tld/download.html', function() { + base64contents = this.base64encode('http://domain.tld/', 'POST', { + param1: 'foo', + param2: 'bar' + }); + }); + + casper.run(function() { + this.echo(base64contents).exit(); + }); + +.. index:: bypass, Step stack + +``bypass()`` +------------------------------------------------------------------------------- + +**Signature:** ``bypass(Numbr nb)`` + +.. versionadded:: 1.1 + +Bypasses a given number of defined navigation steps:: + + casper.start(); + casper.then(function() { + // This step will be executed + }); + casper.then(function() { + this.bypass(2); + }); + casper.then(function() { + // This test won't be executed + }); + casper.then(function() { + // Nor this one + }); + casper.run(); + +.. _casper_click: + +.. index:: click + +``click()`` +------------------------------------------------------------------------------- + +**Signature:** ``click(String selector)`` + +Performs a click on the element matching the provided :doc:`selector expression <../selectors>`. The method tries two strategies sequentially: + +1. trying to trigger a MouseEvent in Javascript +2. using native QtWebKit event if the previous attempt failed + +Example:: + + casper.start('http://google.fr/'); + + casper.thenEvaluate(function(term) { + document.querySelector('input[name="q"]').setAttribute('value', term); + document.querySelector('form[name="f"]').submit(); + }, 'CasperJS'); + + casper.then(function() { + // Click on 1st result link + this.click('h3.r a'); + }); + + casper.then(function() { + console.log('clicked ok, new location is ' + this.getCurrentUrl()); + }); + + casper.run(); + +.. index:: click + +``clickLabel()`` +------------------------------------------------------------------------------- + +**Signature:** ``clickLabel(String label[, String tag])`` + +.. versionadded:: 0.6.1 + +Clicks on the first DOM element found containing ``label`` text. Optionaly ensures that the element node name is ``tag``:: + + // My link is beautiful + casper.then(function() { + this.clickLabel('My link is beautiful', 'a'); + }); + + // + casper.then(function() { + this.clickLabel('But my button is sexier', 'button'); + }); + +.. index:: screenshot + +``capture()`` +------------------------------------------------------------------------------- + +**Signature:** ``capture(String targetFilepath, [Object clipRect, Object imgOptions])`` + +Proxy method for PhantomJS' ``WebPage#render``. Adds a ``clipRect`` parameter for automatically setting page ``clipRect`` setting and reverts it back once done:: + + casper.start('http://www.google.fr/', function() { + this.capture('google.png', { + top: 100, + left: 100, + width: 500, + height: 400 + }); + }); + + casper.run(); + +.. versionadded:: 1.1 + +The ``imgOptions`` object allows to specify two options: + +- ``format`` to set the image format manually, avoiding relying on the filename +- ``quality`` to set the image quality, from 1 to 100 + +Example:: + + casper.start('http://foo', function() { + this.capture('foo', undefined, { + format: 'jpg', + quality: 75 + }); + }); + +.. index:: screenshot, Base64 + +``captureBase64()`` +------------------------------------------------------------------------------- + +**Signature:** ``captureBase64(String format[, Mixed area])`` + +.. versionadded:: 0.6.5 + +Computes the `Base64 `_ representation of a binary image capture of the current page, or an area within the page, in a given format. + +Supported image formats are ``bmp``, ``jpg``, ``jpeg``, ``png``, ``ppm``, ``tiff``, ``xbm`` and ``xpm``. + +The ``area`` argument can be either of the following types: + +- ``String``: area is a CSS3 selector string, eg. ``div#plop form[name="form"] input[type="submit"]`` +- ``clipRect``: area is a clipRect object, eg. ``{"top":0,"left":0,"width":320,"height":200}`` +- ``Object``: area is a :doc:`selector object <../selectors>`, eg. an XPath selector + +Example:: + + casper.start('http://google.com', function() { + // selector capture + console.log(this.captureBase64('png', '#lga')); + // clipRect capture + console.log(this.captureBase64('png', { + top: 0, + left: 0, + width: 320, + height: 200 + })); + // whole page capture + console.log(this.captureBase64('png')); + }); + + casper.run(); + +.. _casper_captureselector: + +.. index:: screenshot + +``captureSelector()`` +------------------------------------------------------------------------------- + +**Signature:** ``captureSelector(String targetFile, String selector [, Object imgOptions])`` + +Captures the page area containing the provided selector and saves it to ``targetFile``:: + + casper.start('http://www.weather.com/', function() { + this.captureSelector('weather.png', '#wx-main'); + }); + + casper.run(); + +.. versionadded:: 1.1 + +The ``imgOptions`` object allows to specify two options: + +- ``format`` to set the image format manually, avoiding relying on the target filename +- ``quality`` to set the image quality, from 1 to 100 + +``clear()`` +------------------------------------------------------------------------------- + +**Signature:** ``clear()`` + +.. versionadded:: 0.6.5 + +Clears the current page execution environment context. Useful to avoid having previously loaded DOM contents being still active. + +Think of it as a way to stop javascript execution within the remote DOM environment:: + + casper.start('http://www.google.fr/', function() { + this.clear(); // javascript execution in this page has been stopped + }); + + casper.then(function() { + // ... + }); + + casper.run(); + +.. index:: Debugging + +``debugHTML()`` +------------------------------------------------------------------------------- + +**Signature:** ``debugHTML([String selector, Boolean outer])`` + +Outputs the results of `getHTML()`_ directly to the console. It takes the same arguments as ``getHTML()``. + +.. index:: Debugging + +``debugPage()`` +------------------------------------------------------------------------------- + +**Signature:** ``debugPage()`` + +Logs the textual contents of the current page directly to the standard output, for debugging purpose:: + + casper.start('http://www.google.fr/', function() { + this.debugPage(); + }); + + casper.run(); + +``die()`` +------------------------------------------------------------------------------- + +**Signature:** ``die(String message[, int status])`` + +Exits phantom with a logged error message and an optional exit status code:: + + casper.start('http://www.google.fr/', function() { + this.die("Fail.", 1); + }); + + casper.run(); + +.. _casper_download: + +.. index:: download + +``download()`` +------------------------------------------------------------------------------- + +**Signature:** ``download(String url, String target[, String method, Object data])`` + +Saves a remote resource onto the filesystem. You can optionally set the HTTP method using the ``method`` argument, and pass request arguments through the ``data`` object (see `base64encode()`_):: + + casper.start('http://www.google.fr/', function() { + var url = 'http://www.google.fr/intl/fr/about/corporate/company/'; + this.download(url, 'google_company.html'); + }); + + casper.run(function() { + this.echo('Done.').exit(); + }); + +.. note:: + + If you have some troubles downloading files, try to :ref:`disable web security `. + +``each()`` +------------------------------------------------------------------------------- + +**Signature:** ``each(Array array, Function fn)`` + +Iterates over provided array items and execute a callback:: + + var links = [ + 'http://google.com/', + 'http://yahoo.com/', + 'http://bing.com/' + ]; + + casper.start().each(links, function(self, link) { + self.thenOpen(link, function() { + this.echo(this.getTitle()); + }); + }); + + casper.run(); + +.. hint:: + + Have a look at the `googlematch.js `_ sample script for a concrete use case. + +``eachThen()`` +------------------------------------------------------------------------------- + +**Signature:** ``eachThen(Array array, Function then)`` + +.. versionadded:: 1.1 + +Iterates over provided array items and adds a step to the stack with current data attached to it:: + + casper.start().eachThen([1, 2, 3], function(response) { + this.echo(response.data); + }).run(); + +Here's an example for opening an array of urls:: + + var casper = require('casper').create(); + var urls = ['http://google.com/', 'http://yahoo.com/']; + + casper.start().eachThen(urls, function(response) { + this.thenOpen(response.data, function(response) { + console.log('Opened', response.url); + }); + }); + + casper.run(); + +.. note:: + + Current item will be stored in the ``response.data`` property. + +.. _casper_echo: + +.. index:: echo, Printing + +``echo()`` +------------------------------------------------------------------------------- + +**Signature:** ``echo(String message[, String style])`` + +Prints something to stdout, optionally with some fancy color (see the :ref:`colorizer module ` for more information):: + + casper.start('http://www.google.fr/', function() { + this.echo('Page title is: ' + this.evaluate(function() { + return document.title; + }), 'INFO'); // Will be printed in green on the console + }); + + casper.run(); + +.. index:: evaluate, DOM + +.. _casper_evaluate: + +``evaluate()`` +------------------------------------------------------------------------------- + +**Signature:** ``evaluate(Function fn[, arg1[, arg2[, …]]])`` + +Basically `PhantomJS' WebPage#evaluate `_ equivalent. Evaluates an expression **in the current page DOM context**:: + + casper.evaluate(function(username, password) { + document.querySelector('#username').value = username; + document.querySelector('#password').value = password; + document.querySelector('#submit').click(); + }, 'sheldon.cooper', 'b4z1ng4'); + +.. note:: + + For filling and submitting forms, rather use the `fill()`_ method. + +.. warning:: + + The pre-1.0 way of passing arguments using an object has been kept for BC purpose, though it may `not work in some case `_; so you're encouraged to use the method described above. + +.. topic:: Understanding ``evaluate()`` + + The concept behind this method is probably the most difficult to understand when discovering CasperJS. As a reminder, think of the ``evaluate()`` method as a *gate* between the CasperJS environment and the one of the page you have opened; everytime you pass a closure to ``evaluate()``, you're entering the page and execute code as if you were using the browser console. + + Here's a quickly drafted diagram trying to basically explain the separation of concerns: + + .. figure:: ../_static/images/evaluate-diagram.png + :align: center + +``evaluateOrDie()`` +------------------------------------------------------------------------------- + +**Signature:** ``evaluateOrDie(Function fn[, String message])`` + +Evaluates an expression within the current page DOM and ``die()`` if it returns anything but ``true``:: + + casper.start('http://foo.bar/home', function() { + this.evaluateOrDie(function() { + return /logged in/.match(document.title); + }, 'not authenticated'); + }); + + casper.run(); + +.. index:: exit + +``exit()`` +------------------------------------------------------------------------------- + +**Signature:** ``exit([int status])`` + +Exits PhantomJS with an optional exit status code. + +.. index:: DOM + +``exists()`` +------------------------------------------------------------------------------- + +**Signature:** ``exists(String selector)`` + +Checks if any element within remote DOM matches the provided :doc:`selector <../selectors>`:: + + casper.start('http://foo.bar/home', function() { + if (this.exists('#my_super_id')) { + this.echo('found #my_super_id', 'INFO'); + } else { + this.echo('#my_super_id not found', 'ERROR'); + } + }); + + casper.run(); + +.. _casper_fetchtext: + +``fetchText()`` +------------------------------------------------------------------------------- + +**Signature:** ``fetchText(String selector)`` + +Retrieves text contents matching a given :doc:`selector expression <../selectors>`. If you provide one matching more than one element, their textual contents will be concatenated:: + + casper.start('http://google.com/search?q=foo', function() { + this.echo(this.fetchText('h3')); + }).run(); + +``forward()`` +------------------------------------------------------------------------------- + +**Signature:** ``forward()`` + +Moves a step forward in browser's history:: + + casper.start('http://foo.bar/1') + casper.thenOpen('http://foo.bar/2'); + casper.thenOpen('http://foo.bar/3'); + casper.back(); // http://foo.bar/2 + casper.back(); // http://foo.bar/1 + casper.forward(); // http://foo.bar/2 + casper.run(); + +Also have a look at `back()`_. + +.. _casper_log: + +.. index:: Logging + +``log()`` +------------------------------------------------------------------------------- + +**Signature:** ``log(String message[, String level, String space])`` + +Logs a message with an optional level in an optional space. Available levels are ``debug``, ``info``, ``warning`` and ``error``. A space is a kind of namespace you can set for filtering your logs. By default, Casper logs messages in two distinct spaces: ``phantom`` and ``remote``, to distinguish what happens in the PhantomJS environment from the remote one:: + + casper.start('http://www.google.fr/', function() { + this.log("I'm logging an error", "error"); + }); + + casper.run(); + +.. _casper_fill: + +.. index:: Form + +``fill()`` +------------------------------------------------------------------------------- + +**Signature:** ``fill(String selector, Object values[, Boolean submit])`` + +Fills the fields of a form with given values and optionally submits it. Fields +are referenced by their ``name`` attribute. + +.. versionchanged:: 1.1 To use :doc:`CSS3 or XPath selectors <../selectors>` instead, check the `fillSelectors()`_ and `fillXPath()`_ methods. + +Example with this sample html form: + +.. code-block :: html + +
    + + + Mr + Mrs + + + + Receive a copy + +
    + +A script to fill and submit this form:: + + casper.start('http://some.tld/contact.form', function() { + this.fill('form#contact-form', { + 'subject': 'I am watching you', + 'content': 'So be careful.', + 'civility': 'Mr', + 'name': 'Chuck Norris', + 'email': 'chuck@norris.com', + 'cc': true, + 'attachment': '/Users/chuck/roundhousekick.doc' + }, true); + }); + + casper.then(function() { + this.evaluateOrDie(function() { + return /message sent/.test(document.body.innerText); + }, 'sending message failed'); + }); + + casper.run(function() { + this.echo('message sent').exit(); + }); + +.. warning:: + + 1. The ``fill()`` method currently can't fill **file fields using XPath selectors**; PhantomJS natively only allows the use of CSS3 selectors in its ``uploadFile()`` method, hence this limitation. + 2. Please Don't use CasperJS nor PhantomJS to send spam, or I'll be calling the Chuck. More seriously, please just don't. + +``fillSelectors()`` +------------------------------------------------------------------------------- + +**Signature:** ``fillSelectors(String selector, Object values[, Boolean submit])`` + +.. versionadded:: 1.1 + +Fills form fields with given values and optionally submits it. Fields +are referenced by ``CSS3`` selectors:: + + casper.start('http://some.tld/contact.form', function() { + this.fillSelectors('form#contact-form', { + 'input[name="subject"]': 'I am watching you', + 'input[name="content"]': 'So be careful.', + 'input[name="civility"]': 'Mr', + 'input[name="name"]': 'Chuck Norris', + 'input[name="email"]': 'chuck@norris.com', + 'input[name="cc"]': true, + 'input[name="attachment"]': '/Users/chuck/roundhousekick.doc' + }, true); + }); + + +``fillXPath()`` +------------------------------------------------------------------------------- + +**Signature:** ``fillXPath(String selector, Object values[, Boolean submit])`` + +.. versionadded:: 1.1 + +Fills form fields with given values and optionally submits it. While the ``form`` element is always referenced by a CSS3 selector, fields are referenced by ``XPath`` selectors:: + + casper.start('http://some.tld/contact.form', function() { + this.fillXPath('form#contact-form', { + '//input[@name="subject"]': 'I am watching you', + '//input[@name="content"]': 'So be careful.', + '//input[@name="civility"]': 'Mr', + '//input[@name="name"]': 'Chuck Norris', + '//input[@name="email"]': 'chuck@norris.com', + '//input[@name="cc"]': true, + }, true); + }); + +.. warning:: + + The ``fillXPath()`` method currently can't fill **file fields using XPath selectors**; PhantomJS natively only allows the use of CSS3 selectors in its ``uploadFile()`` method, hence this limitation. + +.. index:: URL + +``getCurrentUrl()`` +------------------------------------------------------------------------------- + +**Signature:** ``getCurrentUrl()`` + +Retrieves current page URL. Note that the url will be url-decoded:: + + casper.start('http://www.google.fr/', function() { + this.echo(this.getCurrentUrl()); // "http://www.google.fr/" + }); + + casper.run(); + +.. index:: DOM + +``getElementAttribute()`` +------------------------------------------------------------------------------- + +**Signature:** ``getElementAttribute(String selector, String attribute)`` + +.. versionadded:: 1.0 + +Retrieves the value of an attribute on the first element matching the provided :doc:`selector <../selectors>`:: + + var casper = require('casper').create(); + + casper.start('http://www.google.fr/', function() { + require('utils').dump(this.getElementAttribute('div[title="Google"]', 'title')); // "Google" + }); + + casper.run(); + +.. index:: DOM + +``getElementsAttribute()`` +------------------------------------------------------------------------------- + +**Signature:** ``getElementsAttribute(String selector, String attribute)`` + +.. versionadded:: 1.1 + +Retrieves the values of an attribute on each element matching the provided :doc:`selector <../selectors>`:: + + var casper = require('casper').create(); + + casper.start('http://www.google.fr/', function() { + require('utils').dump(this.getElementsAttribute('div[title="Google"]', 'title')); // "['Google']" + }); + + casper.run(); + +.. index:: DOM + +``getElementBounds()`` +------------------------------------------------------------------------------- + +**Signature:** ``getElementBounds(String selector)`` + +Retrieves boundaries for a DOM element matching the provided :doc:`selector <../selectors>`. + +It returns an Object with four keys: ``top``, ``left``, ``width`` and ``height``, or ``null`` if the selector doesn't exist:: + + var casper = require('casper').create(); + + casper.start('http://www.google.fr/', function() { + require('utils').dump(this.getElementBounds('div[title="Google"]')); + }); + + casper.run(); + +This will output something like:: + + { + "height": 95, + "left": 352, + "top": 16, + "width": 275 + } + +.. index:: DOM + +``getElementsBounds()`` +------------------------------------------------------------------------------- + +**Signature:** ``getElementsBounds(String selector)`` + +.. versionadded:: 1.0 + +Retrieves a list of boundaries for all DOM elements matching the provided :doc:`selector <../selectors>`. + +It returns an array of objects with four keys: ``top``, ``left``, ``width`` and ``height`` (see `getElementBounds()`_). + +.. _casper_getelementinfo: + +.. index:: DOM + +``getElementInfo()`` +------------------------------------------------------------------------------- + +**Signature:** ``getElementInfo(String selector)`` + +.. versionadded:: 1.0 + +Retrieves information about the first element matching the provided :doc:`selector <../selectors>`:: + + casper.start('http://google.fr/', function() { + require('utils').dump(this.getElementInfo('#hplogo')); + }); + +Gives something like:: + + { + "attributes": { + "align": "left", + "dir": "ltr", + "id": "hplogo", + "onload": "window.lol&&lol()", + "style": "height:110px;width:276px;background:url(/images/srpr/logo1w.png) no-repeat", + "title": "Google" + }, + "height": 110, + "html": "
    France
    ", + "nodeName": "div", + "tag": "
    France
    ", + "text": "France\n", + "visible": true, + "width": 276, + "x": 62, + "y": 76 + } + +.. index:: DOM + +``getElementsInfo()`` +------------------------------------------------------------------------------- + +**Signature:** ``getElementsInfo(String selector)`` + +.. versionadded:: 1.1 + +Retrieves information about all elements matching the provided :doc:`selector <../selectors>`:: + + casper.start('http://google.fr/', function() { + require('utils').dump(this.getElementsInfo('#hplogo')); + }); + +Gives something like:: + + [ + { + "attributes": { + "align": "left", + "dir": "ltr", + "id": "hplogo", + "onload": "window.lol&&lol()", + "style": "height:110px;width:276px;background:url(/images/srpr/logo1w.png) no-repeat", + "title": "Google" + }, + "height": 110, + "html": "
    France
    ", + "nodeName": "div", + "tag": "
    France
    ", + "text": "France\n", + "visible": true, + "width": 276, + "x": 62, + "y": 76 + } + ] + +.. index:: Form + +``getFormValues()`` +------------------------------------------------------------------------------- + +**Signature:** ``getFormValues(String selector)`` + +.. versionadded:: 1.0 + +Retrieves a given form all of its field values:: + + casper.start('http://www.google.fr/', function() { + this.fill('form', {q: 'plop'}, false); + this.echo(this.getFormValues('form').q); // 'plop' + }); + + casper.run(); + +.. index:: Globals, window + +``getGlobal()`` +------------------------------------------------------------------------------- + +**Signature:** ``getGlobal(String name)`` + +Retrieves a global variable value within the remote DOM environment by its name. Basically, ``getGlobal('foo')`` will retrieve the value of ``window.foo`` from the page:: + + casper.start('http://www.google.fr/', function() { + this.echo(this.getGlobal('innerWidth')); // 1024 + }); + + casper.run(); + +.. index:: Debugging + +``getHTML()`` +------------------------------------------------------------------------------- + +**Signature:** ``getHTML([String selector, Boolean outer])`` + +.. versionadded:: 1.0 + +Retrieves HTML code from the current page. By default, it outputs the whole page HTML contents:: + + casper.start('http://www.google.fr/', function() { + this.echo(this.getHTML()); + }); + + casper.run(); + +The ``getHTML()`` method can also dump HTML contents matching a given :doc:`selector <../selectors>`; for example with this HTML code: + +.. code-block:: html + + + +

    Plop

    + + + +You can fetch those contents using:: + + casper.start('http://www.site.tld/', function() { + this.echo(this.getHTML('h1#foobar')); // => 'Plop' + }); + +The ``outer`` argument allows to retrieve the outer HTML contents of the matching element:: + + casper.start('http://www.site.tld/', function() { + this.echo(this.getHTML('h1#foobar', true)); // => '

    Plop

    ' + }); + +``getPageContent()`` +------------------------------------------------------------------------------- + +**Signature:** ``getPageContent()`` + +.. versionadded:: 1.0 + +Retrieves current page contents, dealing with exotic other content types than HTML:: + + var casper = require('casper').create(); + + casper.start().then(function() { + this.open('http://search.twitter.com/search.json?q=casperjs', { + method: 'get', + headers: { + 'Accept': 'application/json' + } + }); + }); + + casper.run(function() { + require('utils').dump(JSON.parse(this.getPageContent())); + this.exit(); + }); + +.. index:: DOM + +``getTitle()`` +------------------------------------------------------------------------------- + +**Signature:** ``getTitle()`` + +Retrieves current page title:: + + casper.start('http://www.google.fr/', function() { + this.echo(this.getTitle()); // "Google" + }); + + casper.run(); + +.. _casper_mouseevent: + +.. index:: events + +``mouseEvent()`` +------------------------------------------------------------------------------- + +**Signature:** ``mouseEvent(String type, String selector)`` + +.. versionadded:: 0.6.9 + +Triggers a mouse event on the first element found matching the provided selector. + +Supported events are ``mouseup``, ``mousedown``, ``click``, ``mousemove``, ``mouseover`` and ``mouseout``:: + + casper.start('http://www.google.fr/', function() { + this.mouseEvent('click', 'h2 a'); + }); + + casper.run(); + +.. index:: HTTP, HTTP Request, HTTP Method, HTTP Headers + +``open()`` +------------------------------------------------------------------------------- + +**Signature:** ``open(String location, Object Settings)`` + +Performs an HTTP request for opening a given location. You can forge ``GET``, ``POST``, ``PUT``, ``DELETE`` and ``HEAD`` requests. + +Example for a standard ``GET`` request:: + + casper.start(); + + casper.open('http://www.google.com/').then(function() { + this.echo('GOT it.'); + }); + + casper.run(); + +Example for a ``POST`` request:: + + casper.start(); + + casper.open('http://some.testserver.com/post.php', { + method: 'post', + data: { + 'title': 'Plop', + 'body': 'Wow.' + } + }); + + casper.then(function() { + this.echo('POSTED it.'); + }); + + casper.run(); + +To pass nested parameters arrays:: + + casper.open('http://some.testserver.com/post.php', { + method: 'post', + data: { + 'standard_param': 'foo', + 'nested_param[]': [ // please note the use of square brackets! + 'Something', + 'Something else' + ] + } + }); + +.. versionadded:: 1.0 + +You can also set custom request headers to send when performing an outgoing request, passing the ``headers`` option:: + + casper.open('http://some.testserver.com/post.php', { + method: 'post', + data: { + 'title': 'Plop', + 'body': 'Wow.' + }, + headers: { + 'Accept-Language': 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3' + } + }); + +``reload()`` +------------------------------------------------------------------------------- + +**Signature:** ``reload([Function then])`` + +.. versionadded:: 1.0 + +Reloads current page location:: + + casper.start('http://google.com', function() { + this.echo("loaded"); + this.reload(function() { + this.echo("loaded again"); + }); + }); + + casper.run(); + +``repeat()`` +------------------------------------------------------------------------------- + +**Signature:** ``repeat(int times, Function then)`` + +Repeats a navigation step a given number of times:: + + casper.start().repeat(3, function() { + this.echo("Badger"); + }); + + casper.run(); + +.. _casper_resourceexists: + +.. index:: HTTP + +``resourceExists()`` +------------------------------------------------------------------------------- + +**Signature:** ``resourceExists(String|Function|RegExp test)`` + +Checks if a resource has been loaded. You can pass either a function, a string or a ``RegExp`` instance to perform the test:: + + casper.start('http://www.google.com/', function() { + if (this.resourceExists('logo3w.png')) { + this.echo('Google logo loaded'); + } else { + this.echo('Google logo not loaded', 'ERROR'); + } + }); + + casper.run(); + +.. note:: + + If you want to wait for a resource to be loaded, use the `waitForResource()`_ method. + +.. index:: Step stack, run + +``run()`` +------------------------------------------------------------------------------- + +**Signature:** ``run(fn onComplete[, int time])`` + +Runs the whole suite of steps and optionally executes a callback when they've all been done. Obviously, **calling this method is mandatory** in order to run the Casper navigation suite. + +Casper suite **won't run**:: + + casper.start('http://foo.bar/home', function() { + // ... + }); + + // hey, it's missing .run() here! + +Casper suite **will run**:: + + casper.start('http://foo.bar/home', function() { + // ... + }); + + casper.run(); + +``Casper.run()`` also accepts an ``onComplete`` callback, which you can consider as a custom final step to perform when all the other steps have been executed. Just don't forget to ``exit()`` Casper if you define one!:: + + casper.start('http://foo.bar/home', function() { + // ... + }); + + casper.then(function() { + // ... + }); + + casper.run(function() { + this.echo('So the whole suite ended.'); + this.exit(); // <--- don't forget me! + }); + +Binding a callback to ``complete.error`` will trigger when the ``onComplete`` callback fails. + +.. index:: Scroll + +``scrollTo()`` +------------------------------------------------------------------------------- + +**Signature:** ``scrollTo(Number x, Number y)`` + +.. versionadded:: 1.1-beta3 + +Scrolls current document to the coordinates defined by the value of ``x`` and ``y``:: + + casper.start('http://foo.bar/home', function() { + this.scrollTo(500, 300); + }); + +.. note:: This operation is synchronous. + +.. index:: Scroll + +``scrollToBottom()`` +------------------------------------------------------------------------------- + +**Signature:** ``scrollToBottom()`` + +.. versionadded:: 1.1-beta3 + +Scrolls current document to its bottom:: + + casper.start('http://foo.bar/home', function() { + this.scrollToBottom(); + }); + +.. note:: This operation is synchronous. + +.. index:: Form + +``sendKeys()`` +------------------------------------------------------------------------------- + +**Signature:** ``sendKeys(Selector selector, String keys[, Object options])`` + +.. versionadded:: 1.0 + +Sends native keyboard events to the element matching the provided :doc:`selector <../selectors>`:: + + casper.then(function() { + this.sendKeys('form.contact input#name', 'Duke'); + this.sendKeys('form.contact textarea#message', "Damn, I'm looking good."); + this.click('form.contact input[type="submit"]'); + }); + +.. versionadded:: 1.1 + +The currently supported HTMLElements that can receive keyboard events from ``sendKeys`` are ````, `` + + + + + + + + + + +
    + +
    + + + + diff --git a/vendor/casperjs/tests/site/frame1.html b/vendor/casperjs/tests/site/frame1.html new file mode 100755 index 0000000..0452449 --- /dev/null +++ b/vendor/casperjs/tests/site/frame1.html @@ -0,0 +1,10 @@ + + + + + CasperJS frame 1 + + +

    This is frame 1.

    + + diff --git a/vendor/casperjs/tests/site/frame2.html b/vendor/casperjs/tests/site/frame2.html new file mode 100755 index 0000000..0d34298 --- /dev/null +++ b/vendor/casperjs/tests/site/frame2.html @@ -0,0 +1,11 @@ + + + + + CasperJS frame 2 + + +

    This is frame 2.

    +

    frame 3

    + + diff --git a/vendor/casperjs/tests/site/frame3.html b/vendor/casperjs/tests/site/frame3.html new file mode 100755 index 0000000..874999c --- /dev/null +++ b/vendor/casperjs/tests/site/frame3.html @@ -0,0 +1,11 @@ + + + + + CasperJS frame 3 + + +

    This is frame 3.

    +

    frame 2

    + + diff --git a/vendor/casperjs/tests/site/frames.html b/vendor/casperjs/tests/site/frames.html new file mode 100755 index 0000000..3c75ec3 --- /dev/null +++ b/vendor/casperjs/tests/site/frames.html @@ -0,0 +1,12 @@ + + + + + CasperJS test frames + + + + + + + diff --git a/vendor/casperjs/tests/site/global.html b/vendor/casperjs/tests/site/global.html new file mode 100755 index 0000000..7a4714a --- /dev/null +++ b/vendor/casperjs/tests/site/global.html @@ -0,0 +1,14 @@ + + + + + + diff --git a/vendor/casperjs/tests/site/images/phantom.png b/vendor/casperjs/tests/site/images/phantom.png new file mode 100755 index 0000000000000000000000000000000000000000..0a9f5ee3663fadc427590c79d3035d19cdca5df9 GIT binary patch literal 4618 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 A0ssI2 literal 0 HcmV?d00001 diff --git a/vendor/casperjs/tests/site/includes/include1.js b/vendor/casperjs/tests/site/includes/include1.js new file mode 100755 index 0000000..aa21f21 --- /dev/null +++ b/vendor/casperjs/tests/site/includes/include1.js @@ -0,0 +1,7 @@ +(function() { + "use strict"; + var elem = document.createElement('div'); + elem.setAttribute('id', 'include1'); + elem.appendChild(document.createTextNode('include1')); + document.querySelector('body').appendChild(elem); +})(); diff --git a/vendor/casperjs/tests/site/includes/include2.js b/vendor/casperjs/tests/site/includes/include2.js new file mode 100755 index 0000000..8bbe0bb --- /dev/null +++ b/vendor/casperjs/tests/site/includes/include2.js @@ -0,0 +1,7 @@ +(function() { + "use strict"; + var elem = document.createElement('div'); + elem.setAttribute('id', 'include2'); + elem.appendChild(document.createTextNode('include2')); + document.querySelector('body').appendChild(elem); +})(); diff --git a/vendor/casperjs/tests/site/index.html b/vendor/casperjs/tests/site/index.html new file mode 100755 index 0000000..c687926 --- /dev/null +++ b/vendor/casperjs/tests/site/index.html @@ -0,0 +1,20 @@ + + + + + CasperJS test index + + + + test + form +
      +
    • one
    • +
    • two
    • +
    • three
    • +
    + +

    Title

    + + + diff --git a/vendor/casperjs/tests/site/mouse-events.html b/vendor/casperjs/tests/site/mouse-events.html new file mode 100755 index 0000000..3336751 --- /dev/null +++ b/vendor/casperjs/tests/site/mouse-events.html @@ -0,0 +1,47 @@ + + + + + CasperJS test mouse events + + + test + test + test + test + test + test + test + test + + + diff --git a/vendor/casperjs/tests/site/multiple-forms.html b/vendor/casperjs/tests/site/multiple-forms.html new file mode 100755 index 0000000..3e9db35 --- /dev/null +++ b/vendor/casperjs/tests/site/multiple-forms.html @@ -0,0 +1,16 @@ + + + + Multiple forms test + + +
    + + +
    +
    + + +
    + + diff --git a/vendor/casperjs/tests/site/page1.html b/vendor/casperjs/tests/site/page1.html new file mode 100755 index 0000000..c3140e7 --- /dev/null +++ b/vendor/casperjs/tests/site/page1.html @@ -0,0 +1,8 @@ + + + + + CasperJS test page 1 + + Booh. + \ No newline at end of file diff --git a/vendor/casperjs/tests/site/page2.html b/vendor/casperjs/tests/site/page2.html new file mode 100755 index 0000000..3fe0f63 --- /dev/null +++ b/vendor/casperjs/tests/site/page2.html @@ -0,0 +1,8 @@ + + + + + CasperJS test page 2 + + Booh. + \ No newline at end of file diff --git a/vendor/casperjs/tests/site/page3.html b/vendor/casperjs/tests/site/page3.html new file mode 100755 index 0000000..c3140e7 --- /dev/null +++ b/vendor/casperjs/tests/site/page3.html @@ -0,0 +1,8 @@ + + + + + CasperJS test page 1 + + Booh. + \ No newline at end of file diff --git a/vendor/casperjs/tests/site/popup.html b/vendor/casperjs/tests/site/popup.html new file mode 100755 index 0000000..7f5b0c4 --- /dev/null +++ b/vendor/casperjs/tests/site/popup.html @@ -0,0 +1,18 @@ + + + + + CasperJS test popup + + + new window + close + + + diff --git a/vendor/casperjs/tests/site/prompt.html b/vendor/casperjs/tests/site/prompt.html new file mode 100755 index 0000000..291d86b --- /dev/null +++ b/vendor/casperjs/tests/site/prompt.html @@ -0,0 +1,12 @@ + + + + + CasperJS test prompt + + + + + diff --git a/vendor/casperjs/tests/site/resources.html b/vendor/casperjs/tests/site/resources.html new file mode 100755 index 0000000..6c48e43 --- /dev/null +++ b/vendor/casperjs/tests/site/resources.html @@ -0,0 +1,15 @@ + + + + + CasperJS test resource + + + + + + diff --git a/vendor/casperjs/tests/site/result.html b/vendor/casperjs/tests/site/result.html new file mode 100755 index 0000000..de43655 --- /dev/null +++ b/vendor/casperjs/tests/site/result.html @@ -0,0 +1,11 @@ + + + + + CasperJS test form result + + +

    this is the result page

    +

    Return back home

    + + \ No newline at end of file diff --git a/vendor/casperjs/tests/site/test.html b/vendor/casperjs/tests/site/test.html new file mode 100755 index 0000000..d365c97 --- /dev/null +++ b/vendor/casperjs/tests/site/test.html @@ -0,0 +1,10 @@ + + + + + CasperJS test target + + + test form + + \ No newline at end of file diff --git a/vendor/casperjs/tests/site/urls.html b/vendor/casperjs/tests/site/urls.html new file mode 100755 index 0000000..726af18 --- /dev/null +++ b/vendor/casperjs/tests/site/urls.html @@ -0,0 +1,14 @@ + + + + + CasperJS url tests + + + + + diff --git a/vendor/casperjs/tests/site/visible.html b/vendor/casperjs/tests/site/visible.html new file mode 100755 index 0000000..d05da0b --- /dev/null +++ b/vendor/casperjs/tests/site/visible.html @@ -0,0 +1,17 @@ + + + + + CasperJS test index + + + + + + + + diff --git a/vendor/casperjs/tests/site/waitFor.html b/vendor/casperjs/tests/site/waitFor.html new file mode 100755 index 0000000..a1d8994 --- /dev/null +++ b/vendor/casperjs/tests/site/waitFor.html @@ -0,0 +1,29 @@ + + + + + waitFor test + + + +
      +
    • one
    • +
    • two
    • +
    • three
    • +
    +
    + Loading... +
    +
    Voilà
    +

    I'm hidden.

    +

    I'm visible.

    + + + diff --git a/vendor/casperjs/tests/suites/.casper b/vendor/casperjs/tests/suites/.casper new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/suites/casper/.casper b/vendor/casperjs/tests/suites/casper/.casper new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/suites/casper/agent.js b/vendor/casperjs/tests/suites/casper/agent.js new file mode 100755 index 0000000..7dfd674 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/agent.js @@ -0,0 +1,32 @@ +/*global casper*/ +/*jshint strict:false*/ +function testUA(ua, match) { + casper.test.assertMatch( + ua, match, 'Default user agent matches ' + match + ); +} + +function fetchUA(requestData, request) { + var headers = requestData.headers.filter(function(header) { + return header.name === "User-Agent"; + }); + casper.test.assert(headers.length > 0); + testUA(headers.pop().value, /plop/); +} + +casper.test.begin('userAgent() tests', 3, { + originalUA: casper.options.pageSettings.userAgent, + + tearDown: function(test) { + casper.userAgent(this.originalUA); + }, + + test: function(test) { + testUA(casper.options.pageSettings.userAgent, /CasperJS/); + casper.start().userAgent('plop').once('resource.requested', fetchUA); + casper.thenOpen('tests/site/index.html').run(function() { + test.done(); + }); + } +}); + diff --git a/vendor/casperjs/tests/suites/casper/alert.js b/vendor/casperjs/tests/suites/casper/alert.js new file mode 100755 index 0000000..a0a6f85 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/alert.js @@ -0,0 +1,25 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('alert events', 1, { + ok: false, + + tearDown: function(test) { + casper.removeAllListeners('remote.alert'); + }, + + test: function(test) { + var self = this; + + casper.once('remote.alert', function(message) { + self.ok = (message === 'plop'); + }); + + casper.start('tests/site/alert.html', function() { + test.assert(self.ok, 'alert event has been intercepted'); + }); + + casper.run(function() { + test.done(); + }); + } +}); diff --git a/vendor/casperjs/tests/suites/casper/auth.js b/vendor/casperjs/tests/suites/casper/auth.js new file mode 100755 index 0000000..d575eaf --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/auth.js @@ -0,0 +1,26 @@ +/*global casper*/ +/*jshint strict:false, maxstatements:99*/ + +casper.test.begin('HTTP authentication tests', 8, function(test) { + casper.start('tests/site/index.html'); + + casper.configureHttpAuth('http://localhost/'); + test.assertEquals(casper.page.settings.userName, undefined); + test.assertEquals(casper.page.settings.password, undefined); + + casper.configureHttpAuth('http://niko:plop@localhost/'); + test.assertEquals(casper.page.settings.userName, 'niko'); + test.assertEquals(casper.page.settings.password, 'plop'); + + casper.configureHttpAuth('http://localhost/', {username: 'john', password: 'doe'}); + test.assertEquals(casper.page.settings.userName, 'john'); + test.assertEquals(casper.page.settings.password, 'doe'); + + casper.configureHttpAuth('http://niko:plop@localhost/', {username: 'john', password: 'doe'}); + test.assertEquals(casper.page.settings.userName, 'niko'); + test.assertEquals(casper.page.settings.password, 'plop'); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/bypass.js b/vendor/casperjs/tests/suites/casper/bypass.js new file mode 100755 index 0000000..486d2ed --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/bypass.js @@ -0,0 +1,107 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('Casper.bypass() can bypass a step', 1, function(test) { + casper.start(); + casper.then(function(){ + test.fail("This test should not be executed."); + }); + casper.bypass(1).run(function() { + test.pass("Step has been bypassed"); + test.done(); + }); +}); + +casper.test.begin('Casper.bypass() can bypass multiple steps', 1, function(test) { + casper.start(); + casper.then(function() { + test.pass("This test should be executed."); + }); + casper.then(function() { + this.bypass(2); + }); + casper.then(function() { + test.fail("This test should not be executed."); + }); + casper.then(function() { + test.fail("Nor this one."); + }); + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('Casper.thenBypass()', 1, function(test) { + casper. + thenBypass(1). + then(function() { + test.fail("This test should be bypassed."); + }). + then(function() { + test.pass("This test should be executed."); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('Casper.thenBypassIf()', 3, function(test) { + casper. + thenBypassIf(true, 1, "Bypass if with function"). + then(function() { + test.fail("This test should be bypassed."); + }). + then(function() { + test.pass("This test should be executed."); + }). + thenBypassIf(function() { + return true; + }, 1, "Bypass if with function"). + then(function() { + test.fail("This test should be bypassed."); + }). + then(function() { + test.pass("This test should be executed."); + }). + thenBypassIf(function() { + return false; + }, 1, "Do not bypass if with function"). + then(function() { + test.pass("This test should be executed."); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('Casper.thenBypassUnless()', 3, function(test) { + casper. + thenBypassUnless(false, 1, "Bypass unless with function"). + then(function() { + test.fail("This test should be bypassed."); + }). + then(function() { + test.pass("This test should be executed."); + }). + thenBypassUnless(function() { + return false; + }, 1, "Bypass unless with function"). + then(function() { + test.fail("This test should be bypassed."); + }). + then(function() { + test.pass("This test should be executed."); + }). + thenBypassUnless(function() { + return true; + }, 1, "Do not bypass unless with function"). + then(function() { + test.pass("This test should be executed."); + }); + + casper.run(function() { + test.done(); + }); +}); + diff --git a/vendor/casperjs/tests/suites/casper/callback.js b/vendor/casperjs/tests/suites/casper/callback.js new file mode 100755 index 0000000..e3be456 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/callback.js @@ -0,0 +1,25 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('callback events', 1, { + ok: false, + + tearDown: function(test) { + casper.removeAllListeners('remote.callback'); + }, + + test: function(test) { + var self = this; + + casper.once('remote.callback', function(data) { + self.ok = (data.hello === 'world'); + }); + + casper.start('tests/site/callback.html', function() { + test.assert(self.ok, 'callback event has been intercepted'); + }); + + casper.run(function() { + test.done(); + }); + } +}); diff --git a/vendor/casperjs/tests/suites/casper/callutils.js b/vendor/casperjs/tests/suites/casper/callutils.js new file mode 100755 index 0000000..97e1237 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/callutils.js @@ -0,0 +1,23 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('Casper.callUtils()', 2, function(test) { + casper.start("tests/site/index.html", function(){ + this.evaluate(function() { + /*global __utils__*/ + __utils__.testCallUtils = function() { + return [].slice.call(arguments); + }; + }); + + test.assertEquals(casper.callUtils("testCallUtils", "a", "b", "c"), + ["a", "b", "c"], + "Casper.callUtils() invokes a client side utility"); + + test.assertThrows(casper.callUtils, ["xxx", "a", "b", "c"], + "Casper.callUtils() raises an error if used inappropriately"); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/capture.js b/vendor/casperjs/tests/suites/casper/capture.js new file mode 100755 index 0000000..b17cb8d --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/capture.js @@ -0,0 +1,50 @@ +/*global casper*/ +/*jshint strict:false*/ +var fs = require('fs'); + +casper.test.begin('Casper.capture() tests', 1, { + testFile: '/tmp/__casper_test_capture.png', + + setUp: function(test) { + if (fs.exists(this.testFile) && fs.isFile(this.testFile)) { + try { + fs.remove(this.testFile); + } catch (e) { + } + } + }, + + tearDown: function(test) { + try { + fs.remove(this.testFile); + } catch(e) { + } + }, + + test: function(test) { + var self = this; + + casper.start('tests/site/index.html', function() { + this.viewport(300, 200); + this.capture(self.testFile); + test.assert(fs.isFile(self.testFile), 'Casper.capture() captured a screenshot'); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('Casper.captureBase64() tests', 3, function(test) { + casper.start('tests/site/index.html', function() { + test.assert(this.captureBase64('png').length > 0, + 'Casper.captureBase64() rendered a page capture as base64'); + test.assert(this.captureBase64('png', 'ul').length > 0, + 'Casper.captureBase64() rendered a capture from a selector as base64'); + test.assert(this.captureBase64('png', {top: 0, left: 0, width: 30, height: 30}).length > 0, + 'Casper.captureBase64() rendered a capture from a clipRect as base64'); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/click.js b/vendor/casperjs/tests/suites/casper/click.js new file mode 100755 index 0000000..e92ca18 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/click.js @@ -0,0 +1,126 @@ +/*global casper*/ +/*jshint strict:false, maxstatements: 99*/ +var utils = require('utils'); + +casper.test.begin('click() tests', 2, function(test) { + casper.start('tests/site/index.html', function() { + this.click('a[href="test.html"]'); + }).then(function() { + test.assertTitle('CasperJS test target', 'Casper.click() can click on a link'); + }).thenClick('a', function() { + test.assertTitle('CasperJS test form', 'Casper.thenClick() can click on a link'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('onclick variants tests', 8, function(test) { + casper.start('tests/site/click.html', function() { + test.assert(this.click('#test1'), 'Casper.click() can click an `href="javascript:` link'); + test.assert(this.click('#test2'), 'Casper.click() can click an `href="#"` link'); + test.assert(this.click('#test3'), 'Casper.click() can click an `onclick=".*; return false"` link'); + test.assert(this.click('#test4'), 'Casper.click() can click an unobstrusive js handled link'); + var results = this.getGlobal('results'); + if (phantom.casperEngine === 'slimerjs') { + // "javascript:" link in Gecko are executed asynchronously, so we don't have result at this time + test.skip(1) + } + else + test.assert(results.test1, 'Casper.click() has clicked an `href="javascript:` link'); + test.assert(results.test2, 'Casper.click() has clicked an `href="#"` link'); + test.assert(results.test3, 'Casper.click() has clicked an `onclick=".*; return false"` link'); + test.assert(results.test4, 'Casper.click() has clicked an unobstrusive js handled link'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('clickLabel tests tests', 12, function(test) { + casper.start('tests/site/click.html', function() { + test.assert(this.clickLabel('test1'), + 'Casper.clickLabel() can click an `href="javascript:` link'); + test.assert(this.clickLabel('test2'), + 'Casper.clickLabel() can click an `href="#"` link'); + test.assert(this.clickLabel('test3'), + 'Casper.clickLabel() can click an `onclick=".*; return false"` link'); + test.assert(this.clickLabel('test4'), + 'Casper.clickLabel() can click an unobstrusive js handled link'); + test.assert(this.clickLabel('Label with double "quotes"'), + 'Casper.clickLabel() can click the link with double quotes in the label'); + test.assert(this.clickLabel("Label with single 'quotes'"), + 'Casper.clickLabel() can click the link with the single quotes in the label'); + var results = this.getGlobal('results'); + if (phantom.casperEngine === 'slimerjs') { + // "javascript:" link in Gecko are executed asynchronously, so we don't have result at this time + test.skip(1) + } + else + test.assert(results.test1, + 'Casper.clickLabel() has clicked an `href="javascript:` link'); + test.assert(results.test2, + 'Casper.clickLabel() has clicked an `href="#"` link'); + test.assert(results.test3, + 'Casper.clickLabel() has clicked an `onclick=".*; return false"` link'); + test.assert(results.test4, + 'Casper.clickLabel() has clicked an unobstrusive js handled link'); + test.assert(results.test6, + 'Casper.clickLabel() has clicked the link with double quotes in the label'); + test.assert(results.test7, + 'Casper.clickLabel() has clicked the link with single quotes in the label'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('casper.mouse tests', 4, function(test) { + casper.start('tests/site/click.html', function() { + this.mouse.down(200, 100); + var results = this.getGlobal('results'); + test.assertEquals(results.testdown, [200, 100], + 'Mouse.down() has pressed button to the specified position'); + this.mouse.up(200, 100); + results = this.getGlobal('results'); + test.assertEquals(results.testup, [200, 100], + 'Mouse.up() has released button to the specified position'); + this.mouse.move(200, 100); + results = this.getGlobal('results'); + test.assertEquals(results.testmove, [200, 100], + 'Mouse.move() has moved to the specified position'); + if (utils.gteVersion(phantom.version, '1.8.0')) { + this.mouse.doubleclick(200, 100); + results = this.getGlobal('results'); + this.test.assertEquals(results.testdoubleclick, [200, 100], + 'Mouse.doubleclick() double-clicked the specified position'); + } else { + this.test.pass("Mouse.doubleclick() requires PhantomJS >= 1.8"); + } + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('element focus on click', 1, function(test) { + casper.start().then(function() { + this.page.content = '
    ' + this.click('form input[name=foo]') + this.page.sendEvent('keypress', 'bar'); + test.assertEquals(this.getFormValues('form')['foo'], 'bar', + 'Casper.click() sets the focus on clicked element'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('mouse events on click', 2, function(test) { + casper.start('tests/site/click.html', function() { + this.click('#test5'); + }).then(function() { + var results = this.getGlobal('results'); + test.assert(results.test5.indexOf('mousedown') !== -1, + 'Casper.click() triggers mousedown event'); + test.assert(results.test5.indexOf('mouseup') !== -1, + 'Casper.click() triggers mouseup event'); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/confirm.js b/vendor/casperjs/tests/suites/casper/confirm.js new file mode 100755 index 0000000..fac3933 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/confirm.js @@ -0,0 +1,53 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('can confirm dialog', 2, { + received: undefined, + + setUp: function(test) { + var self = this; + casper.removeAllFilters('page.confirm'); + casper.setFilter('page.confirm', function(message) { + self.received = message; + return true; + }); + }, + + tearDown: function(test) { + casper.removeAllFilters('page.confirm'); + }, + + test: function(test) { + var self = this; + casper.start('tests/site/confirm.html', function() { + test.assert(this.getGlobal('confirmed'), 'confirmation dialog accepted'); + }).run(function() { + test.assertEquals(self.received, 'are you sure?', 'confirmation message is ok'); + test.done(); + }); + } +}); + +casper.test.begin('can cancel dialog', { + received: undefined, + + setUp: function(test) { + var self = this; + casper.removeAllFilters('page.confirm'); + casper.setFilter('page.confirm', function(message) { + return false; + }); + }, + + tearDown: function(test) { + casper.removeAllFilters('page.confirm'); + }, + + test: function(test) { + var self = this; + casper.start('tests/site/confirm.html', function() { + test.assertNot(this.getGlobal('confirmed'), 'confirmation dialog canceled'); + }).run(function() { + test.done(); + }); + } +}); diff --git a/vendor/casperjs/tests/suites/casper/content.js b/vendor/casperjs/tests/suites/casper/content.js new file mode 100755 index 0000000..72fde2c --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/content.js @@ -0,0 +1,21 @@ +/*global casper*/ +/*jshint strict:false*/ +var fs = require("fs"); + +casper.test.begin("Casper.getPageContent() text/html content", 1, function(test) { + casper.start("tests/site/test.html", function() { + test.assertMatch(this.getPageContent(), /CasperJS test target/, + "Casper.getPageContent() retrieves text/html content"); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin("Casper.getPageContent() non text/html content", 1, function(test) { + casper.start("tests/site/dummy.js", function() { + test.assertEquals(this.getPageContent(), "document.write('foo');", + "Casper.getPageContent() retrieves non text/html content"); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/debug.js b/vendor/casperjs/tests/suites/casper/debug.js new file mode 100755 index 0000000..6095c28 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/debug.js @@ -0,0 +1,12 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('getHTML() tests', 2, function(test) { + casper.start('tests/site/index.html', function() { + test.assertEquals(this.getHTML('ul li'), 'one', + 'Casper.getHTML() retrieves inner HTML by default'); + test.assertEquals(this.getHTML('ul li', true), '<li>one</li>', + 'Casper.getHTML() can retrieve outer HTML'); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/elementattribute.js b/vendor/casperjs/tests/suites/casper/elementattribute.js new file mode 100755 index 0000000..4a0885a --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/elementattribute.js @@ -0,0 +1,21 @@ +/*global casper*/ +/*jshint strict:false*/ +var x = require('casper').selectXPath; + +casper.test.begin('getElementAttribute() tests', 4, function(test) { + casper.start('tests/site/elementattribute.html', function() { + test.assertEquals(this.getElementAttribute('.testo', 'data-stuff'), + 'beautiful string', 'Casper.getElementAttribute() works with a CSS selector'); + test.assertEquals(this.getElementAttribute(x('//div[@class]'), 'data-stuff'), + 'beautiful string', 'Casper.getElementAttribute() works with a XPath selector'); + }).then(function() { + test.assertEquals(this.getElementsAttribute('.testo', 'data-stuff'), + ['beautiful string', 'not as beautiful string'], + 'Casper.getElementsAttribute() works with a CSS selector'); + test.assertEquals(this.getElementsAttribute(x('//div[@class]'), 'data-stuff'), + ['beautiful string', 'not as beautiful string'], + 'Casper.getElementsAttribute() works with a XPath selector'); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/encode.js b/vendor/casperjs/tests/suites/casper/encode.js new file mode 100755 index 0000000..9c85d14 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/encode.js @@ -0,0 +1,19 @@ +/*global casper*/ +/*jshint strict:false*/ +var fs = require('fs'); + +casper.test.begin('base64encode() and download() tests', 2, function(test) { + // FIXME: https://github.com/ariya/phantomjs/pull/364 has been merged, update scheme + casper.start('file://' + phantom.casperPath + '/tests/site/index.html', function() { + var imageUrl = 'file://' + phantom.casperPath + '/tests/site/images/phantom.png', + image = this.base64encode(imageUrl); + test.assertEquals(image.length, 6160, 'Casper.base64encode() can retrieve base64 contents'); + this.download(imageUrl, '__test_logo.png'); + test.assert(fs.exists('__test_logo.png'), 'Casper.download() downloads a file'); + if (fs.exists('__test_logo.png')) { + fs.remove('__test_logo.png'); + } + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/evaluate.js b/vendor/casperjs/tests/suites/casper/evaluate.js new file mode 100755 index 0000000..43f58bd --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/evaluate.js @@ -0,0 +1,112 @@ +/*global casper*/ +/*jshint strict:false, maxparams:99*/ +casper.test.begin('mapping argument context', 1, function(test) { + casper.start(); + var context = { + "_boolean_true": true, + "_boolean_false": false, + "_int_number": 42, + "_float_number": 1337.42, + "_string": "plop! \"Ÿ£$\" 'no'", + "_array": [1, 2, 3], + "_object": {a: 1, b: 2}, + "_function": function(){console.log('ok');} + }; + var result = casper.evaluate(function(_boolean_true, _boolean_false, _int_number, + _float_number, _string, _array, _object, _function) { + return [].map.call(arguments, function(arg) { + return typeof(arg); + }); + }, context); + test.assertEquals( + result.toString(), + ['boolean', 'boolean', 'number', 'number', 'string', 'object', 'object', 'function'].toString(), + 'Casper.evaluate() handles passed argument context correcly' + ); + test.done(); +}); + +casper.test.begin('handling no argument context', 1, function(test) { + casper.start(); + test.assertEquals(casper.evaluate(function() { + return 42; + }), 42, 'Casper.evaluate() handles evaluation with no context passed'); + test.done(); +}); + +casper.test.begin('handling of object context (BC mode)', 3, function(test) { + casper.start(); + test.assertEquals(casper.evaluate(function(a) { + return [a]; + }, {a: "foo"}), ["foo"], 'Casper.evaluate() accepts an object as arguments context'); + test.assertEquals(casper.evaluate(function(a, b) { + return [a, b]; + }, {a: "foo", b: "bar"}), ["foo", "bar"], 'Casper.evaluate() accepts an object as arguments context'); + test.assertEquals(casper.evaluate(function(a, b, c) { + return [a, b, c]; + }, {a: "foo", b: "bar", c: "baz"}), ["foo", "bar", "baz"], 'Casper.evaluate() accepts an object as arguments context'); + test.done(); +}); + +casper.test.begin('handling of array context', 3, function(test) { + casper.start(); + test.assertEquals(casper.evaluate(function(a) { + return [a]; + }, ["foo"]), ["foo"], 'Casper.evaluate() accepts an array as arguments context'); + test.assertEquals(casper.evaluate(function(a, b) { + return [a, b]; + }, ["foo", "bar"]), ["foo", "bar"], 'Casper.evaluate() accepts an array as arguments context'); + test.assertEquals(casper.evaluate(function(a, b, c) { + return [a, b, c]; + }, ["foo", "bar", "baz"]), ["foo", "bar", "baz"], 'Casper.evaluate() accepts an array as arguments context'); + test.done(); +}); + +casper.test.begin('natural arguments context (phantomjs equivalent)', 3, function(test) { + casper.start(); + test.assertEquals(casper.evaluate(function(a) { + return [a]; + }, "foo"), ["foo"], 'Casper.evaluate() accepts natural arguments context'); + test.assertEquals(casper.evaluate(function(a, b) { + return [a, b]; + }, "foo", "bar"), ["foo", "bar"], 'Casper.evaluate() accepts natural arguments context'); + test.assertEquals(casper.evaluate(function(a, b, c) { + return [a, b, c]; + }, "foo", "bar", "baz"), ["foo", "bar", "baz"], 'Casper.evaluate() accepts natural arguments context'); + test.done(); +}); + +casper.test.begin('thenEvaluate() tests', 2, function(test) { + casper.start().thenEvaluate(function(a, b) { + window.a = a + window.b = b; + }, "foo", "bar"); + casper.then(function() { + test.assertEquals(this.getGlobal('a'), "foo", "Casper.thenEvaluate() sets args"); + test.assertEquals(this.getGlobal('b'), "bar", + "Casper.thenEvaluate() sets args the same way evaluate() does"); + }); + casper.run(function() { + test.done(); + }); +}); + +// https://github.com/n1k0/casperjs/issues/489 +// https://groups.google.com/forum/?fromgroups=#!topic/casperjs/95IgDMFnEKM +casper.test.begin("evaluate() returns a value which can be altered", 1, function(test) { + var list; + + casper.start().then(function() { + list = this.evaluate(function() { + return [{a: 1}, {b: 2}]; + }); + var first = list[0]; + first.a = 42; + test.assertEquals(list, [{a: 42}, {b: 2}], + 'evaluate() returns a cloned value which can be altered'); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/events.js b/vendor/casperjs/tests/suites/casper/events.js new file mode 100755 index 0000000..2a08b12 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/events.js @@ -0,0 +1,29 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('events', 2, function(test) { + casper.plopped = false; + casper.once("plop", function() { + this.plopped = true; + }); + test.assert(Object.keys(casper._events).some(function(i) { + return i === "plop"; + }), "on() has set an event handler"); + casper.emit("plop"); + test.assert(casper.plopped, "emit() emits an event"); + test.done(); +}); + +casper.test.begin('filters', 3, function(test) { + casper.foo = 0; + casper.setFilter("test", function(a) { + this.foo = 42; + return a + 1; + }); + test.assert(Object.keys(casper._filters).some(function(i) { + return i === "test"; + }), "setFilter() has set a filter"); + test.assertEquals(casper.filter("test", 1), 2, "filter() filters a value"); + test.assertEquals(casper.foo, 42, "filter() applies the correct context"); + delete casper.foo; + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/casper/exists.js b/vendor/casperjs/tests/suites/casper/exists.js new file mode 100755 index 0000000..f60e617 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/exists.js @@ -0,0 +1,10 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('exists() tests', 2, function(test) { + casper.start('tests/site/index.html', function() { + test.assert(this.exists('a'), 'Casper.exists() can check if an element exists'); + test.assertNot(this.exists('chucknorriz'), 'Casper.exists() can check than an element does not exist') + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/fetchtext.js b/vendor/casperjs/tests/suites/casper/fetchtext.js new file mode 100755 index 0000000..57bbbf7 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/fetchtext.js @@ -0,0 +1,21 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('fetchText() basic tests', 1, function(test) { + casper.start('tests/site/index.html', function() { + test.assertEquals(this.fetchText('ul li'), 'onetwothree', + 'Casper.fetchText() can retrieve text contents'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('fetchText() handles HTML entities', 1, function(test) { + casper.start().then(function() { + this.setContent('<html><body>Voilà</body></html>'); + test.assertEquals(this.fetchText('body'), 'Voilà', + 'Casper.fetchText() fetches decoded text'); + }); + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/flow.coffee b/vendor/casperjs/tests/suites/casper/flow.coffee new file mode 100755 index 0000000..01473fb --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/flow.coffee @@ -0,0 +1,38 @@ +casper.test.begin 'handling waits and timeouts', 13, (test) -> + step = 0 + + casper.start "tests/site/resources.html", -> + test.assertEquals ++step, 1, "step 1" + @wait 400, -> + test.assertEquals ++step, 2, "step 1.1" + @wait 200, -> + test.assertEquals ++step, 3, "step 1.1.1" + @wait 200, -> + test.assertEquals ++step, 4, "step 1.1.1.1" + @then -> + test.assertEquals ++step, 5, "step 1.1.2.1" + @wait 400, -> + test.assertEquals ++step, 6, "step 1.2" + + casper.wait 200, -> + test.assertEquals ++step, 7, "step 2" + + casper.waitForSelector( + '#noneExistingSelector' + -> test.fail "should run into timeout" + -> test.assertEquals ++step, 8, "step 3 sucessfully timed out" + 1000 + ) + casper.then -> + test.assertEquals ++step, 9, "step 4" + @wait 300, -> + test.assertEquals ++step, 10, "step 4.1" + @wait 300, -> + test.assertEquals ++step, 11, "step 4.1.1" + @wait 100, -> + test.assertEquals ++step, 12, "step 5.2" + + casper.then -> + test.assertEquals ++step, 13, "last step" + + casper.run(-> test.done()) diff --git a/vendor/casperjs/tests/suites/casper/formfill.js b/vendor/casperjs/tests/suites/casper/formfill.js new file mode 100755 index 0000000..08d22c8 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/formfill.js @@ -0,0 +1,231 @@ +/*global casper, __utils__*/ +/*jshint strict:false*/ +var fs = require('fs'); + +function testFormValues(test) { + test.assertField('email', 'chuck@norris.com', + 'can fill an input[type=text] form field'); + test.assertField('password', 'chuck', + 'can fill an input[type=password] form field') + test.assertField('content', 'Am watching thou', + 'can fill a textarea form field'); + test.assertField('topic', 'bar', + 'can pick a value from a select form field'); + test.assertField('check', true, + 'can check a form checkbox'); + test.assertEvalEquals(function() { + return __utils__.findOne('input[name="choice"][value="no"]').checked; + }, true, 'can check a form radio button 1/2'); + test.assertEvalEquals(function() { + return __utils__.findOne('input[name="choice"][value="yes"]').checked; + }, false, 'can check a form radio button 2/2'); + test.assertEvalEquals(function() { + return (__utils__.findOne('input[name="checklist[]"][value="1"]').checked && + !__utils__.findOne('input[name="checklist[]"][value="2"]').checked && + __utils__.findOne('input[name="checklist[]"][value="3"]').checked); + }, true, 'can fill a list of checkboxes'); +} + +function testUrl(test) { + test.assertUrlMatch(/email=chuck@norris.com/, 'input[type=email] field was submitted'); + test.assertUrlMatch(/password=chuck/, 'input[type=password] field was submitted'); + test.assertUrlMatch(/content=Am\+watching\+thou/, 'textarea field was submitted'); + test.assertUrlMatch(/check=on/, 'input[type=checkbox] field was submitted'); + test.assertUrlMatch(/choice=no/, 'input[type=radio] field was submitted'); + test.assertUrlMatch(/topic=bar/, 'select field was submitted'); + test.assertUrlMatch(/strange=very/, 'strangely typed input field was submitted'); +} + +casper.test.begin('fill() & fillNames() tests', 16, function(test) { + var fpath = fs.pathJoin(phantom.casperPath, 'README.md'); + + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + email: 'chuck@norris.com', + password: 'chuck', + content: 'Am watching thou', + check: true, + choice: 'no', + topic: 'bar', + file: fpath, + 'checklist[]': ['1', '3'], + strange: "very" + }); + testFormValues(test); + test.assertEvalEquals(function() { + return __utils__.findOne('input[name="file"]').files.length === 1; + }, true, 'can select a file to upload'); + }); + casper.thenClick('input[type="submit"]', function() { + testUrl(test); + }); + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('fillSelectors() tests', 16, function(test) { + var fpath = fs.pathJoin(phantom.casperPath, 'README.md'); + + casper.start('tests/site/form.html', function() { + this.fillSelectors('form[action="result.html"]', { + "input[name='email']": 'chuck@norris.com', + "input[name='password']": 'chuck', + "textarea[name='content']": 'Am watching thou', + "input[name='check']": true, + "input[name='choice']": 'no', + "select[name='topic']": 'bar', + "input[name='file']": fpath, + "input[name='checklist[]']": ['1', '3'], + "input[name='strange']": "very" + }); + testFormValues(test); + test.assertEvalEquals(function() { + return __utils__.findOne('input[name="file"]').files.length === 1; + }, true, 'can select a file to upload'); + }); + casper.thenClick('input[type="submit"]', function() { + testUrl(test); + }); + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('fillXPath() tests', 15, function(test) { + casper.start('tests/site/form.html', function() { + this.fillXPath('form[action="result.html"]', { + '//input[@name="email"]': 'chuck@norris.com', + '//input[@name="password"]': 'chuck', + '//textarea[@name="content"]': 'Am watching thou', + '//input[@name="check"]': true, + '//input[@name="choice"]': 'no', + '//select[@name="topic"]': 'bar', + '//input[@name="checklist[]"]': ['1', '3'], + '//input[@name="strange"]': "very" + }); + testFormValues(test); + // note: file inputs cannot be filled using XPath + }); + casper.thenClick('input[type="submit"]', function() { + testUrl(test); + }); + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('nonexistent fields', 1, function(test) { + casper.start('tests/site/form.html', function() { + test.assertRaises(this.fill, ['form[action="result.html"]', { + nonexistent: 42 + }, true], 'Casper.fill() raises an exception when unable to fill a form'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('multiple forms', 2, function(test) { + casper.start('tests/site/multiple-forms.html', function() { + this.fill('form[name="f2"]', { + yo: "ok" + }, true); + }).then(function() { + test.assertUrlMatch(/\?f=f2&yo=ok$/, 'Casper.fill() handles multiple forms'); + }).then(function() { + this.fill('form[name="f2"]', { + yo: "ok" + }); + test.assertEquals(this.getFormValues('form[name="f2"]'), { + f: "f2", + yo: "ok" + }, 'Casper.getFormValues() retrieves filled values when multiple forms have same field names'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('field array', 1, function(test) { + // issue #267: array syntax field names + casper.start('tests/site/field-array.html', function() { + this.fill('form', { + 'foo[bar]': "bar", + 'foo[baz]': "baz" + }, true); + }).then(function() { + test.assertUrlMatch('?foo[bar]=bar&foo[baz]=baz', + 'Casper.fill() handles array syntax field names'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('getFormValues() tests', 2, function(test) { + var fpath = fs.pathJoin(phantom.casperPath, 'README.md'); + var fileValue = 'README.md'; + if (phantom.casperEngine === 'phantomjs') { + fileValue = 'C:\\fakepath\\README.md'; // phantomjs/webkit sets that; + } + + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + email: 'chuck@norris.com', + password: 'chuck', + language: 'english', + content: 'Am watching thou', + check: true, + choice: 'no', + topic: 'bar', + file: fpath, + 'checklist[]': ['1', '3'], + strange: "very" + }); + }); + casper.then(function() { + test.assertEquals(this.getFormValues('form'), { + "check": true, + "checklist[]": ["1", "3"], + "choice": "no", + "content": "Am watching thou", + "email": "chuck@norris.com", + "file": fileValue, + "password": "chuck", + "submit": "submit", + "language": "english", + "topic": "bar", + "strange": "very" + }, 'Casper.getFormValues() retrieves filled values'); + }); + casper.then(function() { + this.fill('form[action="result.html"]', { + email: 'chuck@norris.com', + password: 'chuck', + language: 'english', + content: 'Am watching thou', + check: true, + choice: 'yes', + topic: 'bar', + file: fpath, + 'checklist[]': ['1', '3'], + strange: "very" + }); + }); + casper.then(function() { + test.assertEquals(this.getFormValues('form'), { + "check": true, + "checklist[]": ["1", "3"], + "choice": "yes", + "content": "Am watching thou", + "email": "chuck@norris.com", + "file": fileValue, + "password": "chuck", + "language": "english", + "submit": "submit", + "topic": "bar", + "strange": "very" + }, 'Casper.getFormValues() correctly retrieves values from radio inputs regardless of order'); + }); + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/frames.js b/vendor/casperjs/tests/suites/casper/frames.js new file mode 100755 index 0000000..785be97 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/frames.js @@ -0,0 +1,45 @@ +/*global casper, __utils__*/ +/*jshint strict:false*/ +casper.test.begin('handling frames', 16, function(test) { + casper.start('tests/site/frames.html'); + + casper.withFrame('frame1', function() { + test.assertTitle('CasperJS frame 1'); + test.assertExists("#f1"); + test.assertDoesntExist("#f2"); + test.assertEval(function() { + return '__utils__' in window && 'getBinary' in __utils__; + }, '__utils__ object is available in child frame'); + test.assertMatches(this.page.frameContent, /This is frame 1/); + test.assertMatches(this.getHTML(), /This is frame 1/); + }); + + casper.withFrame('frame2', function() { + test.assertTitle('CasperJS frame 2'); + test.assertExists("#f2"); + test.assertDoesntExist("#f1"); + test.assertEval(function() { + return '__utils__' in window && 'getBinary' in __utils__; + }, '__utils__ object is available in other child frame'); + this.clickLabel('frame 3'); + }); + + casper.withFrame('frame2', function() { + test.assertTitle('CasperJS frame 3'); + }); + + casper.withFrame(0, function() { + test.assertTitle('CasperJS frame 1'); + test.assertExists("#f1"); + test.assertDoesntExist("#f2"); + }); + + casper.withFrame(1, function() { + test.assertTitle('CasperJS frame 3'); + }); + + casper.run(function() { + test.assertTitle('CasperJS test frames'); + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/global.js b/vendor/casperjs/tests/suites/casper/global.js new file mode 100755 index 0000000..9e818e0 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/global.js @@ -0,0 +1,14 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('getGLobal() tests', 3, function(test) { + casper.start('tests/site/global.html', function() { + test.assertEquals(this.getGlobal('myGlobal'), 'awesome string', + 'Casper.getGlobal() can retrieve a remote global variable'); + test.assertEquals(this.getGlobal('myObject').foo.bar, 'baz', + 'Casper.getGlobal() can retrieves a serializable object'); + test.assertRaises(this.getGlobal, ['myUnencodableGlobal'], + 'Casper.getGlobal() does not fail trying to encode an unserializable global'); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/headers.js b/vendor/casperjs/tests/suites/casper/headers.js new file mode 100755 index 0000000..8e5bbb4 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/headers.js @@ -0,0 +1,33 @@ +/*global casper*/ +/*jshint strict:false*/ +var server = require('webserver').create(); +var service = server.listen(8090, function(request, response) { + response.statusCode = 200; + response.headers = { + 'Content-Language': 'en', + 'Content-Type': 'text/html', + 'Date': new Date().toUTCString() + }; + response.write("ok"); + response.close(); +}); + +casper.test.begin('Casper.headers.get() using file protocol', 1, function(test) { + casper.start('file://' + phantom.casperPath + 'tests/site/index.html', function(response) { + test.assertEquals(response, {data: null}, 'Empty http response on local page'); + }).run(function() { + test.done(); + }) +}); + +casper.test.begin('Casper.headers.get() using http protocol', 3, function(test) { + casper.start('http://localhost:8090/', function(response) { + var headers = response.headers; + test.assertEquals(headers.get('Content-Language'), 'en', 'Checking existing header (case sensitive)'); + test.assertEquals(headers.get('content-language'), 'en', 'Checking existing header (case insensitive)'); + test.assertEquals(headers.get('X-Is-Troll'), null, 'Checking unexisting header'); + }).run(function() { + server.close(); + test.done(); + }) +}); diff --git a/vendor/casperjs/tests/suites/casper/history.js b/vendor/casperjs/tests/suites/casper/history.js new file mode 100755 index 0000000..5c6b483 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/history.js @@ -0,0 +1,23 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('handling navigation history', 4, function(test) { + casper.start('tests/site/page1.html'); + casper.thenOpen('tests/site/page2.html'); + casper.thenOpen('tests/site/page3.html'); + casper.back(); + casper.then(function() { + test.assertMatch(this.getCurrentUrl(), /page2\.html$/, + 'Casper.back() can go back an history step'); + }); + casper.forward(); + casper.then(function() { + test.assertMatch(this.getCurrentUrl(), /page3\.html$/, + 'Casper.forward() can go forward an history step'); + }); + casper.run(function() { + test.assert(this.history.length > 0, 'Casper.history contains urls'); + test.assertMatch(this.history[0], /page1\.html$/, + 'Casper.history has the correct first url'); + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/hooks.js b/vendor/casperjs/tests/suites/casper/hooks.js new file mode 100755 index 0000000..cc6a44b --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/hooks.js @@ -0,0 +1,65 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('onStepComplete() hook tests', 1, function(test) { + var stepResults = []; + casper.options.onStepComplete = function(self, stepResult) { + stepResults.push(stepResult); + }; + casper.start('tests/site/index.html', function() { + return 'ok'; + }); + casper.run(function() { + test.assert(stepResults.indexOf('ok') > -1, + 'Casper.options.onStepComplete() is called on step complete'); + this.options.onStepComplete = undefined; + test.done(); + }); +}); + +casper.test.begin('onResourceRequested() & onResourceReceived() hook tests', 6, function(test) { + var requests = [], responses = []; + casper.options.onResourceRequested = function(self, request) { + requests.push(request); + }; + casper.options.onResourceReceived = function(self, response) { + responses.push(response); + }; + casper.start('tests/site/index.html', function() { + test.assert(requests.some(function(request) { + return (/index\.html$/).test(request.url); + }), 'onResourceRequested() receives page requests'); + test.assert(requests.some(function(request) { + return (/phantom\.png$/).test(request.url); + }), 'onResourceRequested() receives image requests'); + test.assert(responses.some(function(response) { + return response.stage === 'start' && (/index\.html$/).test(response.url); + }), 'onResourceReceived() receives page response on load start'); + test.assert(responses.some(function(response) { + return response.stage === 'end' && (/index\.html$/).test(response.url); + }), 'onResourceReceived() receives page response on load end'); + test.assert(responses.some(function(response) { + return response.stage === 'start' && (/phantom\.png$/).test(response.url); + }), 'onResourceReceived() receives image response on load start'); + test.assert(responses.some(function(response) { + return response.stage === 'end' && (/phantom\.png$/).test(response.url); + }), 'onResourceReceived() receives image response on load end'); + }); + casper.run(function() { + this.options.onResourceReceived = this.options.onResourceRequested = undefined; + test.done(); + }); +}); + +casper.test.begin('onAlert() hook tests', 1, function(test) { + var message; + casper.options.onAlert = function(self, msg) { + message = msg; + }; + casper.start('tests/site/alert.html', function() { + test.assertEquals(message, 'plop', 'Casper.options.onAlert() can intercept an alert message'); + }); + casper.run(function() { + this.options.onAlert = null; + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/keys.js b/vendor/casperjs/tests/suites/casper/keys.js new file mode 100755 index 0000000..1c292b7 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/keys.js @@ -0,0 +1,72 @@ +/*jshint strict:false*/ +/*global CasperError, casper, console, phantom, require*/ +var utils = require('utils'); + +casper.test.begin('sendKeys() tests', 4, function(test) { + casper.start('tests/site/form.html', function() { + this.sendKeys('input[name="email"]', 'duke@nuk.em'); + this.sendKeys('input[name="language"]', 'fr', {keepFocus: true}); + this.click('#autocomplete li:first-child'); + this.sendKeys('textarea', "Damn, I’m looking good."); + var values = this.getFormValues('form[action="result.html"]'); + test.assertEquals(values.email, 'duke@nuk.em', + 'Casper.sendKeys() sends keys to given input'); + test.assertEquals(values.language, 'french', + 'Casper.sendKeys() sends keys to given input and keeps focus afterweards'); + test.assertEquals(values.content, "Damn, I’m looking good.", + 'Casper.sendKeys() sends keys to given textarea'); + + this.sendKeys('input[name="notype"]', "I have no type."); + values = this.getFormValues('form#no-type-test-form'); + test.assertEquals(values.notype, "I have no type.", + 'Casper.sendKeys() sends keys to given input without type attribute'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('sendKeys() works on content-editable elements', function(test) { + casper.start('tests/site/elementattribute.html', function() { + this.click('#content-editable-div'); + this.sendKeys('#content-editable-div', 'A Clockwork Orange'); + }).then(function() { + test.assertSelectorHasText('#content-editable-div','A Clockwork Orange'); + }).run(function() { + test.done(); + }); +}); + +if (utils.gteVersion(phantom.version, '1.9.0')) { + casper.test.begin('sendKeys() key modifiers tests', 1, function(test) { + casper.start().then(function() { + this.setContent([ + '<input>', + '<script>var keys = []; window.addEventListener("keypress", function(e) {', + ' keys.push({code: e.which, alt: e.altKey, ctrl: e.ctrlKey});', + '})</script>' + ].join('')); + this.sendKeys('input', 'k'); + this.sendKeys('input', 'k', {modifiers: "ctrl"}); + this.sendKeys('input', 'k', {modifiers: "ctrl+alt"}); + test.assertEquals(this.getGlobal('keys'), + [ + {code: 107, alt: false, ctrl: false}, + {code: 107, alt: false, ctrl: true}, + {code: 107, alt: true, ctrl: true} + ], 'sendKeys() uses key modifiers'); + }).run(function() { + test.done(); + }); + }); +} + +casper.test.begin('sendKeys() reset option', 1, function(test) { + casper.start('tests/site/form.html', function() { + this.sendKeys('textarea', 'foo'); + this.sendKeys('textarea', 'bar', {reset: true}); + var values = this.getFormValues('form[action="result.html"]'); + test.assertEquals(values.content, "bar"); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/location.js b/vendor/casperjs/tests/suites/casper/location.js new file mode 100755 index 0000000..31cc875 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/location.js @@ -0,0 +1,23 @@ +/*jshint strict:false*/ +/*global CasperError, casper, console, phantom, require*/ +var utils = require('utils') + +if (utils.ltVersion(phantom.version, '1.8.0')) { + // https://github.com/n1k0/casperjs/issues/101 + casper.warn('document.location is broken under phantomjs < 1.8'); + casper.test.done(); +} else { + casper.test.begin('document.location tests', 1, function(test) { + casper.start('tests/site/index.html', function() { + this.evaluate(function() { + document.location = '/tests/site/form.html'; + }); + }); + casper.then(function() { + test.assertUrlMatches(/form\.html$/, 'document.location works as expected'); + }); + casper.run(function() { + test.done(); + }); + }); +} diff --git a/vendor/casperjs/tests/suites/casper/logging.js b/vendor/casperjs/tests/suites/casper/logging.js new file mode 100755 index 0000000..4537d8d --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/logging.js @@ -0,0 +1,41 @@ +/*jshint strict:false*/ +/*global casper, __utils__*/ +casper.test.begin('logging tests', 4, function(test) { + casper.start('tests/site/index.html'); + + var oldLevel = casper.options.logLevel; + + casper.options.logLevel = 'info'; + casper.options.verbose = false; + + casper.log('foo', 'info'); + casper.test.assert(casper.result.log.some(function(e) { + return e.message === 'foo' && e.level === 'info'; + }), 'Casper.log() adds a log entry'); + + casper.options.logLevel = oldLevel; + casper.options.verbose = true; + + casper.then(function() { + var oldLevel = casper.options.logLevel; + casper.options.logLevel = 'debug'; + casper.options.verbose = false; + casper.evaluate(function() { + __utils__.log('debug message'); + __utils__.log('info message', 'info'); + }); + test.assert(casper.result.log.some(function(e) { + return e.message === 'debug message' && e.level === 'debug' && e.space === 'remote'; + }), 'ClientUtils.log() adds a log entry'); + test.assert(casper.result.log.some(function(e) { + return e.message === 'info message' && e.level === 'info' && e.space === 'remote'; + }), 'ClientUtils.log() adds a log entry at a given level'); + casper.options.logLevel = oldLevel; + casper.options.verbose = true; + }); + + casper.run(function() { + test.assertEquals(this.result.log.length, 3, 'Casper.log() logged messages'); + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/mouseevents.js b/vendor/casperjs/tests/suites/casper/mouseevents.js new file mode 100755 index 0000000..a5e5a84 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/mouseevents.js @@ -0,0 +1,30 @@ +/*global casper*/ +/*jshint strict:false, maxstatements:99*/ +casper.test.begin('mouseEvent() tests', 16, function(test) { + casper.start('tests/site/mouse-events.html', function() { + test.assert(this.mouseEvent('mousedown', '#test1'), 'Casper.mouseEvent() can dispatch a mousedown event'); + test.assert(this.mouseEvent('mousedown', '#test2'), 'Casper.mouseEvent() can dispatch a mousedown event handled by unobstrusive js'); + test.assert(this.mouseEvent('mouseup', '#test3'), 'Casper.mouseEvent() can dispatch a mouseup event'); + test.assert(this.mouseEvent('mouseup', '#test4'), 'Casper.mouseEvent() can dispatch a mouseup event handled by unobstrusive js'); + test.assert(this.mouseEvent('mouseover', '#test5'), 'Casper.mouseEvent() can dispatch a mouseover event'); + test.assert(this.mouseEvent('mouseover', '#test6'), 'Casper.mouseEvent() can dispatch a mouseover event handled by unobstrusive js'); + test.assert(this.mouseEvent('mouseout', '#test7'), 'Casper.mouseEvent() can dispatch a mouseout event'); + test.assert(this.mouseEvent('mouseout', '#test8'), 'Casper.mouseEvent() can dispatch a mouseout event handled by unobstrusive js'); + }); + + casper.then(function() { + var results = this.getGlobal('results'); + test.assert(results.test1, 'Casper.mouseEvent() triggered mousedown'); + test.assert(results.test2, 'Casper.mouseEvent() triggered mousedown via unobstrusive js'); + test.assert(results.test3, 'Casper.mouseEvent() triggered mouseup'); + test.assert(results.test4, 'Casper.mouseEvent() triggered mouseup via unobstrusive js'); + test.assert(results.test5, 'Casper.mouseEvent() triggered mouseover'); + test.assert(results.test6, 'Casper.mouseEvent() triggered mouseover via unobstrusive js'); + test.assert(results.test7, 'Casper.mouseEvent() triggered mouseout'); + test.assert(results.test8, 'Casper.mouseEvent() triggered mouseout via unobstrusive js'); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/navigation.js b/vendor/casperjs/tests/suites/casper/navigation.js new file mode 100755 index 0000000..f7b074c --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/navigation.js @@ -0,0 +1,50 @@ +/*global casper*/ +/*jshint strict:false*/ +var server = require('webserver').create(); +var service = server.listen(8090, function(request, response) { + response.statusCode = 200; + response.setHeader('Content-type', 'text/html'); + response.write('<a href="/link">a link</a>'); + response.write('<form action="/form" method="POST"><input type="submit" /></form>'); + response.close(); +}); + +casper.test.begin('Link Navigation updates response', function(test) { + casper.start('http://localhost:8090', function(response) { + casper.click('a'); + casper.then(function(response) { + test.assertUrlMatch( + /\/link$/, + 'URL matches anchor href' + ); + test.assertEquals( + response.url, + casper.page.url, + 'response is consistent with the internal page' + ); + + }); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Form Submittal updates the response', function(test) { + casper.start('http://localhost:8090', function(response) { + casper.fill('form', {}, true); + casper.then(function(response) { + test.assertUrlMatch( + /\/form$/, + 'URL matches form action' + ); + test.assertEquals( + response.url, + casper.page.url, + 'response is consistent with the internal page' + ); + }); + }).run(function() { + test.done(); + server.close(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/onerror.js b/vendor/casperjs/tests/suites/casper/onerror.js new file mode 100755 index 0000000..e22ec1a --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/onerror.js @@ -0,0 +1,25 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('page.error event tests', 2, function(test) { + var error = {}; + var expectedMessage; + if (phantom.casperEngine === 'phantomjs') { + expectedMessage = "ReferenceError: Can't find variable: plop"; + } + else { + expectedMessage = "ReferenceError: plop is not defined"; + } + casper.once("page.error", function onError(msg, trace) { + error.msg = msg; + error.trace = trace; + }); + casper.start('tests/site/error.html', function() { + test.assertEquals(error.msg, expectedMessage, + "page.error event has been caught OK"); + test.assertMatch(error.trace[0].file, /error.html/, + "page.error retrieves correct stack trace"); + }); + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/open.js b/vendor/casperjs/tests/suites/casper/open.js new file mode 100755 index 0000000..3981163 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/open.js @@ -0,0 +1,264 @@ +/*global casper*/ +/*jshint strict:false*/ +var usedSettings; + +function onOpen(url, settings) { + usedSettings = settings; +} + +function setUp(test) { + casper.start().on('open', onOpen); +} + +function tearDown(test) { + usedSettings = undefined; + casper.removeListener('open', onOpen); +} + +casper.test.begin('open() GET tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + casper.open('tests/site/index.html').then(function() { + test.pass("Casper.open() can open and load a location using GET"); + test.assertEquals(usedSettings, { + method: "get" + }, "Casper.open() used the expected GET settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() GET casing tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + casper.open('tests/site/index.html', { + method: 'GET' + }).then(function() { + test.pass("Casper.open() can open and load a location using GET"); + test.assertEquals(usedSettings, { + method: "GET" + }, "Casper.open() used the expected GET settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() POST tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + casper.open('tests/site/index.html', { + method: 'post', + data: { + plop: 42, + chuck: 'norris' + } + }).then(function() { + test.pass("Casper.open() can open and load a location using POST"); + test.assertEquals(usedSettings, { + method: "post", + data: "plop=42&chuck=norris" + }, "Casper.open() used the expected POST settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() POST casing tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + casper.open('tests/site/index.html', { + method: 'POST', + data: { + plop: 42, + chuck: 'norris' + } + }).then(function() { + test.pass("Casper.open() can open and load a location using POST"); + test.assertEquals(usedSettings, { + method: "POST", + data: "plop=42&chuck=norris" + }, "Casper.open() used the expected POST settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() PUT tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + casper.thenOpen('tests/site/index.html', { + method: 'put', + data: { + plop: 42, + chuck: 'norris' + } + }).then(function() { + test.pass("Casper.open() can open and load a location using PUT"); + test.assertEquals(usedSettings, { + method: "put", + data: "plop=42&chuck=norris" + }, "Casper.open() used the expected PUT settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() PUT casing tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + casper.thenOpen('tests/site/index.html', { + method: 'PUT', + data: { + plop: 42, + chuck: 'norris' + } + }).then(function() { + test.pass("Casper.open() can open and load a location using PUT"); + test.assertEquals(usedSettings, { + method: "PUT", + data: "plop=42&chuck=norris" + }, "Casper.open() used the expected PUT settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() PUT tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + // HTTP Auth + casper.thenOpen('tests/site/index.html', { + method: 'get', + username: 'bob', + password: 'sinclar' + }).then(function() { + test.pass("Casper.open() can open and load a location using HTTP auth"); + test.assertEquals(usedSettings, { + method: "get", + username: 'bob', + password: 'sinclar' + }, "Casper.open() used the expected HTTP auth settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() PUT tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + // GET with thenOpen + casper.thenOpen('tests/site/index.html').then(function() { + test.pass("Casper.thenOpen() can open and load a location using GET"); + test.assertEquals(usedSettings, { + method: "get" + }, "Casper.thenOpen() used the expected GET settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() PUT tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + // POST with thenOpen + casper.thenOpen('tests/site/index.html', { + method: 'post', + data: { + plop: 42, + chuck: 'norris' + } + }, function() { + test.pass("Casper.thenOpen() can open and load a location using POST"); + test.assertEquals(usedSettings, { + method: "post", + data: "plop=42&chuck=norris" + }, "Casper.thenOpen() used the expected POST settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() PUT tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + // PUT with thenOpen + casper.thenOpen('tests/site/index.html', { + method: 'put', + data: { + plop: 42, + chuck: 'norris' + } + }, function() { + test.pass("Casper.thenOpen() can open and load a location using PUT"); + test.assertEquals(usedSettings, { + method: "put", + data: "plop=42&chuck=norris" + }, "Casper.thenOpen() used the expected PUT settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); + +casper.test.begin('open() PUT tests', 2, { + setUp: setUp, + tearDown: tearDown, + test: function(test) { + // HTTP Auth with thenOpen + casper.thenOpen('tests/site/index.html', { + method: 'get', + username: 'bob', + password: 'sinclar' + }, function() { + test.pass("Casper.thenOpen() can open and load a location using HTTP auth"); + test.assertEquals(usedSettings, { + method: "get", + username: 'bob', + password: 'sinclar' + }, "Casper.thenOpen() used the expected HTTP auth settings"); + }); + + casper.run(function() { + test.done(); + }); + } +}); diff --git a/vendor/casperjs/tests/suites/casper/popup.js b/vendor/casperjs/tests/suites/casper/popup.js new file mode 100755 index 0000000..ba16a52 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/popup.js @@ -0,0 +1,91 @@ +/*jshint strict:false, maxstatements:99*/ +/*global CasperError, casper, console, phantom, require*/ +var utils = require('utils'); +var x = require('casper').selectXPath; + +casper.test.begin('popup tests', 22, function(test) { + casper.once('popup.created', function(popup) { + test.pass('"popup.created" event is fired'); + test.assert(utils.isWebPage(popup), + '"popup.created" event callback get a popup page instance'); + }); + + casper.once('popup.loaded', function(popup) { + test.pass('"popup.loaded" event is fired'); + test.assertEquals(popup.evaluate(function() { + return document.title; + }), 'CasperJS test index', + '"popup.loaded" is triggered when popup content is actually loaded'); + }); + + casper.once('popup.closed', function(popup) { + test.assertEquals(this.popups.length, 0, '"popup.closed" event is fired'); + }); + + casper.start('tests/site/popup.html'); + + casper.waitForPopup('index.html', function() { + test.pass('Casper.waitForPopup() waits for a popup being created'); + test.assertEquals(this.popups.length, 1, 'A popup has been added'); + test.assert(utils.isWebPage(this.popups[0]), 'A popup is a WebPage'); + }); + + casper.withPopup('index.html', function() { + test.assertTitle('CasperJS test index', + 'Casper.withPopup() found a popup with expected title'); + test.assertTextExists('three', + 'Casper.withPopup() found a popup with expected text'); + test.assertUrlMatches(/index\.html$/, + 'Casper.withPopup() switched to popup as current active one'); + test.assertEval(function() { + return '__utils__' in window; + }, 'Casper.withPopup() has client utils injected'); + test.assertExists('h1', + 'Casper.withPopup() can perform assertions on the DOM'); + test.assertExists(x('//h1'), + 'Casper.withPopup() can perform assertions on the DOM using XPath'); + }); + + casper.then(function() { + test.assertUrlMatches(/popup\.html$/, + 'Casper.withPopup() has reverted to main page after using the popup'); + }); + + casper.thenClick('.close', function() { + test.assertEquals(this.popups.length, 0, 'Popup is removed when closed'); + }); + + casper.thenOpen('tests/site/popup.html'); + + casper.waitForPopup(/index\.html$/, function() { + test.pass('Casper.waitForPopup() waits for a popup being created'); + }); + + casper.withPopup(/index\.html$/, function() { + test.assertTitle('CasperJS test index', + 'Casper.withPopup() can use a regexp to identify popup'); + }); + + casper.thenClick('.close', function() { + test.assertUrlMatches(/popup\.html$/, + 'Casper.withPopup() has reverted to main page after using the popup'); + test.assertEquals(this.popups.length, 0, 'Popup is removed when closed'); + this.removeAllListeners('popup.created'); + this.removeAllListeners('popup.loaded'); + this.removeAllListeners('popup.closed'); + }); + + casper.thenClick('a[target="_blank"]'); + + casper.waitForPopup('form.html', function() { + test.pass('Casper.waitForPopup() waits when clicked on a link with target=_blank'); + }); + + casper.withPopup('form.html', function() { + test.assertTitle('CasperJS test form'); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/prompt.js b/vendor/casperjs/tests/suites/casper/prompt.js new file mode 100755 index 0000000..f77a56d --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/prompt.js @@ -0,0 +1,12 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('prompt tests', 1, function(test) { + casper.setFilter('page.prompt', function(message, value) { + return 'Chuck ' + value; + }); + casper.start('tests/site/prompt.html', function() { + test.assertEquals(this.getGlobal('name'), 'Chuck Norris', 'prompted value has been received'); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/request.coffee b/vendor/casperjs/tests/suites/casper/request.coffee new file mode 100755 index 0000000..8f0ad83 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/request.coffee @@ -0,0 +1,103 @@ +#global casper + +#jshint strict:false + +utils = require "utils" + +if utils.ltVersion(phantom.version, '1.9.0') + casper.test.skip(6, 'PhantomJS version <1.9.0 does not implement request.abort()') + casper.test.done() +else + SERVER = 'http://localhost:54321/' + ORIGINAL_URL = "tests/site/index.html" + CHANGED_URL = "tests/site/index.html?foo=bar" + + setToTrueOnResourceRequested = false + setToTrueOnResourceReceived = false + requestURLRequested = '' + requestURLReceived = '' + + onResourceRequested = (casper, requestData, request) -> + if requestData.url == (SERVER + ORIGINAL_URL) + setToTrueOnResourceRequested = true + requestURLRequested = requestData.url + + onResourceRequestedWithAbort = (casper, requestData, request) -> + if requestData.url == (SERVER + ORIGINAL_URL) + request.abort() + + onResourceRequestedWithChangeURL = (casper, requestData, request) -> + if requestData.url == (SERVER + ORIGINAL_URL) + request.changeUrl(SERVER + CHANGED_URL) + + onResourceReceived = (casper, response) -> + if response.url == (SERVER + ORIGINAL_URL) + setToTrueOnResourceReceived = true + requestURLReceived = response.url + + onResourceReceivedWithChangeURL = (casper, response) -> + if response.url == (SERVER + CHANGED_URL) + requestURLReceived = response.url + + setUp = (test) -> + casper.options.onResourceRequested = onResourceRequested + casper.options.onResourceReceived = onResourceReceived + casper.start() + + setUpWithAbort = (test) -> + casper.options.onResourceRequested = onResourceRequestedWithAbort + casper.options.onResourceReceived = onResourceReceived + casper.start() + + setUpWithChangeURL = (test) -> + casper.options.onResourceRequested = onResourceRequestedWithChangeURL + casper.options.onResourceReceived = onResourceReceivedWithChangeURL + casper.start() + + tearDown = (test) -> + setToTrueOnResourceRequested = false + setToTrueOnResourceReceived = false + casper.options.onResourceRequested = null + casper.options.onResourceReceived = null + + + casper.test.begin "onResourceRequested tests without abort/override", 4, + setUp: setUp + tearDown: tearDown + test: (test) -> + casper.open(ORIGINAL_URL).then -> + + casper.wait 200, -> + test.assertEquals setToTrueOnResourceRequested, true, "Casper.options.onResourceRequested called successfully" + test.assertEquals requestURLRequested, SERVER+ORIGINAL_URL, "request url successfully recorded" + test.assertEquals setToTrueOnResourceReceived, true, "Casper.options.onResourceReceived called successfully" + test.assertEquals requestURLReceived, SERVER+ORIGINAL_URL, "response url successfully recorded" + + casper.run -> + test.done() + + + casper.test.begin "onResourceRequested tests with request.abort()", 1, + setUp: setUpWithAbort + tearDown: tearDown + test: (test) -> + casper.open(ORIGINAL_URL).then -> + + casper.wait 200, -> + test.assertNotEquals setToTrueOnResourceReceived, true, "Casper.options.onResourceReceived correctly never called" + + casper.run -> + test.done() + + + casper.test.begin "onResourceRequested tests with request.changeUrl()", 1, + setUp: setUpWithChangeURL + tearDown: tearDown + test: (test) -> + casper.open(ORIGINAL_URL).then -> + + casper.wait 200, -> + test.assertEquals requestURLReceived, SERVER+CHANGED_URL, "response url successfully changed" + + casper.run -> + test.done() diff --git a/vendor/casperjs/tests/suites/casper/request.js b/vendor/casperjs/tests/suites/casper/request.js new file mode 100755 index 0000000..616faf5 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/request.js @@ -0,0 +1,48 @@ +/*global casper*/ +/*jshint strict:false*/ +var currentRequest; + +function onResourceRequested(requestData, request) { + currentRequest = requestData; +} + +function testHeader(header) { + return header.name === 'Accept' && header.value === 'application/json'; +} + +casper.test.begin('requests tests', 3, { + setUp: function() { + casper.on('page.resource.requested', onResourceRequested); + }, + + tearDown: function() { + currentRequest = undefined; + casper.removeListener('page.resource.requested', onResourceRequested); + }, + + test: function(test) { + casper.start('tests/site/index.html', function() { + test.assertNot(currentRequest.headers.some(testHeader), + "Casper.open() sets no custom header by default"); + }); + + casper.thenOpen('tests/site/index.html', { + headers: { + Accept: 'application/json' + } + }, function() { + test.assert(currentRequest.headers.some(testHeader), + "Casper.open() can set a custom header"); + }); + + casper.thenOpen('tests/site/index.html', function() { + test.assertNot(currentRequest.headers.some(testHeader), + "Casper.open() custom headers option is not persistent"); + }); + + casper.run(function() { + this.removeAllListeners('page.resource.requested'); + test.done(); + }); + } +}); diff --git a/vendor/casperjs/tests/suites/casper/resources.js b/vendor/casperjs/tests/suites/casper/resources.js new file mode 100755 index 0000000..5805647 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/resources.js @@ -0,0 +1,35 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin("Basic resources tests", 5, function(test) { + casper.start("tests/site/resources.html", function() { + test.assertEquals(this.resources.length, 1, "only one resource found"); + }); + + casper.waitForResource("dummy.js", function() { + test.assertEquals(this.resources.length, 2, "two resources found"); + test.assertResourceExists(/dummy\.js/i, "phantom image found via test RegExp"); + test.assertResourceExists(function(res) { + return res.url.match("dummy.js"); + }, "phantom image found via test Function"); + test.assertResourceExists("dummy.js", "phantom image found via test String"); + }, function onTimeout() { + test.fail("waitForResource timeout occured"); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('"resource.error" event', 3, function(test) { + casper.on("resource.error", function(error) { + test.assertType(error, "object", '"resource.error" triggered error information'); + test.assert(error.errorCode === 203, '"resource.error" error code is correct'); + test.assertMatch(error.url, /non-existant\.html$/, '"resource.error" url is correct'); + }); + + casper.start('tests/site/non-existant.html').run(function() { + casper.removeAllListeners("resource.error"); + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/scripts.js b/vendor/casperjs/tests/suites/casper/scripts.js new file mode 100755 index 0000000..d0b44c9 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/scripts.js @@ -0,0 +1,34 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('remote script includes tests', 4, { + setUp: function() { + casper.options.remoteScripts = [ + 'includes/include1.js', // local includes are actually served + 'includes/include2.js' // through the local test webserver + ]; + }, + + tearDown: function() { + casper.options.remoteScripts = []; + }, + + test: function(test) { + casper.start('tests/site/index.html', function() { + test.assertSelectorHasText('#include1', 'include1', + 'Casper.includeRemoteScripts() includes a first remote script on start'); + test.assertSelectorHasText('#include2', 'include2', + 'Casper.includeRemoteScripts() includes a second remote script on start'); + }); + + casper.thenOpen('tests/site/form.html', function() { + test.assertSelectorHasText('#include1', 'include1', + 'Casper.includeRemoteScripts() includes a first remote script on second step'); + test.assertSelectorHasText('#include2', 'include2', + 'Casper.includeRemoteScripts() includes a second remote script on second step'); + }); + + casper.run(function() { + test.done(); + }); + } +}); diff --git a/vendor/casperjs/tests/suites/casper/scroll.js b/vendor/casperjs/tests/suites/casper/scroll.js new file mode 100755 index 0000000..f9a62cb --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/scroll.js @@ -0,0 +1,30 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('Casper.scrollTo()', 2, function(test) { + casper.start().then(function() { + this.setContent('<div style="width:2000px;height:2000px">large div is large</div>'); + this.scrollTo(1000, 1000); + test.assertEquals(this.getGlobal("scrollX"), 1000, "scrollTo() scrolls to X position"); + test.assertEquals(this.getGlobal("scrollY"), 1000, "scrollTo() scrolls to Y position"); + }); + + casper.run(function() { + test.done(); + }); +}); + + +casper.test.begin('Casper.scrollToBottom()', 1, function(test) { + casper.start().then(function() { + this.setContent('<div style="height:2000px">long div is long</div>'); + this.scrollToBottom(); + test.assertEval(function() { + /*global __utils__*/ + return __utils__.getDocumentHeight() - window.innerHeight === window.scrollY; + }, "scrollToBottom() scrolls to max Y by default"); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/start.js b/vendor/casperjs/tests/suites/casper/start.js new file mode 100755 index 0000000..c80a2e5 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/start.js @@ -0,0 +1,17 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('start() tests', 4, function(test) { + casper.start('tests/site/index.html', function() { + test.pass('Casper.start() can chain a next step'); + test.assertTitle('CasperJS test index', 'Casper.start() opened the passed url'); + test.assertEval(function() { + return typeof(__utils__) === "object"; + }, 'Casper.start() injects ClientUtils instance within remote DOM'); + }); + + test.assert(casper.started, 'Casper.start() started'); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/steps.js b/vendor/casperjs/tests/suites/casper/steps.js new file mode 100755 index 0000000..b4d020e --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/steps.js @@ -0,0 +1,54 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('steps tests', 8, function(test) { + casper.start('tests/site/index.html'); + + var nsteps = casper.steps.length; + + casper.then(function(response) { + test.assertTitle('CasperJS test index', + 'Casper.then() added a new step'); + }); + + test.assertEquals(casper.steps.length, nsteps + 1, + 'Casper.then() can add a new step'); + + casper.thenOpen('tests/site/test.html'); + + test.assertEquals(casper.steps.length, nsteps + 2, + 'Casper.thenOpen() can add a new step'); + + casper.thenOpen('tests/site/test.html', function() { + test.assertTitle('CasperJS test target', + 'Casper.thenOpen() opened a location and executed a step'); + }); + + test.assertEquals(casper.steps.length, nsteps + 4, + 'Casper.thenOpen() can add a new step for opening, plus another step'); + + casper.each([1, 2, 3], function(self, item, i) { + test.assertEquals(i, item - 1, + 'Casper.each() passes a contextualized index'); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('eachThen() tests', 1, function(test) { + var received = []; + + casper.start().eachThen([1, 2, 3], function(response) { + if (!response) { + test.fail('No response received'); + } + received.push(response.data); + }); + + casper.run(function() { + test.assertEquals(received, [1, 2, 3], + 'Casper.eachThen() passes item to step data'); + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/urls.js b/vendor/casperjs/tests/suites/casper/urls.js new file mode 100755 index 0000000..5d36b2a --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/urls.js @@ -0,0 +1,25 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('urls tests', 6, function(test) { + casper.start('tests/site/urls.html', function() { + this.clickLabel('raw unicode', 'a'); + }); + + casper.then(function() { + test.assertHttpStatus(200); + test.assertUrlMatches('Forlì', 'Casper.getCurrentUrl() retrieves a raw unicode URL'); + this.clickLabel('escaped', 'a'); + }); + + casper.then(function() { + test.assertHttpStatus(200); + test.assertUrlMatches('Forlì', 'Casper.getCurrentUrl() retrieves an escaped URL'); + this.clickLabel('uri encoded', 'a'); + }); + + casper.run(function() { + test.assertHttpStatus(200); + test.assertUrlMatches('Forlì', 'Casper.getCurrentUrl() retrieves a decoded URL'); + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/viewport.js b/vendor/casperjs/tests/suites/casper/viewport.js new file mode 100755 index 0000000..c0df689 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/viewport.js @@ -0,0 +1,41 @@ +/*global casper*/ +/*jshint strict:false*/ +var utils = require('utils'); + +casper.test.begin('viewport() tests', 3, function(test) { + casper.start(); + casper.viewport(1337, 999); + test.assertEquals(casper.page.viewportSize.width, 1337, + 'Casper.viewport() can change the width of page viewport'); + test.assertEquals(casper.page.viewportSize.height, 999, + 'Casper.viewport() can change the height of page viewport'); + test.assertRaises(casper.viewport, ['a', 'b'], + 'Casper.viewport() validates viewport size data'); + test.done(); +}); + +casper.test.begin('viewport() asynchronous tests', 2, function(test) { + var screenshotData; + + casper.start('tests/site/index.html').viewport(800, 600, function() { + this.setContent(utils.format('<img src="data:image/png;base64,%s">', + this.captureBase64('png'))); + }); + + casper.then(function() { + var imgInfo = this.getElementInfo('img'); + if (phantom.casperEngine === "slimerjs" && imgInfo.width !== 800) { + // sometimes, setting viewport could take more time in slimerjs/gecko + // and the image is not still ready: :-/ + test.skip(2); + } + else { + test.assertEquals(imgInfo.width, 800, 'Casper.viewport() changes width asynchronously'); + test.assertEquals(imgInfo.height, 600, 'Casper.viewport() changes height asynchronously'); + } + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/visible.js b/vendor/casperjs/tests/suites/casper/visible.js new file mode 100755 index 0000000..accc451 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/visible.js @@ -0,0 +1,19 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('visibility tests', 5, function(test) { + casper.start('tests/site/visible.html', function() { + test.assert(!this.visible('#img1'), 'Casper.visible() can detect if an element is invisible'); + test.assert(this.visible('#img2'), 'Casper.visible() can detect if an element is visible'); + test.assert(!this.visible('#img3'), 'Casper.visible() can detect if an element is invisible'); + test.assert(this.visible('img'), 'Casper.visible() can detect if an element is visible'); + this.waitWhileVisible('#img1', function() { + test.pass('Casper.waitWhileVisible() can wait while an element is visible'); + }, function() { + test.fail('Casper.waitWhileVisible() can wait while an element is visible'); + }, 2000); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/wait.js b/vendor/casperjs/tests/suites/casper/wait.js new file mode 100755 index 0000000..dcf0823 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/wait.js @@ -0,0 +1,170 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('wait() tests', 1, function(test) { + var waitStart; + + casper.start('tests/site/index.html', function() { + waitStart = new Date().getTime(); + }); + + casper.wait(250, function() { + test.assert(new Date().getTime() - waitStart > 250, + 'Casper.wait() can wait for a given amount of time'); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitFor() tests', 2, function(test) { + casper.start('tests/site/waitFor.html'); + + casper.waitFor(function() { + return this.evaluate(function() { + return document.querySelectorAll('li').length === 4; + }); + }, function() { + test.pass('Casper.waitFor() can wait for something to happen'); + }, function() { + test.fail('Casper.waitFor() can wait for something to happen'); + }); + + casper.reload().waitFor(function(){ + return false; + }, function() { + test.fail('waitFor() processes onTimeout callback'); + }, function() { + test.pass('waitFor() processes onTimeout callback'); + }, 1000); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitForResource() tests', 2, function(test) { + casper.start('tests/site/waitFor.html'); + + casper.waitForResource('phantom.png', function() { + test.pass('Casper.waitForResource() waits for a resource'); + }, function() { + test.fail('Casper.waitForResource() waits for a resource'); + }); + + casper.reload().waitForResource(/phantom\.png$/, function() { + test.pass('Casper.waitForResource() waits for a resource using RegExp'); + }, function() { + test.fail('Casper.waitForResource() waits for a resource using RegExp'); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitForSelector() tests', 1, function(test) { + casper.start('tests/site/waitFor.html'); + + casper.waitForSelector('li:nth-child(4)', function() { + test.pass('Casper.waitForSelector() waits for a selector to exist'); + }, function() { + test.fail('Casper.waitForSelector() waits for a selector to exist'); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitForText() tests', 3, function(test) { + casper.start('tests/site/waitFor.html'); + + casper.waitForText('<li>four</li>', function() { + test.pass('Casper.waitForText() can wait for text'); + }, function() { + test.fail('Casper.waitForText() can wait for text'); + }); + + casper.reload().waitForText(/four/i, function() { + test.pass('Casper.waitForText() can wait for regexp'); + }, function() { + test.fail('Casper.waitForText() can wait for regexp'); + }); + + casper.reload().waitForText('Voilà', function() { + test.pass('Casper.waitForText() can wait for decoded HTML text'); + }, function() { + test.fail('Casper.waitForText() can wait for decoded HTML text'); + }, 1000); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitForSelectorTextChange() tests', 1, function(test) { + casper.start('tests/site/waitFor.html'); + + casper.waitForSelectorTextChange('#textChange', function() { + test.pass('Casper.waitForSelectorTextChange() can wait for text on a selector to change'); + }, function() { + test.fail('Casper.waitForSelectorTextChange() can wait for text on a selector to change'); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitUntilVisible() tests', 2, function(test) { + casper.start('tests/site/waitFor.html'); + + casper.waitUntilVisible('li:nth-child(4)', function() { + test.pass('Casper.waitUntilVisible() waits for a selector being visible'); + }, function() { + test.fail('Casper.waitUntilVisible() waits for a selector being visible'); + }); + + casper.waitUntilVisible('p', function() { + test.pass('Casper.waitUntilVisible() waits for a selector being visible'); + }, function() { + test.fail('Casper.waitUntilVisible() waits for a selector being visible'); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitForUrl() regexp tests', 1, function(test) { + casper.start().thenEvaluate(function() { + setTimeout(function() { + document.location = './form.html'; + }, 100); + }); + + casper.waitForUrl(/form\.html$/, function() { + test.pass('Casper.waitForUrl() waits for a given regexp url'); + }); + + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('waitForUrl() string tests', 1, function(test) { + casper.start().thenEvaluate(function() { + setTimeout(function() { + document.location = './form.html'; + }, 100); + }); + + casper.waitForUrl('form.html', function() { + test.pass('Casper.waitForUrl() waits for a given string url'); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/casper/xpath.js b/vendor/casperjs/tests/suites/casper/xpath.js new file mode 100755 index 0000000..81b08d7 --- /dev/null +++ b/vendor/casperjs/tests/suites/casper/xpath.js @@ -0,0 +1,34 @@ +/*global casper, __utils__*/ +/*jshint strict:false*/ +var x = require('casper').selectXPath; + +casper.test.begin('XPath tests', 6, function(test) { + casper.start('tests/site/index.html', function() { + test.assertExists({ + type: 'xpath', + path: '/html/body/ul/li[2]' + }, 'XPath selector can find an element'); + test.assertDoesntExist({ + type: 'xpath', + path: '/html/body/ol/li[2]' + }, 'XPath selector does not retrieve a nonexistent element'); + test.assertExists(x('/html/body/ul/li[2]'), 'selectXPath() shortcut can find an element as well'); + test.assertEvalEquals(function() { + return __utils__.findAll({type: 'xpath', path: '/html/body/ul/li'}).length; + }, 3, 'Correct number of elements are found'); + }); + + casper.thenClick(x('/html/body/a[2]'), function() { + test.assertTitle('CasperJS test form', 'Clicking XPath works as expected'); + this.fill(x('/html/body/form'), { + email: 'chuck@norris.com' + }); + test.assertEvalEquals(function() { + return document.querySelector('input[name="email"]').value; + }, 'chuck@norris.com', 'Casper.fill() can fill an input[type=text] form field'); + }); + + casper.run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/cli.js b/vendor/casperjs/tests/suites/cli.js new file mode 100755 index 0000000..feb6b28 --- /dev/null +++ b/vendor/casperjs/tests/suites/cli.js @@ -0,0 +1,158 @@ +/*global casper*/ +/*jshint strict:false, maxstatements:99*/ +var cli = require('cli'); + +casper.test.begin('parsing an empty argument list', 12, function(test) { + var parsed = cli.parse([]); + // clean + test.assertEquals(parsed.args, [], 'parse() returns expected positional args array'); + test.assertEquals(parsed.options, {}, 'parse() returns expected options object'); + test.assertEquals(parsed.get(0), undefined, 'parse() does not return inexistant positional arg'); + test.assertEquals(parsed.get('blah'), undefined, 'parse() does not return inexistant option'); + test.assert(!parsed.has(0), 'has() checks if an arg is set'); + test.assert(!parsed.has('blah'), 'has() checks if an option is set'); + // raw + test.assertEquals(parsed.raw.args, [], 'parse() returns expected positional args array'); + test.assertEquals(parsed.raw.options, {}, 'parse() returns expected options object'); + test.assertEquals(parsed.raw.get(0), undefined, 'parse() does not return inexistant positional arg'); + test.assertEquals(parsed.raw.get('blah'), undefined, 'parse() does not return inexistant option'); + test.assert(!parsed.raw.has(0), 'has() checks if a raw arg is set'); + test.assert(!parsed.raw.has('blah'), 'has() checks if a raw option is set'); + test.done(); +}); + +casper.test.begin('parsing an basic argument list', 14, function(test) { + var parsed = cli.parse(['foo', 'bar']); + // clean + test.assertEquals(parsed.args, ['foo', 'bar'], 'parse() returns expected positional args array'); + test.assertEquals(parsed.options, {}, 'parse() returns expected options object'); + test.assertEquals(parsed.get(0), 'foo', 'parse() retrieve first positional arg'); + test.assertEquals(parsed.get(1), 'bar', 'parse() retrieve second positional arg'); + test.assert(parsed.has(0), 'has() checks if an arg is set'); + test.assert(parsed.has(1), 'has() checks if an arg is set'); + test.assert(!parsed.has(2), 'has() checks if an arg is not set'); + // raw + test.assertEquals(parsed.raw.args, ['foo', 'bar'], 'parse() returns expected positional raw args array'); + test.assertEquals(parsed.raw.options, {}, 'parse() returns expected raw options object'); + test.assertEquals(parsed.raw.get(0), 'foo', 'parse() retrieve first positional raw arg'); + test.assertEquals(parsed.raw.get(1), 'bar', 'parse() retrieve second positional raw arg'); + test.assert(parsed.raw.has(0), 'has() checks if a arw arg is set'); + test.assert(parsed.raw.has(1), 'has() checks if a arw arg is set'); + test.assert(!parsed.raw.has(2), 'has() checks if a arw arg is not set'); + test.done(); +}); + +casper.test.begin('parsing some options', 12, function(test) { + var parsed = cli.parse(['--foo=bar', '--baz']); + // clean + test.assertEquals(parsed.args, [], 'parse() returns expected positional args array'); + test.assertEquals(parsed.options, {foo: 'bar', baz: true}, 'parse() returns expected options object'); + test.assertEquals(parsed.get('foo'), 'bar', 'parse() retrieve an option value'); + test.assert(parsed.get('baz'), 'parse() retrieve boolean option flag'); + test.assert(parsed.has("foo"), 'has() checks if an option is set'); + test.assert(parsed.has("baz"), 'has() checks if an option is set'); + // raw + test.assertEquals(parsed.raw.args, [], 'parse() returns expected positional raw args array'); + test.assertEquals(parsed.raw.options, {foo: 'bar', baz: true}, 'parse() returns expected options raw object'); + test.assertEquals(parsed.raw.get('foo'), 'bar', 'parse() retrieve an option raw value'); + test.assert(parsed.raw.get('baz'), 'parse() retrieve boolean raw option flag'); + test.assert(parsed.raw.has("foo"), 'has() checks if a raw option is set'); + test.assert(parsed.raw.has("baz"), 'has() checks if a raw option is set'); + test.done(); +}); + +casper.test.begin('parsing an empty argument list', 8, function(test) { + var parsed = cli.parse(['--&é"à=42===42']); + // clean + test.assertEquals(parsed.args, [], 'parse() returns expected positional args array'); + test.assertEquals(parsed.options, { '&é"à': "42===42" }, 'parse() returns expected options object'); + test.assertEquals(parsed.get('&é"à'), "42===42", 'parse() handles options with exotic names'); + test.assert(parsed.has('&é"à'), 'has() checks if an option is set'); + // raw + test.assertEquals(parsed.raw.args, [], 'parse() returns expected positional raw args array'); + test.assertEquals(parsed.raw.options, { '&é"à': "42===42" }, 'parse() returns expected options raw object'); + test.assertEquals(parsed.raw.get('&é"à'), "42===42", 'parse() handles raw options with exotic names'); + test.assert(parsed.raw.has('&é"à'), 'has() checks if a raw option is set'); + test.done(); +}); + +casper.test.begin('parsing commands containing args and options', 34, function(test) { + var parsed = cli.parse(['foo & bar', 'baz & boz', '--universe=42', + '--lap=13.37', '--chucknorris', '--oops=false']); + // clean + test.assertEquals(parsed.args, ['foo & bar', 'baz & boz'], 'parse() returns expected positional args array'); + test.assertEquals(parsed.options, { + universe: 42, + lap: 13.37, + chucknorris: true, + oops: false }, 'parse() returns expected options object'); + test.assertEquals(parsed.get('universe'), 42, 'parse() can cast a numeric option value'); + test.assertEquals(parsed.get('lap'), 13.37, 'parse() can cast a float option value'); + test.assertType(parsed.get('lap'), "number", 'parse() can cast a boolean value'); + test.assert(parsed.get('chucknorris'), 'parse() can get a flag value by its option name'); + test.assertType(parsed.get('oops'), "boolean", 'parse() can cast a boolean value'); + test.assertEquals(parsed.get('oops'), false, 'parse() can cast a boolean value'); + test.assert(parsed.has(0), 'has() checks if an arg is set'); + test.assert(parsed.has(1), 'has() checks if an arg is set'); + test.assert(parsed.has("universe"), 'has() checks if an option is set'); + test.assert(parsed.has("lap"), 'has() checks if an option is set'); + test.assert(parsed.has("chucknorris"), 'has() checks if an option is set'); + test.assert(parsed.has("oops"), 'has() checks if an option is set'); + + // drop() + parsed.drop(0); + test.assertEquals(parsed.get(0), 'baz & boz', 'drop() dropped arg'); + parsed.drop("universe"); + test.assert(!parsed.has("universe"), 'drop() dropped option'); + test.assert(!parsed.raw.has("universe"), 'drop() dropped raw option'); + test.assertEquals(parsed.args, ["baz & boz"], 'drop() did not affect other args'); + test.assertEquals(parsed.options, { + lap: 13.37, + chucknorris: true, + oops: false + }, 'drop() did not affect other options'); + + // raw + test.assertEquals(parsed.args.length, parsed.raw.args.length, + 'parse() cast and raw args share same length'); + test.assertEquals(Object.keys(parsed.options).length, Object.keys(parsed.raw.options).length, + 'parse() cast and raw options share same length'); + test.assertEquals(parsed.raw.args, ['baz & boz'], + 'parse() returns expected positional raw args array'); + test.assertEquals(parsed.raw.options, { + lap: "13.37", + chucknorris: true, + oops: "false" + }, 'parse() returns expected options raw object'); + test.assertEquals(parsed.raw.get('lap'), "13.37", 'parse() does not cast a raw float option value'); + test.assertType(parsed.raw.get('lap'), "string", 'parse() does not cast a numeric value'); + test.assert(parsed.raw.get('chucknorris'), 'parse() can get a flag value by its option name'); + test.assertType(parsed.raw.get('oops'), "string", 'parse() can cast a boolean value'); + test.assertEquals(parsed.raw.get('oops'), "false", 'parse() can cast a boolean value'); + + // drop() for raw + parsed.raw.drop(0); + test.assertEquals(parsed.raw.get(0), undefined, 'drop() dropped raw arg'); + parsed.raw.drop("universe"); + test.assert(!parsed.raw.has("universe"), 'drop() dropped raw option'); + test.assertEquals(parsed.raw.args, [], 'drop() did not affect other raw args'); + test.assertEquals(parsed.raw.options, { + lap: "13.37", + chucknorris: true, + oops: "false" + }, 'drop() did not affect other raw options'); + parsed.raw.drop("lap"); + test.assert(!parsed.raw.has("lap"), 'drop() dropped raw option'); + test.assert(!parsed.has("lap"), 'drop() dropped cast option as well'); + + test.done(); +}); + +casper.test.begin('default values', 2, function(test) { + var parsed = cli.parse(['foo', '--bar']); + test.assertEquals(parsed.get(42, 'boz'), 'boz', + 'get() can return a default arg value'); + test.assertEquals(parsed.get('--zorg', 'boz'), 'boz', + 'get() can return a default option value'); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/clientutils.js b/vendor/casperjs/tests/suites/clientutils.js new file mode 100755 index 0000000..5ba6977 --- /dev/null +++ b/vendor/casperjs/tests/suites/clientutils.js @@ -0,0 +1,203 @@ +/*global casper*/ +/*jshint strict:false*/ +var fs = require('fs'); +var x = require('casper').selectXPath; + +function fakeDocument(html) { + window.document.body.innerHTML = html; +} + +casper.test.begin('ClientUtils.encode() tests', 6, function(test) { + var clientutils = require('clientutils').create(), + testCases = { + 'an empty string': '', + 'a word': 'plop', + 'a null char': 'a\u0000', + 'an utf8 string': 'ÀÁÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', + 'song lyrics': ("Voilà l'été, j'aperçois le soleil\n" + + "Les nuages filent et le ciel s'éclaircit\n" + + "Et dans ma tête qui bourdonnent?\n" + + "Les abeilles!"), + 'a file contents': fs.read(phantom.casperPath + '/tests/site/alert.html') + }; + for (var what in testCases) { + test.assertEquals( + clientutils.decode(clientutils.encode(testCases[what])), + testCases[what], + 'ClientUtils.encode() encodes and decodes ' + what + ); + } + test.done(); +}); + +casper.test.begin('ClientUtils.exists() tests', 5, function(test) { + var clientutils = require('clientutils').create(); + fakeDocument('<ul class="foo"><li>bar</li><li>baz</li></ul>'); + test.assert(clientutils.exists('ul'), + 'ClientUtils.exists() checks that an element exist'); + test.assertNot(clientutils.exists('ol'), + 'ClientUtils.exists() checks that an element exist'); + test.assert(clientutils.exists('ul.foo li'), + 'ClientUtils.exists() checks that an element exist'); + // xpath + test.assert(clientutils.exists(x('//ul')), + 'ClientUtils.exists() checks that an element exist using XPath'); + test.assertNot(clientutils.exists(x('//ol')), + 'ClientUtils.exists() checks that an element exist using XPath'); + fakeDocument(null); + test.done(); +}); + +casper.test.begin('ClientUtils.findAll() tests', 7, function(test) { + var clientutils = require('clientutils').create(); + fakeDocument('<ul class="foo"><li>bar</li><li>baz</li></ul>'); + test.assertType(clientutils.findAll('li'), 'array', + 'ClientUtils.findAll() can find matching DOM elements'); + test.assertEquals(clientutils.findAll('li').length, 2, + 'ClientUtils.findAll() can find matching DOM elements'); + test.assertType(clientutils.findAll('ol'), 'array', + 'ClientUtils.findAll() can find matching DOM elements'); + test.assertEquals(clientutils.findAll('ol').length, 0, + 'ClientUtils.findAll() can find matching DOM elements'); + // scoped + var scope = clientutils.findOne('ul'); + test.assertType(clientutils.findAll('li', scope), 'array', + 'ClientUtils.findAll() can find matching DOM elements within a given scope'); + test.assertEquals(clientutils.findAll('li', scope).length, 2, + 'ClientUtils.findAll() can find matching DOM elements within a given scope'); + test.assertType(clientutils.findAll(x('//li'), scope), 'array', + 'ClientUtils.findAll() can find matching DOM elements using XPath within a given scope'); + fakeDocument(null); + test.done(); +}); + +casper.test.begin('ClientUtils.findOne() tests', 4, function(test) { + var clientutils = require('clientutils').create(); + fakeDocument('<ul class="foo"><li>bar</li><li>baz</li></ul>'); + test.assertType(clientutils.findOne('ul'), 'htmlulistelement', + 'ClientUtils.findOne() can find a matching DOM element'); + test.assertNot(clientutils.findOne('ol'), + 'ClientUtils.findOne() can find a matching DOM element'); + // scoped + var scope = clientutils.findOne('ul'); + test.assertType(clientutils.findOne('li', scope), 'htmllielement', + 'ClientUtils.findOne() can find a matching DOM element within a given scope'); + test.assertType(clientutils.findOne(x('//li'), scope), 'htmllielement', + 'ClientUtils.findOne() can find a matching DOM element using XPath within a given scope'); + fakeDocument(null); + test.done(); +}); + + +casper.test.begin('ClientUtils.processSelector() tests', 6, function(test) { + var clientutils = require('clientutils').create(); + // CSS3 selector + var cssSelector = clientutils.processSelector('html body > ul.foo li'); + test.assertType(cssSelector, 'object', + 'ClientUtils.processSelector() can process a CSS3 selector'); + test.assertEquals(cssSelector.type, 'css', + 'ClientUtils.processSelector() can process a CSS3 selector'); + test.assertEquals(cssSelector.path, 'html body > ul.foo li', + 'ClientUtils.processSelector() can process a CSS3 selector'); + // XPath selector + var xpathSelector = clientutils.processSelector(x('//li[text()="blah"]')); + test.assertType(xpathSelector, 'object', + 'ClientUtils.processSelector() can process a XPath selector'); + test.assertEquals(xpathSelector.type, 'xpath', + 'ClientUtils.processSelector() can process a XPath selector'); + test.assertEquals(xpathSelector.path, '//li[text()="blah"]', + 'ClientUtils.processSelector() can process a XPath selector'); + test.done(); +}); + +casper.test.begin('ClientUtils.getElementBounds() tests', 3, function(test) { + casper.start().then(function() { + this.page.content = '<div id="b1" style="position:fixed;top:10px;left:11px;width:50px;height:60px"></div>'; + test.assertEquals( + this.getElementBounds('#b1'), + { top: 10, left: 11, width: 50, height: 60 }, + 'ClientUtils.getElementBounds() retrieves element boundaries' + ); + }); + casper.then(function() { + var html = '<div id="boxes">'; + html += ' <div style="position:fixed;top:10px;left:11px;width:50px;height:60px"></div>'; + html += ' <div style="position:fixed;top:20px;left:21px;width:70px;height:80px"></div>'; + html += '</div>'; + this.page.content = html; + var bounds = this.getElementsBounds('#boxes div'); + test.assertEquals( + bounds[0], + { top: 10, left: 11, width: 50, height: 60 }, + 'ClientUtils.getElementsBounds() retrieves multiple elements boundaries' + ); + test.assertEquals( + bounds[1], + { top: 20, left: 21, width: 70, height: 80 }, + 'ClientUtils.getElementsBounds() retrieves multiple elements boundaries' + ); + }); + casper.run(function() { + test.done(); + }); +}); + +casper.test.begin('ClientUtils.getElementInfo() tests', 10, function(test) { + casper.page.content = '<a href="plop" class="plip plup"><i>paf</i></a>'; + var info = casper.getElementInfo('a.plip'); + test.assertEquals(info.nodeName, 'a', 'ClientUtils.getElementInfo() retrieves element name'); + test.assertEquals(info.attributes, { + 'href': 'plop', + 'class': 'plip plup' + }, 'ClientUtils.getElementInfo() retrieves element attributes'); + test.assertEquals(info.html, '<i>paf</i>', 'ClientUtils.getElementInfo() retrieves element html content'); + test.assertEquals(info.text, 'paf', 'ClientUtils.getElementInfo() retrieves element text'); + test.assert(info.x > 0, 'ClientUtils.getElementInfo() retrieves element x pos'); + test.assert(info.y > 0, 'ClientUtils.getElementInfo() retrieves element y pos'); + test.assert(info.width > 0, 'ClientUtils.getElementInfo() retrieves element width'); + test.assert(info.height > 0, 'ClientUtils.getElementInfo() retrieves element height'); + test.assert(info.visible, 'ClientUtils.getElementInfo() retrieves element visibility'); + test.assertEquals(info.tag, '<a href="plop" class="plip plup"><i>paf</i></a>', + 'ClientUtils.getElementInfo() retrieves element whole tag contents'); + test.done(); +}); + +casper.test.begin('ClientUtils.getElementsInfo() first element tests', 10, function(test) { + casper.page.content = '<a href="plop" class="plip plup"><i>paf</i></a><a href="plap" class="plip plup"><i>puf</i></a>'; + var info = casper.getElementsInfo('a.plip'); + test.assertEquals(info[0].nodeName, 'a', 'ClientUtils.getElementsInfo() retrieves first element name'); + test.assertEquals(info[0].attributes, { + 'href': 'plop', + 'class': 'plip plup' + }, 'ClientUtils.getElementsInfo() retrieves first element attributes'); + test.assertEquals(info[0].html, '<i>paf</i>', 'ClientUtils.getElementsInfo() retrieves first element html content'); + test.assertEquals(info[0].text, 'paf', 'ClientUtils.getElementsInfo() retrieves first element text'); + test.assert(info[0].x > 0, 'ClientUtils.getElementsInfo() retrieves first element x pos'); + test.assert(info[0].y > 0, 'ClientUtils.getElementsInfo() retrieves first element y pos'); + test.assert(info[0].width > 0, 'ClientUtils.getElementsInfo() retrieves first element width'); + test.assert(info[0].height > 0, 'ClientUtils.getElementsInfo() retrieves first element height'); + test.assert(info[0].visible, 'ClientUtils.getElementsInfo() retrieves first element visibility'); + test.assertEquals(info[0].tag, '<a href="plop" class="plip plup"><i>paf</i></a>', + 'ClientUtils.getElementsInfo() retrieves first element whole tag contents'); + test.done(); +}); + +casper.test.begin('ClientUtils.getElementsInfo() second element tests', 10, function(test) { + casper.page.content = '<a href="plop" class="plip plup"><i>paf</i></a><a href="plap" class="plip plup"><i>puf</i></a>'; + var info = casper.getElementsInfo('a.plip'); + test.assertEquals(info[1].nodeName, 'a', 'ClientUtils.getElementsInfo() retrieves second element name'); + test.assertEquals(info[1].attributes, { + 'href': 'plap', + 'class': 'plip plup' + }, 'ClientUtils.getElementsInfo() retrieves second element attributes'); + test.assertEquals(info[1].html, '<i>puf</i>', 'ClientUtils.getElementsInfo() retrieves second element html content'); + test.assertEquals(info[1].text, 'puf', 'ClientUtils.getElementsInfo() retrieves second element text'); + test.assert(info[1].x > 0, 'ClientUtils.getElementsInfo() retrieves second element x pos'); + test.assert(info[1].y > 0, 'ClientUtils.getElementsInfo() retrieves second element y pos'); + test.assert(info[1].width > 0, 'ClientUtils.getElementsInfo() retrieves second element width'); + test.assert(info[1].height > 0, 'ClientUtils.getElementsInfo() retrieves second element height'); + test.assert(info[1].visible, 'ClientUtils.getElementsInfo() retrieves second element visibility'); + test.assertEquals(info[1].tag, '<a href="plap" class="plip plup"><i>puf</i></a>', + 'ClientUtils.getElementsInfo() retrieves second element whole tag contents'); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/coffee.coffee b/vendor/casperjs/tests/suites/coffee.coffee new file mode 100755 index 0000000..9de230b --- /dev/null +++ b/vendor/casperjs/tests/suites/coffee.coffee @@ -0,0 +1,20 @@ +"A small subset of the run.js written in coffeescript" + +steps = 0 + +casper.options.onStepComplete = -> steps++ + +casper.test.begin "writing async tests in coffeescript", 4, (test) -> + casper.start "tests/site/index.html", -> + test.assertTitle "CasperJS test index", "Casper.start() casper can start itself an open an url" + test.assertEquals @fetchText("ul li"), "onetwothree", "Casper.fetchText() can retrieves text contents" + @click "a[href=\"test.html\"]" + + casper.then -> + test.assertTitle "CasperJS test target", "Casper.click() casper can click on a text link" + @click "a[href=\"form.html\"]" + + casper.run -> + test.assertEquals steps, 3, "Casper.options.onStepComplete() is called on step complete" + @options.onStepComplete = null + @test.done() diff --git a/vendor/casperjs/tests/suites/fs.js b/vendor/casperjs/tests/suites/fs.js new file mode 100755 index 0000000..46b5881 --- /dev/null +++ b/vendor/casperjs/tests/suites/fs.js @@ -0,0 +1,35 @@ +/*global casper*/ +/*jshint strict:false*/ +var fs = require('fs'); + +casper.test.begin('fs.dirname() tests', 8, function(test) { + var tests = { + '/local/plop/foo.js': '/local/plop', + 'local/plop/foo.js': 'local/plop', + './local/plop/foo.js': './local/plop', + 'c:\\local\\plop\\foo.js': 'c:/local/plop', + 'D:\\local\\plop\\foo.js': 'D:/local/plop', + 'D:\\local\\plop\\': 'D:/local/plop', + 'c:\\': 'c:', + 'c:': 'c:' + }; + for (var testCase in tests) { + test.assertEquals(fs.dirname(testCase), tests[testCase], 'fs.dirname() does its job for ' + testCase); + } + test.done(); +}); + +casper.test.begin('fs.isWindows() tests', 6, function(test) { + var tests = { + '/': false, + '/local/plop/foo.js': false, + 'D:\\local\\plop\\': true, + 'c:\\': true, + 'c:': true, + '\\\\Server\\Plop': true + }; + for (var testCase in tests) { + test.assertEquals(fs.isWindows(testCase), tests[testCase], 'fs.isWindows() does its job for ' + testCase); + } + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/http_status.js b/vendor/casperjs/tests/suites/http_status.js new file mode 100755 index 0000000..a20947f --- /dev/null +++ b/vendor/casperjs/tests/suites/http_status.js @@ -0,0 +1,80 @@ +/*global casper*/ +/*jshint strict:false*/ +/** + * Special test server to test for HTTP status codes + * + */ +var fs = require('fs'); +var utils = require('utils'); + +casper.test.begin("HTTP status code handling", 163, { + setUp: function(test) { + this.server = require('webserver').create(); + this.server.listen(8090, function (request, response) { + response.statusCode = parseInt(/^\/(\d+)$/.exec(request.url)[1], 10); + response.write(""); + response.close(); + }); + var isGecko = (phantom.casperEngine === 'slimerjs'); + + this.testCodes = [ + 100, 101, 200, 201, 202, 203, 204, 205, 206, 207, 210, + 300, 301, 302, 303, 304, 305, 307, 310 + ]; + if (!isGecko) { + // it seems that the network layer of Gecko does not process these response + this.testCodes.push(102); + this.testCodes.push(118); + } + + if (utils.ltVersion(phantom.version, '1.9.0') || + utils.gteVersion(phantom.version, '1.9.2') || + isGecko) { + // https://github.com/ariya/phantomjs/issues/11163 + this.testCodes = this.testCodes.concat([ + 400, 401, 402, 403, 404, 405, 406, 407, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 422, 423, 424, 425, 426, 449, 450, + 500, 501, 502, 503, 504, 505, 507, 509 + ]); + if (!isGecko) { + // it seems that the network layer of Gecko has a different + // behavior for 408 than PhantomJS's webkit + this.testCodes.push(408); + } + } + if ((this.testCodes.length * 3) < 165 ) { + test.skip(163 - (this.testCodes.length * 3 - 2) ); + } + }, + + tearDown: function() { + this.server.close(); + }, + + test: function(test) { + casper.start(); + + // file protocol + casper.thenOpen('file://' + phantom.casperPath + '/tests/site/index.html', function() { + this.test.assertHttpStatus(null, 'file:// protocol does not set a HTTP status'); + }); + + casper.each(this.testCodes, function(self, code) { + if (code === 100) { + // HTTP 100 is CONTINUE, so don't expect a terminated response + return; + } + this.thenOpen('http://localhost:8090/' + code, function(resource) { + test.assertEquals(resource.status, code, + 'Status is stored in resource.status'); + test.assertEquals(this.currentHTTPStatus, code, + 'Status is stored in casper.currentHTTPStatus'); + test.assertHttpStatus(code, utils.format('HTTP %d handled' , code)); + }); + }); + + casper.run(function() { + this.test.done(); + }); + } +}); diff --git a/vendor/casperjs/tests/suites/pagestack.js b/vendor/casperjs/tests/suites/pagestack.js new file mode 100755 index 0000000..400bb65 --- /dev/null +++ b/vendor/casperjs/tests/suites/pagestack.js @@ -0,0 +1,33 @@ +/*global casper*/ +/*jshint strict:false, maxstatements:99*/ +var pagestack = require('pagestack'); +var utils = require('utils'); +var webpage = require('webpage'); + +casper.test.begin('pagestack module tests', 14, function(test) { + var stack = pagestack.create(); + var page1 = webpage.create(); + page1.url = 'page1.html'; + stack.push(page1); + test.assertEquals(stack.length, 1); + test.assert(utils.isWebPage(stack[0])); + test.assertEquals(stack[0], page1); + test.assertEquals(stack.list().length, 1); + test.assertEquals(stack.list()[0], page1.url); + + var page2 = webpage.create(); + page2.url = 'page2.html'; + stack.push(page2); + test.assertEquals(stack.length, 2); + test.assert(utils.isWebPage(stack[1])); + test.assertEquals(stack[1], page2); + test.assertEquals(stack.list().length, 2); + test.assertEquals(stack.list()[1], page2.url); + + test.assertEquals(stack.clean(page1), 1); + test.assertEquals(stack[0], page2); + test.assertEquals(stack.list().length, 1); + test.assertEquals(stack.list()[0], page2.url); + + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/require.js b/vendor/casperjs/tests/suites/require.js new file mode 100755 index 0000000..62f7810 --- /dev/null +++ b/vendor/casperjs/tests/suites/require.js @@ -0,0 +1,37 @@ +/*global casper*/ +/*jshint strict:false*/ +var fs = require('fs'); +var modroot = fs.pathJoin(phantom.casperPath, 'tests', 'sample_modules'); + +casper.test.begin('Javascript module loading', 1, function(test) { + var jsmod; + try { + jsmod = require(fs.pathJoin(modroot, 'jsmodule')); + test.assertTrue(jsmod.ok, 'require() patched version can load a js module'); + } catch (e) { + test.fail('require() patched version can load a js module'); + } + test.done(); +}); + +casper.test.begin('CoffeeScript module loading', 1, function(test) { + var csmod; + try { + csmod = require(fs.pathJoin(modroot, 'csmodule')); + test.assertTrue(csmod.ok, 'require() patched version can load a coffeescript module'); + } catch (e) { + test.fail('require() patched version can load a coffeescript module'); + } + test.done(); +}); + +casper.test.begin('JSON module loading', 1, function(test) { + var config; + try { + config = require(fs.pathJoin(modroot, 'config.json')); + test.assertTrue(config.ok, 'require() patched version can load a json module'); + } catch (e) { + test.fail('require() patched version can load a json module'); + } + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/tester/.casper b/vendor/casperjs/tests/suites/tester/.casper new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/suites/tester/assert.js b/vendor/casperjs/tests/suites/tester/assert.js new file mode 100755 index 0000000..3b87e40 --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/assert.js @@ -0,0 +1,222 @@ +/*global casper*/ +/*jshint strict:false, maxstatements:99*/ +var fs = require('fs'); + +casper.test.begin('Common assertions tests', 46, function(test) { + casper.start('tests/site/index.html', function() { + test.assertTextExists('form', 'Tester.assertTextExists() checks that page body contains text'); + test.assertTextExist('form', 'Tester.assertTextExist() checks that page body contains text [alias]'); + test.assertTextDoesntExist('blah', "Tester.assertTextDoesntExist() checks that page body doesn't contain provided text"); + test.assertSelectorHasText('h1', 'Title', 'Tester.assertSelectorHasText() works as expected'); + test.assertSelectorDoesntHaveText('h1', 'Subtitle', 'Tester.assertSelectorDoesntHaveText() works as expected'); + test.assert(true, 'Tester.assert() works as expected'); + test.assertTrue(true, 'Tester.assertTrue() works as expected [alias]'); + test.assertTruthy('1', 'Tester.assertTruthy() works as expected'); + test.assertFalsy('', 'Tester.assertFalsy() works as expected'); + test.assertNot(false, 'Tester.assertNot() works as expected'); + test.assertEquals(true, true, 'Tester.assertEquals() works as expected'); + test.assertEqual(true, true, 'Tester.assertEqual() works as expected [alias]'); + test.assertNotEquals(true, false, 'Tester.assertNotEquals() works as expected'); + test.assertEval(function() { + return true; + }, 'Tester.assertEval() works as expected'); + test.assertEvaluate(function() { + return true; + }, 'Tester.assertEvaluate() works as expected [alias]'); + test.assertEvalEquals(function() { + return 42; + }, 42, 'Tester.assertEvalEquals() works as expected'); + test.assertEvalEqual(function() { + return 42; + }, 42, 'Tester.assertEvalEqual() works as expected [alias]'); + test.assertElementCount('ul', 1, 'Tester.assertElementCount() works as expected'); + test.assertElementCount('li', 3, 'Tester.assertElementCount() works as expected'); + test.assertElementCount('address', 0, 'Tester.assertElementCount() works as expected'); + test.assertExists('body', 'Tester.assertExists() works as expected'); + test.assertExist('body', 'Tester.assertExist() works as expected [alias]'); + test.assertFail(function() { + test.assert(false); + }, 'Tester.assertFail() tests for a failing assertion'); + test.assertSelectorExists('body', 'Tester.assertSelectorExists() works as expected [alias]'); + test.assertSelectorExist('body', 'Tester.assertSelectorExist() works as expected [alias]'); + test.assertDoesntExist('foobar', 'Tester.assertDoesntExist() works as expected'); + test.assertDoesntExist('foobar', 'Tester.assertNotExist() works as expected [alias]'); + // using file:// protocol, HTTP status is always null + test.assertHttpStatus(200, 'Tester.assertHttpStatus() works as expected'); + test.assertMatch("the lazy dog", /lazy/, 'Tester.assertMatch() works as expected'); + test.assertMatches("the lazy dog", /lazy/, 'Tester.assertMatches() works as expected [alias]'); + test.assertRaises(function() { + throw new Error('plop'); + }, [], 'Tester.assertRaises() works as expected'); + test.assertRaise(function() { + throw new Error('plop'); + }, [], 'Tester.assertRaise() works as expected [alias]'); + test.assertThrows(function() { + throw new Error('plop'); + }, [], 'Tester.assertThrows() works as expected [alias]'); + test.assertResourceExists(/index\.html/, 'Tester.assertResourceExists() works as expected'); + test.assertResourceExist(/index\.html/, 'Tester.assertResourceExist() works as expected [alias]'); + test.assertTitle('CasperJS test index', 'Tester.assertTitle() works as expected'); + test.assertTitleMatch(/test index/, 'Tester.assertTitleMatch() works as expected'); + test.assertTitleMatches(/test index/, 'Tester.assertTitleMatches() works as expected [alias]'); + test.assertType("plop", "string", "Tester.assertType() works as expected"); + test.assertInstanceOf("plop", String, "Tester.assertInstanceOf() works as expected"); + test.assertUrlMatch(/index\.html$/, "Tester.assertUrlMatch() works as expected"); + test.assertUrlMatches(/index\.html$/, "Tester.assertUrlMatches() works as expected [alias]"); + test.assertVisible('img', 'Tester.assertVisible() works as expected'); + test.assertNotVisible('p#hidden', 'Tester.assertNotVisible() works as expected'); + test.assertInvisible('p#hidden', 'Tester.assertInvisible() works as expected [alias]'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertField(): filled inputs', 7, function(test) { + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + 'email': '', + 'content': '', + 'check': false, + 'choice': '', + 'topic': '', + 'file': '', + 'checklist[]': [] + }); + test.assertField('email', '', 'Tester.assertField() works as expected with inputs'); + test.assertField('content', '', 'Tester.assertField() works as expected with textarea'); + test.assertField('check', false, 'Tester.assertField() works as expected with checkboxes'); + test.assertField('choice', null, 'Tester.assertField() works as expected with radios'); + test.assertField('topic', 'foo', 'Tester.assertField() works as expected with selects'); + test.assertField('file', '', 'Tester.assertField() works as expected with file inputs'); + test.assertField('checklist[]', [], 'Tester.assertField() works as expected with check lists'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertField(): unfilled inputs', 7, function(test) { + var fpath = fs.pathJoin(phantom.casperPath, 'README.md'); + var fileValue = 'README.md'; + if (phantom.casperEngine === 'phantomjs') { + fileValue = 'C:\\fakepath\\README.md'; // phantomjs/webkit sets that; + } + + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + 'email': 'chuck@norris.com', + 'content': 'Am watching thou', + 'check': true, + 'choice': 'no', + 'topic': 'bar', + 'file': fpath, + 'checklist[]': ['1', '3'] + }); + test.assertField('email', 'chuck@norris.com', 'Tester.assertField() works as expected with inputs'); + test.assertField('content', 'Am watching thou', 'Tester.assertField() works as expected with textarea'); + test.assertField('check', true, 'Tester.assertField() works as expected with checkboxes'); + test.assertField('choice', 'no', 'Tester.assertField() works as expected with radios'); + test.assertField('topic', 'bar', 'Tester.assertField() works as expected with selects'); + test.assertField('file', fileValue, + 'Tester.assertField() works as expected with file inputs'); + test.assertField('checklist[]', ['1', '3'], 'Tester.assertField() works as expected with check lists'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertField(): nonexistent fields', 2, function(test) { + casper.start('tests/site/form.html', function() { + test.assertFail(function() { + test.assertField('nonexistent', ''); + }, 'Tester.assertField() only checks for existing fields'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertField(): CSS selectors', 1, function(test) { + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + 'email': 'albert@camus.com' + }); + + test.assertField({ + type: 'css', + path: '#email' + }, + 'albert@camus.com', + 'Tester.assertField() works as expected with CSS selectors' + ); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertField(): XPath selectors', 1, function(test) { + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + 'email': 'albert@camus.com' + }); + + test.assertField({ + type: 'xpath', + path: '/html/body/form[1]/input[1]' + }, + 'albert@camus.com', + 'Tester.assertField() works as expected with XPath selectors' + ); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertField(): invalid selectors', 1, function(test) { + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + 'email': 'albert@camus.com' + }); + + test.assertRaise(function() { + test.assertField({ + type: 'albert' + }, + 'albert@camus.com', + 'Tester.assertField() works as expected with XPath selectors' + ); + }, [], 'should throw an error for an invalid selector'); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertFieldCSS(): CSS selectors', 1, function(test) { + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + 'email': 'albert@camus.com' + }); + + test.assertFieldCSS( + '#email', + 'albert@camus.com', + 'Tester.assertFieldCSS() works as expected with CSS selectors' + ); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('Tester.assertFieldXPath(): XPath selectors', 1, function(test) { + casper.start('tests/site/form.html', function() { + this.fill('form[action="result.html"]', { + 'email': 'albert@camus.com' + }); + + test.assertFieldXPath( + '/html/body/form[1]/input[1]', + 'albert@camus.com', + 'Tester.assertFieldXPath() works as expected with XPath selectors' + ); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/tester/begin-config.js b/vendor/casperjs/tests/suites/tester/begin-config.js new file mode 100755 index 0000000..67e1165 --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/begin-config.js @@ -0,0 +1,35 @@ +/*jshint strict:false, eqeqeq:false*/ +/*global CasperError, casper, console, phantom, require*/ +var steps = []; + +casper.test.begin('Tester.begin() configuration', 10, { + fixtures: [1, 2, 3], + + _this: function() { + return this; + }, + + setUp: function(test) { + steps.push('setUp'); + test.pass('config.setUp() has been called'); + test.assert(this == this._this(), 'config.setUp() is using the expected context'); + test.assertEquals(this.fixtures, [1, 2, 3], 'config.setUp() accesses fixtures'); + }, + + tearDown: function(test) { + steps.push('tearDown'); + test.pass('config.tearDown() has been called'); + test.assert(this == this._this(), 'config.test() is using the expected context'); + test.assertEquals(this.fixtures, [1, 2, 3], 'config.tearDown() accesses fixtures'); + test.assertEquals(steps, ['setUp', 'test', 'tearDown'], + 'Tester.begin() has processed the configuration in the expected order'); + }, + + test: function(test) { + steps.push('test'); + test.pass('config.test() has been called'); + test.assert(this == this._this(), 'config.tearDown() is using the expected context'); + test.assertEquals(this.fixtures, [1, 2, 3], 'config.test() accesses fixtures'); + test.done(); + } +}); diff --git a/vendor/casperjs/tests/suites/tester/setup-teardown-async.js b/vendor/casperjs/tests/suites/tester/setup-teardown-async.js new file mode 100755 index 0000000..6b65b23 --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/setup-teardown-async.js @@ -0,0 +1,31 @@ +/*global casper*/ +/*jshint strict:false*/ + +var setUp, tearDown; + +casper.test.setUp(function(done) { + setTimeout(function() { + setUp = true; + done(); + }, 50); +}); + +casper.test.tearDown(function(done) { + setTimeout(function() { + tearDown = true; + done(); + // reset + casper.test.setUp(); + casper.test.tearDown(); + }, 50); +}); + +casper.test.begin('setUp() tests', 1, function(test) { + test.assertTrue(setUp, 'Tester.setUp() executed the async setup function'); + test.done(); +}); + +casper.test.begin('tearDown() tests', 1, function(test) { + test.assertTrue(tearDown, 'Tester.tearDown() executed the async tear down function'); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/tester/setup-teardown.js b/vendor/casperjs/tests/suites/tester/setup-teardown.js new file mode 100755 index 0000000..60ceba3 --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/setup-teardown.js @@ -0,0 +1,25 @@ +/*global casper*/ +/*jshint strict:false*/ + +var setUp, tearDown; + +casper.test.setUp(function() { + setUp = true; +}); + +casper.test.tearDown(function() { + tearDown = true; + // reset + casper.test.setUp(); + casper.test.tearDown(); +}); + +casper.test.begin('setUp() tests', 1, function(test) { + test.assertTrue(setUp, 'Tester.setUp() executed the setup function'); + test.done(); +}); + +casper.test.begin('tearDown() tests', 1, function(test) { + test.assertTrue(tearDown, 'Tester.tearDown() executed the tear down function'); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/tester/skip.js b/vendor/casperjs/tests/suites/tester/skip.js new file mode 100755 index 0000000..361294b --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/skip.js @@ -0,0 +1,23 @@ +/*global casper*/ +/*jshint strict:false*/ +casper.test.begin('Skip tests', 4, function(test) { + test.assert(true, 'First test executed'); + test.assert(true, 'Second test executed'); + test.skip(2, 'Two tests skipped'); + test.done(); +}); + +casper.test.begin('Skip tests after', 4, function(test) { + test.skip(2, 'Two tests skipped'); + test.assert(true, 'Third test executed'); + test.assert(true, 'Fourth test executed'); + test.done(); +}); + +casper.test.begin('Skip tests (asynchronous)', 1, function(test) { + casper.start('tests/site/index.html', function() { + test.skip(1); + }).run(function() { + test.done(); + }); +}); diff --git a/vendor/casperjs/tests/suites/tester/test-order.js b/vendor/casperjs/tests/suites/tester/test-order.js new file mode 100755 index 0000000..aad399c --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/test-order.js @@ -0,0 +1,21 @@ +/*jshint strict:false*/ +/*global CasperError, casper, console, phantom, require*/ +var fs = require('fs'); + +casper.test.begin('Tester.sortFiles()', 1, function suite(test) { + var testDirRoot = fs.pathJoin(phantom.casperPath, 'tests', 'testdir'); + var files = test.findTestFiles(testDirRoot); + var expected = [ + "01_a/abc.js", + "01_a/def.js", + "02_b/abc.js", + "03_a.js", + "03_b.js", + "04/01_init.js", + "04/02_do.js" + ].map(function(entry) { + return fs.pathJoin.apply(fs, [testDirRoot].concat(entry.split('/'))); + }); + test.assertEquals(files, expected, 'findTestFiles() find test files and sort them'); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/tester/testcase.js b/vendor/casperjs/tests/suites/tester/testcase.js new file mode 100755 index 0000000..3a7bd3e --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/testcase.js @@ -0,0 +1,50 @@ +/*jshint strict:false, maxstatements:99, maxcomplexity:99*/ +/*global CasperError, casper, console, phantom, require*/ + +var TestCaseResult = require('tester').TestCaseResult; + +casper.test.begin('TestCaseResult.constructor() tests', 4, function(test) { + var caseResult1 = new TestCaseResult(); + test.assertType(caseResult1.name, "undefined", 'TestCaseResult.constructor() name is undefined by default'); + test.assertType(caseResult1.file, "undefined", 'TestCaseResult.constructor() file is undefined by default'); + var caseResult2 = new TestCaseResult({name: 'foo', file: '/tmp/foo'}); + test.assertEquals(caseResult2.name, "foo", 'TestCaseResult.constructor() can set name'); + test.assertEquals(caseResult2.file, "/tmp/foo", 'TestCaseResult.constructor() can set file'); + test.done(); +}); + +casper.test.begin('TestCaseResult.addSuccess() and TestCaseResult.addFailure() tests', 22, function(test) { + var caseResult = new TestCaseResult({name: 'foo', file: '/tmp/foo'}); + test.assertEquals(caseResult.assertions, 0, 'test case result counts no assertion by default'); + test.assertEquals(caseResult.passed, 0, 'test case result counts no success by default'); + test.assertEquals(caseResult.failed, 0, 'test case result counts no failure by default'); + test.assertEquals(caseResult.calculateDuration(), 0, + 'TestCaseResult.calculateDuration() computes initial tests duration'); + var success = {}; + caseResult.addSuccess(success, 1337); + test.assertEquals(caseResult.assertions, 1, 'test case result counts one assertion'); + test.assertEquals(caseResult.passed, 1, 'test case result counts one success'); + test.assertEquals(caseResult.failed, 0, 'test case result counts no failure'); + test.assertEquals(caseResult.passes[0], success, 'TestCaseResult.addSuccess() added a success to the stack'); + test.assertEquals(caseResult.passes[0].time, 1337, 'TestCaseResult.addSuccess() added test duration'); + test.assertEquals(caseResult.passes[0].suite, 'foo', 'TestCaseResult.addSuccess() added suite name'); + test.assertEquals(caseResult.calculateDuration(), 1337, + 'TestCaseResult.calculateDuration() computes tests duration'); + var failure = {}; + caseResult.addFailure(failure, 42); + test.assertEquals(caseResult.assertions, 2, 'test case result counts two assertions'); + test.assertEquals(caseResult.passed, 1, 'test case result counts one success'); + test.assertEquals(caseResult.failed, 1, 'test case result counts no failure'); + test.assertEquals(caseResult.failures[0], failure, 'TestCaseResult.addFailure() added a failure to the stack'); + test.assertEquals(caseResult.failures[0].time, 42, 'TestCaseResult.addFailure() added test duration'); + test.assertEquals(caseResult.failures[0].suite, 'foo', 'TestCaseResult.addFailure() added suite name'); + test.assertEquals(caseResult.calculateDuration(), 1337 + 42, + 'TestCaseResult.calculateDuration() computes new tests duration'); + caseResult.addSuccess({}, 1000); + test.assertEquals(caseResult.assertions, 3, 'test case result counts three assertions'); + test.assertEquals(caseResult.passed, 2, 'test case result counts two successes'); + test.assertEquals(caseResult.failed, 1, 'test case result counts one failure'); + test.assertEquals(caseResult.calculateDuration(), 1337 + 42 + 1000, + 'TestCaseResult.calculateDuration() computes new tests duration'); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/tester/testsuite.js b/vendor/casperjs/tests/suites/tester/testsuite.js new file mode 100755 index 0000000..ac2057b --- /dev/null +++ b/vendor/casperjs/tests/suites/tester/testsuite.js @@ -0,0 +1,56 @@ +/*jshint strict:false*/ +/*global CasperError, casper, console, phantom, require*/ + +var TestCaseResult = require('tester').TestCaseResult, + TestSuiteResult = require('tester').TestSuiteResult; + +function generateCaseResult(options) { + var i, + nPasses = options && ~~options.nPasses, + nFailures = options && ~~options.nFailures, + caseResult = new TestCaseResult(options); + for (i = 0; i < nFailures; i++) { + caseResult.addFailure({}, i * 1000); + } + for (i = 0; i < nPasses; i++) { + caseResult.addSuccess({}, i * 1000); + } + return caseResult; +} + +casper.test.begin('TestSuiteResult() basic tests', 8, function(test) { + var suiteResult = new TestSuiteResult(); + test.assertEquals(suiteResult.constructor.name, 'Array', 'TestSuiteResult() is derived from Array'); + test.assertEquals(suiteResult.countTotal(), 0); + test.assertEquals(suiteResult.countFailed(), 0); + test.assertEquals(suiteResult.countPassed(), 0); + test.assertEquals(suiteResult.getAllFailures(), []); + test.assertEquals(suiteResult.getAllPasses(), []); + test.assertEquals(suiteResult.getAllResults(), []); + test.assertEquals(suiteResult.calculateDuration(), 0); + test.done(); +}); + +casper.test.begin('TestSuiteResult() accumulation tests', 7, function(test) { + var suiteResult = new TestSuiteResult(); + suiteResult.push(generateCaseResult({ + name: 'foo', + file: '/tmp/foo', + nPasses: 4, + nFailures: 1 + })); + suiteResult.push(generateCaseResult({ + name: 'bar', + file: '/tmp/bar', + nPasses: 3, + nFailures: 0 + })); + test.assertEquals(suiteResult.countTotal(), 8); + test.assertEquals(suiteResult.countFailed(), 1); + test.assertEquals(suiteResult.countPassed(), 7); + test.assertEquals(suiteResult.getAllFailures().length, 1); + test.assertEquals(suiteResult.getAllPasses().length, 7); + test.assertEquals(suiteResult.getAllResults().length, 8); + test.assertEquals(suiteResult.calculateDuration(), 9000); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/utils.js b/vendor/casperjs/tests/suites/utils.js new file mode 100755 index 0000000..3fdb754 --- /dev/null +++ b/vendor/casperjs/tests/suites/utils.js @@ -0,0 +1,485 @@ +/*global casper*/ +/*jshint strict:false, maxstatements:99*/ +var utils = require('utils'), + t = casper.test, + x = require('casper').selectXPath; + +casper.test.begin('utils.betterTypeOf() tests', 10, function(test) { + var testCases = [ + {subject: 1, expected: 'number'}, + {subject: '1', expected: 'string'}, + {subject: {}, expected: 'object'}, + {subject: [], expected: 'array'}, + {subject: undefined, expected: 'undefined'}, + {subject: null, expected: 'null'}, + {subject: function(){}, expected: 'function'}, + {subject: window, expected: 'domwindow'}, + {subject: new Date(), expected: 'date'}, + {subject: new RegExp(), expected: 'regexp'} + ]; + testCases.forEach(function(testCase) { + test.assertEquals(utils.betterTypeOf(testCase.subject), testCase.expected, + utils.format('betterTypeOf() detects expected type "%s"', testCase.expected)); + }); + test.done(); +}); + +casper.test.begin('utils.betterInstanceOf() tests', 13, function(test) { + /*global XMLDocument*/ + // need two objects to test inheritance + function Cow(){} var daisy = new Cow(); + function SuperCow(){} SuperCow.prototype = new Cow(); var superDaisy = new SuperCow(); + var date = new Date(); var regex = new RegExp(); var xmlDoc = document.implementation.createDocument("<y>", "x", null); + var testCases = [ + {subject: 1, fn: Number, expected: true}, + {subject: '1', fn: String, expected: true}, + {subject: {}, fn: Object, expected: true}, + {subject: [], fn: Array, expected: true}, + {subject: undefined, fn: Array, expected: false}, + {subject: null, fn: Array, expected: false}, + {subject: function(){}, fn: Function, expected: true}, + {subject: date, fn: Date, expected: true}, + {subject: regex, fn: RegExp, expected: true}, + {subject: xmlDoc, fn: XMLDocument, expected: true}, + {subject: daisy, fn: Cow, expected: true}, + {subject: superDaisy, fn: SuperCow, expected: true}, + {subject: superDaisy, fn: Cow, expected: true} + ]; + testCases.forEach(function(testCase) { + test.assertEquals(utils.betterInstanceOf(testCase.subject, testCase.fn), testCase.expected, + utils.format('betterInstanceOf() detects expected constructor "%s"', testCase.fn.name)); + }); + test.done(); +}); + +casper.test.begin('utils.cleanUrl() tests', 11, function(test) { + var testCases = { + 'http://google.com/': 'http://google.com/', + 'http://google.com': 'http://google.com/', + 'http://www.google.com/': 'http://www.google.com/', + 'http://www.google.com/?plop=2': 'http://www.google.com/?plop=2', + 'https://google.com/': 'https://google.com/', + 'https://google.com': 'https://google.com/', + 'https://www.google.com/': 'https://www.google.com/', + 'https://www.google.com/?plop=2': 'https://www.google.com/?plop=2', + 'https://www.google.com?plop=2': 'https://www.google.com/?plop=2', + 'file:///Users/toto/toto.html': 'file:///Users/toto/toto.html', + '/100': '/100' + }; + for (var testCase in testCases) { + test.assertEquals(utils.cleanUrl(testCase), testCases[testCase], 'cleanUrl() cleans an URL'); + } + test.done(); +}); + +casper.test.begin('utils.clone() tests', 2, function(test) { + var a = {a: 1, b: 2, c: [1, 2]}; + test.assertEquals(utils.clone(a), a); + var b = [1, 2, 3, a]; + test.assertEquals(utils.clone(b), b); + test.done(); +}); + +if (utils.gteVersion(phantom.version, '1.9.0')) { + casper.test.begin('utils.computeModifier() tests', 7, function(test) { + var modifiers = require('webpage').create().event.modifier; + test.assertType(modifiers, "object"); + test.assertEquals(utils.computeModifier("", modifiers), 0, + 'computeModifier() computes a "none" modifier'); + test.assertEquals(utils.computeModifier("alt", modifiers), + modifiers.alt, + 'computeModifier() computes an "alt" modifier'); + test.assertEquals(utils.computeModifier("ctrl+alt", modifiers), + modifiers.ctrl | modifiers.alt, + 'computeModifier() computes a "ctrl+alt" modifier'); + test.assertEquals(utils.computeModifier("ctrl+alt+shift", modifiers), + modifiers.ctrl | modifiers.alt | modifiers.shift, + 'computeModifier() computes a "ctrl+alt+shift" modifier'); + test.assertThrows(utils.computeModifier, ["chucknorris", modifiers], + 'computeModifier() checks for a valid modifier'); + test.assertThrows(utils.computeModifier, ["chuck+norris", modifiers], + 'computeModifier() checks for a valid complex modifier'); + test.done(); + }); +} + +casper.test.begin('decodeUrl() tests', 4, function(test) { + /* global escape */ + test.assertEquals(utils.decodeUrl('foo'), 'foo'); + test.assertEquals(utils.decodeUrl('Forlì'), 'Forlì'); + test.assertEquals(utils.decodeUrl(encodeURIComponent('Forlì')), 'Forlì'); + test.assertEquals(utils.decodeUrl(escape('Forlì')), 'Forlì'); + test.done(); +}); + +casper.test.begin('equals() tests', 23, function(test) { + test.assert(utils.equals(null, null), 'equals() null equality'); + test.assertNot(utils.equals(null, undefined), 'equals() null vs. undefined inequality'); + test.assert(utils.equals("hi", "hi"), 'equals() string equality'); + test.assertNot(utils.equals("hi", "ih"), 'equals() string inequality'); + test.assert(utils.equals(5, 5), 'equals() number equality'); + test.assertNot(utils.equals("5", 5), 'equals() number equality without implicit cast'); + test.assert(utils.equals(5, 5.0), 'equals() number equality with cast'); + test.assertNot(utils.equals(5, 10), 'equals() number inequality'); + test.assert(utils.equals([], []), 'equals() empty array equality'); + test.assert(utils.equals([1,2], [1,2]), 'equals() array equality'); + test.assert(utils.equals([1,2,[1,2,function(){}]], [1,2,[1,2,function(){}]]), + 'equals() complex array equality'); + test.assertNot(utils.equals([1,2,[1,2,function(a){}]], [1,2,[1,2,function(b){}]]), + 'equals() complex array inequality'); + test.assertNot(utils.equals([1,2], [2,1]), 'equals() shuffled array inequality'); + test.assertNot(utils.equals([1,2], [1,2,3]), 'equals() array length inequality'); + test.assert(utils.equals({}, {}), 'equals() empty object equality'); + test.assert(utils.equals({a:1,b:2}, {a:1,b:2}), 'equals() object length equality'); + test.assert(utils.equals({a:1,b:2}, {b:2,a:1}), 'equals() shuffled object keys equality'); + test.assertNot(utils.equals({a:1,b:2}, {a:1,b:3}), 'equals() object inequality'); + test.assert(utils.equals({1:{name:"bob",age:28}, 2:{name:"john",age:26}}, + {1:{name:"bob",age:28}, 2:{name:"john",age:26}}), + 'equals() complex object equality'); + test.assertNot(utils.equals({1:{name:"bob",age:28}, 2:{name:"john",age:26}}, + {1:{name:"bob",age:28}, 2:{name:"john",age:27}}), + 'equals() complex object inequality'); + test.assert(utils.equals(function(x){return x;}, function(x){return x;}), + 'equals() function equality'); + test.assertNot(utils.equals(function(x){return x;}, function(y){return y+2;}), + 'equals() function inequality'); + test.assert(utils.equals([{a:1, b:2}, {c:3, d:4}], [{a:1, b:2}, {c:3, d:4}]), + 'equals() arrays of objects'); + test.done(); +}); + +casper.test.begin('fileExt() tests', 6, function(test) { + var testCases = { + 'foo.ext': 'ext', + 'FOO.EXT': 'ext', + 'a.ext': 'ext', + '.ext': 'ext', + 'toto.': '', + ' plop.ext ': 'ext' + }; + for (var testCase in testCases) { + test.assertEquals(utils.fileExt(testCase), testCases[testCase], + 'fileExt() extract file extension'); + } + test.done(); +}); + +casper.test.begin('fillBlanks() tests', 3, function(test) { + var testCases = { + 'foo': 'foo ', + ' foo bar ': ' foo bar ', + ' foo bar ': ' foo bar ' + }; + for (var testCase in testCases) { + test.assertEquals(utils.fillBlanks(testCase, 10), testCases[testCase], + 'fillBlanks() fills blanks'); + } + test.done(); +}); + +casper.test.begin('getPropertyPath() tests', 7, function(test) { + var testCases = [ + { + input: utils.getPropertyPath({}, 'a.b.c'), + output: undefined + }, + { + input: utils.getPropertyPath([1, 2, 3], 'a.b.c'), + output: undefined + }, + { + input: utils.getPropertyPath({ a: { b: { c: 1 } }, c: 2 }, 'a.b.c'), + output: 1 + }, + { + input: utils.getPropertyPath({ a: { b: { c: 1 } }, c: 2 }, 'a.b.x'), + output: undefined + }, + { + input: utils.getPropertyPath({ a: { b: { c: 1 } }, c: 2 }, 'a.b'), + output: { c: 1 } + }, + { + input: utils.getPropertyPath({ 'a-b': { 'c-d': 1} }, 'a-b.c-d'), + output: 1 + }, + { + input: utils.getPropertyPath({ 'a.b': { 'c.d': 1} }, 'a.b.c.d'), + output: undefined + } + ]; + testCases.forEach(function(testCase) { + test.assertEquals(testCase.input, testCase.output, + 'getPropertyPath() gets a property using a path'); + }); + test.done(); +}); + +casper.test.begin('isArray() tests', 3, function(test) { + test.assertEquals(utils.isArray([]), true, 'isArray() checks for an Array'); + test.assertEquals(utils.isArray({}), false, 'isArray() checks for an Array'); + test.assertEquals(utils.isArray("foo"), false, 'isArray() checks for an Array'); + test.done(); +}); + +casper.test.begin('isClipRect() tests', 5, function(test) { + var testCases = [ + [{}, false], + [{top: 2}, false], + [{top: 2, left: 2, width: 2, height: 2}, true], + [{top: 2, left: 2, height: 2, width: 2}, true], + [{top: 2, left: 2, width: 2, height: new Date()}, false] + ]; + testCases.forEach(function(testCase) { + test.assertEquals(utils.isClipRect(testCase[0]), testCase[1], + 'isClipRect() checks for a ClipRect'); + }); + test.done(); +}); + +casper.test.begin('isHTTPResource() tests', 6, function(test) { + var testCases = [ + [{}, false], + [{url: 'file:///var/www/i.html'}, false], + [{url: 'mailto:plop@plop.com'}, false], + [{url: 'ftp://ftp.plop.com'}, false], + [{url: 'HTTP://plop.com/'}, true], + [{url: 'https://plop.com/'}, true] + ]; + testCases.forEach(function(testCase) { + test.assertEquals(utils.isHTTPResource(testCase[0]), testCase[1], + 'isHTTPResource() checks for an HTTP resource'); + }); + test.done(); +}); + +casper.test.begin('isObject() tests', 8, function(test) { + test.assertEquals(utils.isObject({}), true, 'isObject() checks for an Object'); + test.assertEquals(utils.isObject([]), true, 'isObject() checks for an Object'); + test.assertEquals(utils.isObject(1), false, 'isObject() checks for an Object'); + test.assertEquals(utils.isObject("1"), false, 'isObject() checks for an Object'); + test.assertEquals(utils.isObject(function(){}), false, 'isObject() checks for an Object'); + test.assertEquals(utils.isObject(new Function('return {};')()), true, 'isObject() checks for an Object'); + test.assertEquals(utils.isObject(require('webpage').create()), true, 'isObject() checks for an Object'); + test.assertEquals(utils.isObject(null), false, 'isObject() checks for an Object'); + test.done(); +}); + +casper.test.begin('isValidSelector() tests', 10, function(test) { + t.assertEquals(utils.isValidSelector({}), false, + 'isValidSelector() checks for a valid selector'); + t.assertEquals(utils.isValidSelector(""), false, + 'isValidSelector() checks for a valid selector'); + t.assertEquals(utils.isValidSelector("a"), true, + 'isValidSelector() checks for a valid selector'); + t.assert( + utils.isValidSelector('div#plop form[name="form"] input[type="submit"]'), + 'isValidSelector() checks for a valid selector' + ); + t.assertEquals(utils.isValidSelector(x('//a')), true, + 'isValidSelector() checks for a valid selector'); + t.assertEquals(utils.isValidSelector({ + type: "css", + path: 'div#plop form[name="form"] input[type="submit"]' + }), true, 'isValidSelector() checks for a valid selector'); + t.assertEquals(utils.isValidSelector({ + type: "xpath", + path: '//a' + }), true, 'isValidSelector() checks for a valid selector'); + t.assertEquals(utils.isValidSelector({ + type: "css" + }), false, 'isValidSelector() checks for a valid selector'); + t.assertEquals(utils.isValidSelector({ + type: "xpath" + }), false, 'isValidSelector() checks for a valid selector'); + t.assertEquals(utils.isValidSelector({ + type: "css3", + path: "a" + }), false, 'isValidSelector() checks for a valid selector'); + test.done(); +}); + +casper.test.begin('isWebPage() tests', 3, function(test) { + var pageModule = require('webpage'); + test.assertEquals(utils.isWebPage(pageModule), false, + 'isWebPage() checks for a WebPage instance'); + test.assertEquals(utils.isWebPage(pageModule.create()), true, + 'isWebPage() checks for a WebPage instance'); + test.assertEquals(utils.isWebPage(null), false, + 'isWebPage() checks for a WebPage instance'); + test.done(); +}); + +casper.test.begin('isJsFile() tests', 5, function(test) { + var testCases = { + '': false, + 'toto.png': false, + 'plop': false, + 'gniii.coffee': true, + 'script.js': true + }; + for (var testCase in testCases) { + test.assertEquals(utils.isJsFile(testCase), testCases[testCase], + 'isJsFile() checks for js file'); + } + test.done(); +}); + + +casper.test.begin('mergeObjects() tests', 10, function(test) { + /* jshint eqeqeq:false */ + var testCases = [ + { + obj1: {a: 1}, obj2: {b: 2}, merged: {a: 1, b: 2} + }, + { + obj1: {}, obj2: {a: 1}, merged: {a: 1} + }, + { + obj1: {}, obj2: {a: {b: 2}}, merged: {a: {b: 2}} + }, + { + obj1: {a: 1}, obj2: {}, merged: {a: 1} + }, + { + obj1: {a: 1}, obj2: {a: 2}, merged: {a: 2} + }, + { + obj1: {x: 0, double: function(){return this.x*2;}}, + obj2: {triple: function(){return this.x*3;}}, + merged: { + x: 0, + double: function(){return this.x*2;}, + triple: function(){return this.x*3;} + } + } + ]; + testCases.forEach(function(testCase) { + test.assertEquals( + utils.mergeObjects(testCase.obj1, testCase.obj2), + testCase.merged, + 'mergeObjects() can merge objects' + ); + }); + var obj = {x: 1}, + qtruntimeobject = {foo: 'baz'}; + + var merged1 = utils.mergeObjects({}, {a: obj}); + merged1.a.x = 2; + test.assertEquals(obj.x, 1, 'mergeObjects() creates deep clones #1'); + + var merged2 = utils.mergeObjects({a: {}}, {a: obj}); + merged2.a.x = 2; + test.assertEquals(obj.x, 1, 'mergeObjects() creates deep clones #2'); + + var refObj = {a: qtruntimeobject}; + var merged3 = utils.mergeObjects({}, refObj, {keepReferences: false}); + test.assertFalsy(merged3.a == refObj.a, 'disabling references should not point to same object'); + + var merged4 = utils.mergeObjects({}, refObj, {keepReferences: true}); + test.assert(merged4.a == refObj.a, 'enabling references should point to same object'); + + test.done(); +}); + +casper.test.begin('objectValues() tests', 2, function(test) { + test.assertEquals(utils.objectValues({}), [], + 'objectValues() can extract object values'); + test.assertEquals(utils.objectValues({a: 1, b: 2}), [1, 2], + 'objectValues() can extract object values'); + test.done(); +}); + +casper.test.begin('quoteXPathAttributeString() tests', 2, function(test) { + casper.start('tests/site/click.html', function() { + var selector = utils.format('//a[text()=%s]', + utils.quoteXPathAttributeString('Label with double "quotes"')); + test.assertExists(x(selector), utils.format('Xpath selector "%s" is found on "tests/site/click.html" page', selector)); + selector = utils.format('//a[text()=%s]', + utils.quoteXPathAttributeString("Label with single 'quotes'")); + test.assertExists(x(selector), utils.format('Xpath selector "%s" is found on "tests/site/click.html" page', selector)); + }).run(function() { + test.done(); + }); +}); + +casper.test.begin('unique() tests', 4, function(test) { + var testCases = [ + { + input: [1,2,3], + output: [1,2,3] + }, + { + input: [1,2,3,2,1], + output: [1,2,3] + }, + { + input: ["foo", "bar", "foo"], + output: ["foo", "bar"] + }, + { + input: [], + output: [] + } + ]; + testCases.forEach(function(testCase) { + test.assertEquals(utils.unique(testCase.input), testCase.output, + 'unique() computes unique values of an array'); + }); + test.done(); +}); + +casper.test.begin('cmpVersion() tests', 10, function suite(test) { + test.assertEquals(utils.cmpVersion('1.0.0', '2.0.0'), -1, + 'cmpVersion() can compare version strings'); + test.assertEquals(utils.cmpVersion('1.0.0-DEV', '2.0.0-BOOM'), -1, + 'cmpVersion() can compare version strings'); + test.assertEquals(utils.cmpVersion('1.0.0', '1.1.0'), -1, + 'cmpVersion() can compare version strings'); + test.assertEquals(utils.cmpVersion('1.1.0', '1.0.0'), 1, + 'cmpVersion() can compare version strings'); + test.assertEquals(utils.cmpVersion('0.0.3', '0.0.4'), -1, + 'cmpVersion() can compare version strings'); + test.assertEquals(utils.cmpVersion('0.0.3', '1.0.3'), -1, + 'cmpVersion() can compare version strings'); + test.assertEquals(utils.cmpVersion('0.1', '1.0.3.8'), -1, + 'cmpVersion() can compare version strings'); + test.assertEquals(utils.cmpVersion({major: 1, minor: 2, patch: 3}, + {major: 1, minor: 2, patch: 4}), -1, + 'cmpVersion() can compare version objects'); + test.assertEquals(utils.cmpVersion({major: 2, minor: 0, patch: 3}, + {major: 1, minor: 0, patch: 4}), 1, + 'cmpVersion() can compare version objects'); + test.assertEquals(utils.cmpVersion({major: 0, minor: 0, patch: 3}, + {major: 1, minor: 0, patch: 3}), -1, + 'cmpVersion() can compare version objects'); + test.done(); +}); + +casper.test.begin('gteVersion() tests', 4, function suite(test) { + test.assert(utils.gteVersion('1.1.0', '1.0.0'), + 'gteVersion() checks for a greater or equal version'); + test.assertNot(utils.gteVersion('1.0.0', '1.1.0'), + 'gteVersion() checks for a greater or equal version'); + test.assert(utils.gteVersion({major: 1, minor: 1, patch: 0}, + {major: 1, minor: 0, patch: 0}), + 'gteVersion() checks for a greater or equal version'); + test.assertNot(utils.gteVersion({major: 1, minor: 0, patch: 0}, + {major: 1, minor: 1, patch: 0}), + 'gteVersion() checks for a greater or equal version'); + test.done(); +}); + +casper.test.begin('ltVersion() tests', 4, function suite(test) { + test.assert(utils.ltVersion('1.0.0', '1.1.0'), + 'ltVersion() checks for a lesser version'); + test.assertNot(utils.ltVersion('1.1.0', '1.0.0'), + 'ltVersion() checks for a lesser version'); + test.assert(utils.ltVersion({major: 1, minor: 0, patch: 0}, + {major: 1, minor: 1, patch: 0}), + 'ltVersion() checks for a lesser version'); + test.assertNot(utils.ltVersion({major: 1, minor: 1, patch: 0}, + {major: 1, minor: 0, patch: 0}), + 'ltVersion() checks for a lesser version'); + test.done(); +}); diff --git a/vendor/casperjs/tests/suites/xunit.js b/vendor/casperjs/tests/suites/xunit.js new file mode 100755 index 0000000..57077b7 --- /dev/null +++ b/vendor/casperjs/tests/suites/xunit.js @@ -0,0 +1,77 @@ +/*global casper, __utils__*/ +/*jshint strict:false*/ +var tester = require('tester'); +var testpage = require('webpage').create(); + +casper.test.begin('XUnitReporter() initialization', 1, function suite(test) { + var xunit = require('xunit').create(); + var results = new tester.TestSuiteResult(); + xunit.setResults(results); + test.assertTruthy(xunit.getXML()); + test.done(); +}); + +casper.test.begin('XUnitReporter() can hold test suites', 4, function suite(test) { + var xunit = require('xunit').create(); + var results = new tester.TestSuiteResult(); + var suite1 = new tester.TestCaseResult({ + name: 'foo', + file: '/foo' + }); + results.push(suite1); + var suite2 = new tester.TestCaseResult({ + name: 'bar', + file: '/bar' + }); + results.push(suite2); + xunit.setResults(results); + casper.start().setContent(xunit.getXML()); + test.assertEvalEquals(function() { + return __utils__.findAll('testsuite').length; + }, 2); + test.assertExists('testsuites[time]'); + test.assertExists('testsuite[name="foo"][package="foo"]'); + test.assertExists('testsuite[name="bar"][package="bar"]'); + test.done(); +}); + +casper.test.begin('XUnitReporter() can hold a suite with a succesful test', 1, function suite(test) { + var xunit = require('xunit').create(); + var results = new tester.TestSuiteResult(); + var suite1 = new tester.TestCaseResult({ + name: 'foo', + file: '/foo' + }); + suite1.addSuccess({ + success: true, + type: "footype", + message: "footext", + file: "/foo" + }); + results.push(suite1); + xunit.setResults(results); + casper.start().setContent(xunit.getXML()); + test.assertExists('testsuite[name="foo"][package="foo"][tests="1"][failures="0"] testcase[name="footext"]'); + test.done(); +}); + +casper.test.begin('XUnitReporter() can handle a failed test', 2, function suite(test) { + var xunit = require('xunit').create(); + var results = new tester.TestSuiteResult(); + var suite1 = new tester.TestCaseResult({ + name: 'foo', + file: '/foo' + }); + suite1.addFailure({ + success: false, + type: "footype", + message: "footext", + file: "/foo" + }); + results.push(suite1); + xunit.setResults(results); + casper.start().setContent(xunit.getXML()); + test.assertExists('testsuite[name="foo"][package="foo"][tests="1"][failures="1"] testcase[name="footext"] failure[type="footype"]'); + test.assertEquals(casper.getElementInfo('failure[type="footype"]').text, 'footext'); + test.done(); +}); diff --git a/vendor/casperjs/tests/testdir/01_a/abc.js b/vendor/casperjs/tests/testdir/01_a/abc.js new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/testdir/01_a/def.js b/vendor/casperjs/tests/testdir/01_a/def.js new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/testdir/02_b/abc.js b/vendor/casperjs/tests/testdir/02_b/abc.js new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/testdir/03_a.js b/vendor/casperjs/tests/testdir/03_a.js new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/testdir/03_b.js b/vendor/casperjs/tests/testdir/03_b.js new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/testdir/04/01_init.js b/vendor/casperjs/tests/testdir/04/01_init.js new file mode 100755 index 0000000..e69de29 diff --git a/vendor/casperjs/tests/testdir/04/02_do.js b/vendor/casperjs/tests/testdir/04/02_do.js new file mode 100755 index 0000000..e69de29 diff --git a/vendor/rusha.js b/vendor/rusha.js new file mode 100644 index 0000000..14b542a --- /dev/null +++ b/vendor/rusha.js @@ -0,0 +1,413 @@ +/* + * Rusha, a JavaScript implementation of the Secure Hash Algorithm, SHA-1, + * as defined in FIPS PUB 180-1, tuned for high performance with large inputs. + * (http://github.com/srijs/rusha) + * + * Inspired by Paul Johnstons implementation (http://pajhome.org.uk/crypt/md5). + * + * Copyright (c) 2013 Sam Rijs (http://awesam.de). + * Released under the terms of the MIT license as follows: + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +(function () { + var util = { + getDataType: function (data) { + if (typeof data === 'string') { + return 'string'; + } + if (data instanceof Array) { + return 'array'; + } + if (typeof global !== 'undefined' && global.Buffer && global.Buffer.isBuffer(data)) { + return 'buffer'; + } + if (data instanceof ArrayBuffer) { + return 'arraybuffer'; + } + if (data.buffer instanceof ArrayBuffer) { + return 'view'; + } + if (data instanceof Blob) { + return 'blob'; + } + throw new Error('Unsupported data type.'); + } + }; + // The Rusha object is a wrapper around the low-level RushaCore. + // It provides means of converting different inputs to the + // format accepted by RushaCore as well as other utility methods. + function Rusha(chunkSize) { + 'use strict'; + // Private object structure. + var self$2 = { fill: 0 }; + // Calculate the length of buffer that the sha1 routine uses + // including the padding. + var padlen = function (len) { + for (len += 9; len % 64 > 0; len += 1); + return len; + }; + var padZeroes = function (bin, len) { + for (var i = len >> 2; i < bin.length; i++) + bin[i] = 0; + }; + var padData = function (bin, chunkLen, msgLen) { + bin[chunkLen >> 2] |= 128 << 24 - (chunkLen % 4 << 3); + bin[((chunkLen >> 2) + 2 & ~15) + 14] = msgLen >> 29; + bin[((chunkLen >> 2) + 2 & ~15) + 15] = msgLen << 3; + }; + // Convert a binary string and write it to the heap. + // A binary string is expected to only contain char codes < 256. + var convStr = function (H8, H32, start, len, off) { + var str = this, i, om = off % 4, lm = len % 4, j = len - lm; + if (j > 0) { + switch (om) { + case 0: + H8[off + 3 | 0] = str.charCodeAt(start); + case 1: + H8[off + 2 | 0] = str.charCodeAt(start + 1); + case 2: + H8[off + 1 | 0] = str.charCodeAt(start + 2); + case 3: + H8[off | 0] = str.charCodeAt(start + 3); + } + } + for (i = om; i < j; i = i + 4 | 0) { + H32[off + i >> 2] = str.charCodeAt(start + i) << 24 | str.charCodeAt(start + i + 1) << 16 | str.charCodeAt(start + i + 2) << 8 | str.charCodeAt(start + i + 3); + } + switch (lm) { + case 3: + H8[off + j + 1 | 0] = str.charCodeAt(start + j + 2); + case 2: + H8[off + j + 2 | 0] = str.charCodeAt(start + j + 1); + case 1: + H8[off + j + 3 | 0] = str.charCodeAt(start + j); + } + }; + // Convert a buffer or array and write it to the heap. + // The buffer or array is expected to only contain elements < 256. + var convBuf = function (H8, H32, start, len, off) { + var buf = this, i, om = off % 4, lm = len % 4, j = len - lm; + if (j > 0) { + switch (om) { + case 0: + H8[off + 3 | 0] = buf[start]; + case 1: + H8[off + 2 | 0] = buf[start + 1]; + case 2: + H8[off + 1 | 0] = buf[start + 2]; + case 3: + H8[off | 0] = buf[start + 3]; + } + } + for (i = 4 - om; i < j; i = i += 4 | 0) { + H32[off + i >> 2] = buf[start + i] << 24 | buf[start + i + 1] << 16 | buf[start + i + 2] << 8 | buf[start + i + 3]; + } + switch (lm) { + case 3: + H8[off + j + 1 | 0] = buf[start + j + 2]; + case 2: + H8[off + j + 2 | 0] = buf[start + j + 1]; + case 1: + H8[off + j + 3 | 0] = buf[start + j]; + } + }; + var convBlob = function (H8, H32, start, len, off) { + var blob = this, i, om = off % 4, lm = len % 4, j = len - lm; + var buf = new Uint8Array(reader.readAsArrayBuffer(blob.slice(start, start + len))); + if (j > 0) { + switch (om) { + case 0: + H8[off + 3 | 0] = buf[0]; + case 1: + H8[off + 2 | 0] = buf[1]; + case 2: + H8[off + 1 | 0] = buf[2]; + case 3: + H8[off | 0] = buf[3]; + } + } + for (i = 4 - om; i < j; i = i += 4 | 0) { + H32[off + i >> 2] = buf[i] << 24 | buf[i + 1] << 16 | buf[i + 2] << 8 | buf[i + 3]; + } + switch (lm) { + case 3: + H8[off + j + 1 | 0] = buf[j + 2]; + case 2: + H8[off + j + 2 | 0] = buf[j + 1]; + case 1: + H8[off + j + 3 | 0] = buf[j]; + } + }; + var convFn = function (data) { + switch (util.getDataType(data)) { + case 'string': + return convStr.bind(data); + case 'array': + return convBuf.bind(data); + case 'buffer': + return convBuf.bind(data); + case 'arraybuffer': + return convBuf.bind(new Uint8Array(data)); + case 'view': + return convBuf.bind(new Uint8Array(data.buffer, data.byteOffset, data.byteLength)); + case 'blob': + return convBlob.bind(data); + } + }; + var slice = function (data, offset) { + switch (util.getDataType(data)) { + case 'string': + return data.slice(offset); + case 'array': + return data.slice(offset); + case 'buffer': + return data.slice(offset); + case 'arraybuffer': + return data.slice(offset); + case 'view': + return data.buffer.slice(offset); + } + }; + // Convert an ArrayBuffer into its hexadecimal string representation. + var hex = function (arrayBuffer) { + var i, x, hex_tab = '0123456789abcdef', res = [], binarray = new Uint8Array(arrayBuffer); + for (i = 0; i < binarray.length; i++) { + x = binarray[i]; + res[i] = hex_tab.charAt(x >> 4 & 15) + hex_tab.charAt(x >> 0 & 15); + } + return res.join(''); + }; + var ceilHeapSize = function (v) { + // The asm.js spec says: + // The heap object's byteLength must be either + // 2^n for n in [12, 24) or 2^24 * n for n ≥ 1. + // Also, byteLengths smaller than 2^16 are deprecated. + var p; + // If v is smaller than 2^16, the smallest possible solution + // is 2^16. + if (v <= 65536) + return 65536; + // If v < 2^24, we round up to 2^n, + // otherwise we round up to 2^24 * n. + if (v < 16777216) { + for (p = 1; p < v; p = p << 1); + } else { + for (p = 16777216; p < v; p += 16777216); + } + return p; + }; + // Initialize the internal data structures to a new capacity. + var init = function (size) { + if (size % 64 > 0) { + throw new Error('Chunk size must be a multiple of 128 bit'); + } + self$2.maxChunkLen = size; + self$2.padMaxChunkLen = padlen(size); + // The size of the heap is the sum of: + // 1. The padded input message size + // 2. The extended space the algorithm needs (320 byte) + // 3. The 160 bit state the algoritm uses + self$2.heap = new ArrayBuffer(ceilHeapSize(self$2.padMaxChunkLen + 320 + 20)); + self$2.h32 = new Int32Array(self$2.heap); + self$2.h8 = new Int8Array(self$2.heap); + self$2.core = new Rusha._core({ + Int32Array: Int32Array, + DataView: DataView + }, {}, self$2.heap); + self$2.buffer = null; + }; + // Iinitializethe datastructures according + // to a chunk siyze. + init(chunkSize || 64 * 1024); + var initState = function (heap, padMsgLen) { + var io = new Int32Array(heap, padMsgLen + 320, 5); + io[0] = 1732584193; + io[1] = -271733879; + io[2] = -1732584194; + io[3] = 271733878; + io[4] = -1009589776; + }; + var padChunk = function (chunkLen, msgLen) { + var padChunkLen = padlen(chunkLen); + var view = new Int32Array(self$2.heap, 0, padChunkLen >> 2); + padZeroes(view, chunkLen); + padData(view, chunkLen, msgLen); + return padChunkLen; + }; + // Write data to the heap. + var write = function (data, chunkOffset, chunkLen) { + convFn(data)(self$2.h8, self$2.h32, chunkOffset, chunkLen, 0); + }; + // Initialize and call the RushaCore, + // assuming an input buffer of length len * 4. + var coreCall = function (data, chunkOffset, chunkLen, msgLen, finalize) { + var padChunkLen = chunkLen; + if (finalize) { + padChunkLen = padChunk(chunkLen, msgLen); + } + write(data, chunkOffset, chunkLen); + self$2.core.hash(padChunkLen, self$2.padMaxChunkLen); + }; + var getRawDigest = function (heap, padMaxChunkLen) { + var io = new Int32Array(heap, padMaxChunkLen + 320, 5); + var out = new Int32Array(5); + var arr = new DataView(out.buffer); + arr.setInt32(0, io[0], false); + arr.setInt32(4, io[1], false); + arr.setInt32(8, io[2], false); + arr.setInt32(12, io[3], false); + arr.setInt32(16, io[4], false); + return out; + }; + // Calculate the hash digest as an array of 5 32bit integers. + var rawDigest = this.rawDigest = function (str) { + var msgLen = str.byteLength || str.length || str.size || 0; + initState(self$2.heap, self$2.padMaxChunkLen); + var chunkOffset = 0, chunkLen = self$2.maxChunkLen, last; + for (chunkOffset = 0; msgLen > chunkOffset + chunkLen; chunkOffset += chunkLen) { + coreCall(str, chunkOffset, chunkLen, msgLen, false); + } + coreCall(str, chunkOffset, msgLen - chunkOffset, msgLen, true); + return getRawDigest(self$2.heap, self$2.padMaxChunkLen); + }; + // The digest and digestFrom* interface returns the hash digest + // as a hex string. + this.digest = this.digestFromString = this.digestFromBuffer = this.digestFromArrayBuffer = function (str) { + return hex(rawDigest(str).buffer); + }; + } + ; + // The low-level RushCore module provides the heart of Rusha, + // a high-speed sha1 implementation working on an Int32Array heap. + // At first glance, the implementation seems complicated, however + // with the SHA1 spec at hand, it is obvious this almost a textbook + // implementation that has a few functions hand-inlined and a few loops + // hand-unrolled. + Rusha._core = function RushaCore(stdlib, foreign, heap) { + 'use asm'; + var H = new stdlib.Int32Array(heap); + function hash(k, x) { + // k in bytes + k = k | 0; + x = x | 0; + var i = 0, j = 0, y0 = 0, z0 = 0, y1 = 0, z1 = 0, y2 = 0, z2 = 0, y3 = 0, z3 = 0, y4 = 0, z4 = 0, t0 = 0, t1 = 0; + y0 = H[x + 320 >> 2] | 0; + y1 = H[x + 324 >> 2] | 0; + y2 = H[x + 328 >> 2] | 0; + y3 = H[x + 332 >> 2] | 0; + y4 = H[x + 336 >> 2] | 0; + for (i = 0; (i | 0) < (k | 0); i = i + 64 | 0) { + z0 = y0; + z1 = y1; + z2 = y2; + z3 = y3; + z4 = y4; + for (j = 0; (j | 0) < 64; j = j + 4 | 0) { + t1 = H[i + j >> 2] | 0; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | ~y1 & y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[k + j >> 2] = t1; + } + for (j = k + 64 | 0; (j | 0) < (k + 80 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | ~y1 & y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + for (j = k + 80 | 0; (j | 0) < (k + 160 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) + 1859775393 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + for (j = k + 160 | 0; (j | 0) < (k + 240 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 & y2 | y1 & y3 | y2 & y3) | 0) + ((t1 + y4 | 0) - 1894007588 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + for (j = k + 240 | 0; (j | 0) < (k + 320 | 0); j = j + 4 | 0) { + t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) << 1 | (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31; + t0 = ((y0 << 5 | y0 >>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) - 899497514 | 0) | 0; + y4 = y3; + y3 = y2; + y2 = y1 << 30 | y1 >>> 2; + y1 = y0; + y0 = t0; + H[j >> 2] = t1; + } + y0 = y0 + z0 | 0; + y1 = y1 + z1 | 0; + y2 = y2 + z2 | 0; + y3 = y3 + z3 | 0; + y4 = y4 + z4 | 0; + } + H[x + 320 >> 2] = y0; + H[x + 324 >> 2] = y1; + H[x + 328 >> 2] = y2; + H[x + 332 >> 2] = y3; + H[x + 336 >> 2] = y4; + } + return { hash: hash }; + }; + // If we'e running in Node.JS, export a module. + if (typeof module !== 'undefined') { + module.exports = Rusha; + } else if (typeof window !== 'undefined') { + window.Rusha = Rusha; + } + // If we're running in a webworker, accept + // messages containing a jobid and a buffer + // or blob object, and return the hash result. + if (typeof FileReaderSync !== 'undefined') { + var reader = new FileReaderSync(), hasher = new Rusha(4 * 1024 * 1024); + self.onmessage = function onMessage(event) { + var hash, data = event.data.data; + try { + hash = hasher.digest(data); + self.postMessage({ + id: event.data.id, + hash: hash + }); + } catch (e) { + self.postMessage({ + id: event.data.id, + error: e.name + }); + } + }; + } +}()); \ No newline at end of file