zena 1.2.7 → 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (407) hide show
  1. data/History.txt +80 -25
  2. data/Rakefile +2 -2
  3. data/app/controllers/columns_controller.rb +2 -2
  4. data/app/controllers/nodes_controller.rb +22 -29
  5. data/app/controllers/user_sessions_controller.rb +35 -10
  6. data/app/controllers/users_controller.rb +2 -2
  7. data/app/controllers/versions_controller.rb +2 -2
  8. data/app/models/group.rb +15 -1
  9. data/app/models/node.rb +109 -8
  10. data/app/models/role.rb +4 -0
  11. data/app/models/site.rb +64 -58
  12. data/app/models/template.rb +1 -1
  13. data/app/models/user.rb +135 -29
  14. data/app/models/user_session.rb +0 -1
  15. data/app/models/virtual_class.rb +11 -6
  16. data/app/views/columns/_form.html.erb +3 -1
  17. data/app/views/columns/_li.html.erb +1 -1
  18. data/app/views/columns/create.rjs +1 -1
  19. data/app/views/groups/_form.rhtml +16 -13
  20. data/app/views/relations/_form.erb +18 -6
  21. data/app/views/sites/_form.erb +12 -6
  22. data/app/views/users/_form.rhtml +23 -8
  23. data/app/views/users/_li.rhtml +14 -3
  24. data/app/views/users/index.rhtml +1 -1
  25. data/app/views/virtual_classes/_form.erb +12 -2
  26. data/app/views/zafu/default/Node-+login.zafu +8 -1
  27. data/app/views/zafu/default/Node-+search.zafu +1 -1
  28. data/bricks/acls/lib/bricks/acls.rb +1 -0
  29. data/bricks/acls/zena/migrate/20130903150356_longer_names_for_acl.rb +9 -0
  30. data/bricks/acls/zena/test/integration/acl_integration_test.rb +2 -2
  31. data/bricks/currency/lib/bricks/currency.rb +120 -0
  32. data/bricks/currency/zena/test/unit/currency_test.rb +43 -0
  33. data/bricks/fs_skin/lib/bricks/fs_skin.rb +1 -1
  34. data/bricks/fs_skin/zena/skins/blog/Node-+search.zafu +1 -1
  35. data/bricks/fs_skin/zena/skins/blog/Node.zafu +1 -1
  36. data/bricks/fs_skin/zena/test/unit/fs_skin_view_test.rb +35 -0
  37. data/bricks/pdf/lib/bricks/pdf.rb +1 -1
  38. data/bricks/sphinx/lib/bricks/sphinx.rb +2 -0
  39. data/bricks/sphinx/zena/init.rb +14 -0
  40. data/bricks/tags/zena/test/zafu/tags.yml +5 -1
  41. data/bricks/worker/lib/bricks/worker.rb +3 -2
  42. data/bricks/zena/zena/migrate/20130829093753_add_versioned_flag_to_column.rb +10 -0
  43. data/bricks/zena/zena/migrate/20130903084909_count_login_attempts.rb +11 -0
  44. data/bricks/zena/zena/migrate/20131104153126_index_fullpath.rb +10 -0
  45. data/bricks/zena/zena/migrate/20131104210011_rebuild_fullpath_after_change.rb +10 -0
  46. data/bricks/zena/zena/migrate/20131105160420_add_skin_id_to_sites.rb +9 -0
  47. data/bricks/zena/zena/migrate/20131105175822_add_profile_to_users.rb +11 -0
  48. data/bricks/zena/zena/migrate/20140213120038_fix_idx_scope.rb +13 -0
  49. data/bricks/zena/zena/migrate/20140628140247_add_site_readonly.rb +9 -0
  50. data/config/bricks.yml +8 -4
  51. data/config/gems.yml +5 -3
  52. data/db/init/base/skins/default/Node-+login.zafu +8 -1
  53. data/db/init/base/skins/default/Node-+search.zafu +1 -1
  54. data/lib/bricks/loader.rb +5 -5
  55. data/lib/gettext_strings.rb +3 -0
  56. data/lib/tasks/zena.rake +25 -22
  57. data/lib/zafu/process/context.rb +4 -0
  58. data/lib/zena/acts/secure_node.rb +3 -3
  59. data/lib/zena/app.rb +1 -0
  60. data/lib/zena/deploy.rb +1 -1
  61. data/lib/zena/deploy/template.rb +1 -1
  62. data/lib/zena/foxy_parser.rb +5 -2
  63. data/lib/zena/info.rb +1 -1
  64. data/lib/zena/site_worker.rb +2 -2
  65. data/lib/zena/test_controller.rb +5 -2
  66. data/lib/zena/use/action.rb +9 -2
  67. data/lib/zena/use/ajax.rb +20 -4
  68. data/lib/zena/use/ancestry.rb +89 -15
  69. data/lib/zena/use/authlogic.rb +8 -2
  70. data/lib/zena/use/context.rb +1 -0
  71. data/lib/zena/use/display.rb +1 -97
  72. data/lib/zena/use/forms.rb +28 -8
  73. data/lib/zena/use/html_tags.rb +16 -7
  74. data/lib/zena/use/i18n.rb +1 -1
  75. data/lib/zena/use/prop_eval.rb +6 -1
  76. data/lib/zena/use/query_node.rb +69 -4
  77. data/lib/zena/use/recursion.rb +1 -1
  78. data/lib/zena/use/refactor.rb +5 -2
  79. data/lib/zena/use/relations.rb +1 -0
  80. data/lib/zena/use/rendering.rb +7 -4
  81. data/lib/zena/use/test_helper.rb +8 -4
  82. data/lib/zena/use/upload.rb +14 -0
  83. data/lib/zena/use/urls.rb +39 -23
  84. data/lib/zena/use/version_hash.rb +5 -2
  85. data/lib/zena/use/workflow.rb +116 -70
  86. data/lib/zena/use/zafu_eval.rb +41 -0
  87. data/lib/zena/use/zafu_safe_definitions.rb +1 -0
  88. data/lib/zena/use/zafu_templates.rb +32 -26
  89. data/lib/zena/use/zazen.rb +8 -7
  90. data/locale/app.pot +5 -1
  91. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  92. data/locale/de/zena.po +385 -281
  93. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  94. data/locale/en/zena.po +378 -271
  95. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  96. data/locale/fr/zena.po +387 -272
  97. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  98. data/locale/it/zena.po +433 -404
  99. data/locale/zena.pot +362 -268
  100. data/public/javascripts/grid.js +280 -104
  101. data/public/javascripts/zena.js +43 -15
  102. data/public/stylesheets/admin.css +8 -2
  103. data/public/stylesheets/grid.css +5 -2
  104. data/public/stylesheets/popup.css +1 -1
  105. data/test/fixtures/files/TestNode.zafu +51 -0
  106. data/test/functional/nodes_controller_test.rb +20 -5
  107. data/test/functional/user_sessions_controller_test.rb +41 -6
  108. data/test/functional/users_controller_test.rb +1 -2
  109. data/test/integration/navigation_test.rb +22 -4
  110. data/test/integration/query_node/basic.yml +7 -0
  111. data/test/integration/query_node/complex.yml +1 -1
  112. data/test/integration/query_node/errors.yml +1 -1
  113. data/test/integration/query_node/filters.yml +34 -1
  114. data/test/integration/query_node/relations.yml +6 -13
  115. data/test/integration/query_node_test.rb +22 -3
  116. data/test/integration/zafu_compiler/action.yml +1 -1
  117. data/test/integration/zafu_compiler/alias_site.yml +52 -0
  118. data/test/integration/zafu_compiler/complex.yml +1 -1
  119. data/test/integration/zafu_compiler/complex_ok.yml +5 -5
  120. data/test/integration/zafu_compiler/context.yml +1 -1
  121. data/test/integration/zafu_compiler/display.yml +56 -5
  122. data/test/integration/zafu_compiler/forms.yml +35 -2
  123. data/test/integration/zafu_compiler/meta.yml +4 -0
  124. data/test/integration/zafu_compiler/rubyless.yml +1 -1
  125. data/test/integration/zafu_compiler/safe_definitions.yml +4 -0
  126. data/test/integration/zafu_compiler/security.yml +10 -0
  127. data/test/integration/zafu_compiler/site.yml +5 -1
  128. data/test/integration/zafu_compiler/urls.yml +8 -2
  129. data/test/integration/zafu_compiler/zafu_attributes.yml +2 -1
  130. data/test/integration/zafu_compiler/zazen.yml +4 -0
  131. data/test/integration/zafu_compiler_test.rb +47 -4
  132. data/test/selenium/Grid/grid1.rsel +8 -8
  133. data/test/sites/complex/sites.yml +2 -2
  134. data/test/sites/complex/users.yml +1 -0
  135. data/test/sites/zena/columns.yml +4 -0
  136. data/test/sites/zena/sites.yml +1 -0
  137. data/test/sites/zena/users.yml +1 -0
  138. data/test/unit/node_test.rb +53 -5
  139. data/test/unit/note_test.rb +1 -1
  140. data/test/unit/relation_proxy_test.rb +20 -0
  141. data/test/unit/role_test.rb +2 -0
  142. data/test/unit/site_test.rb +28 -6
  143. data/test/unit/user_test.rb +332 -1
  144. data/test/unit/virtual_class_test.rb +55 -0
  145. data/test/unit/workflow_test.rb +175 -0
  146. data/test/unit/zena/use/ancestry_test.rb +52 -10
  147. data/test/unit/zena/use/prop_eval_test.rb +44 -0
  148. data/test/unit/zena/use/rendering_test.rb +48 -2
  149. data/test/unit/zena/use/upload_test.rb +15 -13
  150. data/test/unit/zena/use/urls_test.rb +1 -0
  151. data/vendor/plugins/ar_mysql_full_text/lib/ar_mysql_full_text.rb +39 -25
  152. data/zena.gemspec +69 -307
  153. metadata +143 -368
  154. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +0 -24
  155. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +0 -58
  156. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +0 -88
  157. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +0 -27
  158. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +0 -23
  159. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +0 -19
  160. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +0 -19
  161. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +0 -16
  162. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +0 -16
  163. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +0 -16
  164. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +0 -18
  165. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +0 -18
  166. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +0 -16
  167. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +0 -18
  168. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +0 -16
  169. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +0 -16
  170. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +0 -16
  171. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +0 -16
  172. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +0 -16
  173. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +0 -16
  174. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +0 -18
  175. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +0 -16
  176. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +0 -17
  177. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +0 -17
  178. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +0 -18
  179. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +0 -22
  180. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +0 -23
  181. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +0 -25
  182. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +0 -18
  183. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +0 -18
  184. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +0 -18
  185. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +0 -16
  186. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +0 -16
  187. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +0 -20
  188. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +0 -20
  189. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +0 -16
  190. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +0 -16
  191. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +0 -16
  192. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +0 -16
  193. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +0 -16
  194. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +0 -16
  195. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +0 -16
  196. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +0 -18
  197. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +0 -16
  198. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +0 -16
  199. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +0 -16
  200. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +0 -16
  201. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +0 -16
  202. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +0 -16
  203. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +0 -16
  204. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +0 -16
  205. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +0 -16
  206. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +0 -16
  207. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +0 -16
  208. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +0 -16
  209. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +0 -16
  210. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +0 -16
  211. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +0 -16
  212. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +0 -16
  213. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +0 -16
  214. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +0 -16
  215. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +0 -16
  216. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +0 -16
  217. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +0 -16
  218. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +0 -16
  219. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +0 -16
  220. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +0 -16
  221. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +0 -16
  222. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +0 -16
  223. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +0 -16
  224. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +0 -16
  225. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +0 -16
  226. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +0 -16
  227. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +0 -16
  228. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +0 -16
  229. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  230. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +0 -104
  231. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  232. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +0 -17
  233. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +0 -13
  234. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +0 -25
  235. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +0 -166
  236. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +0 -304
  237. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +0 -37
  238. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +0 -52
  239. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  240. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +0 -118
  241. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  242. data/vendor/TextMate/Zena.tmbundle/info.plist +0 -17
  243. data/vendor/plugins/selenium-on-rails/CHANGELOG +0 -125
  244. data/vendor/plugins/selenium-on-rails/LICENSE-2.0.txt +0 -202
  245. data/vendor/plugins/selenium-on-rails/README.md +0 -202
  246. data/vendor/plugins/selenium-on-rails/Rakefile +0 -38
  247. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumController.html +0 -265
  248. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumHelper.html +0 -148
  249. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails.html +0 -126
  250. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/FixtureLoader.html +0 -231
  251. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/PartialsSupport.html +0 -195
  252. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Paths.html +0 -295
  253. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/RSelenese.html +0 -219
  254. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Renderer.html +0 -156
  255. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Selenese.html +0 -179
  256. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/SuiteRenderer.html +0 -223
  257. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilder.html +0 -441
  258. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderAccessors.html +0 -3098
  259. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderActions.html +0 -2080
  260. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserAccessors.html +0 -116
  261. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserActions.html +0 -116
  262. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRailsConfig.html +0 -150
  263. data/vendor/plugins/selenium-on-rails/doc/files/CHANGELOG.html +0 -422
  264. data/vendor/plugins/selenium-on-rails/doc/files/README.html +0 -321
  265. data/vendor/plugins/selenium-on-rails/doc/files/lib/controllers/selenium_controller_rb.html +0 -108
  266. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_helper_rb.html +0 -101
  267. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/acceptance_test_runner_rb.html +0 -222
  268. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/fixture_loader_rb.html +0 -109
  269. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/partials_support_rb.html +0 -111
  270. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/paths_rb.html +0 -101
  271. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/renderer_rb.html +0 -101
  272. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/rselenese_rb.html +0 -118
  273. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/selenese_rb.html +0 -101
  274. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/suite_renderer_rb.html +0 -101
  275. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_accessors_rb.html +0 -114
  276. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_actions_rb.html +0 -113
  277. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_rb.html +0 -120
  278. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_config_rb.html +0 -108
  279. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_rb.html +0 -115
  280. data/vendor/plugins/selenium-on-rails/doc/fr_class_index.html +0 -42
  281. data/vendor/plugins/selenium-on-rails/doc/fr_file_index.html +0 -43
  282. data/vendor/plugins/selenium-on-rails/doc/fr_method_index.html +0 -182
  283. data/vendor/plugins/selenium-on-rails/doc/index.html +0 -24
  284. data/vendor/plugins/selenium-on-rails/doc/rdoc-style.css +0 -208
  285. data/vendor/plugins/selenium-on-rails/generators/selenium/USAGE +0 -19
  286. data/vendor/plugins/selenium-on-rails/generators/selenium/selenium_generator.rb +0 -50
  287. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rhtml.rhtml +0 -16
  288. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rselenese.rhtml +0 -14
  289. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/selenese.rhtml +0 -11
  290. data/vendor/plugins/selenium-on-rails/init.rb +0 -15
  291. data/vendor/plugins/selenium-on-rails/lib/controllers/selenium_controller.rb +0 -122
  292. data/vendor/plugins/selenium-on-rails/lib/controllers/switch_environment_controller.rb +0 -16
  293. data/vendor/plugins/selenium-on-rails/lib/selenium_helper.rb +0 -8
  294. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails.rb +0 -11
  295. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/acceptance_test_runner.rb +0 -215
  296. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/fixture_loader.rb +0 -57
  297. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/partials_support.rb +0 -36
  298. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/paths.rb +0 -61
  299. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/renderer.rb +0 -20
  300. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/rselenese.rb +0 -44
  301. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/selenese.rb +0 -87
  302. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/suite_renderer.rb +0 -56
  303. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder.rb +0 -116
  304. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_accessors.rb +0 -1002
  305. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_actions.rb +0 -514
  306. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_accessors.rb.example +0 -91
  307. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_actions.rb.example +0 -24
  308. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +0 -30
  309. data/vendor/plugins/selenium-on-rails/lib/views/layouts/layout.rhtml +0 -18
  310. data/vendor/plugins/selenium-on-rails/lib/views/record.rhtml +0 -5
  311. data/vendor/plugins/selenium-on-rails/lib/views/selenium_helper.rb +0 -9
  312. data/vendor/plugins/selenium-on-rails/lib/views/setup.rhtml +0 -67
  313. data/vendor/plugins/selenium-on-rails/lib/views/test_suite.rhtml +0 -26
  314. data/vendor/plugins/selenium-on-rails/routes.rb +0 -24
  315. data/vendor/plugins/selenium-on-rails/selenium-core/Blank.html +0 -7
  316. data/vendor/plugins/selenium-on-rails/selenium-core/InjectedRemoteRunner.html +0 -8
  317. data/vendor/plugins/selenium-on-rails/selenium-core/RemoteRunner.html +0 -110
  318. data/vendor/plugins/selenium-on-rails/selenium-core/SeleniumLog.html +0 -109
  319. data/vendor/plugins/selenium-on-rails/selenium-core/TestPrompt.html +0 -145
  320. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner-splash.html +0 -55
  321. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.hta +0 -177
  322. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.html +0 -177
  323. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butmin.gif +0 -0
  324. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butplus.gif +0 -0
  325. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.css +0 -298
  326. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.html +0 -16
  327. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/selenium-domviewer.js +0 -205
  328. data/vendor/plugins/selenium-on-rails/selenium-core/icons/all.png +0 -0
  329. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue.png +0 -0
  330. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue_disabled.png +0 -0
  331. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause.png +0 -0
  332. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause_disabled.png +0 -0
  333. data/vendor/plugins/selenium-on-rails/selenium-core/icons/selected.png +0 -0
  334. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step.png +0 -0
  335. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step_disabled.png +0 -0
  336. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc-core.xml +0 -1759
  337. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc.xml +0 -1800
  338. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/cssQuery-p.js +0 -6
  339. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level2.js +0 -142
  340. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level3.js +0 -150
  341. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-standard.js +0 -53
  342. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery.js +0 -356
  343. data/vendor/plugins/selenium-on-rails/selenium-core/lib/prototype.js +0 -2006
  344. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/builder.js +0 -101
  345. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/controls.js +0 -815
  346. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/dragdrop.js +0 -915
  347. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/effects.js +0 -958
  348. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/scriptaculous.js +0 -47
  349. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/slider.js +0 -283
  350. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/unittest.js +0 -383
  351. data/vendor/plugins/selenium-on-rails/selenium-core/lib/snapsie.js +0 -91
  352. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/find_matching_child.js +0 -69
  353. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/htmlutils.js +0 -1616
  354. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/injection.html +0 -72
  355. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-api.js +0 -3184
  356. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserbot.js +0 -2300
  357. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserdetect.js +0 -153
  358. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-commandhandlers.js +0 -377
  359. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-executionloop.js +0 -175
  360. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-logging.js +0 -148
  361. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-remoterunner.js +0 -695
  362. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-testrunner.js +0 -1362
  363. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-version.js +0 -5
  364. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-doc.html +0 -803
  365. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-element.js +0 -1537
  366. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-map-sample.js +0 -979
  367. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js +0 -3
  368. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js.sample +0 -75
  369. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/xmlextras.js +0 -153
  370. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-logo.png +0 -0
  371. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-test.css +0 -43
  372. data/vendor/plugins/selenium-on-rails/selenium-core/selenium.css +0 -316
  373. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/dom.js +0 -566
  374. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/javascript-xpath-0.1.11.js +0 -2816
  375. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/util.js +0 -549
  376. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xmltoken.js +0 -149
  377. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xpath.js +0 -2450
  378. data/vendor/plugins/selenium-on-rails/tasks/test_acceptance.rake +0 -8
  379. data/vendor/plugins/selenium-on-rails/test/fixtures/config.yml +0 -37
  380. data/vendor/plugins/selenium-on-rails/test/fixtures/selenium.yml +0 -27
  381. data/vendor/plugins/selenium-on-rails/test/paths_test.rb +0 -72
  382. data/vendor/plugins/selenium-on-rails/test/renderer_test.rb +0 -157
  383. data/vendor/plugins/selenium-on-rails/test/rselenese_test.rb +0 -708
  384. data/vendor/plugins/selenium-on-rails/test/selenese_test.rb +0 -242
  385. data/vendor/plugins/selenium-on-rails/test/selenium_controller_test.rb +0 -67
  386. data/vendor/plugins/selenium-on-rails/test/selenium_on_rails_config_test.rb +0 -43
  387. data/vendor/plugins/selenium-on-rails/test/selenium_support_test.rb +0 -35
  388. data/vendor/plugins/selenium-on-rails/test/setup_test.rb +0 -31
  389. data/vendor/plugins/selenium-on-rails/test/suite_renderer_test.rb +0 -109
  390. data/vendor/plugins/selenium-on-rails/test/switch_environment_controller_test.rb +0 -17
  391. data/vendor/plugins/selenium-on-rails/test/test_builder_functions_authortest.rb +0 -51
  392. data/vendor/plugins/selenium-on-rails/test/test_helper.rb +0 -101
  393. data/vendor/plugins/selenium-on-rails/test_data/_partial.rsel +0 -1
  394. data/vendor/plugins/selenium-on-rails/test_data/own_layout.html +0 -12
  395. data/vendor/plugins/selenium-on-rails/test_data/partials/_html.html +0 -6
  396. data/vendor/plugins/selenium-on-rails/test_data/partials/_nesting.rsel +0 -2
  397. data/vendor/plugins/selenium-on-rails/test_data/partials/_rhtml.rhtml +0 -6
  398. data/vendor/plugins/selenium-on-rails/test_data/partials/_rsel.rsel +0 -1
  399. data/vendor/plugins/selenium-on-rails/test_data/partials/_sel.sel +0 -5
  400. data/vendor/plugins/selenium-on-rails/test_data/partials/all_partials.rsel +0 -5
  401. data/vendor/plugins/selenium-on-rails/test_data/rhtml.rhtml +0 -7
  402. data/vendor/plugins/selenium-on-rails/test_data/rselenese.rsel +0 -8
  403. data/vendor/plugins/selenium-on-rails/test_data/selenese.sel +0 -7
  404. data/vendor/plugins/selenium-on-rails/test_data/suite_one/subsuite/suite_one_subsuite_testcase.sel +0 -1
  405. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase1.sel +0 -1
  406. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase2.sel +0 -1
  407. data/vendor/plugins/selenium-on-rails/test_data/suite_two/suite_two_testcase.sel +0 -1
@@ -1,979 +0,0 @@
1
- // sample UI element mapping definition. This is for http://alistapart.com/,
2
- // a particularly well structured site on web design principles.
3
-
4
-
5
-
6
- // in general, the map should capture structural aspects of the system, instead
7
- // of "content". In other words, interactive elements / assertible elements
8
- // that can be counted on to always exist should be defined here. Content -
9
- // for example text or a link that appears in a blog entry - is always liable
10
- // to change, and will not be fun to represent in this way. You probably don't
11
- // want to be testing specific content anyway.
12
-
13
- // create the UI mapping object. THIS IS THE MOST IMPORTANT PART - DON'T FORGET
14
- // TO DO THIS! In order for it to come into play, a user extension must
15
- // construct the map in this way.
16
- var myMap = new UIMap();
17
-
18
-
19
-
20
-
21
- // any values which may appear multiple times can be defined as variables here.
22
- // For example, here we're enumerating a list of top level topics that will be
23
- // used as default argument values for several UI elements. Check out how
24
- // this variable is referenced further down.
25
- var topics = [
26
- 'Code',
27
- 'Content',
28
- 'Culture',
29
- 'Design',
30
- 'Process',
31
- 'User Science'
32
- ];
33
-
34
- // map subtopics to their parent topics
35
- var subtopics = {
36
- 'Browsers': 'Code'
37
- , 'CSS': 'Code'
38
- , 'Flash': 'Code'
39
- , 'HTML and XHTML': 'Code'
40
- , 'Scripting': 'Code'
41
- , 'Server Side': 'Code'
42
- , 'XML': 'Code'
43
- , 'Brand Arts': 'Content'
44
- , 'Community': 'Content'
45
- , 'Writing': 'Content'
46
- , 'Industry': 'Culture'
47
- , 'Politics and Money': 'Culture'
48
- , 'State of the Web': 'Culture'
49
- , 'Graphic Design': 'Design'
50
- , 'User Interface Design': 'Design'
51
- , 'Typography': 'Design'
52
- , 'Layout': 'Design'
53
- , 'Business': 'Process'
54
- , 'Creativity': 'Process'
55
- , 'Project Management and Workflow': 'Process'
56
- , 'Accessibility': 'User Science'
57
- , 'Information Architecture': 'User Science'
58
- , 'Usability': 'User Science'
59
- };
60
-
61
-
62
-
63
- // define UI elements common for all pages. This regular expression does the
64
- // trick. '^' is automatically prepended, and '$' is automatically postpended.
65
- // Please note that because the regular expression is being represented as a
66
- // string, all backslashes must be escaped with an additional backslash. Also
67
- // note that the URL being matched will always have any trailing forward slash
68
- // stripped.
69
- myMap.addPageset({
70
- name: 'allPages'
71
- , description: 'all alistapart.com pages'
72
- , pathRegexp: '.*'
73
- });
74
- myMap.addElement('allPages', {
75
- name: 'masthead'
76
- // the description should be short and to the point, usually no longer than
77
- // a single line
78
- , description: 'top level image link to site homepage'
79
- // make sure the function returns the XPath ... it's easy to leave out the
80
- // "return" statement by accident!
81
- , locator: "xpath=//*[@id='masthead']/a/img"
82
- , testcase1: {
83
- xhtml: '<h1 id="masthead"><a><img expected-result="1" /></a></h1>'
84
- }
85
- });
86
- myMap.addElement('allPages', {
87
- // be VERY CAREFUL to include commas in the correct place. Missing commas
88
- // and extra commas can cause lots of headaches when debugging map
89
- // definition files!!!
90
- name: 'current_issue'
91
- , description: 'top level link to issue currently being browsed'
92
- , locator: "//div[@id='ish']/a"
93
- , testcase1: {
94
- xhtml: '<div id="ish"><a expected-result="1"></a></div>'
95
- }
96
- });
97
- myMap.addElement('allPages', {
98
- name: 'section'
99
- , description: 'top level link to articles section'
100
- , args: [
101
- {
102
- name: 'section'
103
- , description: 'the name of the section'
104
- , defaultValues: [
105
- 'articles'
106
- , 'topics'
107
- , 'about'
108
- , 'contact'
109
- , 'contribute'
110
- , 'feed'
111
- ]
112
- }
113
- ]
114
- // getXPath has been deprecated by getLocator, but verify backward
115
- // compatability here
116
- , getXPath: function(args) {
117
- return "//li[@id=" + args.section.quoteForXPath() + "]/a";
118
- }
119
- , testcase1: {
120
- args: { section: 'feed' }
121
- , xhtml: '<ul><li id="feed"><a expected-result="1" /></li></ul>'
122
- }
123
- });
124
- myMap.addElement('allPages', {
125
- name: 'search_box'
126
- , description: 'site search input field'
127
- // xpath has been deprecated by locator, but verify backward compatability
128
- , xpath: "//input[@id='search']"
129
- , testcase1: {
130
- xhtml: '<input id="search" expected-result="1" />'
131
- }
132
- });
133
- myMap.addElement('allPages', {
134
- name: 'search_discussions'
135
- , description: 'site search include discussions checkbox'
136
- , locator: 'incdisc'
137
- , testcase1: {
138
- xhtml: '<input id="incdisc" expected-result="1" />'
139
- }
140
- });
141
- myMap.addElement('allPages', {
142
- name: 'search_submit'
143
- , description: 'site search submission button'
144
- , locator: 'submit'
145
- , testcase1: {
146
- xhtml: '<input id="submit" expected-result="1" />'
147
- }
148
- });
149
- myMap.addElement('allPages', {
150
- name: 'topics'
151
- , description: 'sidebar links to topic categories'
152
- , args: [
153
- {
154
- name: 'topic'
155
- , description: 'the name of the topic'
156
- , defaultValues: topics
157
- }
158
- ]
159
- , getLocator: function(args) {
160
- return "//div[@id='topiclist']/ul/li" +
161
- "/a[text()=" + args.topic.quoteForXPath() + "]";
162
- }
163
- , testcase1: {
164
- args: { topic: 'foo' }
165
- , xhtml: '<div id="topiclist"><ul><li>'
166
- + '<a expected-result="1">foo</a>'
167
- + '</li></ul></div>'
168
- }
169
- });
170
- myMap.addElement('allPages', {
171
- name: 'copyright'
172
- , description: 'footer link to copyright page'
173
- , getLocator: function(args) { return "//span[@class='copyright']/a"; }
174
- , testcase1: {
175
- xhtml: '<span class="copyright"><a expected-result="1" /></span>'
176
- }
177
- });
178
-
179
-
180
-
181
- // define UI elements for the homepage, i.e. "http://alistapart.com/", and
182
- // magazine issue pages, i.e. "http://alistapart.com/issues/234".
183
- myMap.addPageset({
184
- name: 'issuePages'
185
- , description: 'pages including magazine issues'
186
- , pathRegexp: '(issues/.+)?'
187
- });
188
- myMap.addElement('issuePages', {
189
- name: 'article'
190
- , description: 'front or issue page link to article'
191
- , args: [
192
- {
193
- name: 'index'
194
- , description: 'the index of the article'
195
- // an array of default values for the argument. A default
196
- // value is one that is passed to the getXPath() method of
197
- // the container UIElement object when trying to build an
198
- // element locator.
199
- //
200
- // range() may be used to count easily. Remember though that
201
- // the ending value does not include the right extreme; for
202
- // example range(1, 5) counts from 1 to 4 only.
203
- , defaultValues: range(1, 5)
204
- }
205
- ]
206
- , getLocator: function(args) {
207
- return "//div[@class='item'][" + args.index + "]/h4/a";
208
- }
209
- });
210
- myMap.addElement('issuePages', {
211
- name: 'author'
212
- , description: 'article author link'
213
- , args: [
214
- {
215
- name: 'index'
216
- , description: 'the index of the author, by article'
217
- , defaultValues: range(1, 5)
218
- }
219
- ]
220
- , getLocator: function(args) {
221
- return "//div[@class='item'][" + args.index + "]/h5/a";
222
- }
223
- });
224
- myMap.addElement('issuePages', {
225
- name: 'store'
226
- , description: 'alistapart.com store link'
227
- , locator: "//ul[@id='banners']/li/a[@title='ALA Store']/img"
228
- });
229
- myMap.addElement('issuePages', {
230
- name: 'special_article'
231
- , description: "editor's choice article link"
232
- , locator: "//div[@id='choice']/h4/a"
233
- });
234
- myMap.addElement('issuePages', {
235
- name: 'special_author'
236
- , description: "author link of editor's choice article"
237
- , locator: "//div[@id='choice']/h5/a"
238
- });
239
-
240
-
241
-
242
- // define UI elements for the articles page, i.e.
243
- // "http://alistapart.com/articles"
244
- myMap.addPageset({
245
- name: 'articleListPages'
246
- , description: 'page with article listings'
247
- , paths: [ 'articles' ]
248
- });
249
- myMap.addElement('articleListPages', {
250
- name: 'issue'
251
- , description: 'link to issue'
252
- , args: [
253
- {
254
- name: 'index'
255
- , description: 'the index of the issue on the page'
256
- , defaultValues: range(1, 10)
257
- }
258
- ]
259
- , getLocator: function(args) {
260
- return "//h2[@class='ishinfo'][" + args.index + ']/a';
261
- }
262
- , genericLocator: "//h2[@class='ishinfo']/a"
263
- });
264
- myMap.addElement('articleListPages', {
265
- name: 'article'
266
- , description: 'link to article, by issue and article number'
267
- , args: [
268
- {
269
- name: 'issue_index'
270
- , description: "the index of the article's issue on the page; "
271
- + 'typically five per page'
272
- , defaultValues: range(1, 6)
273
- }
274
- , {
275
- name: 'article_index'
276
- , description: 'the index of the article within the issue; '
277
- + 'typically two per issue'
278
- , defaultValues: range(1, 5)
279
- }
280
- ]
281
- , getLocator: function(args) {
282
- var xpath = "//h2[@class='ishinfo'][" + (args.issue_index || 1) + ']'
283
- + "/following-sibling::div[@class='item']"
284
- + '[' + (args.article_index || 1) + "]/h3[@class='title']/a";
285
- return xpath;
286
- }
287
- , genericLocator: "//h2[@class='ishinfo']"
288
- + "/following-sibling::div[@class='item']/h3[@class='title']/a"
289
- });
290
- myMap.addElement('articleListPages', {
291
- name: 'author'
292
- , description: 'article author link, by issue and article'
293
- , args: [
294
- {
295
- name: 'issue_index'
296
- , description: "the index of the article's issue on the page; \
297
- typically five per page"
298
- , defaultValues: range(1, 6)
299
- }
300
- , {
301
- name: 'article_index'
302
- , description: "the index of the article within the issue; \
303
- typically two articles per issue"
304
- , defaultValues: range(1, 3)
305
- }
306
- ]
307
- // this XPath uses the "following-sibling" axis. The div elements for
308
- // the articles in an issue are not children, but siblings of the h2
309
- // element identifying the article.
310
- , getLocator: function(args) {
311
- var xpath = "//h2[@class='ishinfo'][" + (args.issue_index || 1) + ']'
312
- + "/following-sibling::div[@class='item']"
313
- + '[' + (args.article_index || 1) + "]/h4[@class='byline']/a";
314
- return xpath;
315
- }
316
- , genericLocator: "//h2[@class='ishinfo']"
317
- + "/following-sibling::div[@class='item']/h4[@class='byline']/a"
318
- });
319
- myMap.addElement('articleListPages', {
320
- name: 'next_page'
321
- , description: 'link to next page of articles (older)'
322
- , locator: "//a[contains(text(),'Next page')]"
323
- });
324
- myMap.addElement('articleListPages', {
325
- name: 'previous_page'
326
- , description: 'link to previous page of articles (newer)'
327
- , locator: "//a[contains(text(),'Previous page')]"
328
- });
329
-
330
-
331
-
332
- // define UI elements for specific article pages, i.e.
333
- // "http://alistapart.com/articles/culturalprobe"
334
- myMap.addPageset({
335
- name: 'articlePages'
336
- , description: 'pages for actual articles'
337
- , pathRegexp: 'articles/.+'
338
- });
339
- myMap.addElement('articlePages', {
340
- name: 'title'
341
- , description: 'article title loop-link'
342
- , locator: "//div[@id='content']/h1[@class='title']/a"
343
- });
344
- myMap.addElement('articlePages', {
345
- name: 'author'
346
- , description: 'article author link'
347
- , locator: "//div[@id='content']/h3[@class='byline']/a"
348
- });
349
- myMap.addElement('articlePages', {
350
- name: 'article_topics'
351
- , description: 'links to topics under which article is published, before \
352
- article content'
353
- , args: [
354
- {
355
- name: 'topic'
356
- , description: 'the name of the topic'
357
- , defaultValues: keys(subtopics)
358
- }
359
- ]
360
- , getLocator: function(args) {
361
- return "//ul[@id='metastuff']/li/a"
362
- + "[@title=" + args.topic.quoteForXPath() + "]";
363
- }
364
- });
365
- myMap.addElement('articlePages', {
366
- name: 'discuss'
367
- , description: 'link to article discussion area, before article content'
368
- , locator: "//ul[@id='metastuff']/li[@class='discuss']/p/a"
369
- });
370
- myMap.addElement('articlePages', {
371
- name: 'related_topics'
372
- , description: 'links to topics under which article is published, after \
373
- article content'
374
- , args: [
375
- {
376
- name: 'topic'
377
- , description: 'the name of the topic'
378
- , defaultValues: keys(subtopics)
379
- }
380
- ]
381
- , getLocator: function(args) {
382
- return "//div[@id='learnmore']/p/a"
383
- + "[@title=" + args.topic.quoteForXPath() + "]";
384
- }
385
- });
386
- myMap.addElement('articlePages', {
387
- name: 'join_discussion'
388
- , description: 'link to article discussion area, after article content'
389
- , locator: "//div[@class='discuss']/p/a"
390
- });
391
-
392
-
393
-
394
- myMap.addPageset({
395
- name: 'topicListingPages'
396
- , description: 'top level listing of topics'
397
- , paths: [ 'topics' ]
398
- });
399
- myMap.addElement('topicListingPages', {
400
- name: 'topic'
401
- , description: 'link to topic category'
402
- , args: [
403
- {
404
- name: 'topic'
405
- , description: 'the name of the topic'
406
- , defaultValues: topics
407
- }
408
- ]
409
- , getLocator: function(args) {
410
- return "//div[@id='content']/h2/a"
411
- + "[text()=" + args.topic.quoteForXPath() + "]";
412
- }
413
- });
414
- myMap.addElement('topicListingPages', {
415
- name: 'subtopic'
416
- , description: 'link to subtopic category'
417
- , args: [
418
- {
419
- name: 'subtopic'
420
- , description: 'the name of the subtopic'
421
- , defaultValues: keys(subtopics)
422
- }
423
- ]
424
- , getLocator: function(args) {
425
- return "//div[@id='content']" +
426
- "/descendant::a[text()=" + args.subtopic.quoteForXPath() + "]";
427
- }
428
- });
429
-
430
- // the following few subtopic page UI elements are very similar. Define UI
431
- // elements for the code page, which is a subpage under topics, i.e.
432
- // "http://alistapart.com/topics/code/"
433
- myMap.addPageset({
434
- name: 'subtopicListingPages'
435
- , description: 'pages listing subtopics'
436
- , pathPrefix: 'topics/'
437
- , paths: [
438
- 'code'
439
- , 'content'
440
- , 'culture'
441
- , 'design'
442
- , 'process'
443
- , 'userscience'
444
- ]
445
- });
446
- myMap.addElement('subtopicListingPages', {
447
- name: 'subtopic'
448
- , description: 'link to a subtopic category'
449
- , args: [
450
- {
451
- name: 'subtopic'
452
- , description: 'the name of the subtopic'
453
- , defaultValues: keys(subtopics)
454
- }
455
- ]
456
- , getLocator: function(args) {
457
- return "//div[@id='content']/h2" +
458
- "/a[text()=" + args.subtopic.quoteForXPath() + "]";
459
- }
460
- });
461
-
462
-
463
-
464
- // subtopic articles page
465
- myMap.addPageset({
466
- name: 'subtopicArticleListingPages'
467
- , description: 'pages listing the articles for a given subtopic'
468
- , pathRegexp: 'topics/[^/]+/.+'
469
- });
470
- myMap.addElement('subtopicArticleListingPages', {
471
- name: 'article'
472
- , description: 'link to a subtopic article'
473
- , args: [
474
- {
475
- name: 'index'
476
- , description: 'the index of the article'
477
- , defaultValues: range(1, 51) // the range seems unlimited ...
478
- }
479
- ]
480
- , getLocator: function(args) {
481
- return "//div[@id='content']/div[@class='item']"
482
- + "[" + args.index + "]/h3/a";
483
- }
484
- , testcase1: {
485
- args: { index: 2 }
486
- , xhtml: '<div id="content"><div class="item" /><div class="item">'
487
- + '<h3><a expected-result="1" /></h3></div></div>'
488
- }
489
- });
490
- myMap.addElement('subtopicArticleListingPages', {
491
- name: 'author'
492
- , description: "link to a subtopic article author's page"
493
- , args: [
494
- {
495
- name: 'article_index'
496
- , description: 'the index of the authored article'
497
- , defaultValues: range(1, 51)
498
- }
499
- , {
500
- name: 'author_index'
501
- , description: 'the index of the author when there are multiple'
502
- , defaultValues: range(1, 4)
503
- }
504
- ]
505
- , getLocator: function(args) {
506
- return "//div[@id='content']/div[@class='item'][" +
507
- args.article_index + "]/h4/a[" +
508
- (args.author_index ? args.author_index : '1') + ']';
509
- }
510
- });
511
- myMap.addElement('subtopicArticleListingPages', {
512
- name: 'issue'
513
- , description: 'link to issue a subtopic article appears in'
514
- , args: [
515
- {
516
- name: 'index'
517
- , description: 'the index of the subtopic article'
518
- , defaultValues: range(1, 51)
519
- }
520
- ]
521
- , getLocator: function(args) {
522
- return "//div[@id='content']/div[@class='item']"
523
- + "[" + args.index + "]/h5/a";
524
- }
525
- });
526
-
527
-
528
-
529
- myMap.addPageset({
530
- name: 'aboutPages'
531
- , description: 'the website about page'
532
- , paths: [ 'about' ]
533
- });
534
- myMap.addElement('aboutPages', {
535
- name: 'crew'
536
- , description: 'link to site crew member bio or personal website'
537
- , args: [
538
- {
539
- name: 'role'
540
- , description: 'the role of the crew member'
541
- , defaultValues: [
542
- 'ALA Crew'
543
- , 'Support'
544
- , 'Emeritus'
545
- ]
546
- }
547
- , {
548
- name: 'role_index'
549
- , description: 'the index of the member within the role'
550
- , defaultValues: range(1, 20)
551
- }
552
- , {
553
- name: 'member_index'
554
- , description: 'the index of the member within the role title'
555
- , defaultValues: range(1, 5)
556
- }
557
- ]
558
- , getLocator: function(args) {
559
- // the first role is kind of funky, and requires a conditional to
560
- // build the XPath correctly. Its header looks like this:
561
- //
562
- // <h3>
563
- // <span class="caps">ALA 4</span>.0 <span class="caps">CREW</span>
564
- // </h3>
565
- //
566
- // This kind of complexity is a little daunting, but you can see
567
- // how the format can handle it relatively easily and concisely.
568
- if (args.role == 'ALA Crew') {
569
- var selector = "descendant::text()='CREW'";
570
- }
571
- else {
572
- var selector = "text()=" + args.role.quoteForXPath();
573
- }
574
- var xpath =
575
- "//div[@id='secondary']/h3[" + selector + ']' +
576
- "/following-sibling::dl/dt[" + (args.role_index || 1) + ']' +
577
- '/a[' + (args.member_index || '1') + ']';
578
- return xpath;
579
- }
580
- });
581
-
582
-
583
-
584
- myMap.addPageset({
585
- name: 'searchResultsPages'
586
- , description: 'pages listing search results'
587
- , paths: [ 'search' ]
588
- });
589
- myMap.addElement('searchResultsPages', {
590
- name: 'result_link'
591
- , description: 'search result link'
592
- , args: [
593
- {
594
- name: 'index'
595
- , description: 'the index of the search result'
596
- , defaultValues: range(1, 11)
597
- }
598
- ]
599
- , getLocator: function(args) {
600
- return "//div[@id='content']/ul[" + args.index + ']/li/h3/a';
601
- }
602
- });
603
- myMap.addElement('searchResultsPages', {
604
- name: 'more_results_link'
605
- , description: 'next or previous results link at top or bottom of page'
606
- , args: [
607
- {
608
- name: 'direction'
609
- , description: 'next or previous results page'
610
- // demonstrate a method which acquires default values from the
611
- // document object. Such default values may contain EITHER commas
612
- // OR equals signs, but NOT BOTH.
613
- , getDefaultValues: function(inDocument) {
614
- var defaultValues = [];
615
- var divs = inDocument.getElementsByTagName('div');
616
- for (var i = 0; i < divs.length; ++i) {
617
- if (divs[i].className == 'pages') {
618
- break;
619
- }
620
- }
621
- var links = divs[i].getElementsByTagName('a');
622
- for (i = 0; i < links.length; ++i) {
623
- defaultValues.push(links[i].innerHTML
624
- .replace(/^\xab\s*/, "")
625
- .replace(/\s*\bb$/, "")
626
- .replace(/\s*\d+$/, ""));
627
- }
628
- return defaultValues;
629
- }
630
- }
631
- , {
632
- name: 'position'
633
- , description: 'position of the link'
634
- , defaultValues: ['top', 'bottom']
635
- }
636
- ]
637
- , getLocator: function(args) {
638
- return "//div[@id='content']/div[@class='pages']["
639
- + (args.position == 'top' ? '1' : '2') + ']'
640
- + "/a[contains(text(), "
641
- + (args.direction ? args.direction.quoteForXPath() : undefined)
642
- + ")]";
643
- }
644
- });
645
-
646
-
647
-
648
- myMap.addPageset({
649
- name: 'commentsPages'
650
- , description: 'pages listing comments made to an article'
651
- , pathRegexp: 'comments/.+'
652
- });
653
- myMap.addElement('commentsPages', {
654
- name: 'article_link'
655
- , description: 'link back to the original article'
656
- , locator: "//div[@id='content']/h1[@class='title']/a"
657
- });
658
- myMap.addElement('commentsPages', {
659
- name: 'comment_link'
660
- , description: 'same-page link to comment'
661
- , args: [
662
- {
663
- name: 'index'
664
- , description: 'the index of the comment'
665
- , defaultValues: range(1, 11)
666
- }
667
- ]
668
- , getLocator: function(args) {
669
- return "//div[@class='content']/div[contains(@class, 'comment')]" +
670
- '[' + args.index + ']/h4/a[2]';
671
- }
672
- });
673
- myMap.addElement('commentsPages', {
674
- name: 'paging_link'
675
- , description: 'links to more pages of comments'
676
- , args: [
677
- {
678
- name: 'dest'
679
- , description: 'the destination page'
680
- , defaultValues: ['next', 'prev'].concat(range(1, 16))
681
- }
682
- , {
683
- name: 'position'
684
- , description: 'position of the link'
685
- , defaultValues: ['top', 'bottom']
686
- }
687
- ]
688
- , getLocator: function(args) {
689
- var dest = args.dest;
690
- var xpath = "//div[@id='content']/div[@class='pages']" +
691
- '[' + (args.position == 'top' ? '1' : '2') + ']/p';
692
- if (dest == 'next' || dest == 'prev') {
693
- xpath += "/a[contains(text(), " + dest.quoteForXPath() + ")]";
694
- }
695
- else {
696
- xpath += "/a[text()=" + dest.quoteForXPath() + "]";
697
- }
698
- return xpath;
699
- }
700
- });
701
-
702
-
703
-
704
- myMap.addPageset({
705
- name: 'authorPages'
706
- , description: 'personal pages for each author'
707
- , pathRegexp: 'authors/[a-z]/.+'
708
- });
709
- myMap.addElement('authorPages', {
710
- name: 'article'
711
- , description: "link to article written by this author.\n"
712
- + 'This description has a line break.'
713
- , args: [
714
- {
715
- name: 'index'
716
- , description: 'index of the article on the page'
717
- , defaultValues: range(1, 11)
718
- }
719
- ]
720
- , getLocator: function(args) {
721
- var index = args.index;
722
- // try out the CSS locator!
723
- //return "//h4[@class='title'][" + index + "]/a";
724
- return 'css=h4.title:nth-child(' + index + ') > a';
725
- }
726
- , testcase1: {
727
- args: { index: '2' }
728
- , xhtml: '<h4 class="title" /><h4 class="title">'
729
- + '<a expected-result="1" /></h4>'
730
- }
731
- });
732
-
733
-
734
-
735
- // test the offset locator. Something like the following can be recorded:
736
- // ui=qaPages::content()//a[contains(text(),'May I quote from your articles?')]
737
- myMap.addPageset({
738
- name: 'qaPages'
739
- , description: 'question and answer pages'
740
- , pathRegexp: 'qa'
741
- });
742
- myMap.addElement('qaPages', {
743
- name: 'content'
744
- , description: 'the content pane containing the q&a entries'
745
- , locator: "//div[@id='content' and "
746
- + "child::h1[text()='Questions and Answers']]"
747
- , getOffsetLocator: UIElement.defaultOffsetLocatorStrategy
748
- });
749
- myMap.addElement('qaPages', {
750
- name: 'last_updated'
751
- , description: 'displays the last update date'
752
- // demonstrate calling getLocator() for another UI element within a
753
- // getLocator(). The former must have already been added to the map. And
754
- // obviously, you can't randomly combine different locator types!
755
- , locator: myMap.getUIElement('qaPages', 'content').getLocator() + '/p/em'
756
- });
757
-
758
-
759
-
760
- //******************************************************************************
761
-
762
- var myRollupManager = new RollupManager();
763
-
764
- // though the description element is required, its content is free form. You
765
- // might want to create a documentation policy as given below, where the pre-
766
- // and post-conditions of the rollup are spelled out.
767
- //
768
- // To take advantage of a "heredoc" like syntax for longer descriptions,
769
- // add a backslash to the end of the current line and continue the string on
770
- // the next line.
771
- myRollupManager.addRollupRule({
772
- name: 'navigate_to_subtopic_article_listing'
773
- , description: 'drill down to the listing of articles for a given subtopic \
774
- from the section menu, then the topic itself.'
775
- , pre: 'current page contains the section menu (most pages should)'
776
- , post: 'navigated to the page listing all articles for a given subtopic'
777
- , args: [
778
- {
779
- name: 'subtopic'
780
- , description: 'the subtopic whose article listing to navigate to'
781
- , exampleValues: keys(subtopics)
782
- }
783
- ]
784
- , commandMatchers: [
785
- {
786
- command: 'clickAndWait'
787
- , target: 'ui=allPages::section\\(section=topics\\)'
788
- // must escape parentheses in the the above target, since the
789
- // string is being used as a regular expression. Again, backslashes
790
- // in strings must be escaped too.
791
- }
792
- , {
793
- command: 'clickAndWait'
794
- , target: 'ui=topicListingPages::topic\\(.+'
795
- }
796
- , {
797
- command: 'clickAndWait'
798
- , target: 'ui=subtopicListingPages::subtopic\\(.+'
799
- , updateArgs: function(command, args) {
800
- // don't bother stripping the "ui=" prefix from the locator
801
- // here; we're just using UISpecifier to parse the args out
802
- var uiSpecifier = new UISpecifier(command.target);
803
- args.subtopic = uiSpecifier.args.subtopic;
804
- return args;
805
- }
806
- }
807
- ]
808
- , getExpandedCommands: function(args) {
809
- var commands = [];
810
- var topic = subtopics[args.subtopic];
811
- var subtopic = args.subtopic;
812
- commands.push({
813
- command: 'clickAndWait'
814
- , target: 'ui=allPages::section(section=topics)'
815
- });
816
- commands.push({
817
- command: 'clickAndWait'
818
- , target: 'ui=topicListingPages::topic(topic=' + topic + ')'
819
- });
820
- commands.push({
821
- command: 'clickAndWait'
822
- , target: 'ui=subtopicListingPages::subtopic(subtopic=' + subtopic
823
- + ')'
824
- });
825
- commands.push({
826
- command: 'verifyLocation'
827
- , target: 'regexp:.+/topics/.+/.+'
828
- });
829
- return commands;
830
- }
831
- });
832
-
833
-
834
-
835
- myRollupManager.addRollupRule({
836
- name: 'replace_click_with_clickAndWait'
837
- , description: 'replaces commands where a click was detected with \
838
- clickAndWait instead'
839
- , alternateCommand: 'clickAndWait'
840
- , commandMatchers: [
841
- {
842
- command: 'click'
843
- , target: 'ui=subtopicArticleListingPages::article\\(.+'
844
- }
845
- ]
846
- , expandedCommands: []
847
- });
848
-
849
-
850
-
851
- myRollupManager.addRollupRule({
852
- name: 'navigate_to_subtopic_article'
853
- , description: 'navigate to an article listed under a subtopic.'
854
- , pre: 'current page contains the section menu (most pages should)'
855
- , post: 'navigated to an article page'
856
- , args: [
857
- {
858
- name: 'subtopic'
859
- , description: 'the subtopic whose article listing to navigate to'
860
- , exampleValues: keys(subtopics)
861
- }
862
- , {
863
- name: 'index'
864
- , description: 'the index of the article in the listing'
865
- , exampleValues: range(1, 11)
866
- }
867
- ]
868
- , commandMatchers: [
869
- {
870
- command: 'rollup'
871
- , target: 'navigate_to_subtopic_article_listing'
872
- , value: 'subtopic\\s*=.+'
873
- , updateArgs: function(command, args) {
874
- var args1 = parse_kwargs(command.value);
875
- args.subtopic = args1.subtopic;
876
- return args;
877
- }
878
- }
879
- , {
880
- command: 'clickAndWait'
881
- , target: 'ui=subtopicArticleListingPages::article\\(.+'
882
- , updateArgs: function(command, args) {
883
- var uiSpecifier = new UISpecifier(command.target);
884
- args.index = uiSpecifier.args.index;
885
- return args;
886
- }
887
- }
888
- ]
889
- /*
890
- // this is pretty much equivalent to the commandMatchers immediately above.
891
- // Seems more verbose and less expressive, doesn't it? But sometimes you
892
- // might prefer the flexibility of a function.
893
- , getRollup: function(commands) {
894
- if (commands.length >= 2) {
895
- command1 = commands[0];
896
- command2 = commands[1];
897
- var args1 = parse_kwargs(command1.value);
898
- try {
899
- var uiSpecifier = new UISpecifier(command2.target
900
- .replace(/^ui=/, ''));
901
- }
902
- catch (e) {
903
- return false;
904
- }
905
- if (command1.command == 'rollup' &&
906
- command1.target == 'navigate_to_subtopic_article_listing' &&
907
- args1.subtopic &&
908
- command2.command == 'clickAndWait' &&
909
- uiSpecifier.pagesetName == 'subtopicArticleListingPages' &&
910
- uiSpecifier.elementName == 'article') {
911
- var args = {
912
- subtopic: args1.subtopic
913
- , index: uiSpecifier.args.index
914
- };
915
- return {
916
- command: 'rollup'
917
- , target: this.name
918
- , value: to_kwargs(args)
919
- , replacementIndexes: [ 0, 1 ]
920
- };
921
- }
922
- }
923
- return false;
924
- }
925
- */
926
- , getExpandedCommands: function(args) {
927
- var commands = [];
928
- commands.push({
929
- command: 'rollup'
930
- , target: 'navigate_to_subtopic_article_listing'
931
- , value: to_kwargs({ subtopic: args.subtopic })
932
- });
933
- var uiSpecifier = new UISpecifier(
934
- 'subtopicArticleListingPages'
935
- , 'article'
936
- , { index: args.index });
937
- commands.push({
938
- command: 'clickAndWait'
939
- , target: 'ui=' + uiSpecifier.toString()
940
- });
941
- commands.push({
942
- command: 'verifyLocation'
943
- , target: 'regexp:.+/articles/.+'
944
- });
945
- return commands;
946
- }
947
- });
948
-
949
-
950
-
951
-
952
-
953
-
954
-
955
-
956
-
957
-
958
-
959
-
960
-
961
-
962
-
963
-
964
-
965
-
966
-
967
-
968
-
969
-
970
-
971
-
972
-
973
-
974
-
975
-
976
-
977
-
978
-
979
-