zena 1.2.7 → 1.2.8

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