actionpack 2.3.18 → 3.0.0.beta

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 (513) hide show
  1. data/CHANGELOG +15 -64
  2. data/README +39 -48
  3. data/lib/abstract_controller.rb +22 -0
  4. data/lib/abstract_controller/base.rb +191 -0
  5. data/lib/abstract_controller/callbacks.rb +113 -0
  6. data/lib/abstract_controller/collector.rb +30 -0
  7. data/lib/abstract_controller/compatibility.rb +18 -0
  8. data/lib/abstract_controller/helpers.rb +163 -0
  9. data/lib/abstract_controller/layouts.rb +413 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +13 -0
  12. data/lib/abstract_controller/rendering.rb +238 -0
  13. data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
  14. data/lib/action_controller.rb +68 -102
  15. data/lib/action_controller/base.rb +77 -1409
  16. data/lib/action_controller/caching.rb +58 -45
  17. data/lib/action_controller/caching/actions.rb +100 -114
  18. data/lib/action_controller/caching/fragments.rb +17 -19
  19. data/lib/action_controller/caching/pages.rb +12 -6
  20. data/lib/action_controller/caching/sweeping.rb +42 -0
  21. data/lib/action_controller/deprecated.rb +5 -0
  22. data/lib/action_controller/deprecated/dispatcher.rb +28 -0
  23. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  24. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  25. data/lib/action_controller/metal.rb +125 -0
  26. data/lib/action_controller/metal/compatibility.rb +141 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +17 -0
  30. data/lib/action_controller/metal/exceptions.rb +46 -0
  31. data/lib/action_controller/metal/flash.rb +28 -0
  32. data/lib/action_controller/metal/head.rb +33 -0
  33. data/lib/action_controller/metal/helpers.rb +116 -0
  34. data/lib/action_controller/metal/hide_actions.rb +50 -0
  35. data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
  36. data/lib/action_controller/metal/instrumentation.rb +99 -0
  37. data/lib/action_controller/metal/mime_responds.rb +300 -0
  38. data/lib/action_controller/metal/rack_delegation.rb +35 -0
  39. data/lib/action_controller/metal/redirecting.rb +90 -0
  40. data/lib/action_controller/metal/renderers.rb +95 -0
  41. data/lib/action_controller/metal/rendering.rb +69 -0
  42. data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
  43. data/lib/action_controller/metal/rescue.rb +13 -0
  44. data/lib/action_controller/metal/responder.rb +220 -0
  45. data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
  46. data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
  47. data/lib/action_controller/metal/testing.rb +42 -0
  48. data/lib/action_controller/metal/url_for.rb +157 -0
  49. data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
  50. data/lib/action_controller/middleware.rb +38 -0
  51. data/lib/action_controller/polymorphic_routes.rb +20 -26
  52. data/lib/action_controller/railtie.rb +30 -0
  53. data/lib/action_controller/railties/subscriber.rb +63 -0
  54. data/lib/action_controller/record_identifier.rb +3 -16
  55. data/lib/action_controller/test_case.rb +156 -18
  56. data/lib/action_controller/url_rewriter.rb +47 -200
  57. data/lib/action_controller/vendor/html-scanner.rb +16 -12
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  59. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
  60. data/lib/action_dispatch.rb +88 -0
  61. data/lib/action_dispatch/http/cache.rb +123 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +98 -0
  63. data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
  64. data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
  65. data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
  66. data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
  67. data/lib/action_dispatch/http/parameters.rb +49 -0
  68. data/lib/action_dispatch/http/request.rb +223 -0
  69. data/lib/action_dispatch/http/response.rb +209 -0
  70. data/lib/action_dispatch/http/upload.rb +48 -0
  71. data/lib/action_dispatch/http/url.rb +129 -0
  72. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  73. data/lib/action_dispatch/middleware/cascade.rb +29 -0
  74. data/lib/action_dispatch/middleware/cookies.rb +216 -0
  75. data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
  76. data/lib/action_dispatch/middleware/head.rb +18 -0
  77. data/lib/action_dispatch/middleware/params_parser.rb +78 -0
  78. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  79. data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
  80. data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
  81. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  82. data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
  83. data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
  84. data/lib/action_dispatch/middleware/static.rb +44 -0
  85. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
  86. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
  89. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
  90. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
  91. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
  92. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
  93. data/lib/action_dispatch/railtie.rb +15 -0
  94. data/lib/action_dispatch/routing.rb +217 -0
  95. data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
  96. data/lib/action_dispatch/routing/mapper.rb +649 -0
  97. data/lib/action_dispatch/routing/route.rb +55 -0
  98. data/lib/action_dispatch/routing/route_set.rb +445 -0
  99. data/lib/action_dispatch/testing/assertions.rb +21 -0
  100. data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
  101. data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
  102. data/lib/action_dispatch/testing/assertions/response.rb +154 -0
  103. data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
  104. data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
  105. data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
  106. data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
  107. data/lib/action_dispatch/testing/performance_test.rb +17 -0
  108. data/lib/action_dispatch/testing/test_process.rb +42 -0
  109. data/lib/action_dispatch/testing/test_request.rb +83 -0
  110. data/lib/action_dispatch/testing/test_response.rb +136 -0
  111. data/lib/action_pack/version.rb +3 -3
  112. data/lib/action_view.rb +29 -26
  113. data/lib/action_view/base.rb +101 -148
  114. data/lib/action_view/context.rb +44 -0
  115. data/lib/action_view/helpers.rb +6 -4
  116. data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
  117. data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
  118. data/lib/action_view/helpers/cache_helper.rb +1 -1
  119. data/lib/action_view/helpers/capture_helper.rb +40 -8
  120. data/lib/action_view/helpers/csrf_helper.rb +2 -4
  121. data/lib/action_view/helpers/date_helper.rb +14 -15
  122. data/lib/action_view/helpers/form_helper.rb +121 -24
  123. data/lib/action_view/helpers/form_options_helper.rb +26 -25
  124. data/lib/action_view/helpers/form_tag_helper.rb +42 -33
  125. data/lib/action_view/helpers/javascript_helper.rb +1 -109
  126. data/lib/action_view/helpers/number_helper.rb +4 -1
  127. data/lib/action_view/helpers/prototype_helper.rb +75 -499
  128. data/lib/action_view/helpers/raw_output_helper.rb +1 -1
  129. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  130. data/lib/action_view/helpers/sanitize_helper.rb +3 -2
  131. data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
  132. data/lib/action_view/helpers/tag_helper.rb +12 -13
  133. data/lib/action_view/helpers/text_helper.rb +33 -38
  134. data/lib/action_view/helpers/translation_helper.rb +11 -35
  135. data/lib/action_view/helpers/url_helper.rb +140 -134
  136. data/lib/action_view/locale/en.yml +34 -28
  137. data/lib/action_view/paths.rb +27 -24
  138. data/lib/action_view/railtie.rb +17 -0
  139. data/lib/action_view/railties/subscriber.rb +24 -0
  140. data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
  141. data/lib/action_view/render/rendering.rb +117 -0
  142. data/lib/action_view/template.rb +88 -217
  143. data/lib/action_view/template/error.rb +105 -0
  144. data/lib/action_view/template/handler.rb +41 -0
  145. data/lib/action_view/template/handlers.rb +54 -0
  146. data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
  147. data/lib/action_view/template/handlers/erb.rb +58 -0
  148. data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
  149. data/lib/action_view/template/resolver.rb +164 -0
  150. data/lib/action_view/template/text.rb +40 -0
  151. data/lib/action_view/test_case.rb +18 -18
  152. metadata +165 -420
  153. data/RUNNING_UNIT_TESTS +0 -24
  154. data/Rakefile +0 -158
  155. data/install.rb +0 -30
  156. data/lib/action_controller/assertions/dom_assertions.rb +0 -55
  157. data/lib/action_controller/assertions/response_assertions.rb +0 -169
  158. data/lib/action_controller/benchmarking.rb +0 -107
  159. data/lib/action_controller/caching/sweeper.rb +0 -45
  160. data/lib/action_controller/cgi_ext.rb +0 -15
  161. data/lib/action_controller/cgi_ext/cookie.rb +0 -112
  162. data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
  163. data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
  164. data/lib/action_controller/cgi_process.rb +0 -77
  165. data/lib/action_controller/cookies.rb +0 -197
  166. data/lib/action_controller/dispatcher.rb +0 -133
  167. data/lib/action_controller/failsafe.rb +0 -87
  168. data/lib/action_controller/filters.rb +0 -680
  169. data/lib/action_controller/helpers.rb +0 -225
  170. data/lib/action_controller/layout.rb +0 -286
  171. data/lib/action_controller/middlewares.rb +0 -14
  172. data/lib/action_controller/mime_responds.rb +0 -193
  173. data/lib/action_controller/params_parser.rb +0 -77
  174. data/lib/action_controller/performance_test.rb +0 -15
  175. data/lib/action_controller/rack_lint_patch.rb +0 -36
  176. data/lib/action_controller/reloader.rb +0 -54
  177. data/lib/action_controller/request.rb +0 -518
  178. data/lib/action_controller/request_forgery_protection.rb +0 -116
  179. data/lib/action_controller/rescue.rb +0 -183
  180. data/lib/action_controller/resources.rb +0 -682
  181. data/lib/action_controller/response.rb +0 -237
  182. data/lib/action_controller/routing.rb +0 -388
  183. data/lib/action_controller/routing/builder.rb +0 -197
  184. data/lib/action_controller/routing/optimisations.rb +0 -130
  185. data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
  186. data/lib/action_controller/routing/route.rb +0 -265
  187. data/lib/action_controller/routing/route_set.rb +0 -503
  188. data/lib/action_controller/routing/routing_ext.rb +0 -49
  189. data/lib/action_controller/routing/segments.rb +0 -343
  190. data/lib/action_controller/session/abstract_store.rb +0 -276
  191. data/lib/action_controller/session/mem_cache_store.rb +0 -60
  192. data/lib/action_controller/status_codes.rb +0 -88
  193. data/lib/action_controller/string_coercion.rb +0 -29
  194. data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
  195. data/lib/action_controller/test_process.rb +0 -580
  196. data/lib/action_controller/uploaded_file.rb +0 -44
  197. data/lib/action_view/helpers/benchmark_helper.rb +0 -54
  198. data/lib/action_view/inline_template.rb +0 -19
  199. data/lib/action_view/reloadable_template.rb +0 -117
  200. data/lib/action_view/renderable.rb +0 -109
  201. data/lib/action_view/renderable_partial.rb +0 -53
  202. data/lib/action_view/template_error.rb +0 -99
  203. data/lib/action_view/template_handler.rb +0 -34
  204. data/lib/action_view/template_handlers.rb +0 -48
  205. data/lib/action_view/template_handlers/erb.rb +0 -25
  206. data/lib/actionpack.rb +0 -2
  207. data/test/abstract_unit.rb +0 -78
  208. data/test/active_record_unit.rb +0 -104
  209. data/test/activerecord/active_record_store_test.rb +0 -221
  210. data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
  211. data/test/adv_attr_test.rb +0 -20
  212. data/test/controller/action_pack_assertions_test.rb +0 -545
  213. data/test/controller/addresses_render_test.rb +0 -37
  214. data/test/controller/assert_select_test.rb +0 -735
  215. data/test/controller/base_test.rb +0 -217
  216. data/test/controller/benchmark_test.rb +0 -32
  217. data/test/controller/caching_test.rb +0 -743
  218. data/test/controller/capture_test.rb +0 -66
  219. data/test/controller/content_type_test.rb +0 -178
  220. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  221. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  222. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  223. data/test/controller/cookie_test.rb +0 -208
  224. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
  225. data/test/controller/dispatcher_test.rb +0 -144
  226. data/test/controller/dom_assertions_test.rb +0 -53
  227. data/test/controller/failsafe_test.rb +0 -60
  228. data/test/controller/fake_controllers.rb +0 -33
  229. data/test/controller/fake_models.rb +0 -19
  230. data/test/controller/filter_params_test.rb +0 -52
  231. data/test/controller/filters_test.rb +0 -885
  232. data/test/controller/flash_test.rb +0 -174
  233. data/test/controller/header_test.rb +0 -14
  234. data/test/controller/helper_test.rb +0 -224
  235. data/test/controller/html-scanner/cdata_node_test.rb +0 -15
  236. data/test/controller/html-scanner/document_test.rb +0 -148
  237. data/test/controller/html-scanner/node_test.rb +0 -89
  238. data/test/controller/html-scanner/sanitizer_test.rb +0 -300
  239. data/test/controller/html-scanner/tag_node_test.rb +0 -238
  240. data/test/controller/html-scanner/text_node_test.rb +0 -50
  241. data/test/controller/html-scanner/tokenizer_test.rb +0 -131
  242. data/test/controller/http_basic_authentication_test.rb +0 -113
  243. data/test/controller/http_digest_authentication_test.rb +0 -254
  244. data/test/controller/integration_test.rb +0 -526
  245. data/test/controller/layout_test.rb +0 -215
  246. data/test/controller/localized_templates_test.rb +0 -24
  247. data/test/controller/logging_test.rb +0 -46
  248. data/test/controller/middleware_stack_test.rb +0 -90
  249. data/test/controller/mime_responds_test.rb +0 -536
  250. data/test/controller/mime_type_test.rb +0 -93
  251. data/test/controller/output_escaping_test.rb +0 -19
  252. data/test/controller/polymorphic_routes_test.rb +0 -297
  253. data/test/controller/rack_test.rb +0 -308
  254. data/test/controller/record_identifier_test.rb +0 -139
  255. data/test/controller/redirect_test.rb +0 -285
  256. data/test/controller/reloader_test.rb +0 -125
  257. data/test/controller/render_test.rb +0 -1783
  258. data/test/controller/request/json_params_parsing_test.rb +0 -65
  259. data/test/controller/request/multipart_params_parsing_test.rb +0 -177
  260. data/test/controller/request/query_string_parsing_test.rb +0 -129
  261. data/test/controller/request/test_request_test.rb +0 -35
  262. data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
  263. data/test/controller/request/xml_params_parsing_test.rb +0 -103
  264. data/test/controller/request_forgery_protection_test.rb +0 -233
  265. data/test/controller/request_test.rb +0 -398
  266. data/test/controller/rescue_test.rb +0 -541
  267. data/test/controller/resources_test.rb +0 -1393
  268. data/test/controller/routing_test.rb +0 -2592
  269. data/test/controller/selector_test.rb +0 -628
  270. data/test/controller/send_file_test.rb +0 -171
  271. data/test/controller/session/abstract_store_test.rb +0 -64
  272. data/test/controller/session/cookie_store_test.rb +0 -354
  273. data/test/controller/session/mem_cache_store_test.rb +0 -187
  274. data/test/controller/session/test_session_test.rb +0 -58
  275. data/test/controller/test_test.rb +0 -700
  276. data/test/controller/translation_test.rb +0 -26
  277. data/test/controller/url_rewriter_test.rb +0 -395
  278. data/test/controller/verification_test.rb +0 -270
  279. data/test/controller/view_paths_test.rb +0 -141
  280. data/test/controller/webservice_test.rb +0 -273
  281. data/test/fixtures/_top_level_partial.html.erb +0 -1
  282. data/test/fixtures/_top_level_partial_only.erb +0 -1
  283. data/test/fixtures/addresses/list.erb +0 -1
  284. data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
  285. data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
  286. data/test/fixtures/companies.yml +0 -24
  287. data/test/fixtures/company.rb +0 -10
  288. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
  289. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
  290. data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
  291. data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
  292. data/test/fixtures/customers/_customer.html.erb +0 -1
  293. data/test/fixtures/db_definitions/sqlite.sql +0 -49
  294. data/test/fixtures/developer.rb +0 -9
  295. data/test/fixtures/developers.yml +0 -21
  296. data/test/fixtures/developers/_developer.erb +0 -1
  297. data/test/fixtures/developers_projects.yml +0 -13
  298. data/test/fixtures/failsafe/500.html +0 -1
  299. data/test/fixtures/fun/games/_game.erb +0 -1
  300. data/test/fixtures/fun/games/hello_world.erb +0 -1
  301. data/test/fixtures/fun/serious/games/_game.erb +0 -1
  302. data/test/fixtures/functional_caching/_partial.erb +0 -3
  303. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
  304. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
  305. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
  306. data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
  307. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
  308. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
  309. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
  310. data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
  311. data/test/fixtures/helpers/abc_helper.rb +0 -5
  312. data/test/fixtures/helpers/fun/games_helper.rb +0 -3
  313. data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
  314. data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
  315. data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
  316. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  317. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
  318. data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
  319. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
  320. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
  321. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
  322. data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
  323. data/test/fixtures/layouts/_column.html.erb +0 -2
  324. data/test/fixtures/layouts/block_with_layout.erb +0 -3
  325. data/test/fixtures/layouts/builder.builder +0 -3
  326. data/test/fixtures/layouts/default_html.html.erb +0 -1
  327. data/test/fixtures/layouts/partial_with_layout.erb +0 -3
  328. data/test/fixtures/layouts/standard.erb +0 -1
  329. data/test/fixtures/layouts/talk_from_action.erb +0 -2
  330. data/test/fixtures/layouts/xhr.html.erb +0 -2
  331. data/test/fixtures/layouts/yield.erb +0 -2
  332. data/test/fixtures/localized/hello_world.de.html +0 -1
  333. data/test/fixtures/localized/hello_world.en.html +0 -1
  334. data/test/fixtures/mascot.rb +0 -3
  335. data/test/fixtures/mascots.yml +0 -4
  336. data/test/fixtures/mascots/_mascot.html.erb +0 -1
  337. data/test/fixtures/multipart/binary_file +0 -0
  338. data/test/fixtures/multipart/boundary_problem_file +0 -10
  339. data/test/fixtures/multipart/bracketed_param +0 -5
  340. data/test/fixtures/multipart/empty +0 -10
  341. data/test/fixtures/multipart/hello.txt +0 -1
  342. data/test/fixtures/multipart/large_text_file +0 -10
  343. data/test/fixtures/multipart/mixed_files +0 -0
  344. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  345. data/test/fixtures/multipart/none +0 -9
  346. data/test/fixtures/multipart/single_parameter +0 -5
  347. data/test/fixtures/multipart/text_file +0 -10
  348. data/test/fixtures/override/test/hello_world.erb +0 -1
  349. data/test/fixtures/override2/layouts/test/sub.erb +0 -1
  350. data/test/fixtures/post_test/layouts/post.html.erb +0 -1
  351. data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
  352. data/test/fixtures/post_test/post/index.html.erb +0 -1
  353. data/test/fixtures/post_test/post/index.iphone.erb +0 -1
  354. data/test/fixtures/post_test/super_post/index.html.erb +0 -1
  355. data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
  356. data/test/fixtures/project.rb +0 -3
  357. data/test/fixtures/projects.yml +0 -7
  358. data/test/fixtures/projects/_project.erb +0 -1
  359. data/test/fixtures/public/404.html +0 -1
  360. data/test/fixtures/public/500.da.html +0 -1
  361. data/test/fixtures/public/500.html +0 -1
  362. data/test/fixtures/public/absolute/test.css +0 -23
  363. data/test/fixtures/public/absolute/test.js +0 -63
  364. data/test/fixtures/public/images/rails.png +0 -0
  365. data/test/fixtures/public/javascripts/application.js +0 -1
  366. data/test/fixtures/public/javascripts/bank.js +0 -1
  367. data/test/fixtures/public/javascripts/controls.js +0 -1
  368. data/test/fixtures/public/javascripts/dragdrop.js +0 -1
  369. data/test/fixtures/public/javascripts/effects.js +0 -1
  370. data/test/fixtures/public/javascripts/prototype.js +0 -1
  371. data/test/fixtures/public/javascripts/robber.js +0 -1
  372. data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
  373. data/test/fixtures/public/javascripts/version.1.0.js +0 -1
  374. data/test/fixtures/public/stylesheets/bank.css +0 -1
  375. data/test/fixtures/public/stylesheets/robber.css +0 -1
  376. data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
  377. data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
  378. data/test/fixtures/quiz/questions/_question.html.erb +0 -1
  379. data/test/fixtures/replies.yml +0 -15
  380. data/test/fixtures/replies/_reply.erb +0 -1
  381. data/test/fixtures/reply.rb +0 -7
  382. data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
  383. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
  384. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
  385. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
  386. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
  387. data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
  388. data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
  389. data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
  390. data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
  391. data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
  392. data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
  393. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
  394. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
  395. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
  396. data/test/fixtures/scope/test/modgreet.erb +0 -1
  397. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
  398. data/test/fixtures/shared.html.erb +0 -1
  399. data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
  400. data/test/fixtures/test/_counter.html.erb +0 -1
  401. data/test/fixtures/test/_customer.erb +0 -1
  402. data/test/fixtures/test/_customer_counter.erb +0 -1
  403. data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
  404. data/test/fixtures/test/_customer_greeting.erb +0 -1
  405. data/test/fixtures/test/_customer_with_var.erb +0 -1
  406. data/test/fixtures/test/_form.erb +0 -1
  407. data/test/fixtures/test/_from_helper.erb +0 -1
  408. data/test/fixtures/test/_hash_greeting.erb +0 -1
  409. data/test/fixtures/test/_hash_object.erb +0 -2
  410. data/test/fixtures/test/_hello.builder +0 -1
  411. data/test/fixtures/test/_labelling_form.erb +0 -1
  412. data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
  413. data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
  414. data/test/fixtures/test/_local_inspector.html.erb +0 -1
  415. data/test/fixtures/test/_one.html.erb +0 -1
  416. data/test/fixtures/test/_partial.erb +0 -1
  417. data/test/fixtures/test/_partial.html.erb +0 -1
  418. data/test/fixtures/test/_partial.js.erb +0 -1
  419. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
  420. data/test/fixtures/test/_partial_only.erb +0 -1
  421. data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
  422. data/test/fixtures/test/_person.erb +0 -2
  423. data/test/fixtures/test/_raise.html.erb +0 -1
  424. data/test/fixtures/test/_two.html.erb +0 -1
  425. data/test/fixtures/test/_utf8_partial.html.erb +0 -1
  426. data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
  427. data/test/fixtures/test/action_talk_to_layout.erb +0 -2
  428. data/test/fixtures/test/array_translation.erb +0 -1
  429. data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
  430. data/test/fixtures/test/capturing.erb +0 -4
  431. data/test/fixtures/test/content_for.erb +0 -2
  432. data/test/fixtures/test/content_for_concatenated.erb +0 -3
  433. data/test/fixtures/test/content_for_with_parameter.erb +0 -2
  434. data/test/fixtures/test/delete_with_js.rjs +0 -2
  435. data/test/fixtures/test/dont_pick_me +0 -1
  436. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
  437. data/test/fixtures/test/enum_rjs_test.rjs +0 -6
  438. data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
  439. data/test/fixtures/test/formatted_xml_erb.builder +0 -1
  440. data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
  441. data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
  442. data/test/fixtures/test/greeting.erb +0 -1
  443. data/test/fixtures/test/greeting.js.rjs +0 -1
  444. data/test/fixtures/test/hello.builder +0 -4
  445. data/test/fixtures/test/hello_world.da.html.erb +0 -1
  446. data/test/fixtures/test/hello_world.erb +0 -1
  447. data/test/fixtures/test/hello_world.erb~ +0 -1
  448. data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
  449. data/test/fixtures/test/hello_world_container.builder +0 -3
  450. data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
  451. data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
  452. data/test/fixtures/test/hello_xml_world.builder +0 -11
  453. data/test/fixtures/test/hyphen-ated.erb +0 -1
  454. data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
  455. data/test/fixtures/test/list.erb +0 -1
  456. data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
  457. data/test/fixtures/test/malformed/malformed.erb~ +0 -1
  458. data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
  459. data/test/fixtures/test/nested_layout.erb +0 -3
  460. data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
  461. data/test/fixtures/test/potential_conflicts.erb +0 -4
  462. data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
  463. data/test/fixtures/test/render_file_from_template.html.erb +0 -1
  464. data/test/fixtures/test/render_file_with_ivar.erb +0 -1
  465. data/test/fixtures/test/render_file_with_locals.erb +0 -1
  466. data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
  467. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
  468. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
  469. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
  470. data/test/fixtures/test/render_to_string_test.erb +0 -1
  471. data/test/fixtures/test/scoped_array_translation.erb +0 -1
  472. data/test/fixtures/test/sub_template_raise.html.erb +0 -1
  473. data/test/fixtures/test/template.erb +0 -1
  474. data/test/fixtures/test/translation.erb +0 -1
  475. data/test/fixtures/test/update_element_with_capture.erb +0 -9
  476. data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
  477. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
  478. data/test/fixtures/test/utf8.html.erb +0 -4
  479. data/test/fixtures/test/utf8_magic.html.erb +0 -5
  480. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
  481. data/test/fixtures/topic.rb +0 -3
  482. data/test/fixtures/topics.yml +0 -22
  483. data/test/fixtures/topics/_topic.html.erb +0 -1
  484. data/test/template/active_record_helper_i18n_test.rb +0 -51
  485. data/test/template/active_record_helper_test.rb +0 -302
  486. data/test/template/asset_tag_helper_test.rb +0 -770
  487. data/test/template/atom_feed_helper_test.rb +0 -315
  488. data/test/template/benchmark_helper_test.rb +0 -86
  489. data/test/template/compiled_templates_test.rb +0 -204
  490. data/test/template/date_helper_i18n_test.rb +0 -121
  491. data/test/template/date_helper_test.rb +0 -2603
  492. data/test/template/erb_util_test.rb +0 -36
  493. data/test/template/form_helper_test.rb +0 -1447
  494. data/test/template/form_options_helper_i18n_test.rb +0 -27
  495. data/test/template/form_options_helper_test.rb +0 -811
  496. data/test/template/form_tag_helper_test.rb +0 -356
  497. data/test/template/javascript_helper_test.rb +0 -106
  498. data/test/template/number_helper_i18n_test.rb +0 -69
  499. data/test/template/number_helper_test.rb +0 -132
  500. data/test/template/prototype_helper_test.rb +0 -639
  501. data/test/template/raw_output_helper_test.rb +0 -21
  502. data/test/template/record_tag_helper_test.rb +0 -58
  503. data/test/template/render_test.rb +0 -329
  504. data/test/template/sanitize_helper_test.rb +0 -57
  505. data/test/template/scriptaculous_helper_test.rb +0 -90
  506. data/test/template/tag_helper_test.rb +0 -98
  507. data/test/template/template_test.rb +0 -32
  508. data/test/template/test_test.rb +0 -54
  509. data/test/template/text_helper_test.rb +0 -601
  510. data/test/template/translation_helper_test.rb +0 -95
  511. data/test/template/url_helper_test.rb +0 -641
  512. data/test/testing_sandbox.rb +0 -15
  513. data/test/view/test_case_test.rb +0 -176
@@ -1,89 +0,0 @@
1
- require 'abstract_unit'
2
-
3
- class NodeTest < Test::Unit::TestCase
4
-
5
- class MockNode
6
- def initialize(matched, value)
7
- @matched = matched
8
- @value = value
9
- end
10
-
11
- def find(conditions)
12
- @matched && self
13
- end
14
-
15
- def to_s
16
- @value.to_s
17
- end
18
- end
19
-
20
- def setup
21
- @node = HTML::Node.new("parent")
22
- @node.children.concat [MockNode.new(false,1), MockNode.new(true,"two"), MockNode.new(false,:three)]
23
- end
24
-
25
- def test_match
26
- assert !@node.match("foo")
27
- end
28
-
29
- def test_tag
30
- assert !@node.tag?
31
- end
32
-
33
- def test_to_s
34
- assert_equal "1twothree", @node.to_s
35
- end
36
-
37
- def test_find
38
- assert_equal "two", @node.find('blah').to_s
39
- end
40
-
41
- def test_parse_strict
42
- s = "<b foo='hello'' bar='baz'>"
43
- assert_raise(RuntimeError) { HTML::Node.parse(nil,0,0,s) }
44
- end
45
-
46
- def test_parse_relaxed
47
- s = "<b foo='hello'' bar='baz'>"
48
- node = nil
49
- assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
50
- assert node.attributes.has_key?("foo")
51
- assert !node.attributes.has_key?("bar")
52
- end
53
-
54
- def test_to_s_with_boolean_attrs
55
- s = "<b foo bar>"
56
- node = HTML::Node.parse(nil,0,0,s)
57
- assert node.attributes.has_key?("foo")
58
- assert node.attributes.has_key?("bar")
59
- assert "<b foo bar>", node.to_s
60
- end
61
-
62
- def test_parse_with_unclosed_tag
63
- s = "<span onmouseover='bang'"
64
- node = nil
65
- assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
66
- assert node.attributes.has_key?("onmouseover")
67
- end
68
-
69
- def test_parse_with_valid_cdata_section
70
- s = "<![CDATA[<span>contents</span>]]>"
71
- node = nil
72
- assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
73
- assert_kind_of HTML::CDATA, node
74
- assert_equal '<span>contents</span>', node.content
75
- end
76
-
77
- def test_parse_strict_with_unterminated_cdata_section
78
- s = "<![CDATA[neverending..."
79
- assert_raise(RuntimeError) { HTML::Node.parse(nil,0,0,s) }
80
- end
81
-
82
- def test_parse_relaxed_with_unterminated_cdata_section
83
- s = "<![CDATA[neverending..."
84
- node = nil
85
- assert_nothing_raised { node = HTML::Node.parse(nil,0,0,s,false) }
86
- assert_kind_of HTML::CDATA, node
87
- assert_equal 'neverending...', node.content
88
- end
89
- end
@@ -1,300 +0,0 @@
1
- require 'abstract_unit'
2
-
3
- class SanitizerTest < ActionController::TestCase
4
- def setup
5
- @sanitizer = nil # used by assert_sanitizer
6
- end
7
-
8
- def test_strip_tags_with_quote
9
- sanitizer = HTML::FullSanitizer.new
10
- string = '<" <img src="trollface.gif" onload="alert(1)"> hi'
11
-
12
- assert_equal ' hi', sanitizer.sanitize(string)
13
- end
14
-
15
- def test_strip_tags
16
- sanitizer = HTML::FullSanitizer.new
17
- assert_equal("<<<bad html", sanitizer.sanitize("<<<bad html"))
18
- assert_equal("<<", sanitizer.sanitize("<<<bad html>"))
19
- assert_equal("Dont touch me", sanitizer.sanitize("Dont touch me"))
20
- assert_equal("This is a test.", sanitizer.sanitize("<p>This <u>is<u> a <a href='test.html'><strong>test</strong></a>.</p>"))
21
- assert_equal("Weirdos", sanitizer.sanitize("Wei<<a>a onclick='alert(document.cookie);'</a>/>rdos"))
22
- assert_equal("This is a test.", sanitizer.sanitize("This is a test."))
23
- assert_equal(
24
- %{This is a test.\n\n\nIt no longer contains any HTML.\n}, sanitizer.sanitize(
25
- %{<title>This is <b>a <a href="" target="_blank">test</a></b>.</title>\n\n<!-- it has a comment -->\n\n<p>It no <b>longer <strong>contains <em>any <strike>HTML</strike></em>.</strong></b></p>\n}))
26
- assert_equal "This has a here.", sanitizer.sanitize("This has a <!-- comment --> here.")
27
- assert_equal "This has a here.", sanitizer.sanitize("This has a <![CDATA[<section>]]> here.")
28
- assert_equal "This has an unclosed ", sanitizer.sanitize("This has an unclosed <![CDATA[<section>]] here...")
29
- assert_equal "non printable char is a tag", sanitizer.sanitize("<\x07a href='/hello'>non printable char is a tag</a>")
30
- [nil, '', ' '].each { |blank| assert_equal blank, sanitizer.sanitize(blank) }
31
- end
32
-
33
- def test_strip_links
34
- sanitizer = HTML::LinkSanitizer.new
35
- assert_equal "Dont touch me", sanitizer.sanitize("Dont touch me")
36
- assert_equal "on my mind\nall day long", sanitizer.sanitize("<a href='almost'>on my mind</a>\n<A href='almost'>all day long</A>")
37
- assert_equal "0wn3d", sanitizer.sanitize("<a href='http://www.rubyonrails.com/'><a href='http://www.rubyonrails.com/' onlclick='steal()'>0wn3d</a></a>")
38
- assert_equal "Magic", sanitizer.sanitize("<a href='http://www.rubyonrails.com/'>Mag<a href='http://www.ruby-lang.org/'>ic")
39
- assert_equal "FrrFox", sanitizer.sanitize("<href onlclick='steal()'>FrrFox</a></href>")
40
- assert_equal "My mind\nall <b>day</b> long", sanitizer.sanitize("<a href='almost'>My mind</a>\n<A href='almost'>all <b>day</b> long</A>")
41
- assert_equal "all <b>day</b> long", sanitizer.sanitize("<<a>a href='hello'>all <b>day</b> long<</A>/a>")
42
-
43
- assert_equal "<a<a", sanitizer.sanitize("<a<a")
44
- end
45
-
46
- def test_sanitize_form
47
- assert_sanitized "<form action=\"/foo/bar\" method=\"post\"><input></form>", ''
48
- end
49
-
50
- def test_sanitize_plaintext
51
- raw = "<plaintext><span>foo</span></plaintext>"
52
- assert_sanitized raw, "<span>foo</span>"
53
- end
54
-
55
- def test_sanitize_script
56
- assert_sanitized "a b c<script language=\"Javascript\">blah blah blah</script>d e f", "a b cd e f"
57
- end
58
-
59
- # fucked
60
- def test_sanitize_js_handlers
61
- raw = %{onthis="do that" <a href="#" onclick="hello" name="foo" onbogus="remove me">hello</a>}
62
- assert_sanitized raw, %{onthis="do that" <a name="foo" href="#">hello</a>}
63
- end
64
-
65
- def test_sanitize_javascript_href
66
- raw = %{href="javascript:bang" <a href="javascript:bang" name="hello">foo</a>, <span href="javascript:bang">bar</span>}
67
- assert_sanitized raw, %{href="javascript:bang" <a name="hello">foo</a>, <span>bar</span>}
68
- end
69
-
70
- def test_sanitize_image_src
71
- raw = %{src="javascript:bang" <img src="javascript:bang" width="5">foo</img>, <span src="javascript:bang">bar</span>}
72
- assert_sanitized raw, %{src="javascript:bang" <img width="5">foo</img>, <span>bar</span>}
73
- end
74
-
75
- HTML::WhiteListSanitizer.allowed_tags.each do |tag_name|
76
- define_method "test_should_allow_#{tag_name}_tag" do
77
- assert_sanitized "start <#{tag_name} title=\"1\" onclick=\"foo\">foo <bad>bar</bad> baz</#{tag_name}> end", %(start <#{tag_name} title="1">foo bar baz</#{tag_name}> end)
78
- end
79
- end
80
-
81
- def test_should_allow_anchors
82
- assert_sanitized %(<a href="foo" onclick="bar"><script>baz</script></a>), %(<a href="foo"></a>)
83
- end
84
-
85
- # RFC 3986, sec 4.2
86
- def test_allow_colons_in_path_component
87
- assert_sanitized("<a href=\"./this:that\">foo</a>")
88
- end
89
-
90
- %w(src width height alt).each do |img_attr|
91
- define_method "test_should_allow_image_#{img_attr}_attribute" do
92
- assert_sanitized %(<img #{img_attr}="foo" onclick="bar" />), %(<img #{img_attr}="foo" />)
93
- end
94
- end
95
-
96
- def test_should_handle_non_html
97
- assert_sanitized 'abc'
98
- end
99
-
100
- def test_should_handle_blank_text
101
- assert_sanitized nil
102
- assert_sanitized ''
103
- end
104
-
105
- def test_should_allow_custom_tags
106
- text = "<u>foo</u>"
107
- sanitizer = HTML::WhiteListSanitizer.new
108
- assert_equal(text, sanitizer.sanitize(text, :tags => %w(u)))
109
- end
110
-
111
- def test_should_allow_only_custom_tags
112
- text = "<u>foo</u> with <i>bar</i>"
113
- sanitizer = HTML::WhiteListSanitizer.new
114
- assert_equal("<u>foo</u> with bar", sanitizer.sanitize(text, :tags => %w(u)))
115
- end
116
-
117
- def test_should_allow_custom_tags_with_attributes
118
- text = %(<blockquote cite="http://example.com/">foo</blockquote>)
119
- sanitizer = HTML::WhiteListSanitizer.new
120
- assert_equal(text, sanitizer.sanitize(text))
121
- end
122
-
123
- def test_should_allow_custom_tags_with_custom_attributes
124
- text = %(<blockquote foo="bar">Lorem ipsum</blockquote>)
125
- sanitizer = HTML::WhiteListSanitizer.new
126
- assert_equal(text, sanitizer.sanitize(text, :attributes => ['foo']))
127
- end
128
-
129
- [%w(img src), %w(a href)].each do |(tag, attr)|
130
- define_method "test_should_strip_#{attr}_attribute_in_#{tag}_with_bad_protocols" do
131
- assert_sanitized %(<#{tag} #{attr}="javascript:bang" title="1">boo</#{tag}>), %(<#{tag} title="1">boo</#{tag}>)
132
- end
133
- end
134
-
135
- def test_should_flag_bad_protocols
136
- sanitizer = HTML::WhiteListSanitizer.new
137
- %w(about chrome data disk hcp help javascript livescript lynxcgi lynxexec ms-help ms-its mhtml mocha opera res resource shell vbscript view-source vnd.ms.radio wysiwyg).each do |proto|
138
- assert sanitizer.send(:contains_bad_protocols?, 'src', "#{proto}://bad")
139
- end
140
- end
141
-
142
- def test_should_accept_good_protocols
143
- sanitizer = HTML::WhiteListSanitizer.new
144
- HTML::WhiteListSanitizer.allowed_protocols.each do |proto|
145
- assert !sanitizer.send(:contains_bad_protocols?, 'src', "#{proto}://good")
146
- end
147
- end
148
-
149
- def test_should_reject_hex_codes_in_protocol
150
- assert_sanitized %(<a href="&#37;6A&#37;61&#37;76&#37;61&#37;73&#37;63&#37;72&#37;69&#37;70&#37;74&#37;3A&#37;61&#37;6C&#37;65&#37;72&#37;74&#37;28&#37;22&#37;58&#37;53&#37;53&#37;22&#37;29">1</a>), "<a>1</a>"
151
- assert @sanitizer.send(:contains_bad_protocols?, 'src', "%6A%61%76%61%73%63%72%69%70%74%3A%61%6C%65%72%74%28%22%58%53%53%22%29")
152
- end
153
-
154
- def test_should_block_script_tag
155
- assert_sanitized %(<SCRIPT\nSRC=http://ha.ckers.org/xss.js></SCRIPT>), ""
156
- end
157
-
158
- [%(<IMG SRC="javascript:alert('XSS');">),
159
- %(<IMG SRC=javascript:alert('XSS')>),
160
- %(<IMG SRC=JaVaScRiPt:alert('XSS')>),
161
- %(<IMG """><SCRIPT>alert("XSS")</SCRIPT>">),
162
- %(<IMG SRC=javascript:alert(&quot;XSS&quot;)>),
163
- %(<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>),
164
- %(<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>),
165
- %(<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>),
166
- %(<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>),
167
- %(<IMG SRC="jav\tascript:alert('XSS');">),
168
- %(<IMG SRC="jav&#x09;ascript:alert('XSS');">),
169
- %(<IMG SRC="jav&#x0A;ascript:alert('XSS');">),
170
- %(<IMG SRC="jav&#x0D;ascript:alert('XSS');">),
171
- %(<IMG SRC=" &#14; javascript:alert('XSS');">),
172
- %(<IMG SRC="javascript&#x3a;alert('XSS');">),
173
- %(<IMG SRC=`javascript:alert("RSnake says, 'XSS'")`>)].each_with_index do |img_hack, i|
174
- define_method "test_should_not_fall_for_xss_image_hack_#{i+1}" do
175
- assert_sanitized img_hack, "<img>"
176
- end
177
- end
178
-
179
- def test_should_sanitize_tag_broken_up_by_null
180
- assert_sanitized %(<SCR\0IPT>alert(\"XSS\")</SCR\0IPT>), "alert(\"XSS\")"
181
- end
182
-
183
- def test_should_sanitize_invalid_script_tag
184
- assert_sanitized %(<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>), ""
185
- end
186
-
187
- def test_should_sanitize_script_tag_with_multiple_open_brackets
188
- assert_sanitized %(<<SCRIPT>alert("XSS");//<</SCRIPT>), "&lt;"
189
- assert_sanitized %(<iframe src=http://ha.ckers.org/scriptlet.html\n<a), %(&lt;a)
190
- end
191
-
192
- def test_should_sanitize_unclosed_script
193
- assert_sanitized %(<SCRIPT SRC=http://ha.ckers.org/xss.js?<B>), "<b>"
194
- end
195
-
196
- def test_should_sanitize_half_open_scripts
197
- assert_sanitized %(<IMG SRC="javascript:alert('XSS')"), "<img>"
198
- end
199
-
200
- def test_should_not_fall_for_ridiculous_hack
201
- img_hack = %(<IMG\nSRC\n=\n"\nj\na\nv\na\ns\nc\nr\ni\np\nt\n:\na\nl\ne\nr\nt\n(\n'\nX\nS\nS\n'\n)\n"\n>)
202
- assert_sanitized img_hack, "<img>"
203
- end
204
-
205
- # fucked
206
- def test_should_sanitize_attributes
207
- assert_sanitized %(<SPAN title="'><script>alert()</script>">blah</SPAN>), %(<span title="'&gt;&lt;script&gt;alert()&lt;/script&gt;">blah</span>)
208
- end
209
-
210
- def test_should_sanitize_illegal_style_properties
211
- raw = %(display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;)
212
- expected = %(display: block; width: 100%; height: 100%; background-color: black; background-image: ; background-x: center; background-y: center;)
213
- assert_equal expected, sanitize_css(raw)
214
- end
215
-
216
- def test_should_sanitize_with_trailing_space
217
- raw = "display:block; "
218
- expected = "display: block;"
219
- assert_equal expected, sanitize_css(raw)
220
- end
221
-
222
- def test_should_sanitize_xul_style_attributes
223
- raw = %(-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss'))
224
- assert_equal '', sanitize_css(raw)
225
- end
226
-
227
- def test_should_sanitize_invalid_tag_names
228
- assert_sanitized(%(a b c<script/XSS src="http://ha.ckers.org/xss.js"></script>d e f), "a b cd e f")
229
- end
230
-
231
- def test_should_sanitize_non_alpha_and_non_digit_characters_in_tags
232
- assert_sanitized('<a onclick!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>foo</a>', "<a>foo</a>")
233
- end
234
-
235
- def test_should_sanitize_invalid_tag_names_in_single_tags
236
- assert_sanitized('<img/src="http://ha.ckers.org/xss.js"/>', "<img />")
237
- end
238
-
239
- def test_should_sanitize_img_dynsrc_lowsrc
240
- assert_sanitized(%(<img lowsrc="javascript:alert('XSS')" />), "<img />")
241
- end
242
-
243
- def test_should_sanitize_div_background_image_unicode_encoded
244
- raw = %(background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029)
245
- assert_equal '', sanitize_css(raw)
246
- end
247
-
248
- def test_should_sanitize_div_style_expression
249
- raw = %(width: expression(alert('XSS'));)
250
- assert_equal '', sanitize_css(raw)
251
- end
252
-
253
- def test_should_sanitize_across_newlines
254
- raw = %(\nwidth:\nexpression(alert('XSS'));\n)
255
- assert_equal '', sanitize_css(raw)
256
- end
257
-
258
- def test_should_sanitize_img_vbscript
259
- assert_sanitized %(<img src='vbscript:msgbox("XSS")' />), '<img />'
260
- end
261
-
262
- def test_should_sanitize_cdata_section
263
- assert_sanitized "<![CDATA[<span>section</span>]]>", "&lt;![CDATA[&lt;span>section&lt;/span>]]>"
264
- end
265
-
266
- def test_should_sanitize_unterminated_cdata_section
267
- assert_sanitized "<![CDATA[<span>neverending...", "&lt;![CDATA[&lt;span>neverending...]]>"
268
- end
269
-
270
- def test_should_not_mangle_urls_with_ampersand
271
- assert_sanitized %{<a href=\"http://www.domain.com?var1=1&amp;var2=2\">my link</a>}
272
- end
273
-
274
- def test_should_sanitize_neverending_attribute
275
- assert_sanitized "<span class=\"\\", "<span class=\"\\\">"
276
- end
277
-
278
- def test_x03a
279
- assert_sanitized %(<a href="javascript&#x3a;alert('XSS');">), "<a>"
280
- assert_sanitized %(<a href="javascript&#x003a;alert('XSS');">), "<a>"
281
- assert_sanitized %(<a href="http&#x3a;//legit">), %(<a href="http://legit">)
282
- assert_sanitized %(<a href="javascript&#x3A;alert('XSS');">), "<a>"
283
- assert_sanitized %(<a href="javascript&#x003A;alert('XSS');">), "<a>"
284
- assert_sanitized %(<a href="http&#x3A;//legit">), %(<a href="http://legit">)
285
- end
286
-
287
- protected
288
- def assert_sanitized(input, expected = nil)
289
- @sanitizer ||= HTML::WhiteListSanitizer.new
290
- if input
291
- assert_dom_equal expected || input, @sanitizer.sanitize(input)
292
- else
293
- assert_nil @sanitizer.sanitize(input)
294
- end
295
- end
296
-
297
- def sanitize_css(input)
298
- (@sanitizer ||= HTML::WhiteListSanitizer.new).sanitize_css(input)
299
- end
300
- end
@@ -1,238 +0,0 @@
1
- require 'abstract_unit'
2
-
3
- class TagNodeTest < Test::Unit::TestCase
4
- def test_open_without_attributes
5
- node = tag("<tag>")
6
- assert_equal "tag", node.name
7
- assert_equal Hash.new, node.attributes
8
- assert_nil node.closing
9
- end
10
-
11
- def test_open_with_attributes
12
- node = tag("<TAG1 foo=hey_ho x:bar=\"blah blah\" BAZ='blah blah blah' >")
13
- assert_equal "tag1", node.name
14
- assert_equal "hey_ho", node["foo"]
15
- assert_equal "blah blah", node["x:bar"]
16
- assert_equal "blah blah blah", node["baz"]
17
- end
18
-
19
- def test_self_closing_without_attributes
20
- node = tag("<tag/>")
21
- assert_equal "tag", node.name
22
- assert_equal Hash.new, node.attributes
23
- assert_equal :self, node.closing
24
- end
25
-
26
- def test_self_closing_with_attributes
27
- node = tag("<tag a=b/>")
28
- assert_equal "tag", node.name
29
- assert_equal( { "a" => "b" }, node.attributes )
30
- assert_equal :self, node.closing
31
- end
32
-
33
- def test_closing_without_attributes
34
- node = tag("</tag>")
35
- assert_equal "tag", node.name
36
- assert_nil node.attributes
37
- assert_equal :close, node.closing
38
- end
39
-
40
- def test_bracket_op_when_no_attributes
41
- node = tag("</tag>")
42
- assert_nil node["foo"]
43
- end
44
-
45
- def test_bracket_op_when_attributes
46
- node = tag("<tag a=b/>")
47
- assert_equal "b", node["a"]
48
- end
49
-
50
- def test_attributes_with_escaped_quotes
51
- node = tag("<tag a='b\\'c' b=\"bob \\\"float\\\"\">")
52
- assert_equal "b\\'c", node["a"]
53
- assert_equal "bob \\\"float\\\"", node["b"]
54
- end
55
-
56
- def test_to_s
57
- node = tag("<a b=c d='f' g=\"h 'i'\" />")
58
- assert_equal %(<a b='c' d='f' g='h \\'i\\'' />), node.to_s
59
- end
60
-
61
- def test_tag
62
- assert tag("<tag>").tag?
63
- end
64
-
65
- def test_match_tag_as_string
66
- assert tag("<tag>").match(:tag => "tag")
67
- assert !tag("<tag>").match(:tag => "b")
68
- end
69
-
70
- def test_match_tag_as_regexp
71
- assert tag("<tag>").match(:tag => /t.g/)
72
- assert !tag("<tag>").match(:tag => /t[bqs]g/)
73
- end
74
-
75
- def test_match_attributes_as_string
76
- t = tag("<tag a=something b=else />")
77
- assert t.match(:attributes => {"a" => "something"})
78
- assert t.match(:attributes => {"b" => "else"})
79
- end
80
-
81
- def test_match_attributes_as_regexp
82
- t = tag("<tag a=something b=else />")
83
- assert t.match(:attributes => {"a" => /^something$/})
84
- assert t.match(:attributes => {"b" => /e.*e/})
85
- assert t.match(:attributes => {"a" => /me..i/, "b" => /.ls.$/})
86
- end
87
-
88
- def test_match_attributes_as_number
89
- t = tag("<tag a=15 b=3.1415 />")
90
- assert t.match(:attributes => {"a" => 15})
91
- assert t.match(:attributes => {"b" => 3.1415})
92
- assert t.match(:attributes => {"a" => 15, "b" => 3.1415})
93
- end
94
-
95
- def test_match_attributes_exist
96
- t = tag("<tag a=15 b=3.1415 />")
97
- assert t.match(:attributes => {"a" => true})
98
- assert t.match(:attributes => {"b" => true})
99
- assert t.match(:attributes => {"a" => true, "b" => true})
100
- end
101
-
102
- def test_match_attributes_not_exist
103
- t = tag("<tag a=15 b=3.1415 />")
104
- assert t.match(:attributes => {"c" => false})
105
- assert t.match(:attributes => {"c" => nil})
106
- assert t.match(:attributes => {"a" => true, "c" => false})
107
- end
108
-
109
- def test_match_parent_success
110
- t = tag("<tag a=15 b='hello'>", tag("<foo k='value'>"))
111
- assert t.match(:parent => {:tag => "foo", :attributes => {"k" => /v.l/, "j" => false}})
112
- end
113
-
114
- def test_match_parent_fail
115
- t = tag("<tag a=15 b='hello'>", tag("<foo k='value'>"))
116
- assert !t.match(:parent => {:tag => /kafka/})
117
- end
118
-
119
- def test_match_child_success
120
- t = tag("<tag x:k='something'>")
121
- tag("<child v=john a=kelly>", t)
122
- tag("<sib m=vaughn v=james>", t)
123
- assert t.match(:child => { :tag => "sib", :attributes => {"v" => /j/}})
124
- assert t.match(:child => { :attributes => {"a" => "kelly"}})
125
- end
126
-
127
- def test_match_child_fail
128
- t = tag("<tag x:k='something'>")
129
- tag("<child v=john a=kelly>", t)
130
- tag("<sib m=vaughn v=james>", t)
131
- assert !t.match(:child => { :tag => "sib", :attributes => {"v" => /r/}})
132
- assert !t.match(:child => { :attributes => {"v" => false}})
133
- end
134
-
135
- def test_match_ancestor_success
136
- t = tag("<tag x:k='something'>", tag("<parent v=john a=kelly>", tag("<grandparent m=vaughn v=james>")))
137
- assert t.match(:ancestor => {:tag => "parent", :attributes => {"a" => /ll/}})
138
- assert t.match(:ancestor => {:attributes => {"m" => "vaughn"}})
139
- end
140
-
141
- def test_match_ancestor_fail
142
- t = tag("<tag x:k='something'>", tag("<parent v=john a=kelly>", tag("<grandparent m=vaughn v=james>")))
143
- assert !t.match(:ancestor => {:tag => /^parent/, :attributes => {"v" => /m/}})
144
- assert !t.match(:ancestor => {:attributes => {"v" => false}})
145
- end
146
-
147
- def test_match_descendant_success
148
- tag("<grandchild m=vaughn v=james>", tag("<child v=john a=kelly>", t = tag("<tag x:k='something'>")))
149
- assert t.match(:descendant => {:tag => "child", :attributes => {"a" => /ll/}})
150
- assert t.match(:descendant => {:attributes => {"m" => "vaughn"}})
151
- end
152
-
153
- def test_match_descendant_fail
154
- tag("<grandchild m=vaughn v=james>", tag("<child v=john a=kelly>", t = tag("<tag x:k='something'>")))
155
- assert !t.match(:descendant => {:tag => /^child/, :attributes => {"v" => /m/}})
156
- assert !t.match(:descendant => {:attributes => {"v" => false}})
157
- end
158
-
159
- def test_match_child_count
160
- t = tag("<tag x:k='something'>")
161
- tag("hello", t)
162
- tag("<child v=john a=kelly>", t)
163
- tag("<sib m=vaughn v=james>", t)
164
- assert t.match(:children => { :count => 2 })
165
- assert t.match(:children => { :count => 2..4 })
166
- assert t.match(:children => { :less_than => 4 })
167
- assert t.match(:children => { :greater_than => 1 })
168
- assert !t.match(:children => { :count => 3 })
169
- end
170
-
171
- def test_conditions_as_strings
172
- t = tag("<tag x:k='something'>")
173
- assert t.match("tag" => "tag")
174
- assert t.match("attributes" => { "x:k" => "something" })
175
- assert !t.match("tag" => "gat")
176
- assert !t.match("attributes" => { "x:j" => "something" })
177
- end
178
-
179
- def test_attributes_as_symbols
180
- t = tag("<child v=john a=kelly>")
181
- assert t.match(:attributes => { :v => /oh/ })
182
- assert t.match(:attributes => { :a => /ll/ })
183
- end
184
-
185
- def test_match_sibling
186
- t = tag("<tag x:k='something'>")
187
- tag("hello", t)
188
- tag("<span a=b>", t)
189
- tag("world", t)
190
- m = tag("<span k=r>", t)
191
- tag("<span m=l>", t)
192
-
193
- assert m.match(:sibling => {:tag => "span", :attributes => {:a => true}})
194
- assert m.match(:sibling => {:tag => "span", :attributes => {:m => true}})
195
- assert !m.match(:sibling => {:tag => "span", :attributes => {:k => true}})
196
- end
197
-
198
- def test_match_sibling_before
199
- t = tag("<tag x:k='something'>")
200
- tag("hello", t)
201
- tag("<span a=b>", t)
202
- tag("world", t)
203
- m = tag("<span k=r>", t)
204
- tag("<span m=l>", t)
205
-
206
- assert m.match(:before => {:tag => "span", :attributes => {:m => true}})
207
- assert !m.match(:before => {:tag => "span", :attributes => {:a => true}})
208
- assert !m.match(:before => {:tag => "span", :attributes => {:k => true}})
209
- end
210
-
211
- def test_match_sibling_after
212
- t = tag("<tag x:k='something'>")
213
- tag("hello", t)
214
- tag("<span a=b>", t)
215
- tag("world", t)
216
- m = tag("<span k=r>", t)
217
- tag("<span m=l>", t)
218
-
219
- assert m.match(:after => {:tag => "span", :attributes => {:a => true}})
220
- assert !m.match(:after => {:tag => "span", :attributes => {:m => true}})
221
- assert !m.match(:after => {:tag => "span", :attributes => {:k => true}})
222
- end
223
-
224
- def test_to_s
225
- t = tag("<b x='foo'>")
226
- tag("hello", t)
227
- tag("<hr />", t)
228
- assert_equal %(<b x="foo">hello<hr /></b>), t.to_s
229
- end
230
-
231
- private
232
-
233
- def tag(content, parent=nil)
234
- node = HTML::Node.parse(parent,0,0,content)
235
- parent.children << node if parent
236
- node
237
- end
238
- end