Skip to content

Commit 168170f

Browse files
committed
Add autocomplete="off" to all generated hidden fields (fixes rails#42610)
1 parent 7df466c commit 168170f

15 files changed

+328
-322
lines changed

actionview/lib/action_view/helpers/date_helper.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,8 @@ def build_hidden(type, value)
11011101
type: "hidden",
11021102
id: input_id_from_type(type),
11031103
name: input_name_from_type(type),
1104-
value: value
1104+
value: value,
1105+
autocomplete: "off"
11051106
}.merge!(@html_options.slice(:disabled))
11061107
select_options[:disabled] = "disabled" if @options[:disabled]
11071108

actionview/lib/action_view/helpers/form_tag_helper.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ def label_tag(name = nil, content_or_options = nil, options = nil, &block)
277277
# # => <input id="collected_input" name="collected_input" onchange="alert('Input collected!')"
278278
# # type="hidden" value="" />
279279
def hidden_field_tag(name, value = nil, options = {})
280-
text_field_tag(name, value, options.merge(type: :hidden))
280+
text_field_tag(name, value, options.merge(type: :hidden, autocomplete: "off"))
281281
end
282282

283283
# Creates a file upload field. If you are using file uploads then you will also need
@@ -866,7 +866,7 @@ def utf8_enforcer_tag
866866
# Use raw HTML to ensure the value is written as an HTML entity; it
867867
# needs to be the right character regardless of which encoding the
868868
# browser infers.
869-
'<input name="utf8" type="hidden" value="&#x2713;" />'.html_safe
869+
'<input name="utf8" type="hidden" value="&#x2713;" autocomplete="off" />'.html_safe
870870
end
871871

872872
private

actionview/lib/action_view/helpers/tags/base.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def select_content_tag(option_tags, options, html_options)
141141
select = content_tag("select", add_options(option_tags, options, value), html_options)
142142

143143
if html_options["multiple"] && options.fetch(:include_hidden, true)
144-
tag("input", disabled: html_options["disabled"], name: html_options["name"], type: "hidden", value: "") + select
144+
tag("input", disabled: html_options["disabled"], name: html_options["name"], type: "hidden", value: "", autocomplete: "off") + select
145145
else
146146
select
147147
end

actionview/lib/action_view/helpers/tags/check_box.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def checked?(value)
5757
end
5858

5959
def hidden_field_for_checkbox(options)
60-
@unchecked_value ? tag("input", options.slice("name", "disabled", "form").merge!("type" => "hidden", "value" => @unchecked_value)) : "".html_safe
60+
@unchecked_value ? tag("input", options.slice("name", "disabled", "form").merge!("type" => "hidden", "value" => @unchecked_value, "autocomplete" => "off")) : "".html_safe
6161
end
6262
end
6363
end

actionview/lib/action_view/helpers/tags/hidden_field.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ module ActionView
44
module Helpers
55
module Tags # :nodoc:
66
class HiddenField < TextField # :nodoc:
7+
def render
8+
@options[:autocomplete] = "off"
9+
super
10+
end
711
end
812
end
913
end

actionview/lib/action_view/helpers/url_helper.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,8 @@ def button_to(name = nil, options = nil, html_options = nil, &block)
354354
inner_tags = method_tag.safe_concat(button).safe_concat(request_token_tag)
355355
if params
356356
to_form_params(params).each do |param|
357-
inner_tags.safe_concat tag(:input, type: "hidden", name: param[:name], value: param[:value])
357+
inner_tags.safe_concat tag(:input, type: "hidden", name: param[:name], value: param[:value],
358+
autocomplete: "off")
358359
end
359360
end
360361
content_tag("form", inner_tags, form_options)
@@ -752,14 +753,14 @@ def method_not_get_method?(method)
752753
def token_tag(token = nil, form_options: {})
753754
if token != false && defined?(protect_against_forgery?) && protect_against_forgery?
754755
token ||= form_authenticity_token(form_options: form_options)
755-
tag(:input, type: "hidden", name: request_forgery_protection_token.to_s, value: token)
756+
tag(:input, type: "hidden", name: request_forgery_protection_token.to_s, value: token, autocomplete: "off")
756757
else
757758
""
758759
end
759760
end
760761

761762
def method_tag(method)
762-
tag("input", type: "hidden", name: "_method", value: method.to_s)
763+
tag("input", type: "hidden", name: "_method", value: method.to_s, autocomplete: "off")
763764
end
764765

765766
# Returns an array of hashes each containing :name and :value keys

actionview/test/activerecord/form_helper_activerecord_test.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,18 @@ def test_nested_fields_for_with_child_index_option_override_on_a_nested_attribut
5151

5252
expected = whole_form("/developers/123", "edit_developer_123", "edit_developer", method: "patch") do
5353
'<input id="developer_projects_attributes_abc_name" name="developer[projects_attributes][abc][name]" type="text" value="project #321" />' \
54-
'<input id="developer_projects_attributes_abc_id" name="developer[projects_attributes][abc][id]" type="hidden" value="321" />'
54+
'<input id="developer_projects_attributes_abc_id" name="developer[projects_attributes][abc][id]" type="hidden" value="321" autocomplete="off" />'
5555
end
5656

5757
assert_dom_equal expected, output_buffer
5858
end
5959

6060
private
6161
def hidden_fields(method = nil)
62-
txt = +%{<input name="utf8" type="hidden" value="&#x2713;" />}
62+
txt = +%{<input name="utf8" type="hidden" value="&#x2713;" autocomplete="off" />}
6363

6464
if method && !%w(get post).include?(method.to_s)
65-
txt << %{<input name="_method" type="hidden" value="#{method}" />}
65+
txt << %{<input name="_method" type="hidden" value="#{method}" autocomplete="off" />}
6666
end
6767

6868
txt

actionview/test/template/active_model_helper_test.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,21 +81,21 @@ def test_collection_select_with_errors
8181

8282
def test_date_select_with_errors
8383
assert_dom_equal(
84-
%(<div class="field_with_errors"><select id="post_updated_at_1i" name="post[updated_at(1i)]">\n<option selected="selected" value="2004">2004</option>\n<option value="2005">2005</option>\n</select>\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="1" />\n</div>),
84+
%(<div class="field_with_errors"><select id="post_updated_at_1i" name="post[updated_at(1i)]">\n<option selected="selected" value="2004">2004</option>\n<option value="2005">2005</option>\n</select>\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" autocomplete="off" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="1" autocomplete="off" />\n</div>),
8585
date_select("post", "updated_at", discard_month: true, discard_day: true, start_year: 2004, end_year: 2005)
8686
)
8787
end
8888

8989
def test_datetime_select_with_errors
9090
assert_dom_equal(
91-
%(<div class="field_with_errors"><input id="post_updated_at_1i" name="post[updated_at(1i)]" type="hidden" value="2004" />\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="1" />\n<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n<option selected="selected" value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n</select>\n : <select id="post_updated_at_5i" name="post[updated_at(5i)]">\n<option selected="selected" value="00">00</option>\n</select>\n</div>),
91+
%(<div class="field_with_errors"><input id="post_updated_at_1i" name="post[updated_at(1i)]" type="hidden" value="2004" autocomplete="off" />\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" autocomplete="off" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="1" autocomplete="off" />\n<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n<option selected="selected" value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n</select>\n : <select id="post_updated_at_5i" name="post[updated_at(5i)]">\n<option selected="selected" value="00">00</option>\n</select>\n</div>),
9292
datetime_select("post", "updated_at", discard_year: true, discard_month: true, discard_day: true, minute_step: 60)
9393
)
9494
end
9595

9696
def test_time_select_with_errors
9797
assert_dom_equal(
98-
%(<div class="field_with_errors"><input id="post_updated_at_1i" name="post[updated_at(1i)]" type="hidden" value="2004" />\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="15" />\n<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n<option selected="selected" value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n</select>\n : <select id="post_updated_at_5i" name="post[updated_at(5i)]">\n<option selected="selected" value="00">00</option>\n</select>\n</div>),
98+
%(<div class="field_with_errors"><input id="post_updated_at_1i" name="post[updated_at(1i)]" type="hidden" value="2004" autocomplete="off" />\n<input id="post_updated_at_2i" name="post[updated_at(2i)]" type="hidden" value="6" autocomplete="off" />\n<input id="post_updated_at_3i" name="post[updated_at(3i)]" type="hidden" value="15" autocomplete="off" />\n<select id="post_updated_at_4i" name="post[updated_at(4i)]">\n<option selected="selected" value="00">00</option>\n<option value="01">01</option>\n<option value="02">02</option>\n<option value="03">03</option>\n<option value="04">04</option>\n<option value="05">05</option>\n<option value="06">06</option>\n<option value="07">07</option>\n<option value="08">08</option>\n<option value="09">09</option>\n<option value="10">10</option>\n<option value="11">11</option>\n<option value="12">12</option>\n<option value="13">13</option>\n<option value="14">14</option>\n<option value="15">15</option>\n<option value="16">16</option>\n<option value="17">17</option>\n<option value="18">18</option>\n<option value="19">19</option>\n<option value="20">20</option>\n<option value="21">21</option>\n<option value="22">22</option>\n<option value="23">23</option>\n</select>\n : <select id="post_updated_at_5i" name="post[updated_at(5i)]">\n<option selected="selected" value="00">00</option>\n</select>\n</div>),
9999
time_select("post", "updated_at", minute_step: 60)
100100
)
101101
end
@@ -109,14 +109,14 @@ def test_label_with_errors
109109

110110
def test_check_box_with_errors
111111
assert_dom_equal(
112-
%(<input name="post[published]" type="hidden" value="0" /><div class="field_with_errors"><input type="checkbox" value="1" name="post[published]" id="post_published" /></div>),
112+
%(<input name="post[published]" type="hidden" value="0" autocomplete="off" /><div class="field_with_errors"><input type="checkbox" value="1" name="post[published]" id="post_published" /></div>),
113113
check_box("post", "published")
114114
)
115115
end
116116

117117
def test_check_boxes_with_errors
118118
assert_dom_equal(
119-
%(<input name="post[published]" type="hidden" value="0" /><div class="field_with_errors"><input type="checkbox" value="1" name="post[published]" id="post_published" /></div><input name="post[published]" type="hidden" value="0" /><div class="field_with_errors"><input type="checkbox" value="1" name="post[published]" id="post_published" /></div>),
119+
%(<input name="post[published]" type="hidden" value="0" autocomplete="off" /><div class="field_with_errors"><input type="checkbox" value="1" name="post[published]" id="post_published" /></div><input name="post[published]" type="hidden" value="0" autocomplete="off" /><div class="field_with_errors"><input type="checkbox" value="1" name="post[published]" id="post_published" /></div>),
120120
check_box("post", "published") + check_box("post", "published")
121121
)
122122
end
@@ -137,21 +137,21 @@ def test_radio_buttons_with_errors
137137

138138
def test_collection_check_boxes_with_errors
139139
assert_dom_equal(
140-
%(<input type="hidden" name="post[category][]" value="" /><div class="field_with_errors"><input type="checkbox" value="ruby" name="post[category][]" id="post_category_ruby" /></div><label for="post_category_ruby">ruby</label><div class="field_with_errors"><input type="checkbox" value="java" name="post[category][]" id="post_category_java" /></div><label for="post_category_java">java</label>),
140+
%(<input type="hidden" name="post[category][]" value="" autocomplete="off" /><div class="field_with_errors"><input type="checkbox" value="ruby" name="post[category][]" id="post_category_ruby" /></div><label for="post_category_ruby">ruby</label><div class="field_with_errors"><input type="checkbox" value="java" name="post[category][]" id="post_category_java" /></div><label for="post_category_java">java</label>),
141141
collection_check_boxes("post", "category", [:ruby, :java], :to_s, :to_s)
142142
)
143143
end
144144

145145
def test_collection_radio_buttons_with_errors
146146
assert_dom_equal(
147-
%(<input type="hidden" name="post[category]" value="" /><div class="field_with_errors"><input type="radio" value="ruby" name="post[category]" id="post_category_ruby" /></div><label for="post_category_ruby">ruby</label><div class="field_with_errors"><input type="radio" value="java" name="post[category]" id="post_category_java" /></div><label for="post_category_java">java</label>),
147+
%(<input type="hidden" name="post[category]" value="" autocomplete="off" /><div class="field_with_errors"><input type="radio" value="ruby" name="post[category]" id="post_category_ruby" /></div><label for="post_category_ruby">ruby</label><div class="field_with_errors"><input type="radio" value="java" name="post[category]" id="post_category_java" /></div><label for="post_category_java">java</label>),
148148
collection_radio_buttons("post", "category", [:ruby, :java], :to_s, :to_s)
149149
)
150150
end
151151

152152
def test_hidden_field_does_not_render_errors
153153
assert_dom_equal(
154-
%(<input id="post_author_name" name="post[author_name]" type="hidden" value="" />),
154+
%(<input id="post_author_name" name="post[author_name]" type="hidden" value="" autocomplete="off" />),
155155
hidden_field("post", "author_name")
156156
)
157157
end

0 commit comments

Comments
 (0)