actionpack 3.2.22.5 → 5.2.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +279 -603
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +13 -297
  5. data/lib/abstract_controller/asset_paths.rb +4 -2
  6. data/lib/abstract_controller/base.rb +82 -52
  7. data/lib/abstract_controller/caching/fragments.rb +166 -0
  8. data/lib/abstract_controller/caching.rb +66 -0
  9. data/lib/abstract_controller/callbacks.rb +117 -103
  10. data/lib/abstract_controller/collector.rb +18 -7
  11. data/lib/abstract_controller/error.rb +6 -0
  12. data/lib/abstract_controller/helpers.rb +65 -38
  13. data/lib/abstract_controller/logger.rb +3 -2
  14. data/lib/abstract_controller/railties/routes_helpers.rb +5 -3
  15. data/lib/abstract_controller/rendering.rb +77 -129
  16. data/lib/abstract_controller/translation.rb +21 -3
  17. data/lib/abstract_controller/url_for.rb +9 -7
  18. data/lib/abstract_controller.rb +12 -13
  19. data/lib/action_controller/api/api_rendering.rb +16 -0
  20. data/lib/action_controller/api.rb +149 -0
  21. data/lib/action_controller/base.rb +81 -40
  22. data/lib/action_controller/caching.rb +22 -62
  23. data/lib/action_controller/form_builder.rb +50 -0
  24. data/lib/action_controller/log_subscriber.rb +30 -18
  25. data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
  26. data/lib/action_controller/metal/conditional_get.rb +190 -47
  27. data/lib/action_controller/metal/content_security_policy.rb +52 -0
  28. data/lib/action_controller/metal/cookies.rb +3 -3
  29. data/lib/action_controller/metal/data_streaming.rb +40 -65
  30. data/lib/action_controller/metal/etag_with_flash.rb +18 -0
  31. data/lib/action_controller/metal/etag_with_template_digest.rb +57 -0
  32. data/lib/action_controller/metal/exceptions.rb +19 -12
  33. data/lib/action_controller/metal/flash.rb +42 -9
  34. data/lib/action_controller/metal/force_ssl.rb +79 -19
  35. data/lib/action_controller/metal/head.rb +35 -10
  36. data/lib/action_controller/metal/helpers.rb +31 -21
  37. data/lib/action_controller/metal/http_authentication.rb +182 -134
  38. data/lib/action_controller/metal/implicit_render.rb +62 -8
  39. data/lib/action_controller/metal/instrumentation.rb +28 -26
  40. data/lib/action_controller/metal/live.rb +312 -0
  41. data/lib/action_controller/metal/mime_responds.rb +159 -163
  42. data/lib/action_controller/metal/parameter_encoding.rb +51 -0
  43. data/lib/action_controller/metal/params_wrapper.rb +146 -93
  44. data/lib/action_controller/metal/redirecting.rb +80 -56
  45. data/lib/action_controller/metal/renderers.rb +119 -47
  46. data/lib/action_controller/metal/rendering.rb +89 -32
  47. data/lib/action_controller/metal/request_forgery_protection.rb +373 -41
  48. data/lib/action_controller/metal/rescue.rb +9 -16
  49. data/lib/action_controller/metal/streaming.rb +39 -45
  50. data/lib/action_controller/metal/strong_parameters.rb +1086 -0
  51. data/lib/action_controller/metal/testing.rb +8 -29
  52. data/lib/action_controller/metal/url_for.rb +43 -32
  53. data/lib/action_controller/metal.rb +112 -106
  54. data/lib/action_controller/railtie.rb +56 -18
  55. data/lib/action_controller/railties/helpers.rb +24 -0
  56. data/lib/action_controller/renderer.rb +117 -0
  57. data/lib/action_controller/template_assertions.rb +11 -0
  58. data/lib/action_controller/test_case.rb +402 -347
  59. data/lib/action_controller.rb +31 -30
  60. data/lib/action_dispatch/http/cache.rb +133 -34
  61. data/lib/action_dispatch/http/content_security_policy.rb +272 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +40 -24
  63. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  64. data/lib/action_dispatch/http/headers.rb +117 -16
  65. data/lib/action_dispatch/http/mime_negotiation.rb +98 -33
  66. data/lib/action_dispatch/http/mime_type.rb +198 -146
  67. data/lib/action_dispatch/http/mime_types.rb +22 -7
  68. data/lib/action_dispatch/http/parameter_filter.rb +61 -49
  69. data/lib/action_dispatch/http/parameters.rb +94 -51
  70. data/lib/action_dispatch/http/rack_cache.rb +4 -3
  71. data/lib/action_dispatch/http/request.rb +262 -117
  72. data/lib/action_dispatch/http/response.rb +400 -86
  73. data/lib/action_dispatch/http/upload.rb +66 -29
  74. data/lib/action_dispatch/http/url.rb +232 -60
  75. data/lib/action_dispatch/journey/formatter.rb +189 -0
  76. data/lib/action_dispatch/journey/gtg/builder.rb +164 -0
  77. data/lib/action_dispatch/journey/gtg/simulator.rb +41 -0
  78. data/lib/action_dispatch/journey/gtg/transition_table.rb +158 -0
  79. data/lib/action_dispatch/journey/nfa/builder.rb +78 -0
  80. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  81. data/lib/action_dispatch/journey/nfa/simulator.rb +49 -0
  82. data/lib/action_dispatch/journey/nfa/transition_table.rb +120 -0
  83. data/lib/action_dispatch/journey/nodes/node.rb +140 -0
  84. data/lib/action_dispatch/journey/parser.rb +199 -0
  85. data/lib/action_dispatch/journey/parser.y +50 -0
  86. data/lib/action_dispatch/journey/parser_extras.rb +31 -0
  87. data/lib/action_dispatch/journey/path/pattern.rb +199 -0
  88. data/lib/action_dispatch/journey/route.rb +203 -0
  89. data/lib/action_dispatch/journey/router/utils.rb +102 -0
  90. data/lib/action_dispatch/journey/router.rb +156 -0
  91. data/lib/action_dispatch/journey/routes.rb +82 -0
  92. data/lib/action_dispatch/journey/scanner.rb +64 -0
  93. data/lib/action_dispatch/journey/visitors.rb +268 -0
  94. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  95. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  96. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  97. data/lib/action_dispatch/journey.rb +7 -0
  98. data/lib/action_dispatch/middleware/callbacks.rb +17 -13
  99. data/lib/action_dispatch/middleware/cookies.rb +494 -162
  100. data/lib/action_dispatch/middleware/debug_exceptions.rb +176 -53
  101. data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
  102. data/lib/action_dispatch/middleware/exception_wrapper.rb +103 -38
  103. data/lib/action_dispatch/middleware/executor.rb +21 -0
  104. data/lib/action_dispatch/middleware/flash.rb +128 -91
  105. data/lib/action_dispatch/middleware/public_exceptions.rb +43 -16
  106. data/lib/action_dispatch/middleware/reloader.rb +6 -83
  107. data/lib/action_dispatch/middleware/remote_ip.rb +151 -49
  108. data/lib/action_dispatch/middleware/request_id.rb +19 -15
  109. data/lib/action_dispatch/middleware/session/abstract_store.rb +38 -34
  110. data/lib/action_dispatch/middleware/session/cache_store.rb +14 -9
  111. data/lib/action_dispatch/middleware/session/cookie_store.rb +94 -44
  112. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -4
  113. data/lib/action_dispatch/middleware/show_exceptions.rb +36 -61
  114. data/lib/action_dispatch/middleware/ssl.rb +150 -0
  115. data/lib/action_dispatch/middleware/stack.rb +33 -41
  116. data/lib/action_dispatch/middleware/static.rb +92 -48
  117. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +22 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +27 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  123. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  125. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +21 -0
  126. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +13 -0
  127. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +134 -5
  128. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  132. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  133. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  136. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  137. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  138. data/lib/action_dispatch/railtie.rb +29 -8
  139. data/lib/action_dispatch/request/session.rb +234 -0
  140. data/lib/action_dispatch/request/utils.rb +78 -0
  141. data/lib/action_dispatch/routing/endpoint.rb +17 -0
  142. data/lib/action_dispatch/routing/inspector.rb +225 -0
  143. data/lib/action_dispatch/routing/mapper.rb +1329 -582
  144. data/lib/action_dispatch/routing/polymorphic_routes.rb +237 -94
  145. data/lib/action_dispatch/routing/redirection.rb +120 -50
  146. data/lib/action_dispatch/routing/route_set.rb +545 -322
  147. data/lib/action_dispatch/routing/routes_proxy.rb +37 -7
  148. data/lib/action_dispatch/routing/url_for.rb +103 -34
  149. data/lib/action_dispatch/routing.rb +66 -99
  150. data/lib/action_dispatch/system_test_case.rb +147 -0
  151. data/lib/action_dispatch/system_testing/browser.rb +49 -0
  152. data/lib/action_dispatch/system_testing/driver.rb +59 -0
  153. data/lib/action_dispatch/system_testing/server.rb +31 -0
  154. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +96 -0
  155. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +31 -0
  156. data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +26 -0
  157. data/lib/action_dispatch/testing/assertion_response.rb +47 -0
  158. data/lib/action_dispatch/testing/assertions/response.rb +53 -42
  159. data/lib/action_dispatch/testing/assertions/routing.rb +79 -74
  160. data/lib/action_dispatch/testing/assertions.rb +15 -9
  161. data/lib/action_dispatch/testing/integration.rb +361 -207
  162. data/lib/action_dispatch/testing/request_encoder.rb +55 -0
  163. data/lib/action_dispatch/testing/test_process.rb +28 -19
  164. data/lib/action_dispatch/testing/test_request.rb +30 -33
  165. data/lib/action_dispatch/testing/test_response.rb +35 -11
  166. data/lib/action_dispatch.rb +42 -32
  167. data/lib/action_pack/gem_version.rb +17 -0
  168. data/lib/action_pack/version.rb +7 -7
  169. data/lib/action_pack.rb +4 -2
  170. metadata +116 -175
  171. data/lib/abstract_controller/layouts.rb +0 -423
  172. data/lib/abstract_controller/view_paths.rb +0 -96
  173. data/lib/action_controller/caching/actions.rb +0 -185
  174. data/lib/action_controller/caching/fragments.rb +0 -127
  175. data/lib/action_controller/caching/pages.rb +0 -187
  176. data/lib/action_controller/caching/sweeping.rb +0 -97
  177. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  178. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  179. data/lib/action_controller/deprecated.rb +0 -3
  180. data/lib/action_controller/metal/compatibility.rb +0 -65
  181. data/lib/action_controller/metal/hide_actions.rb +0 -41
  182. data/lib/action_controller/metal/rack_delegation.rb +0 -26
  183. data/lib/action_controller/metal/responder.rb +0 -286
  184. data/lib/action_controller/metal/session_management.rb +0 -14
  185. data/lib/action_controller/middleware.rb +0 -39
  186. data/lib/action_controller/railties/paths.rb +0 -25
  187. data/lib/action_controller/record_identifier.rb +0 -85
  188. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  189. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  190. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  191. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  192. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  193. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  194. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  195. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  196. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  197. data/lib/action_dispatch/middleware/head.rb +0 -18
  198. data/lib/action_dispatch/middleware/params_parser.rb +0 -75
  199. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  200. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  201. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  202. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  203. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  204. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  205. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  206. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  207. data/lib/action_dispatch/testing/assertions/dom.rb +0 -37
  208. data/lib/action_dispatch/testing/assertions/selector.rb +0 -435
  209. data/lib/action_dispatch/testing/assertions/tag.rb +0 -138
  210. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  211. data/lib/action_view/asset_paths.rb +0 -142
  212. data/lib/action_view/base.rb +0 -220
  213. data/lib/action_view/buffers.rb +0 -43
  214. data/lib/action_view/context.rb +0 -36
  215. data/lib/action_view/flows.rb +0 -79
  216. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  217. data/lib/action_view/helpers/asset_paths.rb +0 -7
  218. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  219. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  220. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  221. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  222. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  223. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  224. data/lib/action_view/helpers/cache_helper.rb +0 -64
  225. data/lib/action_view/helpers/capture_helper.rb +0 -203
  226. data/lib/action_view/helpers/controller_helper.rb +0 -25
  227. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  228. data/lib/action_view/helpers/date_helper.rb +0 -1062
  229. data/lib/action_view/helpers/debug_helper.rb +0 -40
  230. data/lib/action_view/helpers/form_helper.rb +0 -1486
  231. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  232. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  233. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  234. data/lib/action_view/helpers/number_helper.rb +0 -622
  235. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  236. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  237. data/lib/action_view/helpers/rendering_helper.rb +0 -92
  238. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  239. data/lib/action_view/helpers/tag_helper.rb +0 -167
  240. data/lib/action_view/helpers/text_helper.rb +0 -426
  241. data/lib/action_view/helpers/translation_helper.rb +0 -91
  242. data/lib/action_view/helpers/url_helper.rb +0 -693
  243. data/lib/action_view/helpers.rb +0 -60
  244. data/lib/action_view/locale/en.yml +0 -160
  245. data/lib/action_view/log_subscriber.rb +0 -28
  246. data/lib/action_view/lookup_context.rb +0 -258
  247. data/lib/action_view/path_set.rb +0 -101
  248. data/lib/action_view/railtie.rb +0 -55
  249. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  250. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  251. data/lib/action_view/renderer/renderer.rb +0 -61
  252. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  253. data/lib/action_view/renderer/template_renderer.rb +0 -95
  254. data/lib/action_view/template/error.rb +0 -128
  255. data/lib/action_view/template/handlers/builder.rb +0 -26
  256. data/lib/action_view/template/handlers/erb.rb +0 -125
  257. data/lib/action_view/template/handlers.rb +0 -50
  258. data/lib/action_view/template/resolver.rb +0 -298
  259. data/lib/action_view/template/text.rb +0 -30
  260. data/lib/action_view/template.rb +0 -337
  261. data/lib/action_view/test_case.rb +0 -246
  262. data/lib/action_view/testing/resolvers.rb +0 -49
  263. data/lib/action_view.rb +0 -84
  264. data/lib/sprockets/assets.rake +0 -99
  265. data/lib/sprockets/bootstrap.rb +0 -37
  266. data/lib/sprockets/compressors.rb +0 -83
  267. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  268. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  269. data/lib/sprockets/helpers.rb +0 -6
  270. data/lib/sprockets/railtie.rb +0 -62
  271. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,111 +0,0 @@
1
- require 'action_controller/record_identifier'
2
-
3
- module ActionView
4
- # = Action View Record Tag Helpers
5
- module Helpers
6
- module RecordTagHelper
7
- include ActionController::RecordIdentifier
8
-
9
- # Produces a wrapper DIV element with id and class parameters that
10
- # relate to the specified Active Record object. Usage example:
11
- #
12
- # <%= div_for(@person, :class => "foo") do %>
13
- # <%= @person.name %>
14
- # <% end %>
15
- #
16
- # produces:
17
- #
18
- # <div id="person_123" class="person foo"> Joe Bloggs </div>
19
- #
20
- # You can also pass an array of Active Record objects, which will then
21
- # get iterated over and yield each record as an argument for the block.
22
- # For example:
23
- #
24
- # <%= div_for(@people, :class => "foo") do |person| %>
25
- # <%= person.name %>
26
- # <% end %>
27
- #
28
- # produces:
29
- #
30
- # <div id="person_123" class="person foo"> Joe Bloggs </div>
31
- # <div id="person_124" class="person foo"> Jane Bloggs </div>
32
- #
33
- def div_for(record, *args, &block)
34
- content_tag_for(:div, record, *args, &block)
35
- end
36
-
37
- # content_tag_for creates an HTML element with id and class parameters
38
- # that relate to the specified Active Record object. For example:
39
- #
40
- # <%= content_tag_for(:tr, @person) do %>
41
- # <td><%= @person.first_name %></td>
42
- # <td><%= @person.last_name %></td>
43
- # <% end %>
44
- #
45
- # would produce the following HTML (assuming @person is an instance of
46
- # a Person object, with an id value of 123):
47
- #
48
- # <tr id="person_123" class="person">....</tr>
49
- #
50
- # If you require the HTML id attribute to have a prefix, you can specify it:
51
- #
52
- # <%= content_tag_for(:tr, @person, :foo) do %> ...
53
- #
54
- # produces:
55
- #
56
- # <tr id="foo_person_123" class="person">...
57
- #
58
- # You can also pass an array of objects which this method will loop through
59
- # and yield the current object to the supplied block, reducing the need for
60
- # having to iterate through the object (using <tt>each</tt>) beforehand.
61
- # For example (assuming @people is an array of Person objects):
62
- #
63
- # <%= content_tag_for(:tr, @people) do |person| %>
64
- # <td><%= person.first_name %></td>
65
- # <td><%= person.last_name %></td>
66
- # <% end %>
67
- #
68
- # produces:
69
- #
70
- # <tr id="person_123" class="person">...</tr>
71
- # <tr id="person_124" class="person">...</tr>
72
- #
73
- # content_tag_for also accepts a hash of options, which will be converted to
74
- # additional HTML attributes. If you specify a <tt>:class</tt> value, it will be combined
75
- # with the default class name for your object. For example:
76
- #
77
- # <%= content_tag_for(:li, @person, :class => "bar") %>...
78
- #
79
- # produces:
80
- #
81
- # <li id="person_123" class="person bar">...
82
- #
83
- def content_tag_for(tag_name, single_or_multiple_records, prefix = nil, options = nil, &block)
84
- if single_or_multiple_records.respond_to?(:to_ary)
85
- single_or_multiple_records.to_ary.map do |single_record|
86
- capture { content_tag_for_single_record(tag_name, single_record, prefix, options, &block) }
87
- end.join("\n").html_safe
88
- else
89
- content_tag_for_single_record(tag_name, single_or_multiple_records, prefix, options, &block)
90
- end
91
- end
92
-
93
- private
94
-
95
- # Called by <tt>content_tag_for</tt> internally to render a content tag
96
- # for each record.
97
- def content_tag_for_single_record(tag_name, record, prefix, options, &block)
98
- options, prefix = prefix, nil if prefix.is_a?(Hash)
99
- options = options ? options.dup : {}
100
- options.merge!(:class => "#{dom_class(record, prefix)} #{options[:class]}".strip, :id => dom_id(record, prefix))
101
- if !block_given?
102
- content_tag(tag_name, "", options)
103
- elsif block.arity == 0
104
- content_tag(tag_name, capture(&block), options)
105
- else
106
- content_tag(tag_name, capture(record, &block), options)
107
- end
108
- end
109
- end
110
- end
111
- end
@@ -1,92 +0,0 @@
1
- require "active_support/core_ext/hash/indifferent_access"
2
-
3
- module ActionView
4
- module Helpers
5
- # = Action View Rendering
6
- #
7
- # Implements methods that allow rendering from a view context.
8
- # In order to use this module, all you need is to implement
9
- # view_renderer that returns an ActionView::Renderer object.
10
- module RenderingHelper
11
- # Returns the result of a render that's dictated by the options hash. The primary options are:
12
- #
13
- # * <tt>:partial</tt> - See <tt>ActionView::PartialRenderer</tt>.
14
- # * <tt>:file</tt> - Renders an explicit template file (this used to be the old default), add :locals to pass in those.
15
- # * <tt>:inline</tt> - Renders an inline template similar to how it's done in the controller.
16
- # * <tt>:text</tt> - Renders the text passed in out.
17
- #
18
- # If no options hash is passed or :update specified, the default is to render a partial and use the second parameter
19
- # as the locals hash.
20
- def render(options = {}, locals = {}, &block)
21
- case options
22
- when Hash
23
- if block_given?
24
- view_renderer.render_partial(self, options.merge(:partial => options[:layout]), &block)
25
- else
26
- view_renderer.render(self, options)
27
- end
28
- else
29
- view_renderer.render_partial(self, :partial => options, :locals => locals)
30
- end
31
- end
32
-
33
- # Overwrites _layout_for in the context object so it supports the case a block is
34
- # passed to a partial. Returns the contents that are yielded to a layout, given a
35
- # name or a block.
36
- #
37
- # You can think of a layout as a method that is called with a block. If the user calls
38
- # <tt>yield :some_name</tt>, the block, by default, returns <tt>content_for(:some_name)</tt>.
39
- # If the user calls simply +yield+, the default block returns <tt>content_for(:layout)</tt>.
40
- #
41
- # The user can override this default by passing a block to the layout:
42
- #
43
- # # The template
44
- # <%= render :layout => "my_layout" do %>
45
- # Content
46
- # <% end %>
47
- #
48
- # # The layout
49
- # <html>
50
- # <%= yield %>
51
- # </html>
52
- #
53
- # In this case, instead of the default block, which would return <tt>content_for(:layout)</tt>,
54
- # this method returns the block that was passed in to <tt>render :layout</tt>, and the response
55
- # would be
56
- #
57
- # <html>
58
- # Content
59
- # </html>
60
- #
61
- # Finally, the block can take block arguments, which can be passed in by +yield+:
62
- #
63
- # # The template
64
- # <%= render :layout => "my_layout" do |customer| %>
65
- # Hello <%= customer.name %>
66
- # <% end %>
67
- #
68
- # # The layout
69
- # <html>
70
- # <%= yield Struct.new(:name).new("David") %>
71
- # </html>
72
- #
73
- # In this case, the layout would receive the block passed into <tt>render :layout</tt>,
74
- # and the struct specified would be passed into the block as an argument. The result
75
- # would be
76
- #
77
- # <html>
78
- # Hello David
79
- # </html>
80
- #
81
- def _layout_for(*args, &block)
82
- name = args.first
83
-
84
- if block && !name.is_a?(Symbol)
85
- capture(*args, &block)
86
- else
87
- super
88
- end
89
- end
90
- end
91
- end
92
- end
@@ -1,259 +0,0 @@
1
- require 'active_support/core_ext/object/try'
2
- require 'action_controller/vendor/html-scanner'
3
-
4
- module ActionView
5
- # = Action View Sanitize Helpers
6
- module Helpers #:nodoc:
7
- # The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements.
8
- # These helper methods extend Action View making them callable within your template files.
9
- module SanitizeHelper
10
- extend ActiveSupport::Concern
11
- # This +sanitize+ helper will html encode all tags and strip all attributes that
12
- # aren't specifically allowed.
13
- #
14
- # It also strips href/src tags with invalid protocols, like javascript: especially.
15
- # It does its best to counter any tricks that hackers may use, like throwing in
16
- # unicode/ascii/hex values to get past the javascript: filters. Check out
17
- # the extensive test suite.
18
- #
19
- # <%= sanitize @article.body %>
20
- #
21
- # You can add or remove tags/attributes if you want to customize it a bit.
22
- # See ActionView::Base for full docs on the available options. You can add
23
- # tags/attributes for single uses of +sanitize+ by passing either the
24
- # <tt>:attributes</tt> or <tt>:tags</tt> options:
25
- #
26
- # Normal Use
27
- #
28
- # <%= sanitize @article.body %>
29
- #
30
- # Custom Use (only the mentioned tags and attributes are allowed, nothing else)
31
- #
32
- # <%= sanitize @article.body, :tags => %w(table tr td), :attributes => %w(id class style) %>
33
- #
34
- # Add table tags to the default allowed tags
35
- #
36
- # class Application < Rails::Application
37
- # config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td'
38
- # end
39
- #
40
- # Remove tags to the default allowed tags
41
- #
42
- # class Application < Rails::Application
43
- # config.after_initialize do
44
- # ActionView::Base.sanitized_allowed_tags.delete 'div'
45
- # end
46
- # end
47
- #
48
- # Change allowed default attributes
49
- #
50
- # class Application < Rails::Application
51
- # config.action_view.sanitized_allowed_attributes = 'id', 'class', 'style'
52
- # end
53
- #
54
- # Please note that sanitizing user-provided text does not guarantee that the
55
- # resulting markup is valid (conforming to a document type) or even well-formed.
56
- # The output may still contain e.g. unescaped '<', '>', '&' characters and
57
- # confuse browsers.
58
- #
59
- def sanitize(html, options = {})
60
- self.class.white_list_sanitizer.sanitize(html, options).try(:html_safe)
61
- end
62
-
63
- # Sanitizes a block of CSS code. Used by +sanitize+ when it comes across a style attribute.
64
- def sanitize_css(style)
65
- self.class.white_list_sanitizer.sanitize_css(style)
66
- end
67
-
68
- # Strips all HTML tags from the +html+, including comments. This uses the
69
- # html-scanner tokenizer and so its HTML parsing ability is limited by
70
- # that of html-scanner.
71
- #
72
- # ==== Examples
73
- #
74
- # strip_tags("Strip <i>these</i> tags!")
75
- # # => Strip these tags!
76
- #
77
- # strip_tags("<b>Bold</b> no more! <a href='more.html'>See more here</a>...")
78
- # # => Bold no more! See more here...
79
- #
80
- # strip_tags("<div id='top-bar'>Welcome to my website!</div>")
81
- # # => Welcome to my website!
82
- def strip_tags(html)
83
- self.class.full_sanitizer.sanitize(html)
84
- end
85
-
86
- # Strips all link tags from +text+ leaving just the link text.
87
- #
88
- # ==== Examples
89
- # strip_links('<a href="http://www.rubyonrails.org">Ruby on Rails</a>')
90
- # # => Ruby on Rails
91
- #
92
- # strip_links('Please e-mail me at <a href="mailto:me@email.com">me@email.com</a>.')
93
- # # => Please e-mail me at me@email.com.
94
- #
95
- # strip_links('Blog: <a href="http://www.myblog.com/" class="nav" target=\"_blank\">Visit</a>.')
96
- # # => Blog: Visit.
97
- def strip_links(html)
98
- self.class.link_sanitizer.sanitize(html)
99
- end
100
-
101
- module ClassMethods #:nodoc:
102
- attr_writer :full_sanitizer, :link_sanitizer, :white_list_sanitizer
103
-
104
- def sanitized_protocol_separator
105
- white_list_sanitizer.protocol_separator
106
- end
107
-
108
- def sanitized_uri_attributes
109
- white_list_sanitizer.uri_attributes
110
- end
111
-
112
- def sanitized_bad_tags
113
- white_list_sanitizer.bad_tags
114
- end
115
-
116
- def sanitized_allowed_tags
117
- white_list_sanitizer.allowed_tags
118
- end
119
-
120
- def sanitized_allowed_attributes
121
- white_list_sanitizer.allowed_attributes
122
- end
123
-
124
- def sanitized_allowed_css_properties
125
- white_list_sanitizer.allowed_css_properties
126
- end
127
-
128
- def sanitized_allowed_css_keywords
129
- white_list_sanitizer.allowed_css_keywords
130
- end
131
-
132
- def sanitized_shorthand_css_properties
133
- white_list_sanitizer.shorthand_css_properties
134
- end
135
-
136
- def sanitized_allowed_protocols
137
- white_list_sanitizer.allowed_protocols
138
- end
139
-
140
- def sanitized_protocol_separator=(value)
141
- white_list_sanitizer.protocol_separator = value
142
- end
143
-
144
- # Gets the HTML::FullSanitizer instance used by +strip_tags+. Replace with
145
- # any object that responds to +sanitize+.
146
- #
147
- # class Application < Rails::Application
148
- # config.action_view.full_sanitizer = MySpecialSanitizer.new
149
- # end
150
- #
151
- def full_sanitizer
152
- @full_sanitizer ||= HTML::FullSanitizer.new
153
- end
154
-
155
- # Gets the HTML::LinkSanitizer instance used by +strip_links+. Replace with
156
- # any object that responds to +sanitize+.
157
- #
158
- # class Application < Rails::Application
159
- # config.action_view.link_sanitizer = MySpecialSanitizer.new
160
- # end
161
- #
162
- def link_sanitizer
163
- @link_sanitizer ||= HTML::LinkSanitizer.new
164
- end
165
-
166
- # Gets the HTML::WhiteListSanitizer instance used by sanitize and +sanitize_css+.
167
- # Replace with any object that responds to +sanitize+.
168
- #
169
- # class Application < Rails::Application
170
- # config.action_view.white_list_sanitizer = MySpecialSanitizer.new
171
- # end
172
- #
173
- def white_list_sanitizer
174
- @white_list_sanitizer ||= HTML::WhiteListSanitizer.new
175
- end
176
-
177
- # Adds valid HTML attributes that the +sanitize+ helper checks for URIs.
178
- #
179
- # class Application < Rails::Application
180
- # config.action_view.sanitized_uri_attributes = 'lowsrc', 'target'
181
- # end
182
- #
183
- def sanitized_uri_attributes=(attributes)
184
- HTML::WhiteListSanitizer.uri_attributes.merge(attributes)
185
- end
186
-
187
- # Adds to the Set of 'bad' tags for the +sanitize+ helper.
188
- #
189
- # class Application < Rails::Application
190
- # config.action_view.sanitized_bad_tags = 'embed', 'object'
191
- # end
192
- #
193
- def sanitized_bad_tags=(attributes)
194
- HTML::WhiteListSanitizer.bad_tags.merge(attributes)
195
- end
196
-
197
- # Adds to the Set of allowed tags for the +sanitize+ helper.
198
- #
199
- # class Application < Rails::Application
200
- # config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td'
201
- # end
202
- #
203
- def sanitized_allowed_tags=(attributes)
204
- HTML::WhiteListSanitizer.allowed_tags.merge(attributes)
205
- end
206
-
207
- # Adds to the Set of allowed HTML attributes for the +sanitize+ helper.
208
- #
209
- # class Application < Rails::Application
210
- # config.action_view.sanitized_allowed_attributes = 'onclick', 'longdesc'
211
- # end
212
- #
213
- def sanitized_allowed_attributes=(attributes)
214
- HTML::WhiteListSanitizer.allowed_attributes.merge(attributes)
215
- end
216
-
217
- # Adds to the Set of allowed CSS properties for the #sanitize and +sanitize_css+ helpers.
218
- #
219
- # class Application < Rails::Application
220
- # config.action_view.sanitized_allowed_css_properties = 'expression'
221
- # end
222
- #
223
- def sanitized_allowed_css_properties=(attributes)
224
- HTML::WhiteListSanitizer.allowed_css_properties.merge(attributes)
225
- end
226
-
227
- # Adds to the Set of allowed CSS keywords for the +sanitize+ and +sanitize_css+ helpers.
228
- #
229
- # class Application < Rails::Application
230
- # config.action_view.sanitized_allowed_css_keywords = 'expression'
231
- # end
232
- #
233
- def sanitized_allowed_css_keywords=(attributes)
234
- HTML::WhiteListSanitizer.allowed_css_keywords.merge(attributes)
235
- end
236
-
237
- # Adds to the Set of allowed shorthand CSS properties for the +sanitize+ and +sanitize_css+ helpers.
238
- #
239
- # class Application < Rails::Application
240
- # config.action_view.sanitized_shorthand_css_properties = 'expression'
241
- # end
242
- #
243
- def sanitized_shorthand_css_properties=(attributes)
244
- HTML::WhiteListSanitizer.shorthand_css_properties.merge(attributes)
245
- end
246
-
247
- # Adds to the Set of allowed protocols for the +sanitize+ helper.
248
- #
249
- # class Application < Rails::Application
250
- # config.action_view.sanitized_allowed_protocols = 'ssh', 'feed'
251
- # end
252
- #
253
- def sanitized_allowed_protocols=(attributes)
254
- HTML::WhiteListSanitizer.allowed_protocols.merge(attributes)
255
- end
256
- end
257
- end
258
- end
259
- end
@@ -1,167 +0,0 @@
1
- require 'active_support/core_ext/object/blank'
2
- require 'active_support/core_ext/string/output_safety'
3
- require 'set'
4
-
5
- module ActionView
6
- # = Action View Tag Helpers
7
- module Helpers #:nodoc:
8
- # Provides methods to generate HTML tags programmatically when you can't use
9
- # a Builder. By default, they output XHTML compliant tags.
10
- module TagHelper
11
- extend ActiveSupport::Concern
12
- include CaptureHelper
13
- include OutputSafetyHelper
14
-
15
- BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
16
- autoplay controls loop selected hidden scoped async
17
- defer reversed ismap seemless muted required
18
- autofocus novalidate formnovalidate open pubdate).to_set
19
- BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attribute| attribute.to_sym })
20
-
21
- PRE_CONTENT_STRINGS = {
22
- :textarea => "\n"
23
- }
24
-
25
- # Returns an empty HTML tag of type +name+ which by default is XHTML
26
- # compliant. Set +open+ to true to create an open tag compatible
27
- # with HTML 4.0 and below. Add HTML attributes by passing an attributes
28
- # hash to +options+. Set +escape+ to false to disable attribute value
29
- # escaping.
30
- #
31
- # ==== Options
32
- # You can use symbols or strings for the attribute names.
33
- #
34
- # Use +true+ with boolean attributes that can render with no value, like
35
- # +disabled+ and +readonly+.
36
- #
37
- # HTML5 <tt>data-*</tt> attributes can be set with a single +data+ key
38
- # pointing to a hash of sub-attributes.
39
- #
40
- # To play nicely with JavaScript conventions sub-attributes are dasherized.
41
- # For example, a key +user_id+ would render as <tt>data-user-id</tt> and
42
- # thus accessed as <tt>dataset.userId</tt>.
43
- #
44
- # Values are encoded to JSON, with the exception of strings and symbols.
45
- # This may come in handy when using jQuery's HTML5-aware <tt>.data()<tt>
46
- # from 1.4.3.
47
- #
48
- # ==== Examples
49
- # tag("br")
50
- # # => <br />
51
- #
52
- # tag("br", nil, true)
53
- # # => <br>
54
- #
55
- # tag("input", :type => 'text', :disabled => true)
56
- # # => <input type="text" disabled="disabled" />
57
- #
58
- # tag("img", :src => "open & shut.png")
59
- # # => <img src="open &amp; shut.png" />
60
- #
61
- # tag("img", {:src => "open &amp; shut.png"}, false, false)
62
- # # => <img src="open &amp; shut.png" />
63
- #
64
- # tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)})
65
- # # => <div data-name="Stephen" data-city-state="[&quot;Chicago&quot;,&quot;IL&quot;]" />
66
- def tag(name, options = nil, open = false, escape = true)
67
- "<#{name}#{tag_options(options, escape) if options}#{open ? ">" : " />"}".html_safe
68
- end
69
-
70
- # Returns an HTML block tag of type +name+ surrounding the +content+. Add
71
- # HTML attributes by passing an attributes hash to +options+.
72
- # Instead of passing the content as an argument, you can also use a block
73
- # in which case, you pass your +options+ as the second parameter.
74
- # Set escape to false to disable attribute value escaping.
75
- #
76
- # ==== Options
77
- # The +options+ hash is used with attributes with no value like (<tt>disabled</tt> and
78
- # <tt>readonly</tt>), which you can give a value of true in the +options+ hash. You can use
79
- # symbols or strings for the attribute names.
80
- #
81
- # ==== Examples
82
- # content_tag(:p, "Hello world!")
83
- # # => <p>Hello world!</p>
84
- # content_tag(:div, content_tag(:p, "Hello world!"), :class => "strong")
85
- # # => <div class="strong"><p>Hello world!</p></div>
86
- # content_tag("select", options, :multiple => true)
87
- # # => <select multiple="multiple">...options...</select>
88
- #
89
- # <%= content_tag :div, :class => "strong" do -%>
90
- # Hello world!
91
- # <% end -%>
92
- # # => <div class="strong">Hello world!</div>
93
- def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
94
- if block_given?
95
- options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
96
- content_tag_string(name, capture(&block), options, escape)
97
- else
98
- content_tag_string(name, content_or_options_with_block, options, escape)
99
- end
100
- end
101
-
102
- # Returns a CDATA section with the given +content+. CDATA sections
103
- # are used to escape blocks of text containing characters which would
104
- # otherwise be recognized as markup. CDATA sections begin with the string
105
- # <tt><![CDATA[</tt> and end with (and may not contain) the string <tt>]]></tt>.
106
- #
107
- # ==== Examples
108
- # cdata_section("<hello world>")
109
- # # => <![CDATA[<hello world>]]>
110
- #
111
- # cdata_section(File.read("hello_world.txt"))
112
- # # => <![CDATA[<hello from a text file]]>
113
- def cdata_section(content)
114
- "<![CDATA[#{content}]]>".html_safe
115
- end
116
-
117
- # Returns an escaped version of +html+ without affecting existing escaped entities.
118
- #
119
- # ==== Examples
120
- # escape_once("1 < 2 &amp; 3")
121
- # # => "1 &lt; 2 &amp; 3"
122
- #
123
- # escape_once("&lt;&lt; Accept & Checkout")
124
- # # => "&lt;&lt; Accept &amp; Checkout"
125
- def escape_once(html)
126
- ActiveSupport::Multibyte.clean(html.to_s).gsub(/[\"><]|&(?!([a-zA-Z]+|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] }
127
- end
128
-
129
- private
130
-
131
- def content_tag_string(name, content, options, escape = true)
132
- tag_options = tag_options(options, escape) if options
133
- "<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{escape ? ERB::Util.h(content) : content}</#{name}>".html_safe
134
- end
135
-
136
- def tag_options(options, escape = true)
137
- unless options.blank?
138
- attrs = []
139
- options.each_pair do |key, value|
140
- if key.to_s == 'data' && value.is_a?(Hash)
141
- value.each do |k, v|
142
- unless v.is_a?(String) || v.is_a?(Symbol) || v.is_a?(BigDecimal)
143
- v = v.to_json
144
- end
145
- attrs << tag_option("data-#{k.to_s.dasherize}", v, escape)
146
- end
147
- elsif BOOLEAN_ATTRIBUTES.include?(key)
148
- attrs << %(#{key}="#{key}") if value
149
- elsif !value.nil?
150
- attrs << tag_option(key, value, escape)
151
- end
152
- end
153
- " #{attrs.sort * ' '}".html_safe unless attrs.empty?
154
- end
155
- end
156
-
157
- def tag_option(key, value, escape)
158
- if value.is_a?(Array)
159
- value = escape ? safe_join(value, " ") : value.join(" ")
160
- else
161
- value = escape ? ERB::Util.html_escape(value) : value.to_s
162
- end
163
- %(#{key}="#{value.gsub(/"/, '&quot;'.freeze)}")
164
- end
165
- end
166
- end
167
- end