javascriptmvc 3.0.0.pre15
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/README.markdown +15 -0
- data/Rakefile +17 -0
- data/VERSION +1 -0
- data/bin/jmvc-build +4 -0
- data/bin/jmvc-gen +4 -0
- data/bin/jmvc-get +4 -0
- data/bin/jmvc-init +4 -0
- data/bin/jmvc-update +4 -0
- data/lib/javascriptmvc.rb +97 -0
- data/lib/javascriptmvc/documentjs/README +0 -0
- data/lib/javascriptmvc/documentjs/add.js +76 -0
- data/lib/javascriptmvc/documentjs/application.js +285 -0
- data/lib/javascriptmvc/documentjs/attribute.js +61 -0
- data/lib/javascriptmvc/documentjs/baseclass.js +537 -0
- data/lib/javascriptmvc/documentjs/class.js +141 -0
- data/lib/javascriptmvc/documentjs/constructor.js +145 -0
- data/lib/javascriptmvc/documentjs/directives.js +394 -0
- data/lib/javascriptmvc/documentjs/distance.js +49 -0
- data/lib/javascriptmvc/documentjs/document +21 -0
- data/lib/javascriptmvc/documentjs/documentjs.js +76 -0
- data/lib/javascriptmvc/documentjs/file.js +55 -0
- data/lib/javascriptmvc/documentjs/function.js +112 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/close.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/download.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/fav-off.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/fav-on.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/favicon.ico +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/logo.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/pre.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-icons_222222_256x240.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-icons_2e83ff_256x240.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-icons_454545_256x240.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-icons_888888_256x240.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/images/video.png +0 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/production.js +552 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/style.css +354 -0
- data/lib/javascriptmvc/documentjs/jmvcdoc/summary.ejs +134 -0
- data/lib/javascriptmvc/documentjs/json.js +172 -0
- data/lib/javascriptmvc/documentjs/page.js +107 -0
- data/lib/javascriptmvc/documentjs/pair.js +302 -0
- data/lib/javascriptmvc/documentjs/prototype.js +13 -0
- data/lib/javascriptmvc/documentjs/scripts/build.js +6 -0
- data/lib/javascriptmvc/documentjs/static.js +25 -0
- data/lib/javascriptmvc/documentjs/test/docs/Something.json +1 -0
- data/lib/javascriptmvc/documentjs/test/docs/searchData.json +1 -0
- data/lib/javascriptmvc/documentjs/test/something.js +8 -0
- data/lib/javascriptmvc/documentjs/test/test.html +6 -0
- data/lib/javascriptmvc/documentjs/test_doc.html +1 -0
- data/lib/javascriptmvc/documentjs/update +5 -0
- data/lib/javascriptmvc/funcunit/README +17 -0
- data/lib/javascriptmvc/funcunit/autosuggest/auto_suggest.js +495 -0
- data/lib/javascriptmvc/funcunit/autosuggest/autosuggest.css +24 -0
- data/lib/javascriptmvc/funcunit/autosuggest/autosuggest.html +26 -0
- data/lib/javascriptmvc/funcunit/autosuggest/autosuggest.js +17 -0
- data/lib/javascriptmvc/funcunit/autosuggest/autosuggest_test.js +14 -0
- data/lib/javascriptmvc/funcunit/autosuggest/funcunit.html +15 -0
- data/lib/javascriptmvc/funcunit/build.js +54 -0
- data/lib/javascriptmvc/funcunit/drivers/selenium.js +129 -0
- data/lib/javascriptmvc/funcunit/drivers/standard.js +169 -0
- data/lib/javascriptmvc/funcunit/envjs +13 -0
- data/lib/javascriptmvc/funcunit/envjs.bat +28 -0
- data/lib/javascriptmvc/funcunit/funcunit.html +20 -0
- data/lib/javascriptmvc/funcunit/funcunit.js +1509 -0
- data/lib/javascriptmvc/funcunit/java/selenium-java-client-driver.jar +0 -0
- data/lib/javascriptmvc/funcunit/java/selenium-server.jar +0 -0
- data/lib/javascriptmvc/funcunit/qunit.html +22 -0
- data/lib/javascriptmvc/funcunit/qunit/qunit.css +119 -0
- data/lib/javascriptmvc/funcunit/qunit/qunit.js +1124 -0
- data/lib/javascriptmvc/funcunit/qunit/rhino/rhino.js +24 -0
- data/lib/javascriptmvc/funcunit/qunit/test/qunit.html +18 -0
- data/lib/javascriptmvc/funcunit/qunit/test/test.js +7 -0
- data/lib/javascriptmvc/funcunit/resources/funcunit.js +31 -0
- data/lib/javascriptmvc/funcunit/resources/jquery.js +6378 -0
- data/lib/javascriptmvc/funcunit/resources/json.js +201 -0
- data/lib/javascriptmvc/funcunit/resources/selenium_start.js +43 -0
- data/lib/javascriptmvc/funcunit/scripts/run.js +36 -0
- data/lib/javascriptmvc/funcunit/scripts/test.js +55 -0
- data/lib/javascriptmvc/funcunit/settings.js +10 -0
- data/lib/javascriptmvc/funcunit/synthetic/browsers.js +151 -0
- data/lib/javascriptmvc/funcunit/synthetic/demo.html +150 -0
- data/lib/javascriptmvc/funcunit/synthetic/demo/record.js +254 -0
- data/lib/javascriptmvc/funcunit/synthetic/drag/drag.html +41 -0
- data/lib/javascriptmvc/funcunit/synthetic/drag/drag.js +268 -0
- data/lib/javascriptmvc/funcunit/synthetic/drag/qunit.html +20 -0
- data/lib/javascriptmvc/funcunit/synthetic/drag/test/qunit/drag_test.js +195 -0
- data/lib/javascriptmvc/funcunit/synthetic/drag/test/qunit/qunit.js +7 -0
- data/lib/javascriptmvc/funcunit/synthetic/key.js +832 -0
- data/lib/javascriptmvc/funcunit/synthetic/mouse.js +291 -0
- data/lib/javascriptmvc/funcunit/synthetic/qunit.html +22 -0
- data/lib/javascriptmvc/funcunit/synthetic/recorder.html +303 -0
- data/lib/javascriptmvc/funcunit/synthetic/synthetic.html +85 -0
- data/lib/javascriptmvc/funcunit/synthetic/synthetic.js +796 -0
- data/lib/javascriptmvc/funcunit/synthetic/test/qunit/key_test.js +391 -0
- data/lib/javascriptmvc/funcunit/synthetic/test/qunit/mouse_test.js +233 -0
- data/lib/javascriptmvc/funcunit/synthetic/test/qunit/qunit.js +6 -0
- data/lib/javascriptmvc/funcunit/synthetic/test/qunit/synthetic_test.js +91 -0
- data/lib/javascriptmvc/funcunit/synthetic/test/submit.html +29 -0
- data/lib/javascriptmvc/funcunit/synthetic/test/submitted.html +3 -0
- data/lib/javascriptmvc/funcunit/template.html +18 -0
- data/lib/javascriptmvc/funcunit/test/drag.html +63 -0
- data/lib/javascriptmvc/funcunit/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/funcunit/test/funcunit/funcunit_test.js +87 -0
- data/lib/javascriptmvc/funcunit/test/funcunit/open_test.js +28 -0
- data/lib/javascriptmvc/funcunit/test/funcunit/protodrag_test.js +13 -0
- data/lib/javascriptmvc/funcunit/test/funcunit/syn_test.js +41 -0
- data/lib/javascriptmvc/funcunit/test/jquery.event.drag.js +801 -0
- data/lib/javascriptmvc/funcunit/test/jquery.event.drop.js +439 -0
- data/lib/javascriptmvc/funcunit/test/jquery.js +6360 -0
- data/lib/javascriptmvc/funcunit/test/myapp.html +103 -0
- data/lib/javascriptmvc/funcunit/test/myotherapp.html +15 -0
- data/lib/javascriptmvc/funcunit/test/protodrag/dragdrop.js +974 -0
- data/lib/javascriptmvc/funcunit/test/protodrag/effects.js +1123 -0
- data/lib/javascriptmvc/funcunit/test/protodrag/funcunit_test.js +20 -0
- data/lib/javascriptmvc/funcunit/test/protodrag/myapp.html +63 -0
- data/lib/javascriptmvc/funcunit/test/protodrag/prototype.js +4874 -0
- data/lib/javascriptmvc/funcunit/test/protodrag/scriptaculous.js +68 -0
- data/lib/javascriptmvc/funcunit/update +5 -0
- data/lib/javascriptmvc/jquery/README +24 -0
- data/lib/javascriptmvc/jquery/build.js +73 -0
- data/lib/javascriptmvc/jquery/class/class.html +109 -0
- data/lib/javascriptmvc/jquery/class/class.js +627 -0
- data/lib/javascriptmvc/jquery/class/qunit.html +15 -0
- data/lib/javascriptmvc/jquery/class/test/qunit/class_test.js +146 -0
- data/lib/javascriptmvc/jquery/class/test/qunit/qunit.js +5 -0
- data/lib/javascriptmvc/jquery/class/test/qunit/test.html +20 -0
- data/lib/javascriptmvc/jquery/controller/controller.html +89 -0
- data/lib/javascriptmvc/jquery/controller/controller.js +735 -0
- data/lib/javascriptmvc/jquery/controller/history/history.html +44 -0
- data/lib/javascriptmvc/jquery/controller/history/history.js +177 -0
- data/lib/javascriptmvc/jquery/controller/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/scripts/compress.js +6 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/scripts/docs.js +6 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/subscribe.html +56 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/subscribe.js +27 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/test/funcunit/subscribe_test.js +11 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/controller/subscribe/test/qunit/subscribe_test.js +4 -0
- data/lib/javascriptmvc/jquery/controller/test/qunit/controller_test.js +170 -0
- data/lib/javascriptmvc/jquery/controller/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/controller/view/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/controller/view/test/qunit/controller_view_test.js +15 -0
- data/lib/javascriptmvc/jquery/controller/view/test/qunit/qunit.js +6 -0
- data/lib/javascriptmvc/jquery/controller/view/test/qunit/views/init.micro +1 -0
- data/lib/javascriptmvc/jquery/controller/view/view.js +102 -0
- data/lib/javascriptmvc/jquery/dom/closest/closest.html +23 -0
- data/lib/javascriptmvc/jquery/dom/closest/closest.js +47 -0
- data/lib/javascriptmvc/jquery/dom/closest/funcunit.html +20 -0
- data/lib/javascriptmvc/jquery/dom/closest/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/dom/closest/scripts/compress.js +3 -0
- data/lib/javascriptmvc/jquery/dom/closest/scripts/doc.js +4 -0
- data/lib/javascriptmvc/jquery/dom/closest/scripts/test.js +55 -0
- data/lib/javascriptmvc/jquery/dom/closest/settings.js +40 -0
- data/lib/javascriptmvc/jquery/dom/closest/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/dom/closest/test/funcunit/tests/basic.js +11 -0
- data/lib/javascriptmvc/jquery/dom/closest/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/dom/closest/test/qunit/tests/basic.js +4 -0
- data/lib/javascriptmvc/jquery/dom/compare/compare.html +88 -0
- data/lib/javascriptmvc/jquery/dom/compare/compare.js +67 -0
- data/lib/javascriptmvc/jquery/dom/compare/qunit.html +20 -0
- data/lib/javascriptmvc/jquery/dom/compare/test/qunit/compare_test.js +19 -0
- data/lib/javascriptmvc/jquery/dom/compare/test/qunit/qunit.js +5 -0
- data/lib/javascriptmvc/jquery/dom/cookie/cookie.html +25 -0
- data/lib/javascriptmvc/jquery/dom/cookie/cookie.js +119 -0
- data/lib/javascriptmvc/jquery/dom/cookie/scripts/compress.js +6 -0
- data/lib/javascriptmvc/jquery/dom/cookie/scripts/doc.js +6 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/funcunit/cookie_test.js +11 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/funcunit/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/qunit/cookie_test.js +4 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/dom/cookie/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/dom/cur_styles/cur_styles.html +71 -0
- data/lib/javascriptmvc/jquery/dom/cur_styles/cur_styles.js +120 -0
- data/lib/javascriptmvc/jquery/dom/cur_styles/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/dom/cur_styles/test/qunit/curStyles.micro +3 -0
- data/lib/javascriptmvc/jquery/dom/cur_styles/test/qunit/cur_styles_test.js +22 -0
- data/lib/javascriptmvc/jquery/dom/cur_styles/test/qunit/outer.micro +0 -0
- data/lib/javascriptmvc/jquery/dom/cur_styles/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/curstyles.html +22 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/dimensions.html +132 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/dimensions.js +140 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/test/qunit/curStyles.micro +3 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/test/qunit/dimensions_test.js +8 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/test/qunit/outer.micro +0 -0
- data/lib/javascriptmvc/jquery/dom/dimensions/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/dom/dom.js +7 -0
- data/lib/javascriptmvc/jquery/dom/fixture/fixture.html +143 -0
- data/lib/javascriptmvc/jquery/dom/fixture/fixture.js +521 -0
- data/lib/javascriptmvc/jquery/dom/fixture/fixtures/messages.html +31 -0
- data/lib/javascriptmvc/jquery/dom/fixture/fixtures/test.json +3 -0
- data/lib/javascriptmvc/jquery/dom/fixture/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/dom/fixture/test/qunit/fixture_test.js +50 -0
- data/lib/javascriptmvc/jquery/dom/fixture/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/dom/form_params/form_params.html +57 -0
- data/lib/javascriptmvc/jquery/dom/form_params/form_params.js +106 -0
- data/lib/javascriptmvc/jquery/dom/form_params/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/dom/form_params/test/qunit/basics.micro +27 -0
- data/lib/javascriptmvc/jquery/dom/form_params/test/qunit/checkbox.micro +20 -0
- data/lib/javascriptmvc/jquery/dom/form_params/test/qunit/form_params_test.js +43 -0
- data/lib/javascriptmvc/jquery/dom/form_params/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/dom/form_params/test/qunit/truthy.micro +8 -0
- data/lib/javascriptmvc/jquery/dom/within/within.js +67 -0
- data/lib/javascriptmvc/jquery/error/background.png +0 -0
- data/lib/javascriptmvc/jquery/error/error.html +31 -0
- data/lib/javascriptmvc/jquery/error/error.js +227 -0
- data/lib/javascriptmvc/jquery/error/setup.js +4 -0
- data/lib/javascriptmvc/jquery/error/test/test.html +23 -0
- data/lib/javascriptmvc/jquery/error/test/test.js +4 -0
- data/lib/javascriptmvc/jquery/event/default/compress.js +7 -0
- data/lib/javascriptmvc/jquery/event/default/default.html +85 -0
- data/lib/javascriptmvc/jquery/event/default/default.js +193 -0
- data/lib/javascriptmvc/jquery/event/default/defaultjquery.html +117 -0
- data/lib/javascriptmvc/jquery/event/default/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/event/default/test/qunit/default_test.js +104 -0
- data/lib/javascriptmvc/jquery/event/default/test/qunit/html.micro +8 -0
- data/lib/javascriptmvc/jquery/event/default/test/qunit/qunit.js +6 -0
- data/lib/javascriptmvc/jquery/event/default/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/event/destroyed/destroyed.html +24 -0
- data/lib/javascriptmvc/jquery/event/destroyed/destroyed.js +40 -0
- data/lib/javascriptmvc/jquery/event/destroyed/destroyed_menu.html +96 -0
- data/lib/javascriptmvc/jquery/event/destroyed/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/event/destroyed/test/qunit/destroyed_test.js +12 -0
- data/lib/javascriptmvc/jquery/event/destroyed/test/qunit/qunit.js +6 -0
- data/lib/javascriptmvc/jquery/event/drag/drag.html +105 -0
- data/lib/javascriptmvc/jquery/event/drag/drag.js +466 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/limit.html +74 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/limit.js +56 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/scripts/compress.js +6 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/scripts/doc.js +6 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/funcunit/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/funcunit/limit_test.js +11 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/qunit/limit_test.js +4 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/event/drag/limit/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/event/drag/qunit.html +16 -0
- data/lib/javascriptmvc/jquery/event/drag/scroll/scroll.js +120 -0
- data/lib/javascriptmvc/jquery/event/drag/test/qunit/drag_test.js +130 -0
- data/lib/javascriptmvc/jquery/event/drag/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/event/drop/drop.html +74 -0
- data/lib/javascriptmvc/jquery/event/drop/drop.js +301 -0
- data/lib/javascriptmvc/jquery/event/event.js +6 -0
- data/lib/javascriptmvc/jquery/event/hashchange/hashchange.js +245 -0
- data/lib/javascriptmvc/jquery/event/hover/compress.js +7 -0
- data/lib/javascriptmvc/jquery/event/hover/hover.html +56 -0
- data/lib/javascriptmvc/jquery/event/hover/hover.js +219 -0
- data/lib/javascriptmvc/jquery/event/hover/qunit.html +16 -0
- data/lib/javascriptmvc/jquery/event/hover/test/qunit/hover_test.js +55 -0
- data/lib/javascriptmvc/jquery/event/hover/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/event/livehack/compress.js +7 -0
- data/lib/javascriptmvc/jquery/event/livehack/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/event/livehack/livehack.html +25 -0
- data/lib/javascriptmvc/jquery/event/livehack/livehack.js +167 -0
- data/lib/javascriptmvc/jquery/event/offline/funcunit.html +20 -0
- data/lib/javascriptmvc/jquery/event/offline/offline.html +26 -0
- data/lib/javascriptmvc/jquery/event/offline/offline.js +36 -0
- data/lib/javascriptmvc/jquery/event/offline/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/event/offline/scripts/compress.js +3 -0
- data/lib/javascriptmvc/jquery/event/offline/scripts/doc.js +4 -0
- data/lib/javascriptmvc/jquery/event/offline/settings.js +41 -0
- data/lib/javascriptmvc/jquery/event/offline/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/event/offline/test/funcunit/tests/basic.js +11 -0
- data/lib/javascriptmvc/jquery/event/offline/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/event/offline/test/qunit/tests/basic.js +4 -0
- data/lib/javascriptmvc/jquery/event/resize/funcunit.html +20 -0
- data/lib/javascriptmvc/jquery/event/resize/qunit.html +22 -0
- data/lib/javascriptmvc/jquery/event/resize/resize.html +23 -0
- data/lib/javascriptmvc/jquery/event/resize/resize.js +50 -0
- data/lib/javascriptmvc/jquery/event/resize/scripts/compress.js +3 -0
- data/lib/javascriptmvc/jquery/event/resize/scripts/doc.js +4 -0
- data/lib/javascriptmvc/jquery/event/resize/scripts/test.js +55 -0
- data/lib/javascriptmvc/jquery/event/resize/settings.js +40 -0
- data/lib/javascriptmvc/jquery/event/resize/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/event/resize/test/funcunit/tests/basic.js +11 -0
- data/lib/javascriptmvc/jquery/event/resize/test/qunit/qunit.js +4 -0
- data/lib/javascriptmvc/jquery/event/resize/test/qunit/tests/basic.js +4 -0
- data/lib/javascriptmvc/jquery/event/select/scripts/compress.js +6 -0
- data/lib/javascriptmvc/jquery/event/select/scripts/doc.js +6 -0
- data/lib/javascriptmvc/jquery/event/select/select.html +63 -0
- data/lib/javascriptmvc/jquery/event/select/select.js +65 -0
- data/lib/javascriptmvc/jquery/event/select/test/funcunit/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/event/select/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/event/select/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/event/select/test/funcunit/select_test.js +11 -0
- data/lib/javascriptmvc/jquery/event/select/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/event/select/test/qunit/qunit.js +5 -0
- data/lib/javascriptmvc/jquery/event/select/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/event/select/test/qunit/select_test.js +4 -0
- data/lib/javascriptmvc/jquery/generate/app +23 -0
- data/lib/javascriptmvc/jquery/generate/controller +21 -0
- data/lib/javascriptmvc/jquery/generate/model +26 -0
- data/lib/javascriptmvc/jquery/generate/page +20 -0
- data/lib/javascriptmvc/jquery/generate/plugin +20 -0
- data/lib/javascriptmvc/jquery/generate/scaffold +23 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/(application_name).css.ejs +4 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/(application_name).html.ejs +23 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/(application_name).js.ejs +21 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/controllers/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/docs/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/fixtures/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/funcunit.html.ejs +15 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/models/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/qunit.html.ejs +20 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/resources/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/scripts/build.js.ejs +6 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/scripts/clean.js.ejs +6 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/scripts/docs.js.ejs +4 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/test/funcunit/(application_name)_test.js.ejs +9 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/test/funcunit/funcunit.js.ejs +3 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/test/qunit/(application_name)_test.js.ejs +5 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/test/qunit/qunit.js.ejs +3 -0
- data/lib/javascriptmvc/jquery/generate/templates/app/views/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/controller/controllers/(underscore)_controller.js.ejs +12 -0
- data/lib/javascriptmvc/jquery/generate/templates/model/fixtures.link +1 -0
- data/lib/javascriptmvc/jquery/generate/templates/model/models.link +1 -0
- data/lib/javascriptmvc/jquery/generate/templates/model/test/qunit.link +1 -0
- data/lib/javascriptmvc/jquery/generate/templates/page.ejs +23 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/(application_name).html.ejs +23 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/(application_name).js.ejs +3 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/fixtures/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/funcunit.html.ejs +15 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/qunit.html.ejs +20 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/resources/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/scripts.link +1 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/test.link +1 -0
- data/lib/javascriptmvc/jquery/generate/templates/plugin/views/.ignore +0 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/controllers/(underscore)_controller.js.ejs +96 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/fixtures/(plural).json.get.ejs +3 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/models/(underscore).js.ejs +83 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/test/funcunit/(underscore)_controller_test.js.ejs +63 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/test/qunit/(underscore)_test.js.ejs +45 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/views/(underscore)/edit.ejs.ejs +10 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/views/(underscore)/init.ejs.ejs +26 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/views/(underscore)/list.ejs.ejs +5 -0
- data/lib/javascriptmvc/jquery/generate/templates/scaffold/views/(underscore)/show.ejs.ejs +10 -0
- data/lib/javascriptmvc/jquery/jquery.js +6360 -0
- data/lib/javascriptmvc/jquery/lang/json/json.html +25 -0
- data/lib/javascriptmvc/jquery/lang/json/json.js +201 -0
- data/lib/javascriptmvc/jquery/lang/json/scripts/compress.js +6 -0
- data/lib/javascriptmvc/jquery/lang/json/scripts/doc.js +6 -0
- data/lib/javascriptmvc/jquery/lang/json/test/funcunit/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/lang/json/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/lang/json/test/funcunit/json_test.js +11 -0
- data/lib/javascriptmvc/jquery/lang/json/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/lang/json/test/qunit/json_test.js +4 -0
- data/lib/javascriptmvc/jquery/lang/json/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/lang/json/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/lang/json/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/lang/lang.html +27 -0
- data/lib/javascriptmvc/jquery/lang/lang.js +104 -0
- data/lib/javascriptmvc/jquery/lang/openajax/openajax.js +202 -0
- data/lib/javascriptmvc/jquery/lang/rsplit/rsplit.js +31 -0
- data/lib/javascriptmvc/jquery/lang/vector/vector.js +167 -0
- data/lib/javascriptmvc/jquery/model/associations/associations.html +25 -0
- data/lib/javascriptmvc/jquery/model/associations/associations.js +46 -0
- data/lib/javascriptmvc/jquery/model/associations/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/model/associations/test/qunit/associations_test.js +51 -0
- data/lib/javascriptmvc/jquery/model/associations/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/model/associations/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/model/backup/backup.js +82 -0
- data/lib/javascriptmvc/jquery/model/json_rest/json_rest.js +91 -0
- data/lib/javascriptmvc/jquery/model/list/list.js +148 -0
- data/lib/javascriptmvc/jquery/model/list/qunit.html +16 -0
- data/lib/javascriptmvc/jquery/model/list/test/qunit/list_test.js +58 -0
- data/lib/javascriptmvc/jquery/model/list/test/qunit/qunit.js +6 -0
- data/lib/javascriptmvc/jquery/model/list/test/qunit/run.js +0 -0
- data/lib/javascriptmvc/jquery/model/model.js +537 -0
- data/lib/javascriptmvc/jquery/model/qunit.html +17 -0
- data/lib/javascriptmvc/jquery/model/store/store.js +66 -0
- data/lib/javascriptmvc/jquery/model/test/qunit/model_test.js +71 -0
- data/lib/javascriptmvc/jquery/model/test/qunit/qunit.js +5 -0
- data/lib/javascriptmvc/jquery/qunit.html +15 -0
- data/lib/javascriptmvc/jquery/test/funcunit/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/test/funcunit/jquerytest_test.js +11 -0
- data/lib/javascriptmvc/jquery/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/test/qunit/qunit.js +22 -0
- data/lib/javascriptmvc/jquery/update +5 -0
- data/lib/javascriptmvc/jquery/view/compress.js +7 -0
- data/lib/javascriptmvc/jquery/view/ejs/ejs.html +25 -0
- data/lib/javascriptmvc/jquery/view/ejs/ejs.js +489 -0
- data/lib/javascriptmvc/jquery/view/ejs/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/view/ejs/test/funcunit/ejs_test.js +11 -0
- data/lib/javascriptmvc/jquery/view/ejs/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/view/ejs/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/view/ejs/test/qunit/ejs_test.js +4 -0
- data/lib/javascriptmvc/jquery/view/ejs/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/view/ejs/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/view/ejs/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/view/fulljslint.js +3774 -0
- data/lib/javascriptmvc/jquery/view/helpers/helpers.js +338 -0
- data/lib/javascriptmvc/jquery/view/jaml/compress.js +7 -0
- data/lib/javascriptmvc/jquery/view/jaml/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/view/jaml/jaml.html +25 -0
- data/lib/javascriptmvc/jquery/view/jaml/jaml.js +73 -0
- data/lib/javascriptmvc/jquery/view/jaml/node.js +149 -0
- data/lib/javascriptmvc/jquery/view/jaml/template.js +131 -0
- data/lib/javascriptmvc/jquery/view/jaml/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/view/jaml/test/funcunit/jaml_test.js +11 -0
- data/lib/javascriptmvc/jquery/view/jaml/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/view/jaml/test/qunit/jaml_test.js +4 -0
- data/lib/javascriptmvc/jquery/view/jaml/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/view/jaml/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/view/jaml/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/view/micro/compress.js +7 -0
- data/lib/javascriptmvc/jquery/view/micro/funcunit.html +21 -0
- data/lib/javascriptmvc/jquery/view/micro/micro.html +25 -0
- data/lib/javascriptmvc/jquery/view/micro/micro.js +57 -0
- data/lib/javascriptmvc/jquery/view/micro/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/view/micro/test/funcunit/micro_test.js +11 -0
- data/lib/javascriptmvc/jquery/view/micro/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/view/micro/test/qunit/micro_test.js +4 -0
- data/lib/javascriptmvc/jquery/view/micro/test/qunit/qunit.html +21 -0
- data/lib/javascriptmvc/jquery/view/micro/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/view/micro/test/qunit/run.js +2 -0
- data/lib/javascriptmvc/jquery/view/qunit.html +16 -0
- data/lib/javascriptmvc/jquery/view/test/compression/compression.html +12 -0
- data/lib/javascriptmvc/jquery/view/test/compression/compression.js +11 -0
- data/lib/javascriptmvc/jquery/view/test/compression/run.js +36 -0
- data/lib/javascriptmvc/jquery/view/test/funcunit/funcunit.js +3 -0
- data/lib/javascriptmvc/jquery/view/test/funcunit/run.js +10 -0
- data/lib/javascriptmvc/jquery/view/test/funcunit/view_test.js +11 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/nested_plugin.ejs +1 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/plugin.ejs +1 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/qunit.js +9 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/template.ejs +1 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/template.jaml +3 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/template.micro +1 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/template.tmpl +1 -0
- data/lib/javascriptmvc/jquery/view/test/qunit/view_test.js +24 -0
- data/lib/javascriptmvc/jquery/view/tmpl/tmpl.js +150 -0
- data/lib/javascriptmvc/jquery/view/view.html +65 -0
- data/lib/javascriptmvc/jquery/view/view.js +296 -0
- data/lib/javascriptmvc/js +56 -0
- data/lib/javascriptmvc/js.bat +57 -0
- data/lib/javascriptmvc/steal/README +26 -0
- data/lib/javascriptmvc/steal/build/apps/apps.js +208 -0
- data/lib/javascriptmvc/steal/build/apps/test.js +4 -0
- data/lib/javascriptmvc/steal/build/build.js +281 -0
- data/lib/javascriptmvc/steal/build/pluginify.js +73 -0
- data/lib/javascriptmvc/steal/build/scripts/compiler.jar +0 -0
- data/lib/javascriptmvc/steal/build/scripts/scripts.js +155 -0
- data/lib/javascriptmvc/steal/build/styles/cssmin.js +17 -0
- data/lib/javascriptmvc/steal/build/styles/styles.js +84 -0
- data/lib/javascriptmvc/steal/build/test/basicpage.html +6 -0
- data/lib/javascriptmvc/steal/build/test/basicproduction.js +1 -0
- data/lib/javascriptmvc/steal/build/test/basicsource.js +6 -0
- data/lib/javascriptmvc/steal/build/test/css/css/css1.css +1 -0
- data/lib/javascriptmvc/steal/build/test/css/css/justin.png +0 -0
- data/lib/javascriptmvc/steal/build/test/css/css2.css +5 -0
- data/lib/javascriptmvc/steal/build/test/css/page.html +9 -0
- data/lib/javascriptmvc/steal/build/test/css/production.css +1 -0
- data/lib/javascriptmvc/steal/build/test/css/test.js +7 -0
- data/lib/javascriptmvc/steal/build/test/css/upload.PNG +0 -0
- data/lib/javascriptmvc/steal/build/test/foreign.html +6 -0
- data/lib/javascriptmvc/steal/build/test/foreign.js +2 -0
- data/lib/javascriptmvc/steal/build/test/removecode.js +11 -0
- data/lib/javascriptmvc/steal/build/test/run.js +57 -0
- data/lib/javascriptmvc/steal/build/test/stealpage.html +10 -0
- data/lib/javascriptmvc/steal/build/test/stealprodpage.html +10 -0
- data/lib/javascriptmvc/steal/build/test/test.js +3 -0
- data/lib/javascriptmvc/steal/buildjs +21 -0
- data/lib/javascriptmvc/steal/clean/beautify.js +1108 -0
- data/lib/javascriptmvc/steal/clean/clean.js +179 -0
- data/lib/javascriptmvc/steal/clean/jslint.js +5662 -0
- data/lib/javascriptmvc/steal/clean/test.js +7 -0
- data/lib/javascriptmvc/steal/cleanjs +5 -0
- data/lib/javascriptmvc/steal/coffee/coffee-script.js +9 -0
- data/lib/javascriptmvc/steal/coffee/coffee.js +56 -0
- data/lib/javascriptmvc/steal/dev/dev.js +83 -0
- data/lib/javascriptmvc/steal/end.js +1 -0
- data/lib/javascriptmvc/steal/generate/app +23 -0
- data/lib/javascriptmvc/steal/generate/ejs.js +470 -0
- data/lib/javascriptmvc/steal/generate/generate.js +211 -0
- data/lib/javascriptmvc/steal/generate/inflector.js +117 -0
- data/lib/javascriptmvc/steal/generate/system.js +33 -0
- data/lib/javascriptmvc/steal/generate/templates/app/(application_name).css.ejs +10 -0
- data/lib/javascriptmvc/steal/generate/templates/app/(application_name).html.ejs +18 -0
- data/lib/javascriptmvc/steal/generate/templates/app/(application_name).js.ejs +10 -0
- data/lib/javascriptmvc/steal/generate/templates/app/docs/.ignore +0 -0
- data/lib/javascriptmvc/steal/generate/templates/app/resources/.ignore +0 -0
- data/lib/javascriptmvc/steal/generate/templates/app/resources/example.coffee.ejs +5 -0
- data/lib/javascriptmvc/steal/generate/templates/app/resources/example.js.ejs +13 -0
- data/lib/javascriptmvc/steal/generate/templates/app/resources/example.less.ejs +9 -0
- data/lib/javascriptmvc/steal/generate/templates/app/scripts/build.js.ejs +6 -0
- data/lib/javascriptmvc/steal/generate/templates/app/scripts/clean.js.ejs +6 -0
- data/lib/javascriptmvc/steal/generate/templates/app/test/.ignore +0 -0
- data/lib/javascriptmvc/steal/generate/templates/page.ejs +23 -0
- data/lib/javascriptmvc/steal/generate/test/test.js +92 -0
- data/lib/javascriptmvc/steal/get/get.js +163 -0
- data/lib/javascriptmvc/steal/get/gets.json +10 -0
- data/lib/javascriptmvc/steal/get/getter.js +115 -0
- data/lib/javascriptmvc/steal/get/github.js +134 -0
- data/lib/javascriptmvc/steal/get/json.js +172 -0
- data/lib/javascriptmvc/steal/getjs +5 -0
- data/lib/javascriptmvc/steal/js +56 -0
- data/lib/javascriptmvc/steal/js.bat +57 -0
- data/lib/javascriptmvc/steal/less/less.js +117 -0
- data/lib/javascriptmvc/steal/less/less_engine.js +2529 -0
- data/lib/javascriptmvc/steal/rhino/blank.html +6 -0
- data/lib/javascriptmvc/steal/rhino/build.js +31 -0
- data/lib/javascriptmvc/steal/rhino/docs.js +68 -0
- data/lib/javascriptmvc/steal/rhino/empty.html +12 -0
- data/lib/javascriptmvc/steal/rhino/env.js +11537 -0
- data/lib/javascriptmvc/steal/rhino/file.js +299 -0
- data/lib/javascriptmvc/steal/rhino/js.jar +0 -0
- data/lib/javascriptmvc/steal/rhino/loader.js +8 -0
- data/lib/javascriptmvc/steal/rhino/prompt.js +49 -0
- data/lib/javascriptmvc/steal/rhino/steal.js +122 -0
- data/lib/javascriptmvc/steal/rhino/test.js +16 -0
- data/lib/javascriptmvc/steal/steal.js +1317 -0
- data/lib/javascriptmvc/steal/steal.production.js +23 -0
- data/lib/javascriptmvc/steal/test/absoluteurl.html +7 -0
- data/lib/javascriptmvc/steal/test/absoluteurl/absoluteurl.js +1 -0
- data/lib/javascriptmvc/steal/test/absoluteurl/alert.js +1 -0
- data/lib/javascriptmvc/steal/test/another/two.js +2 -0
- data/lib/javascriptmvc/steal/test/one/four.js +1 -0
- data/lib/javascriptmvc/steal/test/one/one.js +6 -0
- data/lib/javascriptmvc/steal/test/qunit/qunit.html +22 -0
- data/lib/javascriptmvc/steal/test/qunit/qunit.js +3 -0
- data/lib/javascriptmvc/steal/test/qunit/steal_test.js +197 -0
- data/lib/javascriptmvc/steal/test/run.js +12 -0
- data/lib/javascriptmvc/steal/test/steal.html +37 -0
- data/lib/javascriptmvc/steal/test/test.js +82 -0
- data/lib/javascriptmvc/steal/test/three.js +3 -0
- data/lib/javascriptmvc/steal/testing/test.html +20 -0
- data/lib/javascriptmvc/steal/testing/testing.js +48 -0
- data/lib/javascriptmvc/steal/update +5 -0
- metadata +622 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
CP=selenium/selenium-java-client-driver.jar:selenium/js.jar
|
4
|
+
ARGS=[
|
5
|
+
for arg
|
6
|
+
do
|
7
|
+
if [ $arg != $0 ]
|
8
|
+
then
|
9
|
+
ARGS=$ARGS"'$arg'",
|
10
|
+
fi
|
11
|
+
done
|
12
|
+
ARGS=$ARGS]
|
13
|
+
java -Xss1024k -cp $CP org.mozilla.javascript.tools.shell.Main -e _args=$ARGS -opt -1 -e 'load('"'"selenium/run.js"'"')'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
@echo off
|
2
|
+
|
3
|
+
SETLOCAL ENABLEDELAYEDEXPANSION
|
4
|
+
|
5
|
+
set BASE=%0
|
6
|
+
|
7
|
+
set BASE=%BASE:envjs=%
|
8
|
+
|
9
|
+
if not "%BASE%" == "" ( set BASE=%BASE:\=/% )
|
10
|
+
|
11
|
+
:: trim spaces
|
12
|
+
for /f "tokens=1*" %%A in ("%BASE%") do SET BASE=%%A
|
13
|
+
|
14
|
+
SET CP=%BASE%java/selenium-java-client-driver.jar;%BASE%../steal/rhino/js.jar
|
15
|
+
|
16
|
+
SET ARGS=[
|
17
|
+
|
18
|
+
for /f "tokens=1,2,3,4,5,6 delims= " %%a in ("%*") do SET ARGS=!ARGS!'%%a','%%b','%%c','%%d','%%e','%%f'
|
19
|
+
|
20
|
+
for %%a in (",''=") do ( call set ARGS=%%ARGS:%%~a%% )
|
21
|
+
|
22
|
+
for /f "tokens=1*" %%A in ("%ARGS%") do SET ARGS=%%A
|
23
|
+
|
24
|
+
SET ARGS=%ARGS%,'%BASE%']
|
25
|
+
|
26
|
+
set ARGS=%ARGS:\=/%
|
27
|
+
|
28
|
+
java -Xss1024k -cp %CP% org.mozilla.javascript.tools.shell.Main -opt -1 -e _args=%ARGS% -e load('%BASE%scripts/run.js')
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<link rel="stylesheet" type="text/css" href="../funcunit/qunit/qunit.css" />
|
4
|
+
<title>FuncUnit Test</title>
|
5
|
+
<style>
|
6
|
+
body {
|
7
|
+
margin: 0px; padding: 0px;
|
8
|
+
}
|
9
|
+
</style>
|
10
|
+
</head>
|
11
|
+
<body>
|
12
|
+
|
13
|
+
<h1 id="qunit-header">funcunit Test Suite</h1>
|
14
|
+
<h2 id="qunit-banner"></h2>
|
15
|
+
<div id="qunit-testrunner-toolbar"></div>
|
16
|
+
<h2 id="qunit-userAgent"></h2>
|
17
|
+
<ol id="qunit-tests"></ol>
|
18
|
+
<script type='text/javascript' src='../steal/steal.js?steal[app]=funcunit/test/funcunit'></script>
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -0,0 +1,1509 @@
|
|
1
|
+
//what we need from javascriptmvc or other places
|
2
|
+
steal.plugins('funcunit/qunit',
|
3
|
+
'funcunit/qunit/rhino')
|
4
|
+
.then('resources/jquery','resources/json')
|
5
|
+
.plugins('funcunit/synthetic')
|
6
|
+
//Now describe FuncUnit
|
7
|
+
.then(function(){
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
//this gets the global object, even in rhino
|
12
|
+
var window = (function(){return this }).call(null),
|
13
|
+
|
14
|
+
//if there is an old FuncUnit, use that for settings
|
15
|
+
oldFunc = window.FuncUnit;
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @constructor FuncUnit
|
19
|
+
* @tag core
|
20
|
+
* @test test.html
|
21
|
+
* @download http://github.com/downloads/jupiterjs/funcunit/funcunit-beta-4.zip
|
22
|
+
* FuncUnit provides powerful functional testing as an add on to [http://docs.jquery.com/QUnit QUnit].
|
23
|
+
* The same tests can be run
|
24
|
+
* in the browser, or with Selenium. It also lets you automate basic
|
25
|
+
* QUnit tests in [http://www.envjs.com/ EnvJS] (a command line browser).
|
26
|
+
*
|
27
|
+
* <h2>Example:</h2>
|
28
|
+
* The following tests that an AutoSuggest returns 5 results.
|
29
|
+
* <a href='funcunit/autosuggest/funcunit.html'>See it in action!</a> (Make sure
|
30
|
+
* you turn off your popup blocker!).
|
31
|
+
@codestart
|
32
|
+
module("autosuggest",{
|
33
|
+
setup: function() {
|
34
|
+
S.open('autosuggest.html')
|
35
|
+
}
|
36
|
+
});
|
37
|
+
|
38
|
+
test("JavaScript results",function(){
|
39
|
+
S('input').click().type("JavaScript")
|
40
|
+
|
41
|
+
// wait until we have some results
|
42
|
+
S('.autocomplete_item').visible(function(){
|
43
|
+
equal( S('.autocomplete_item').size(), 5, "there are 5 results")
|
44
|
+
})
|
45
|
+
});
|
46
|
+
@codeend
|
47
|
+
*
|
48
|
+
* <h2>Basic Setup</h2>
|
49
|
+
* <h3>Setup with JavaScriptMVC</h3>
|
50
|
+
* If you're setting up FuncUnit with JavaScriptMVC,
|
51
|
+
* use [steal.static.plugins] to get the funcunit plugin. If you used
|
52
|
+
* JavaScriptMVC's generators, it will setup a testing skeleton for you.
|
53
|
+
* <h3>Setup with Stand-alone funcunit.js</h3>
|
54
|
+
* Lets say you want to test <code>pages/mypage.html</code> and
|
55
|
+
* you've installed funcunit in test/funcunit.</br>
|
56
|
+
* Steps:
|
57
|
+
* <ol>
|
58
|
+
* <li>Create a HTML file (pages/mypage_test.html) that loads
|
59
|
+
* <code><b>qunit.css</b></code>, <code><b>funcunit.js</b></code>,
|
60
|
+
* and <code><b>mypage_test.js</b></code>. We'll create mypage_test.js in step #2.
|
61
|
+
@codestart html
|
62
|
+
<html>
|
63
|
+
<head>
|
64
|
+
<link href='../funcunit/<b>qunit.css</b>'
|
65
|
+
type='text/css'
|
66
|
+
rel='stylesheet' />
|
67
|
+
<script src='../funcunit/<b>funcunit.js</b>'
|
68
|
+
type='text/javascript' ></script>
|
69
|
+
<script src='<b>mypage_test.js</b>'
|
70
|
+
type='text/javascript'></script>
|
71
|
+
<title>MyPage Test Suite</title>
|
72
|
+
</head>
|
73
|
+
<body>
|
74
|
+
<h1 id="qunit-header">MyPage Test Suite</h1>
|
75
|
+
<h2 id="qunit-banner"></h2>
|
76
|
+
<div id="qunit-testrunner-toolbar"></div>
|
77
|
+
<h2 id="qunit-userAgent"></h2>
|
78
|
+
<ol id="qunit-tests"></ol>
|
79
|
+
</body>
|
80
|
+
</html>
|
81
|
+
@codeend
|
82
|
+
* </li>
|
83
|
+
* <li>Create a JS file (<code>pages/mypage_test.js</code>) for your tests. The skeleton should like:
|
84
|
+
@codestart
|
85
|
+
module("APPNAME", {
|
86
|
+
setup: function() {
|
87
|
+
// opens the page you want to test
|
88
|
+
$.open("myPage.html");
|
89
|
+
}
|
90
|
+
})
|
91
|
+
|
92
|
+
test("page has content", function(){
|
93
|
+
ok( S("body *").size(), "There be elements in that there body")
|
94
|
+
})
|
95
|
+
@codeend
|
96
|
+
* </li>
|
97
|
+
* <li>Open your html page (<code>mytest.html</code>) in a browser. Did it pass?
|
98
|
+
* If not check the paths.
|
99
|
+
* <div class='whisper'>P.S. Your page and test files don't have to be in the same folder; however,
|
100
|
+
* on the filesystem, Firefox and Chrome don't let you access parent folders. We wanted the
|
101
|
+
* demo to work without having to host these files.
|
102
|
+
* </div>
|
103
|
+
*
|
104
|
+
* </li>
|
105
|
+
* <li>Now run your test in Selenium. In windows:
|
106
|
+
@codestart text
|
107
|
+
> envjs ../../pages/mypage_test.html
|
108
|
+
@codeend
|
109
|
+
In Linux / Mac:
|
110
|
+
@codestart text
|
111
|
+
> ./envjs ../../pages/mypage_test.html
|
112
|
+
@codeend
|
113
|
+
<div class='whisper'>This will run mytest.html on the filesystem. To run it served, just
|
114
|
+
pass in the url of your test page: <pre>envjs http://localhost/pages/mypage_test.html</pre>.
|
115
|
+
</div>
|
116
|
+
</li>
|
117
|
+
* </ol>
|
118
|
+
* <h2>Writing Tests</h2>
|
119
|
+
* <p>Writing tests is super easy and follows this pattern:</p>
|
120
|
+
<ol>
|
121
|
+
<li>Open a page with [FuncUnit.static.open S.open].
|
122
|
+
@codestart
|
123
|
+
S.open("//myapp/myapp.html")
|
124
|
+
@codeend
|
125
|
+
</li>
|
126
|
+
<li>Do some things
|
127
|
+
@codestart
|
128
|
+
//click something
|
129
|
+
S('#myButton').click()
|
130
|
+
|
131
|
+
//type something
|
132
|
+
S('#myInput').type("hello")
|
133
|
+
@codeend
|
134
|
+
</li>
|
135
|
+
|
136
|
+
<li>Wait for the page to change:
|
137
|
+
@codestart
|
138
|
+
//Wait until it is visible
|
139
|
+
S('#myMenu').visible()
|
140
|
+
|
141
|
+
//wait until something exists
|
142
|
+
S('#myArea').exists()
|
143
|
+
|
144
|
+
//waits a second
|
145
|
+
S.wait(1000);
|
146
|
+
@codeend
|
147
|
+
</li>
|
148
|
+
<li>Check your page in a callback:
|
149
|
+
@codestart
|
150
|
+
S('#myMenu').visible(function(){
|
151
|
+
//check that offset is right
|
152
|
+
equals(S('#myMenu').offset().left,
|
153
|
+
500,
|
154
|
+
"menu is in the right spot");
|
155
|
+
|
156
|
+
})
|
157
|
+
@codeend
|
158
|
+
</li>
|
159
|
+
</ol>
|
160
|
+
<h2>Actions, Waits, and Getters</h2>
|
161
|
+
<p>FuncUnit supports three types of commands: asynchronous actions and waits,
|
162
|
+
and synchronous getters.</p>
|
163
|
+
<p><b>Actions</b> are used to simulate user behavior such as clicking, typing, moving the mouse.</p>
|
164
|
+
<p><b>Waits</b> are used to pause the test script until a condition has been met.</p>
|
165
|
+
<p><b>Getters</b> are used to get information about elements in the page</p>
|
166
|
+
<p>Typically, a test looks like a series of action and wait commands followed by qUnit test of
|
167
|
+
the result of a getter command. Getter commands are almost always in a action or wait callback.</p>
|
168
|
+
<h3>Actions</h3>
|
169
|
+
Actions simulate user behavior. FuncUnit provides the following actions:
|
170
|
+
<ul>
|
171
|
+
<li><code>[FuncUnit.static.open open]</code> - Opens a page.</li>
|
172
|
+
|
173
|
+
<li><code>[FuncUnit.prototype.click click]</code> - clicks an element (mousedown, mouseup, click).</li>
|
174
|
+
<li><code>[FuncUnit.prototype.dblclick dblclick]</code> - two clicks followed by a dblclick.</li>
|
175
|
+
<li><code>[FuncUnit.prototype.rightClick rightClick]</code> - a right mousedown, mouseup, and contextmenu.</li>
|
176
|
+
|
177
|
+
<li><code>[FuncUnit.prototype.type type]</code> - Types characters into an element.</li>
|
178
|
+
|
179
|
+
<li><code>[FuncUnit.prototype.move move]</code> - mousemove, mouseover, and mouseouts from one element to another.</li>
|
180
|
+
<li><code>[FuncUnit.prototype.drag drag]</code> - a drag motion from one element to another.</li>
|
181
|
+
|
182
|
+
<li><code>[FuncUnit.prototype.scroll scroll]</code> - scrolls an element.</li>
|
183
|
+
</ul>
|
184
|
+
|
185
|
+
<p>Actions run asynchronously, meaning they do not complete all their events immediately.
|
186
|
+
However, each action is queued so that you can write actions (and waits) linearly.</p>
|
187
|
+
<p>The following might simulate typing and resizing a "resizable" textarea plugin:</p>
|
188
|
+
@codestart
|
189
|
+
S.open('resizableTextarea.html');
|
190
|
+
|
191
|
+
S('textarea').click().type("Hello World");
|
192
|
+
|
193
|
+
S('.resizer').drag("+20 +20");
|
194
|
+
@codeend
|
195
|
+
<h3>Getters</h3>
|
196
|
+
Getters are used to test the conditions of the page. Most getter commands correspond to a jQuery
|
197
|
+
method of the same name. The following getters are provided:
|
198
|
+
<table style='font-family: monospace'>
|
199
|
+
<tr>
|
200
|
+
<th colspan='2'>Dimensions</th> <th>Attributes</th> <th>Position</th> <th>Selector</th> <th>Style</th>
|
201
|
+
</tr>
|
202
|
+
<tr>
|
203
|
+
<td>[FuncUnit.prototype.width width]</td>
|
204
|
+
<td>[FuncUnit.prototype.height height]</td>
|
205
|
+
<td>[FuncUnit.prototype.attr attr]</td>
|
206
|
+
<td>[FuncUnit.prototype.position position]</td>
|
207
|
+
<td>[FuncUnit.prototype.size size]</td>
|
208
|
+
<td>[FuncUnit.prototype.css css]</td>
|
209
|
+
</tr>
|
210
|
+
<tr>
|
211
|
+
<td>[FuncUnit.prototype.innerWidth innerWidth]</td>
|
212
|
+
<td>[FuncUnit.prototype.innerHeight innerHeight]</td>
|
213
|
+
<td>[FuncUnit.prototype.hasClass hasClass]</td>
|
214
|
+
<td>[FuncUnit.prototype.offset offset]</td>
|
215
|
+
<td>[FuncUnit.prototype.exists exists]</td>
|
216
|
+
<td>[FuncUnit.prototype.visible visible]</td>
|
217
|
+
</tr>
|
218
|
+
<tr>
|
219
|
+
<td>[FuncUnit.prototype.outerWidth outerWidth]</td>
|
220
|
+
<td>[FuncUnit.prototype.outerHeight outerHeight]</td>
|
221
|
+
<td>[FuncUnit.prototype.val val]</td>
|
222
|
+
<td>[FuncUnit.prototype.scrollLeft scrollLeft]</td>
|
223
|
+
<td>[FuncUnit.prototype.missing missing]</td>
|
224
|
+
<td>[FuncUnit.prototype.invisible invisible]</td>
|
225
|
+
</tr>
|
226
|
+
<tr>
|
227
|
+
<td colspan='2'></td>
|
228
|
+
<td>[FuncUnit.prototype.text text]</td>
|
229
|
+
<td>[FuncUnit.prototype.scrollTop scrollTop]</td>
|
230
|
+
</tr>
|
231
|
+
<tr>
|
232
|
+
<td colspan='2'></td>
|
233
|
+
<td>[FuncUnit.prototype.html html]</td>
|
234
|
+
</tr>
|
235
|
+
</table>
|
236
|
+
<p>
|
237
|
+
As getters return synchronously, it's important that they happen after the action or wait command completes.
|
238
|
+
This is why getters are typically found in an action or wait command's callback:
|
239
|
+
</p>
|
240
|
+
The following checks that the textarea is 20 pixels taller after the drag.
|
241
|
+
@codestart
|
242
|
+
//save textarea reference
|
243
|
+
var txtarea = S('textarea'),
|
244
|
+
|
245
|
+
// save references to width and height
|
246
|
+
startingWidth = txtarea.width(),
|
247
|
+
startingHeight = txtarea.height();
|
248
|
+
|
249
|
+
S.open('resizableTextarea.html');
|
250
|
+
|
251
|
+
S('textarea').click().type("Hello World");
|
252
|
+
|
253
|
+
S('.resizer').drag("+20 +20", function(){
|
254
|
+
equals(txtarea.width(),
|
255
|
+
startingWidth,
|
256
|
+
"width stays the same");
|
257
|
+
|
258
|
+
equals(txtarea.height(),
|
259
|
+
startingHeight+20,
|
260
|
+
"height got bigger");
|
261
|
+
});
|
262
|
+
@codeend
|
263
|
+
<h3>Waits</h3>
|
264
|
+
<p>Waits are used to wait for a specific condition to be met before continuing to the next wait or
|
265
|
+
action command. Every getter commands can become a wait command when given a check value or function.
|
266
|
+
For
|
267
|
+
example, the following waits until the width of an element is 200 pixels and tests its offset.
|
268
|
+
</p>
|
269
|
+
@codestart
|
270
|
+
var sm = S("#sliderMenu");
|
271
|
+
sm.width( 200, function(){
|
272
|
+
|
273
|
+
var offset = sm.offset();
|
274
|
+
equals( offset.left, 200)
|
275
|
+
equals( offset.top, 200)
|
276
|
+
})
|
277
|
+
@codeend
|
278
|
+
<p>You can also provide a test function that when true, continues to the next action or wait command.
|
279
|
+
The following is equivalent to the previous example:
|
280
|
+
</p>
|
281
|
+
@codestart
|
282
|
+
var sm = S("#sliderMenu");
|
283
|
+
|
284
|
+
sm.width(
|
285
|
+
function( width ) {
|
286
|
+
return width == 200;
|
287
|
+
},
|
288
|
+
function(){
|
289
|
+
var offset = sm.offset();
|
290
|
+
equals( offset.left, 200)
|
291
|
+
equals( offset.top, 200)
|
292
|
+
}
|
293
|
+
)
|
294
|
+
@codeend
|
295
|
+
<div class='whisper'>Notice that the test function is provided the width of the element to use to check.</div>
|
296
|
+
<p>In addition to all the getter functions, FuncUnit provides:
|
297
|
+
</p>
|
298
|
+
<ul>
|
299
|
+
<li>[FuncUnit.static.wait S.wait] - waits a timeout before continuing.</li>
|
300
|
+
<li>[FuncUnit.prototype.wait S().wait] - waits a timeout before continuing.</li>
|
301
|
+
<li>[FuncUnit S(function(){})] - code runs between actions (like a wait with timeout = 0).</li>
|
302
|
+
</ul>
|
303
|
+
<h2>Automated Testing with Selenium</h2>
|
304
|
+
<p>FuncUnit has a command line mode, which allows you to run your tests as part of a checkin script or nightly build.
|
305
|
+
The Selenium server is used to automate opening browsers, and FuncUnit commands are sent to the test window via Selenium RC.</p>
|
306
|
+
|
307
|
+
<p>The envjs script (written for both Windows and OS X/Linux), is used to load your test page (the
|
308
|
+
same one that runs tests in the browser) in Env.js, a simulated browser running on Rhino. The
|
309
|
+
test page recognizes its running in the Rhino context and issues commands to Selenium accordingly.</p>
|
310
|
+
|
311
|
+
<p>Running these command line tests is simple:</p>
|
312
|
+
@codestart
|
313
|
+
my\path\to\envjs my\path\to\funcunit.html
|
314
|
+
@codeend
|
315
|
+
<p>Configuring settings for the command line mode will be covered next.</p>
|
316
|
+
<h3>Configuration</h3>
|
317
|
+
<p>FuncUnit loads a settings.js file every time it is runs in Selenium mode. This file defines
|
318
|
+
configuration that tells Selenium how to run. You can change which browsers run, their location,
|
319
|
+
the domain to serve from, and the speed of test execution.</p>
|
320
|
+
<p>FuncUnit looks first in the same directory as the funcunit page you're running tests from for
|
321
|
+
settings.js. For example if you're running FuncUnit like this:</p>
|
322
|
+
@codestart
|
323
|
+
funcunit\envjs phui\combobox\funcunit.html
|
324
|
+
@codeend
|
325
|
+
<p>It will look first for phui/combobox/settings.js.</p>
|
326
|
+
<p>Then it looks in its own root directory, where a default settings.js exists.
|
327
|
+
This is to allow you to create different settings for different projects.</p>
|
328
|
+
<h3>Setting Browsers</h3>
|
329
|
+
<p>FuncUnit.browsers is an array that defines which browsers Selenium opens and runs your tests in.
|
330
|
+
This is defined in settings.js. If this null it will default to a standard set of browsers for your OS
|
331
|
+
(FF and IE on Windows, FF on everything else). You populate it with strings like the following:</p>
|
332
|
+
@codestart
|
333
|
+
browsers: ["*firefox", "*iexplore", "*safari", "*googlechrome"]
|
334
|
+
@codeend
|
335
|
+
<p>To define a custom path to a browser, put this in the string following the browser name like this:</p>
|
336
|
+
@codestart
|
337
|
+
browsers: ["*custom /path/to/my/browser"]
|
338
|
+
@codeend
|
339
|
+
<p>See the
|
340
|
+
[http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/DefaultSelenium.html#DefaultSelenium Selenium docs]
|
341
|
+
for more information on customizing browsers and other settings.</p>
|
342
|
+
<h3>Filesystem for Faster Tests</h3>
|
343
|
+
<p>You might want to use envjs to open local funcunit pages, but test pages on your server. This is possible, you
|
344
|
+
just have to change FuncUnit.href or FuncUnit.jmvcRoot. This file can load locally while everything else is
|
345
|
+
using a server because it is a static file and loads static script files.</p>
|
346
|
+
|
347
|
+
<p>Set jmvcRoot to point to the location you want your pages to load from, like this:</p>
|
348
|
+
@codestart
|
349
|
+
jmvcRoot: "localhost:8000"
|
350
|
+
@codeend
|
351
|
+
|
352
|
+
<p>Then make sure your test paths contain // in them to signify something relative to the jmvcRoot.
|
353
|
+
For example, S.open("//funcunit/test/myapp.html") would open a page at
|
354
|
+
http://localhost:8000/funcunit/test/myapp.html.</p>
|
355
|
+
|
356
|
+
<p>To load the command page from filesystem, start your test like you normally do:</p>
|
357
|
+
@codestart
|
358
|
+
funcunit\envjs path\to\funcunit.html
|
359
|
+
@codeend
|
360
|
+
|
361
|
+
<h3>Running Served Pages</h3>
|
362
|
+
<p>Certain browsers, like Safari and Chrome, don't run Selenium tests from filesystem because
|
363
|
+
of security resrictions. To get around this you have to run pages served from a server. The
|
364
|
+
downside of this is the test takes longer to start up, compared to loading from filesystem.</p>
|
365
|
+
<p>To do this, provide an absolute path in your envjs path, like this:</p>
|
366
|
+
@codestart
|
367
|
+
funcunit\envjs http://localhost:8000/path/to/funcunit.html
|
368
|
+
@codeend
|
369
|
+
<p>and set jmvcRoot and your paths as directed in the previous section. This will cause the command page
|
370
|
+
and the test pages to load from your server.</p>
|
371
|
+
|
372
|
+
<h3>Slow Mode</h3>
|
373
|
+
<p>You can slow down the amount of time between tests by setting FuncUnit.speed. By default, FuncUnit commands
|
374
|
+
in Selenium will run as soon as the previous command is complete. If you set FuncUnit.speed to "slow" this
|
375
|
+
becomes 500ms between commands. You may also provide a number of milliseconds.
|
376
|
+
Slow mode is useful while debugging.</p>
|
377
|
+
|
378
|
+
<h2>Limitations</h2>
|
379
|
+
<ul>
|
380
|
+
<li>Selenium doesn't run Chrome/Opera/Safari on the filesystem.</li>
|
381
|
+
</ul>
|
382
|
+
*
|
383
|
+
* @init
|
384
|
+
* selects something in the other page
|
385
|
+
* @param {String|Function|Object} selector FuncUnit behaves differently depending if
|
386
|
+
* the selector is a string, a function, or an object.
|
387
|
+
* <h5>String</h5>
|
388
|
+
* The selector is treated as a css selector.
|
389
|
+
* jQuery/Sizzle is used as the selector so any selector it understands
|
390
|
+
* will work with funcUnit. FuncUnit does not perform the selection until a
|
391
|
+
* command is called upon this selector. This makes aliasing the selectors to
|
392
|
+
* JavaScript variables a great technique.
|
393
|
+
* <h5>Function</h5>
|
394
|
+
* If a function is provided, it will add that function to the action queue to be run
|
395
|
+
* after previous actions and waits.
|
396
|
+
* <h5>Object</h5>
|
397
|
+
* If you want to reference the window or document, pass <code>S.window</code>
|
398
|
+
* or <code>S.window.document</code> to the selector.
|
399
|
+
*
|
400
|
+
* @param {Number} [context] If provided, the context is the frame number in the
|
401
|
+
* document.frames array to use as the context of the selector.
|
402
|
+
*/
|
403
|
+
FuncUnit = function(selector, context){
|
404
|
+
if(typeof selector == "function"){
|
405
|
+
return FuncUnit.wait(0, selector)
|
406
|
+
}
|
407
|
+
|
408
|
+
return new FuncUnit.init(selector, context)
|
409
|
+
}
|
410
|
+
/**
|
411
|
+
* @Static
|
412
|
+
*/
|
413
|
+
window.jQuery.extend(FuncUnit,oldFunc)
|
414
|
+
window.jQuery.extend(FuncUnit,{
|
415
|
+
//move jquery and clear it out
|
416
|
+
jquery : jQuery.noConflict(true),
|
417
|
+
/**
|
418
|
+
* @attribute href
|
419
|
+
* The location of the page running the tests on the server and where relative paths passed in to [FuncUnit.static.open] will be
|
420
|
+
* referenced from.
|
421
|
+
* <p>This is typically where the test page runs on the server. It can be set before calls to [FuncUnit.static.open]:</p>
|
422
|
+
@codestart
|
423
|
+
test("opening something", function(){
|
424
|
+
S.href = "http://localhost/tests/mytest.html"
|
425
|
+
S.open("../myapp")
|
426
|
+
...
|
427
|
+
})
|
428
|
+
@codeend
|
429
|
+
*/
|
430
|
+
// href comes from settings
|
431
|
+
/**
|
432
|
+
* @attribute jmvcRoot
|
433
|
+
* jmvcRoot should be set to url of JMVC's root folder.
|
434
|
+
* <p>This is used to calculate JMVC style paths (paths that begin with //).
|
435
|
+
* This is the prefered method of referencing pages if
|
436
|
+
* you want to test on the filesystem and test on the server.</p>
|
437
|
+
* <p>This is usually set in the global config file in <code>funcunit/settings.js</code> like:</p>
|
438
|
+
@codestart
|
439
|
+
FuncUnit = {jmvcRoot: "http://localhost/script/" }
|
440
|
+
@codeend
|
441
|
+
*/
|
442
|
+
// jmvcRoot comes from settings
|
443
|
+
|
444
|
+
/**
|
445
|
+
* Opens a page. It will error if the page can't be opened before timeout.
|
446
|
+
* <h3>Example</h3>
|
447
|
+
@codestart
|
448
|
+
//a full url
|
449
|
+
S.open("http://localhost/app/app.html")
|
450
|
+
|
451
|
+
//from jmvc root (FuncUnit.jmvcRoot must be set)
|
452
|
+
S.open("//app/app.html")
|
453
|
+
@codeend
|
454
|
+
|
455
|
+
* <h3>Paths in Selenium</h3>
|
456
|
+
* Selenium runs the testing page from the filesystem and by default will look for pages on the filesystem unless provided a full
|
457
|
+
* url or information that can translate a partial path into a full url. FuncUnit uses [FuncUnit.static.jmvcRoot]
|
458
|
+
* and [FuncUnit.static.href] to
|
459
|
+
* translate partial paths.
|
460
|
+
<table>
|
461
|
+
<tr>
|
462
|
+
<th>path</th>
|
463
|
+
<th>jmvcRoot</th>
|
464
|
+
<th>href</th>
|
465
|
+
<th>resulting url</th>
|
466
|
+
</tr>
|
467
|
+
<tr>
|
468
|
+
<td>//myapp/mypage.html</td>
|
469
|
+
<td>null</td>
|
470
|
+
<td>null</td>
|
471
|
+
<td>file:///C:/development/cookbook/public/myapp/mypage.html</td>
|
472
|
+
</tr>
|
473
|
+
<tr>
|
474
|
+
<td>//myapp/mypage.html</td>
|
475
|
+
<td>http://localhost/</td>
|
476
|
+
<td></td>
|
477
|
+
<td>http://localhost/myapp/mypage.html</td>
|
478
|
+
</tr>
|
479
|
+
<tr>
|
480
|
+
<td>http://foo.com</td>
|
481
|
+
<td></td>
|
482
|
+
<td></td>
|
483
|
+
<td>http://foo.com</td>
|
484
|
+
</tr>
|
485
|
+
<tr>
|
486
|
+
<td>../mypage.html</td>
|
487
|
+
<td></td>
|
488
|
+
<td>http://localhost/myapp/funcunit.html</td>
|
489
|
+
<td>http://localhost/mypage.html</td>
|
490
|
+
</tr>
|
491
|
+
</table>
|
492
|
+
*
|
493
|
+
* @param {String} path a full or partial url to open. If a partial is given,
|
494
|
+
* @param {Function} callback
|
495
|
+
* @param {Number} timeout
|
496
|
+
*/
|
497
|
+
open: function( path, callback, timeout ) {
|
498
|
+
var fullPath = FuncUnit.getAbsolutePath(path),
|
499
|
+
temp;
|
500
|
+
if(typeof callback != 'function'){
|
501
|
+
timeout = callback;
|
502
|
+
callback = undefined;
|
503
|
+
}
|
504
|
+
FuncUnit.add(function(success, error){ //function that actually does stuff, if this doesn't call success by timeout, error will be called, or can call error itself
|
505
|
+
steal.dev.log("Opening "+path)
|
506
|
+
FuncUnit._open(fullPath, error);
|
507
|
+
FuncUnit._onload(function(){
|
508
|
+
FuncUnit._opened();
|
509
|
+
success()
|
510
|
+
}, error);
|
511
|
+
}, callback, "Page " + path + " not loaded in time!", timeout || 30000);
|
512
|
+
},
|
513
|
+
/**
|
514
|
+
* @hide
|
515
|
+
* Gets a path, will use steal if present
|
516
|
+
* @param {String} path
|
517
|
+
*/
|
518
|
+
getAbsolutePath: function( path ) {
|
519
|
+
if(typeof(steal) == "undefined"){
|
520
|
+
return path;
|
521
|
+
}
|
522
|
+
var fullPath,
|
523
|
+
root = FuncUnit.jmvcRoot || steal.root.path;
|
524
|
+
|
525
|
+
if (/^\/\//.test(path)) {
|
526
|
+
fullPath = new steal.File(path.substr(2)).joinFrom(root);
|
527
|
+
}
|
528
|
+
else {
|
529
|
+
fullPath = path;
|
530
|
+
}
|
531
|
+
|
532
|
+
if(/^http/.test(path))
|
533
|
+
fullPath = path;
|
534
|
+
return fullPath;
|
535
|
+
},
|
536
|
+
/**
|
537
|
+
* @attribute browsers
|
538
|
+
* Used to configure the browsers selenium uses to run FuncUnit tests.
|
539
|
+
* If you need to learn how to configure selenium, and we haven't filled in this page,
|
540
|
+
* post a note on the forum and we will fill this out right away.
|
541
|
+
*/
|
542
|
+
// for feature detection
|
543
|
+
support : {},
|
544
|
+
/**
|
545
|
+
* @attribute window
|
546
|
+
* Use this to refer to the window of the application page. You can also
|
547
|
+
* reference window.document.
|
548
|
+
* @codestart
|
549
|
+
* S(S.window).innerWidth(function(w){
|
550
|
+
* ok(w > 1000, "window is more than 1000 px wide")
|
551
|
+
* })
|
552
|
+
* @codeend
|
553
|
+
*/
|
554
|
+
window : {
|
555
|
+
document: {}
|
556
|
+
},
|
557
|
+
_opened: function() {}
|
558
|
+
});
|
559
|
+
|
560
|
+
|
561
|
+
(function(){
|
562
|
+
//the queue of commands waiting to be run
|
563
|
+
var queue = [],
|
564
|
+
//are we in a callback function (something we pass to a FuncUnit plugin)
|
565
|
+
incallback = false,
|
566
|
+
//where we should add things in a callback
|
567
|
+
currentPosition = 0;
|
568
|
+
|
569
|
+
|
570
|
+
FuncUnit.
|
571
|
+
/**
|
572
|
+
* @hide
|
573
|
+
* Adds a function to be called in the queue.
|
574
|
+
* @param {Function} f The function to be called. It will be provided a success and error function.
|
575
|
+
* @param {Function} callback a callback to be called after the function is done
|
576
|
+
* @param {Object} error an error statement if the command fails
|
577
|
+
* @param {Object} timeout the length of time until success should be called.
|
578
|
+
*/
|
579
|
+
add = function(f, callback, error, timeout, stopper){
|
580
|
+
|
581
|
+
//if we are in a callback, add to the current position
|
582
|
+
if (incallback) {
|
583
|
+
queue.splice(currentPosition,0,{
|
584
|
+
method: f,
|
585
|
+
callback: callback,
|
586
|
+
error: error,
|
587
|
+
timeout: timeout,
|
588
|
+
stop : stopper
|
589
|
+
})
|
590
|
+
currentPosition++;
|
591
|
+
}
|
592
|
+
else {
|
593
|
+
//add to the end
|
594
|
+
queue.push({
|
595
|
+
method: f,
|
596
|
+
callback: callback,
|
597
|
+
error: error,
|
598
|
+
timeout: timeout
|
599
|
+
});
|
600
|
+
}
|
601
|
+
//if our queue has just started, stop qunit
|
602
|
+
//call done to call the next command
|
603
|
+
if (queue.length == 1 && ! incallback) {
|
604
|
+
stop();
|
605
|
+
setTimeout(FuncUnit._done, 13)
|
606
|
+
}
|
607
|
+
}
|
608
|
+
//this is called after every command
|
609
|
+
// it gets the next function from the queue
|
610
|
+
FuncUnit._done = function(){
|
611
|
+
var next,
|
612
|
+
timer,
|
613
|
+
speed = 0;
|
614
|
+
|
615
|
+
if(FuncUnit.speed == "slow"){
|
616
|
+
speed = 500;
|
617
|
+
}
|
618
|
+
else if (FuncUnit.speed){
|
619
|
+
speed = FuncUnit.speed;
|
620
|
+
}
|
621
|
+
if (queue.length > 0) {
|
622
|
+
next = queue.shift();
|
623
|
+
currentPosition = 0;
|
624
|
+
// set a timer that will error
|
625
|
+
|
626
|
+
|
627
|
+
//call next method
|
628
|
+
setTimeout(function(){
|
629
|
+
timer = setTimeout(function(){
|
630
|
+
next.stop && next.stop();
|
631
|
+
ok(false, next.error);
|
632
|
+
FuncUnit._done();
|
633
|
+
},
|
634
|
+
(next.timeout || 10000) + speed)
|
635
|
+
|
636
|
+
next.method( //success
|
637
|
+
function(){
|
638
|
+
//make sure we don't create an error
|
639
|
+
clearTimeout(timer);
|
640
|
+
|
641
|
+
//mark in callback so the next set of add get added to the front
|
642
|
+
|
643
|
+
incallback = true;
|
644
|
+
if (next.callback)
|
645
|
+
next.callback.apply(null, arguments);
|
646
|
+
incallback = false;
|
647
|
+
|
648
|
+
|
649
|
+
FuncUnit._done();
|
650
|
+
}, //error
|
651
|
+
function(message){
|
652
|
+
clearTimeout(timer);
|
653
|
+
ok(false, message);
|
654
|
+
FuncUnit._done();
|
655
|
+
})
|
656
|
+
|
657
|
+
|
658
|
+
}, speed);
|
659
|
+
|
660
|
+
}
|
661
|
+
else {
|
662
|
+
start();
|
663
|
+
}
|
664
|
+
}
|
665
|
+
FuncUnit.
|
666
|
+
/**
|
667
|
+
* Waits a timeout before running the next command. Wait is an action and gets
|
668
|
+
* added to the queue.
|
669
|
+
* @codestart
|
670
|
+
* S.wait(100, function(){
|
671
|
+
* equals( S('#foo').innerWidth(), 100, "innerWidth is 100");
|
672
|
+
* })
|
673
|
+
* @codeend
|
674
|
+
* @param {Number} [time] The timeout in milliseconds. Defaults to 5000.
|
675
|
+
* @param {Function} [callback] A callback that will run
|
676
|
+
* after the wait has completed,
|
677
|
+
* but before any more queued actions.
|
678
|
+
*/
|
679
|
+
wait = function(time, callback){
|
680
|
+
if(typeof time == 'function'){
|
681
|
+
callback = time;
|
682
|
+
time = undefined;
|
683
|
+
}
|
684
|
+
time = time != null ? time : 5000
|
685
|
+
FuncUnit.add(function(success, error){
|
686
|
+
steal.dev.log("Waiting "+time)
|
687
|
+
setTimeout(success, time)
|
688
|
+
}, callback, "Couldn't wait!", time + 1000);
|
689
|
+
return this;
|
690
|
+
}
|
691
|
+
/**
|
692
|
+
* @hide
|
693
|
+
* @function repeat
|
694
|
+
* Takes a function that will be called over and over until it is successful.
|
695
|
+
*/
|
696
|
+
FuncUnit.repeat = function(checker, callback, error, timeout){
|
697
|
+
var interval,
|
698
|
+
stopped = false ,
|
699
|
+
stop = function(){
|
700
|
+
clearTimeout(interval)
|
701
|
+
stopped = true;
|
702
|
+
};
|
703
|
+
|
704
|
+
FuncUnit.add(function(success, error){
|
705
|
+
interval = setTimeout(function(){
|
706
|
+
|
707
|
+
var result = null;
|
708
|
+
try {
|
709
|
+
result = checker()
|
710
|
+
}
|
711
|
+
catch (e) {
|
712
|
+
//should we throw this too error?
|
713
|
+
}
|
714
|
+
|
715
|
+
if (result) {
|
716
|
+
success();
|
717
|
+
}else if(!stopped){
|
718
|
+
interval = setTimeout(arguments.callee, 10)
|
719
|
+
}
|
720
|
+
|
721
|
+
}, 10);
|
722
|
+
|
723
|
+
|
724
|
+
}, callback, error, timeout, stop)
|
725
|
+
}
|
726
|
+
|
727
|
+
|
728
|
+
|
729
|
+
FuncUnit.makeArray = function(arr){
|
730
|
+
var narr = [];
|
731
|
+
for (var i = 0; i < arr.length; i++) {
|
732
|
+
narr[i] = arr[i]
|
733
|
+
}
|
734
|
+
return narr;
|
735
|
+
}
|
736
|
+
FuncUnit.
|
737
|
+
/**
|
738
|
+
* @hide
|
739
|
+
* Converts a string into a Native JS type.
|
740
|
+
* @param {Object} str
|
741
|
+
*/
|
742
|
+
convert = function(str){
|
743
|
+
//if it is an object and not null, eval it
|
744
|
+
if (str !== null && typeof str == "object") {
|
745
|
+
return object;
|
746
|
+
}
|
747
|
+
str = String(str);
|
748
|
+
switch (str) {
|
749
|
+
case "false":
|
750
|
+
return false;
|
751
|
+
case "null":
|
752
|
+
return null;
|
753
|
+
case "true":
|
754
|
+
return true;
|
755
|
+
case "undefined":
|
756
|
+
return undefined;
|
757
|
+
default:
|
758
|
+
if (/^\d+\.\d+$/.test(str) || /^\d+$/.test(str)) {
|
759
|
+
return 1 * str;
|
760
|
+
}
|
761
|
+
|
762
|
+
return str;
|
763
|
+
}
|
764
|
+
}
|
765
|
+
|
766
|
+
})();
|
767
|
+
|
768
|
+
|
769
|
+
/**
|
770
|
+
* @prototype
|
771
|
+
*/
|
772
|
+
FuncUnit.init = function(s, c){
|
773
|
+
this.selector = s;
|
774
|
+
this.context = c == null ? FuncUnit.window.document : c;
|
775
|
+
}
|
776
|
+
FuncUnit.init.prototype = {
|
777
|
+
/**
|
778
|
+
* Types text into an element. This makes use of [Syn.prototype.type] and works in
|
779
|
+
* a very similar way.
|
780
|
+
* <h3>Quick Examples</h3>
|
781
|
+
* @codestart
|
782
|
+
* //types hello world
|
783
|
+
* S('#bar').type('hello world')
|
784
|
+
*
|
785
|
+
* //submits a form by typing \r
|
786
|
+
* S("input[name=age]").type("27\r")
|
787
|
+
*
|
788
|
+
* //types FuncUnit, then deletes the Unit
|
789
|
+
* S('#foo').type("FuncUnit\b\b\b\b")
|
790
|
+
*
|
791
|
+
* //types JavaScriptMVC, then removes the MVC
|
792
|
+
* S('#zar').type("JavaScriptMVC[left][left][left]"+
|
793
|
+
* "[delete][delete][delete]")
|
794
|
+
*
|
795
|
+
* //types JavaScriptMVC, then selects the MVC and
|
796
|
+
* //deletes it
|
797
|
+
* S('#zar').type("JavaScriptMVC[shift]"+
|
798
|
+
* "[left][left][left]"+
|
799
|
+
* "[shift-up][delete]")
|
800
|
+
* @codeend
|
801
|
+
* <h2>Characters</h2>
|
802
|
+
* You can type the characters found in [Syn.static.keycodes].
|
803
|
+
*
|
804
|
+
* @param {String} text the text you want to type
|
805
|
+
* @param {Function} [callback] a callback that is run after typing, but before the next action.
|
806
|
+
* @return {FuncUnit} returns the funcUnit for chaining.
|
807
|
+
*/
|
808
|
+
type: function( text, callback ) {
|
809
|
+
var selector = this.selector,
|
810
|
+
context = this.context;
|
811
|
+
FuncUnit.add(function(success, error){
|
812
|
+
steal.dev.log("Typing "+text+" on "+selector)
|
813
|
+
FuncUnit.$(selector, context, "triggerSyn", "_type", text, success)
|
814
|
+
}, callback, "Could not type " + text + " into " + this.selector);
|
815
|
+
return this;
|
816
|
+
},
|
817
|
+
/**
|
818
|
+
* Waits until an element exists before running the next action.
|
819
|
+
* @codestart
|
820
|
+
* //waits until #foo exists before clicking it.
|
821
|
+
* S("#foo").exists().click()
|
822
|
+
* @codeend
|
823
|
+
* @param {Function} [callback] a callback that is run after the selector exists, but before the next action.
|
824
|
+
* @return {FuncUnit} returns the funcUnit for chaining.
|
825
|
+
*/
|
826
|
+
exists: function( callback ) {
|
827
|
+
if(true){
|
828
|
+
return this.size(function(size){
|
829
|
+
return size > 0;
|
830
|
+
}, callback)
|
831
|
+
}
|
832
|
+
return this.size() == 0;
|
833
|
+
},
|
834
|
+
/**
|
835
|
+
* Waits until no elements are matched by the selector. Missing is equivalent to calling
|
836
|
+
* <code>.size(0, callback);</code>
|
837
|
+
* @codestart
|
838
|
+
* //waits until #foo leaves before continuing to the next action.
|
839
|
+
* S("#foo").missing()
|
840
|
+
* @codeend
|
841
|
+
* @param {Function} [callback] a callback that is run after the selector exists, but before the next action
|
842
|
+
* @return {FuncUnit} returns the funcUnit for chaining.
|
843
|
+
*/
|
844
|
+
missing: function( callback ) {
|
845
|
+
return this.size(0, callback)
|
846
|
+
},
|
847
|
+
/**
|
848
|
+
* Waits until the funcUnit selector is visible.
|
849
|
+
* @codestart
|
850
|
+
* //waits until #foo is visible.
|
851
|
+
* S("#foo").visible()
|
852
|
+
* @codeend
|
853
|
+
* @param {Function} [callback] a callback that runs after the funcUnit is visible, but before the next action.
|
854
|
+
* @return [funcUnit] returns the funcUnit for chaining.
|
855
|
+
*/
|
856
|
+
visible: function( callback ) {
|
857
|
+
var self = this,
|
858
|
+
sel = this.selector,
|
859
|
+
ret;
|
860
|
+
this.selector += ":visible"
|
861
|
+
if(true){
|
862
|
+
return this.size(function(size){
|
863
|
+
return size > 0;
|
864
|
+
}, function(){
|
865
|
+
self.selector = sel;
|
866
|
+
callback && callback();
|
867
|
+
})
|
868
|
+
}else{
|
869
|
+
ret = this.size() > 0;
|
870
|
+
this.selector = sel;
|
871
|
+
return ret;
|
872
|
+
}
|
873
|
+
|
874
|
+
},
|
875
|
+
/**
|
876
|
+
* Waits until the selector is invisible.
|
877
|
+
* @codestart
|
878
|
+
* //waits until #foo is invisible.
|
879
|
+
* S("#foo").invisible()
|
880
|
+
* @codeend
|
881
|
+
* @param {Function} [callback] a callback that runs after the selector is invisible, but before the next action.
|
882
|
+
* @return [funcUnit] returns the funcUnit selector for chaining.
|
883
|
+
*/
|
884
|
+
invisible: function( callback ) {
|
885
|
+
var self = this,
|
886
|
+
sel = this.selector,
|
887
|
+
ret;
|
888
|
+
if(true){
|
889
|
+
this.selector += ":visible"
|
890
|
+
return this.size(0, function(){
|
891
|
+
self.selector = sel;
|
892
|
+
callback && callback();
|
893
|
+
})
|
894
|
+
}else{
|
895
|
+
ret = this.size() == 0;
|
896
|
+
this.selector = sel;
|
897
|
+
return ret;
|
898
|
+
}
|
899
|
+
|
900
|
+
},
|
901
|
+
/**
|
902
|
+
* Drags an element into another element or coordinates.
|
903
|
+
* This takes the same paramameters as [Syn.prototype.move move].
|
904
|
+
* @param {String|Object} options A selector or coordinates describing the motion of the drag.
|
905
|
+
* <h5>Options as a Selector</h5>
|
906
|
+
* Passing a string selector to drag the mouse. The drag runs to the center of the element
|
907
|
+
* matched by the selector. The following drags from the center of #foo to the center of #bar.
|
908
|
+
* @codestart
|
909
|
+
* S('#foo').drag('#bar')
|
910
|
+
* @codeend
|
911
|
+
* <h5>Options as Coordinates</h5>
|
912
|
+
* You can pass in coordinates as clientX and clientY:
|
913
|
+
* @codestart
|
914
|
+
* S('#foo').drag('100x200')
|
915
|
+
* @codeend
|
916
|
+
* Or as pageX and pageY
|
917
|
+
* @codestart
|
918
|
+
* S('#foo').drag('100X200')
|
919
|
+
* @codeend
|
920
|
+
* Or relative to the start position
|
921
|
+
* S('#foo').drag('+10 +20')
|
922
|
+
* <h5>Options as an Object</h5>
|
923
|
+
* You can configure the duration, start, and end point of a drag by passing in a json object.
|
924
|
+
* @codestart
|
925
|
+
* //drags from 0x0 to 100x100 in 2 seconds
|
926
|
+
* S('#foo').drag({
|
927
|
+
* from: "0x0",
|
928
|
+
* to: "100x100",
|
929
|
+
* duration: 2000
|
930
|
+
* })
|
931
|
+
* @codeend
|
932
|
+
* @param {Function} [callback] a callback that runs after the drag, but before the next action.
|
933
|
+
* @return {funcUnit} returns the funcunit selector for chaining.
|
934
|
+
*/
|
935
|
+
drag: function( options, callback ) {
|
936
|
+
if(typeof options == 'string'){
|
937
|
+
options = {to: options}
|
938
|
+
}
|
939
|
+
options.from = this.selector;
|
940
|
+
|
941
|
+
var selector = this.selector,
|
942
|
+
context = this.context;
|
943
|
+
FuncUnit.add(function(success, error){
|
944
|
+
steal.dev.log("dragging "+selector)
|
945
|
+
FuncUnit.$(selector, context, "triggerSyn", "_drag", options, success)
|
946
|
+
}, callback, "Could not drag " + this.selector)
|
947
|
+
return this;
|
948
|
+
},
|
949
|
+
/**
|
950
|
+
* Moves an element into another element or coordinates. This will trigger mouseover
|
951
|
+
* mouseouts accordingly.
|
952
|
+
* This takes the same paramameters as [Syn.prototype.move move].
|
953
|
+
* @param {String|Object} options A selector or coordinates describing the motion of the move.
|
954
|
+
* <h5>Options as a Selector</h5>
|
955
|
+
* Passing a string selector to move the mouse. The move runs to the center of the element
|
956
|
+
* matched by the selector. The following moves from the center of #foo to the center of #bar.
|
957
|
+
* @codestart
|
958
|
+
* S('#foo').move('#bar')
|
959
|
+
* @codeend
|
960
|
+
* <h5>Options as Coordinates</h5>
|
961
|
+
* You can pass in coordinates as clientX and clientY:
|
962
|
+
* @codestart
|
963
|
+
* S('#foo').move('100x200')
|
964
|
+
* @codeend
|
965
|
+
* Or as pageX and pageY
|
966
|
+
* @codestart
|
967
|
+
* S('#foo').move('100X200')
|
968
|
+
* @codeend
|
969
|
+
* Or relative to the start position
|
970
|
+
* S('#foo').move('+10 +20')
|
971
|
+
* <h5>Options as an Object</h5>
|
972
|
+
* You can configure the duration, start, and end point of a move by passing in a json object.
|
973
|
+
* @codestart
|
974
|
+
* //drags from 0x0 to 100x100 in 2 seconds
|
975
|
+
* S('#foo').move({
|
976
|
+
* from: "0x0",
|
977
|
+
* to: "100x100",
|
978
|
+
* duration: 2000
|
979
|
+
* })
|
980
|
+
* @codeend
|
981
|
+
* @param {Function} [callback] a callback that runs after the drag, but before the next action.
|
982
|
+
* @return {funcUnit} returns the funcunit selector for chaining.
|
983
|
+
*/
|
984
|
+
move: function( options, callback ) {
|
985
|
+
if(typeof options == 'string'){
|
986
|
+
options = {to: options}
|
987
|
+
}
|
988
|
+
options.from = this.selector;
|
989
|
+
|
990
|
+
var selector = this.selector,
|
991
|
+
context = this.context;
|
992
|
+
FuncUnit.add(function(success, error){
|
993
|
+
steal.dev.log("moving "+selector)
|
994
|
+
FuncUnit.$(selector, context, "triggerSyn", "_move", options, success)
|
995
|
+
}, callback, "Could not move " + this.selector)
|
996
|
+
return this;
|
997
|
+
},
|
998
|
+
/**
|
999
|
+
* Scrolls an element in a particular direction by setting the scrollTop or srollLeft.
|
1000
|
+
* @param {String} direction "left" or "top"
|
1001
|
+
* @param {Number} amount number of pixels to scroll
|
1002
|
+
* @param {Function} callback
|
1003
|
+
*/
|
1004
|
+
scroll: function( direction, amount, callback ) {
|
1005
|
+
var selector = this.selector,
|
1006
|
+
context = this.context,
|
1007
|
+
direction = /left|right|x/i.test(direction)? "Left" : "Right";
|
1008
|
+
FuncUnit.add(function(success, error){
|
1009
|
+
steal.dev.log("setting "+selector+ " scroll"+direction+" "+amount+" pixels")
|
1010
|
+
FuncUnit.$(selector, context, "scroll"+direction, amount)
|
1011
|
+
success();
|
1012
|
+
}, callback, "Could not scroll " + this.selector)
|
1013
|
+
return this;
|
1014
|
+
},
|
1015
|
+
/**
|
1016
|
+
* Waits a timeout before calling the next action. This is the same as
|
1017
|
+
* [FuncUnit.prototype.wait].
|
1018
|
+
* @param {Number} [timeout]
|
1019
|
+
* @param {Object} callback
|
1020
|
+
*/
|
1021
|
+
wait: function( timeout, callback ) {
|
1022
|
+
FuncUnit.wait(timeout, callback)
|
1023
|
+
}
|
1024
|
+
};
|
1025
|
+
var clicks = [
|
1026
|
+
/**
|
1027
|
+
* @function click
|
1028
|
+
* Clicks an element. This uses [Syn.prototype.click] to issue a:
|
1029
|
+
* <ul>
|
1030
|
+
* <li><code>mousedown</code></li>
|
1031
|
+
* <li><code>focus</code> - if the element is focusable</li>
|
1032
|
+
* <li><code>mouseup</code></li>
|
1033
|
+
* <li><code>click</code></li>
|
1034
|
+
* </ul>
|
1035
|
+
* If no clientX/Y or pageX/Y is provided as options, the click happens at the
|
1036
|
+
* center of the element.
|
1037
|
+
* <p>For a right click or double click use [FuncUnit.prototype.rightClick] or
|
1038
|
+
* [FuncUnit.prototype.dblclick].</p>
|
1039
|
+
* <h3>Example</h3>
|
1040
|
+
* @codestart
|
1041
|
+
* //clicks the bar element
|
1042
|
+
* S("#bar").click()
|
1043
|
+
* @codeend
|
1044
|
+
* @param {Object} [options] options to pass to the click event. Typically, this is clientX/Y or pageX/Y like:
|
1045
|
+
* @codestart
|
1046
|
+
* $('#foo').click({pageX: 200, pageY: 100});
|
1047
|
+
* @codeend
|
1048
|
+
* You can pass it any of the serializable parameters you'd send to :
|
1049
|
+
* [http://developer.mozilla.org/en/DOM/event.initMouseEvent initMouseEvent], but command keys are
|
1050
|
+
* controlled by [FuncUnit.prototype.type].
|
1051
|
+
* @param {Function} [callback] a callback that runs after the click, but before the next action.
|
1052
|
+
* @return {funcUnit} returns the funcunit selector for chaining.
|
1053
|
+
*/
|
1054
|
+
'click',
|
1055
|
+
/**
|
1056
|
+
* @function dblclick
|
1057
|
+
* Double clicks an element by [FuncUnit.prototype.click clicking] it twice and triggering a dblclick event.
|
1058
|
+
* @param {Object} options options to add to the mouse events. This works
|
1059
|
+
* the same as [FuncUnit.prototype.click]'s options.
|
1060
|
+
* @param {Function} [callback] a callback that runs after the double click, but before the next action.
|
1061
|
+
* @return {funcUnit} returns the funcunit selector for chaining.
|
1062
|
+
*/
|
1063
|
+
'dblclick',
|
1064
|
+
/**
|
1065
|
+
* @function rightClick
|
1066
|
+
* Right clicks an element. This typically results in a contextmenu event for browsers that
|
1067
|
+
* support it.
|
1068
|
+
* @param {Object} options options to add to the mouse events. This works
|
1069
|
+
* the same as [FuncUnit.prototype.click]'s options.
|
1070
|
+
* @param {Function} [callback] a callback that runs after the click, but before the next action.
|
1071
|
+
* @return {funcUnit} returns the funcunit selector for chaining.
|
1072
|
+
*/
|
1073
|
+
'rightClick'],
|
1074
|
+
makeClick = function(name){
|
1075
|
+
FuncUnit.init.prototype[name] = function(options, callback){
|
1076
|
+
if(typeof options == 'function'){
|
1077
|
+
callback = options;
|
1078
|
+
options = {};
|
1079
|
+
}
|
1080
|
+
var selector = this.selector,
|
1081
|
+
context = this.context;
|
1082
|
+
FuncUnit.add(function(success, error){
|
1083
|
+
options = options || {}
|
1084
|
+
steal.dev.log("Clicking "+selector)
|
1085
|
+
FuncUnit.$(selector, context, "triggerSyn", "_"+name, options, success)
|
1086
|
+
}, callback, "Could not "+name+" " + this.selector)
|
1087
|
+
return this;
|
1088
|
+
}
|
1089
|
+
}
|
1090
|
+
|
1091
|
+
for(var i=0; i < clicks.length; i++){
|
1092
|
+
makeClick(clicks[i])
|
1093
|
+
}
|
1094
|
+
|
1095
|
+
|
1096
|
+
//list of jQuery functions we want, number is argument index
|
1097
|
+
//for wait instead of getting value
|
1098
|
+
FuncUnit.funcs = {
|
1099
|
+
/**
|
1100
|
+
* @function size
|
1101
|
+
* Gets the number of elements matched by the selector or
|
1102
|
+
* waits until the the selector is size. You can also
|
1103
|
+
* provide a function that continues to the next action when
|
1104
|
+
* it returns true.
|
1105
|
+
* @codestart
|
1106
|
+
* S(".recipe").size() //gets the number of recipes
|
1107
|
+
*
|
1108
|
+
* S(".recipe").size(2) //waits until there are 2 recipes
|
1109
|
+
*
|
1110
|
+
* //waits until size is count
|
1111
|
+
* S(".recipe").size(function(size){
|
1112
|
+
* return size == count;
|
1113
|
+
* })
|
1114
|
+
* @codeend
|
1115
|
+
* @param {Number|Function} [size] number or a checking function.
|
1116
|
+
* @param {Function} a callback that will run after this action completes.
|
1117
|
+
* @return {Number} if the size parameter is not provided, size returns the number
|
1118
|
+
* of elements matched.
|
1119
|
+
*/
|
1120
|
+
'size' : 0,
|
1121
|
+
/**
|
1122
|
+
* @attr data
|
1123
|
+
* Gets data from jQuery.data or waits until data
|
1124
|
+
* equals some value.
|
1125
|
+
* @codestart
|
1126
|
+
* S("#something").data("abc") //gets the abc data
|
1127
|
+
*
|
1128
|
+
* S("#something").data("abc","some") //waits until the data == some
|
1129
|
+
* @codeend
|
1130
|
+
* @param {String} data The data to get, or wait for.
|
1131
|
+
* @param {Object|Function} [value] If provided uses this as a check before continuing to the next action.
|
1132
|
+
* @param {Function} a callback that will run after this action completes.
|
1133
|
+
* @return {Object} if the size parameter is not provided, returns
|
1134
|
+
* the object.
|
1135
|
+
*/
|
1136
|
+
'data': 1,
|
1137
|
+
/**
|
1138
|
+
* @function attr
|
1139
|
+
* Gets the value of an attribute from an element or waits until the attribute
|
1140
|
+
* equals the attr param.
|
1141
|
+
* @codestart
|
1142
|
+
* //gets the abc attribute
|
1143
|
+
* S("#something").attr("abc")
|
1144
|
+
*
|
1145
|
+
* //waits until the abc attribute == some
|
1146
|
+
* S("#something").attr("abc","some")
|
1147
|
+
* @codeend
|
1148
|
+
* @param {String} data The attribute to get, or wait for.
|
1149
|
+
* @param {String|Function} [value] If provided uses this as a check before continuing to the next action.
|
1150
|
+
* @param {Function} a callback that will run after this action completes.
|
1151
|
+
* @return {Object} if the attr parameter is not provided, returns
|
1152
|
+
* the attribute.
|
1153
|
+
*/
|
1154
|
+
'attr' : 1,
|
1155
|
+
/**
|
1156
|
+
* @function hasClass
|
1157
|
+
* @codestart
|
1158
|
+
* //returns if the element has the class in its className
|
1159
|
+
* S("#something").hasClass("selected");
|
1160
|
+
*
|
1161
|
+
* //waits until #something has selected in its className
|
1162
|
+
* S("#something").hasClass("selected",true);
|
1163
|
+
*
|
1164
|
+
* //waits until #something does not have selected in its className
|
1165
|
+
* S("#something").hasClass("selected",false);
|
1166
|
+
* @codeend
|
1167
|
+
* @param {String} className The part of the className to search for.
|
1168
|
+
* @param {Boolean|Function} [value] If provided uses this as a check before continuing to the next action.
|
1169
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1170
|
+
* @return {Boolean|funcUnit} if the value parameter is not provided, returns
|
1171
|
+
* if the className is found in the element's className. If a value paramters is provided, returns funcUnit for chaining.
|
1172
|
+
*/
|
1173
|
+
'hasClass' : 1, //makes wait
|
1174
|
+
/**
|
1175
|
+
* @function html
|
1176
|
+
* Gets the [http://api.jquery.com/html/ html] from an element or waits until the html is a certain value.
|
1177
|
+
* @codestart
|
1178
|
+
* //checks foo's html has "JupiterJS"
|
1179
|
+
* ok( /JupiterJS/.test( S('#foo').html() ) )
|
1180
|
+
*
|
1181
|
+
* //waits until bar's html has JupiterJS
|
1182
|
+
* S('#foo').html(/JupiterJS/)
|
1183
|
+
*
|
1184
|
+
* //waits until bar's html is JupiterJS
|
1185
|
+
* S('#foo').html("JupiterJS")
|
1186
|
+
* @codeend
|
1187
|
+
*
|
1188
|
+
* @param {String|Function} [html] If provided uses this as a check before continuing to the next action.
|
1189
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1190
|
+
* @return {String|funcUnit} if the html parameter is provided,
|
1191
|
+
* returns the funcUnit selector for chaining, otherwise returns the html of the selector.
|
1192
|
+
*/
|
1193
|
+
'html' : 0,
|
1194
|
+
/**
|
1195
|
+
* @function text
|
1196
|
+
* Gets the [http://api.jquery.com/text/ text] from an element or waits until the text is a certain value.
|
1197
|
+
* @codestart
|
1198
|
+
* //checks foo's text has "JupiterJS"
|
1199
|
+
* ok( /JupiterJS/.test( S('#foo').text() ) )
|
1200
|
+
*
|
1201
|
+
* //waits until bar's text has JupiterJS
|
1202
|
+
* S('#foo').text(/JupiterJS/)
|
1203
|
+
*
|
1204
|
+
* //waits until bar's text is JupiterJS
|
1205
|
+
* S('#foo').text("JupiterJS")
|
1206
|
+
* @codeend
|
1207
|
+
*
|
1208
|
+
* @param {String|Function} [text] If provided uses this as a check before continuing to the next action.
|
1209
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1210
|
+
* @return {String|funcUnit} if the text parameter is provided,
|
1211
|
+
* returns the funcUnit selector for chaining, otherwise returns the html of the selector.
|
1212
|
+
*/
|
1213
|
+
'text' : 0,
|
1214
|
+
/**
|
1215
|
+
* @function val
|
1216
|
+
* Gets the [http://api.jquery.com/val/ val] from an element or waits until the val is a certain value.
|
1217
|
+
* @codestart
|
1218
|
+
* //checks foo's val has "JupiterJS"
|
1219
|
+
* ok( /JupiterJS/.test( S('input#foo').val() ) )
|
1220
|
+
*
|
1221
|
+
* //waits until bar's val has JupiterJS
|
1222
|
+
* S('input#foo').val(/JupiterJS/)
|
1223
|
+
*
|
1224
|
+
* //waits until bar's val is JupiterJS
|
1225
|
+
* S('input#foo').val("JupiterJS")
|
1226
|
+
* @codeend
|
1227
|
+
*
|
1228
|
+
* @param {String|Function} [val] If provided uses this as a check before continuing to the next action.
|
1229
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1230
|
+
* @return {String|funcUnit} if the val parameter is provided,
|
1231
|
+
* returns the funcUnit selector for chaining, otherwise returns the html of the selector.
|
1232
|
+
*/
|
1233
|
+
'val' : 0,
|
1234
|
+
/**
|
1235
|
+
* @function css
|
1236
|
+
* Gets a [http://api.jquery.com/css/ css] property from an element or waits until the property is
|
1237
|
+
* a specified value.
|
1238
|
+
* @codestart
|
1239
|
+
* // gets the color
|
1240
|
+
* S("#foo").css("color")
|
1241
|
+
*
|
1242
|
+
* // waits until the color is red
|
1243
|
+
* S("#foo").css("color","red")
|
1244
|
+
* @codeend
|
1245
|
+
*
|
1246
|
+
* @param {String} prop A css property to get or wait until it is a specified value.
|
1247
|
+
* @param {String|Function} [val] If provided uses this as a check before continuing to the next action.
|
1248
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1249
|
+
* @return {String|funcUnit} if the val parameter is provided,
|
1250
|
+
* returns the funcUnit selector for chaining, otherwise returns the css of the selector.
|
1251
|
+
*/
|
1252
|
+
'css': 1,
|
1253
|
+
/**
|
1254
|
+
* @function offset
|
1255
|
+
* Gets an element's [http://api.jquery.com/offset/ offset] or waits until
|
1256
|
+
* the offset is a specified value.
|
1257
|
+
* @codestart
|
1258
|
+
* // gets the offset
|
1259
|
+
* S("#foo").offset();
|
1260
|
+
*
|
1261
|
+
* // waits until the offset is 100, 200
|
1262
|
+
* S("#foo").offset({top: 100, left: 200})
|
1263
|
+
* @codeend
|
1264
|
+
*
|
1265
|
+
* @param {Object|Function} [offset] If provided uses this as a check before continuing to the next action. Or you can
|
1266
|
+
* provide a function that returns true to continue to the next action.
|
1267
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1268
|
+
* @return {String|funcUnit} if the offset parameter is provided,
|
1269
|
+
* returns the funcUnit selector for chaining, otherwise returns the css of the selector.
|
1270
|
+
*/
|
1271
|
+
'offset' : 0,
|
1272
|
+
/**
|
1273
|
+
* @function position
|
1274
|
+
* Gets an element's [http://api.jquery.com/position/ position] or waits until
|
1275
|
+
* the position is a specified value.
|
1276
|
+
* @codestart
|
1277
|
+
* // gets the position
|
1278
|
+
* S("#foo").position();
|
1279
|
+
*
|
1280
|
+
* // waits until the position is 100, 200
|
1281
|
+
* S("#foo").position({top: 100, left: 200})
|
1282
|
+
* @codeend
|
1283
|
+
*
|
1284
|
+
* @param {Object|Function} [position] If provided uses this as a check before continuing to the next action. Or you can
|
1285
|
+
* provide a function that returns true to continue to the next action.
|
1286
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1287
|
+
* @return {String|funcUnit} if the position parameter is provided,
|
1288
|
+
* returns the funcUnit selector for chaining, otherwise returns the offset of the selector.
|
1289
|
+
*/
|
1290
|
+
'position' : 0,
|
1291
|
+
/**
|
1292
|
+
* @function scrollTop
|
1293
|
+
* Gets an element's [http://api.jquery.com/scrollTop/ scrollTop] or waits until
|
1294
|
+
* it equals a specified value.
|
1295
|
+
* @codestart
|
1296
|
+
* // gets the scrollTop
|
1297
|
+
* S("#foo").scrollTop();
|
1298
|
+
*
|
1299
|
+
* // waits until the scrollTop is 100
|
1300
|
+
* S("#foo").scrollTop(100)
|
1301
|
+
* @codeend
|
1302
|
+
*
|
1303
|
+
* @param {Number|Function} [scrollTop] If provided uses this as a check before continuing to the next action. Or you can
|
1304
|
+
* provide a function that returns true to continue to the next action.
|
1305
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1306
|
+
* @return {String|funcUnit} if scrollTop is provided,
|
1307
|
+
* returns the funcUnit selector for chaining, otherwise returns the scrollTop of the selector.
|
1308
|
+
*/
|
1309
|
+
'scrollTop' : 0,
|
1310
|
+
/**
|
1311
|
+
* @function scrollLeft
|
1312
|
+
* Gets an element's [http://api.jquery.com/scrollLeft/ scrollLeft] or waits until
|
1313
|
+
* it equals a specified value.
|
1314
|
+
* @codestart
|
1315
|
+
* // gets the scrollLeft
|
1316
|
+
* S("#foo").scrollLeft();
|
1317
|
+
*
|
1318
|
+
* // waits until the scrollLeft is 100
|
1319
|
+
* S("#foo").scrollLeft(100)
|
1320
|
+
* @codeend
|
1321
|
+
*
|
1322
|
+
* @param {Number|Function} [scrollLeft] If provided uses this as a check before continuing to the next action. Or you can
|
1323
|
+
* provide a function that returns true to continue to the next action.
|
1324
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1325
|
+
* @return {String|funcUnit} if scrollLeft is provided,
|
1326
|
+
* returns the funcUnit selector for chaining, otherwise returns the scrollLeft of the selector.
|
1327
|
+
*/
|
1328
|
+
'scrollLeft' : 0,
|
1329
|
+
/**
|
1330
|
+
* @function height
|
1331
|
+
* Gets an element's [http://api.jquery.com/height/ height] or waits until
|
1332
|
+
* it equals a specified value.
|
1333
|
+
* @codestart
|
1334
|
+
* // gets the height
|
1335
|
+
* S("#foo").height();
|
1336
|
+
*
|
1337
|
+
* // waits until the height is 100
|
1338
|
+
* S("#foo").height(100)
|
1339
|
+
* @codeend
|
1340
|
+
*
|
1341
|
+
* @param {Number|Function} [height] If provided uses this as a check before continuing to the next action. Or you can
|
1342
|
+
* provide a function that returns true to continue to the next action.
|
1343
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1344
|
+
* @return {String|funcUnit} if height is provided,
|
1345
|
+
* returns the funcUnit selector for chaining, otherwise returns the height of the selector.
|
1346
|
+
*/
|
1347
|
+
'height' : 0,
|
1348
|
+
/**
|
1349
|
+
* @function width
|
1350
|
+
* Gets an element's [http://api.jquery.com/width/ width] or waits until
|
1351
|
+
* it equals a specified value.
|
1352
|
+
* @codestart
|
1353
|
+
* // gets the width
|
1354
|
+
* S("#foo").width();
|
1355
|
+
*
|
1356
|
+
* // waits until the width is 100
|
1357
|
+
* S("#foo").width(100)
|
1358
|
+
* @codeend
|
1359
|
+
*
|
1360
|
+
* @param {Number|Function} [width] If provided uses this as a check before continuing to the next action. Or you can
|
1361
|
+
* provide a function that returns true to continue to the next action.
|
1362
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1363
|
+
* @return {String|funcUnit} if width is provided,
|
1364
|
+
* returns the funcUnit selector for chaining, otherwise returns the width of the selector.
|
1365
|
+
*/
|
1366
|
+
'width' : 0,
|
1367
|
+
/**
|
1368
|
+
* @function innerHeight
|
1369
|
+
* Gets an element's [http://api.jquery.com/innerHeight/ innerHeight] or waits until
|
1370
|
+
* it equals a specified value.
|
1371
|
+
* @codestart
|
1372
|
+
* // gets the innerHeight
|
1373
|
+
* S("#foo").innerHeight();
|
1374
|
+
*
|
1375
|
+
* // waits until the innerHeight is 100
|
1376
|
+
* S("#foo").innerHeight(100)
|
1377
|
+
* @codeend
|
1378
|
+
*
|
1379
|
+
* @param {Number|Function} [innerHeight] If provided uses this as a check before continuing to the next action. Or you can
|
1380
|
+
* provide a function that returns true to continue to the next action.
|
1381
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1382
|
+
* @return {String|funcUnit} if innerHeight is provided,
|
1383
|
+
* returns the funcUnit selector for chaining, otherwise returns the innerHeight of the selector.
|
1384
|
+
*/
|
1385
|
+
'innerHeight' : 0,
|
1386
|
+
/**
|
1387
|
+
* @function innerWidth
|
1388
|
+
* Gets an element's [http://api.jquery.com/innerWidth/ innerWidth] or waits until
|
1389
|
+
* it equals a specified value.
|
1390
|
+
* @codestart
|
1391
|
+
* // gets the innerWidth
|
1392
|
+
* S("#foo").innerWidth();
|
1393
|
+
*
|
1394
|
+
* // waits until the innerWidth is 100
|
1395
|
+
* S("#foo").innerWidth(100)
|
1396
|
+
* @codeend
|
1397
|
+
*
|
1398
|
+
* @param {Number|Function} [innerWidth] If provided uses this as a check before continuing to the next action. Or you can
|
1399
|
+
* provide a function that returns true to continue to the next action.
|
1400
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1401
|
+
* @return {String|funcUnit} if innerWidth is provided,
|
1402
|
+
* returns the funcUnit selector for chaining, otherwise returns the innerWidth of the selector.
|
1403
|
+
*/
|
1404
|
+
'innerWidth' : 0,
|
1405
|
+
/**
|
1406
|
+
* @function outerHeight
|
1407
|
+
* Gets an element's [http://api.jquery.com/outerHeight/ outerHeight] or waits until
|
1408
|
+
* it equals a specified value.
|
1409
|
+
* @codestart
|
1410
|
+
* // gets the outerHeight
|
1411
|
+
* S("#foo").outerHeight();
|
1412
|
+
*
|
1413
|
+
* // waits until the outerHeight is 100
|
1414
|
+
* S("#foo").outerHeight(100)
|
1415
|
+
* @codeend
|
1416
|
+
*
|
1417
|
+
* @param {Number|Function} [outerHeight] If provided uses this as a check before continuing to the next action. Or you can
|
1418
|
+
* provide a function that returns true to continue to the next action.
|
1419
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1420
|
+
* @return {String|funcUnit} if outerHeight is provided,
|
1421
|
+
* returns the funcUnit selector for chaining, otherwise returns the outerHeight of the selector.
|
1422
|
+
*/
|
1423
|
+
'outerHeight' : 0,
|
1424
|
+
/**
|
1425
|
+
* @function outerWidth
|
1426
|
+
* Gets an element's [http://api.jquery.com/outerWidth/ outerWidth] or waits until
|
1427
|
+
* it equals a specified value.
|
1428
|
+
* @codestart
|
1429
|
+
* // gets the outerWidth
|
1430
|
+
* S("#foo").outerWidth();
|
1431
|
+
*
|
1432
|
+
* // waits until the outerWidth is 100
|
1433
|
+
* S("#foo").outerWidth(100)
|
1434
|
+
* @codeend
|
1435
|
+
*
|
1436
|
+
* @param {Number|Function} [outerWidth] If provided uses this as a check before continuing to the next action. Or you can
|
1437
|
+
* provide a function that returns true to continue to the next action.
|
1438
|
+
* @param {Function} [callback] a callback that will run after this action completes.
|
1439
|
+
* @return {String|funcUnit} if outerWidth is provided,
|
1440
|
+
* returns the funcUnit selector for chaining, otherwise returns the outerWidth of the selector.
|
1441
|
+
*/
|
1442
|
+
'outerWidth' : 0}
|
1443
|
+
|
1444
|
+
|
1445
|
+
//makes a jQuery like command.
|
1446
|
+
FuncUnit.makeFunc = function(fname, argIndex){
|
1447
|
+
|
1448
|
+
//makes a read / wait function
|
1449
|
+
FuncUnit.init.prototype[fname] = function(){
|
1450
|
+
//assume last arg is callback
|
1451
|
+
var args = FuncUnit.makeArray(arguments),
|
1452
|
+
callback,
|
1453
|
+
isWait = args.length > argIndex,
|
1454
|
+
callback;
|
1455
|
+
|
1456
|
+
args.unshift(this.selector,this.context,fname)
|
1457
|
+
|
1458
|
+
if(isWait){
|
1459
|
+
//get the args greater and equal to argIndex
|
1460
|
+
var tester = args[argIndex+3],
|
1461
|
+
timeout = args[argIndex+4],
|
1462
|
+
callback = args[argIndex+5],
|
1463
|
+
testVal = tester,
|
1464
|
+
errorMessage = "waiting for "+fname +" on " + this.selector;
|
1465
|
+
|
1466
|
+
if(typeof timeout == 'function'){
|
1467
|
+
callback = timeout;
|
1468
|
+
timeout = undefined;
|
1469
|
+
}
|
1470
|
+
|
1471
|
+
args.splice(argIndex+3, args.length- argIndex - 3);
|
1472
|
+
|
1473
|
+
if(typeof tester != 'function'){
|
1474
|
+
errorMessage += " !== "+testVal
|
1475
|
+
tester = function(val){
|
1476
|
+
|
1477
|
+
return QUnit.equiv(val, testVal) ||
|
1478
|
+
(testVal instanceof RegExp && testVal.test(val) );
|
1479
|
+
}
|
1480
|
+
}
|
1481
|
+
FuncUnit.repeat(function(){
|
1482
|
+
var ret = FuncUnit.$.apply(FuncUnit.$, args);
|
1483
|
+
return tester(ret);
|
1484
|
+
}, callback, errorMessage, timeout)
|
1485
|
+
|
1486
|
+
return this;
|
1487
|
+
}else{
|
1488
|
+
//get the value
|
1489
|
+
steal.dev.log("Getting "+fname+" on "+this.selector)
|
1490
|
+
return FuncUnit.$.apply(FuncUnit.$, args);
|
1491
|
+
}
|
1492
|
+
}
|
1493
|
+
}
|
1494
|
+
|
1495
|
+
|
1496
|
+
|
1497
|
+
for (var prop in FuncUnit.funcs) {
|
1498
|
+
FuncUnit.makeFunc(prop, FuncUnit.funcs[prop]);
|
1499
|
+
}
|
1500
|
+
|
1501
|
+
|
1502
|
+
S = FuncUnit;
|
1503
|
+
|
1504
|
+
|
1505
|
+
})
|
1506
|
+
//now add drivers
|
1507
|
+
.then('resources/selenium_start',
|
1508
|
+
'drivers/selenium',
|
1509
|
+
'drivers/standard')
|