Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: components/autofill/content/renderer/form_autofill_util.cc

Issue 1059393002: Remove --respect-autocomplete-off-autofill flag. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix last 3 tests Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/autofill/content/renderer/form_autofill_util.h" 5 #include "components/autofill/content/renderer/form_autofill_util.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 enum FieldFilterMask { 56 enum FieldFilterMask {
57 FILTER_NONE = 0, 57 FILTER_NONE = 0,
58 FILTER_DISABLED_ELEMENTS = 1 << 0, 58 FILTER_DISABLED_ELEMENTS = 1 << 0,
59 FILTER_READONLY_ELEMENTS = 1 << 1, 59 FILTER_READONLY_ELEMENTS = 1 << 1,
60 FILTER_NON_FOCUSABLE_ELEMENTS = 1 << 2, 60 FILTER_NON_FOCUSABLE_ELEMENTS = 1 << 2,
61 FILTER_ALL_NON_EDITABLE_ELEMENTS = FILTER_DISABLED_ELEMENTS | 61 FILTER_ALL_NON_EDITABLE_ELEMENTS = FILTER_DISABLED_ELEMENTS |
62 FILTER_READONLY_ELEMENTS | 62 FILTER_READONLY_ELEMENTS |
63 FILTER_NON_FOCUSABLE_ELEMENTS, 63 FILTER_NON_FOCUSABLE_ELEMENTS,
64 }; 64 };
65 65
66 RequirementsMask ExtractionRequirements() {
67 return base::CommandLine::ForCurrentProcess()->HasSwitch(
68 switches::kRespectAutocompleteOffForAutofill)
69 ? REQUIRE_AUTOCOMPLETE
70 : REQUIRE_NONE;
71 }
72
73 void TruncateString(base::string16* str, size_t max_length) { 66 void TruncateString(base::string16* str, size_t max_length) {
74 if (str->length() > max_length) 67 if (str->length() > max_length)
75 str->resize(max_length); 68 str->resize(max_length);
76 } 69 }
77 70
78 bool IsOptionElement(const WebElement& element) { 71 bool IsOptionElement(const WebElement& element) {
79 CR_DEFINE_STATIC_LOCAL(WebString, kOption, ("option")); 72 CR_DEFINE_STATIC_LOCAL(WebString, kOption, ("option"));
80 return element.hasHTMLTagName(kOption); 73 return element.hasHTMLTagName(kOption);
81 } 74 }
82 75
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 130
138 std::string tag_name = node.toConst<WebElement>().tagName().utf8(); 131 std::string tag_name = node.toConst<WebElement>().tagName().utf8();
139 return (tag_name == "DD" || 132 return (tag_name == "DD" ||
140 tag_name == "DIV" || 133 tag_name == "DIV" ||
141 tag_name == "FIELDSET" || 134 tag_name == "FIELDSET" ||
142 tag_name == "LI" || 135 tag_name == "LI" ||
143 tag_name == "TD" || 136 tag_name == "TD" ||
144 tag_name == "TABLE"); 137 tag_name == "TABLE");
145 } 138 }
146 139
147 // Check whether the given field satisfies the REQUIRE_AUTOCOMPLETE requirement.
148 bool SatisfiesRequireAutocomplete(const WebInputElement& input_element) {
149 return input_element.autoComplete();
150 }
151
152 // Returns the colspan for a <td> / <th>. Defaults to 1. 140 // Returns the colspan for a <td> / <th>. Defaults to 1.
153 size_t CalculateTableCellColumnSpan(const WebElement& element) { 141 size_t CalculateTableCellColumnSpan(const WebElement& element) {
154 DCHECK(element.hasHTMLTagName("td") || element.hasHTMLTagName("th")); 142 DCHECK(element.hasHTMLTagName("td") || element.hasHTMLTagName("th"));
155 143
156 size_t span = 1; 144 size_t span = 1;
157 if (element.hasAttribute("colspan")) { 145 if (element.hasAttribute("colspan")) {
158 base::string16 colspan = element.getAttribute("colspan"); 146 base::string16 colspan = element.getAttribute("colspan");
159 // Do not check return value to accept imperfect conversions. 147 // Do not check return value to accept imperfect conversions.
160 base::StringToSizeT(colspan, &span); 148 base::StringToSizeT(colspan, &span);
161 // Handle overflow. 149 // Handle overflow.
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 770
783 // For each autofillable field in |data| that matches a field in the |form|, 771 // For each autofillable field in |data| that matches a field in the |form|,
784 // the |callback| is invoked with the corresponding |form| field data. 772 // the |callback| is invoked with the corresponding |form| field data.
785 void ForEachMatchingFormField(const WebFormElement& form_element, 773 void ForEachMatchingFormField(const WebFormElement& form_element,
786 const WebElement& initiating_element, 774 const WebElement& initiating_element,
787 const FormData& data, 775 const FormData& data,
788 FieldFilterMask filters, 776 FieldFilterMask filters,
789 bool force_override, 777 bool force_override,
790 const Callback& callback) { 778 const Callback& callback) {
791 std::vector<WebFormControlElement> control_elements = 779 std::vector<WebFormControlElement> control_elements =
792 ExtractAutofillableElementsInForm(form_element, ExtractionRequirements()); 780 ExtractAutofillableElementsInForm(form_element);
793 ForEachMatchingFormFieldCommon(&control_elements, initiating_element, data, 781 ForEachMatchingFormFieldCommon(&control_elements, initiating_element, data,
794 filters, force_override, callback); 782 filters, force_override, callback);
795 } 783 }
796 784
797 // For each autofillable field in |data| that matches a field in the set of 785 // For each autofillable field in |data| that matches a field in the set of
798 // unowned autofillable form fields, the |callback| is invoked with the 786 // unowned autofillable form fields, the |callback| is invoked with the
799 // corresponding |data| field. 787 // corresponding |data| field.
800 void ForEachMatchingUnownedFormField(const WebElement& initiating_element, 788 void ForEachMatchingUnownedFormField(const WebElement& initiating_element,
801 const FormData& data, 789 const FormData& data,
802 FieldFilterMask filters, 790 FieldFilterMask filters,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
904 for (size_t i = 0; i < length; ++i) { 892 for (size_t i = 0; i < length; ++i) {
905 const blink::WebNode& item = children.item(i); 893 const blink::WebNode& item = children.item(i);
906 if (IsWebNodeVisibleImpl(item, depth - 1)) 894 if (IsWebNodeVisibleImpl(item, depth - 1))
907 return true; 895 return true;
908 } 896 }
909 return false; 897 return false;
910 } 898 }
911 899
912 bool ExtractFieldsFromControlElements( 900 bool ExtractFieldsFromControlElements(
913 const WebVector<WebFormControlElement>& control_elements, 901 const WebVector<WebFormControlElement>& control_elements,
914 RequirementsMask requirements,
915 ExtractMask extract_mask, 902 ExtractMask extract_mask,
916 ScopedVector<FormFieldData>* form_fields, 903 ScopedVector<FormFieldData>* form_fields,
917 std::vector<bool>* fields_extracted, 904 std::vector<bool>* fields_extracted,
918 std::map<WebFormControlElement, FormFieldData*>* element_map) { 905 std::map<WebFormControlElement, FormFieldData*>* element_map) {
919 for (size_t i = 0; i < control_elements.size(); ++i) { 906 for (size_t i = 0; i < control_elements.size(); ++i) {
920 const WebFormControlElement& control_element = control_elements[i]; 907 const WebFormControlElement& control_element = control_elements[i];
921 908
922 if (!IsAutofillableElement(control_element)) 909 if (!IsAutofillableElement(control_element))
923 continue; 910 continue;
924 911
925 const WebInputElement* input_element = toWebInputElement(&control_element);
926 if (requirements & REQUIRE_AUTOCOMPLETE &&
927 IsAutofillableInputElement(input_element) &&
928 !SatisfiesRequireAutocomplete(*input_element))
929 continue;
930
931 // Create a new FormFieldData, fill it out and map it to the field's name. 912 // Create a new FormFieldData, fill it out and map it to the field's name.
932 FormFieldData* form_field = new FormFieldData; 913 FormFieldData* form_field = new FormFieldData;
933 WebFormControlElementToFormField(control_element, extract_mask, form_field); 914 WebFormControlElementToFormField(control_element, extract_mask, form_field);
934 form_fields->push_back(form_field); 915 form_fields->push_back(form_field);
935 (*element_map)[control_element] = form_field; 916 (*element_map)[control_element] = form_field;
936 (*fields_extracted)[i] = true; 917 (*fields_extracted)[i] = true;
937 } 918 }
938 919
939 // If we failed to extract any fields, give up. Also, to avoid overly 920 // If we failed to extract any fields, give up. Also, to avoid overly
940 // expensive computation, we impose a maximum number of allowable fields. 921 // expensive computation, we impose a maximum number of allowable fields.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 // 1) |form_element| and an empty |fieldsets|. 990 // 1) |form_element| and an empty |fieldsets|.
1010 // or 991 // or
1011 // 2) a NULL |form_element|. 992 // 2) a NULL |form_element|.
1012 // 993 //
1013 // If |field| is not NULL, then |form_control_element| should be not NULL. 994 // If |field| is not NULL, then |form_control_element| should be not NULL.
1014 bool FormOrFieldsetsToFormData( 995 bool FormOrFieldsetsToFormData(
1015 const blink::WebFormElement* form_element, 996 const blink::WebFormElement* form_element,
1016 const blink::WebFormControlElement* form_control_element, 997 const blink::WebFormControlElement* form_control_element,
1017 const std::vector<blink::WebElement>& fieldsets, 998 const std::vector<blink::WebElement>& fieldsets,
1018 const WebVector<WebFormControlElement>& control_elements, 999 const WebVector<WebFormControlElement>& control_elements,
1019 RequirementsMask requirements,
1020 ExtractMask extract_mask, 1000 ExtractMask extract_mask,
1021 FormData* form, 1001 FormData* form,
1022 FormFieldData* field) { 1002 FormFieldData* field) {
1023 CR_DEFINE_STATIC_LOCAL(WebString, kLabel, ("label")); 1003 CR_DEFINE_STATIC_LOCAL(WebString, kLabel, ("label"));
1024 1004
1025 if (form_element) 1005 if (form_element)
1026 DCHECK(fieldsets.empty()); 1006 DCHECK(fieldsets.empty());
1027 if (field) 1007 if (field)
1028 DCHECK(form_control_element); 1008 DCHECK(form_control_element);
1029 1009
1030 // A map from a FormFieldData's name to the FormFieldData itself. 1010 // A map from a FormFieldData's name to the FormFieldData itself.
1031 std::map<WebFormControlElement, FormFieldData*> element_map; 1011 std::map<WebFormControlElement, FormFieldData*> element_map;
1032 1012
1033 // The extracted FormFields. We use pointers so we can store them in 1013 // The extracted FormFields. We use pointers so we can store them in
1034 // |element_map|. 1014 // |element_map|.
1035 ScopedVector<FormFieldData> form_fields; 1015 ScopedVector<FormFieldData> form_fields;
1036 1016
1037 // A vector of bools that indicate whether each field in the form meets the 1017 // A vector of bools that indicate whether each field in the form meets the
1038 // requirements and thus will be in the resulting |form|. 1018 // requirements and thus will be in the resulting |form|.
1039 std::vector<bool> fields_extracted(control_elements.size(), false); 1019 std::vector<bool> fields_extracted(control_elements.size(), false);
1040 1020
1041 if (!ExtractFieldsFromControlElements(control_elements, requirements, 1021 if (!ExtractFieldsFromControlElements(control_elements, extract_mask,
1042 extract_mask, &form_fields, 1022 &form_fields, &fields_extracted,
1043 &fields_extracted, &element_map)) { 1023 &element_map)) {
1044 return false; 1024 return false;
1045 } 1025 }
1046 1026
1047 if (form_element) { 1027 if (form_element) {
1048 // Loop through the label elements inside the form element. For each label 1028 // Loop through the label elements inside the form element. For each label
1049 // element, get the corresponding form control element, use the form control 1029 // element, get the corresponding form control element, use the form control
1050 // element's name as a key into the <name, FormFieldData> map to find the 1030 // element's name as a key into the <name, FormFieldData> map to find the
1051 // previously created FormFieldData and set the FormFieldData's label to the 1031 // previously created FormFieldData and set the FormFieldData's label to the
1052 // label.firstChild().nodeValue() of the label element. 1032 // label.firstChild().nodeValue() of the label element.
1053 WebElementCollection labels = 1033 WebElementCollection labels =
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 1122
1143 bool IsWebNodeVisible(const blink::WebNode& node) { 1123 bool IsWebNodeVisible(const blink::WebNode& node) {
1144 // In the bug http://crbug.com/237216 the form's bounding box is empty 1124 // In the bug http://crbug.com/237216 the form's bounding box is empty
1145 // however the form has non empty children. Thus we need to look at the 1125 // however the form has non empty children. Thus we need to look at the
1146 // form's children. 1126 // form's children.
1147 int kNodeSearchDepth = 2; 1127 int kNodeSearchDepth = 2;
1148 return IsWebNodeVisibleImpl(node, kNodeSearchDepth); 1128 return IsWebNodeVisibleImpl(node, kNodeSearchDepth);
1149 } 1129 }
1150 1130
1151 std::vector<blink::WebFormControlElement> ExtractAutofillableElementsFromSet( 1131 std::vector<blink::WebFormControlElement> ExtractAutofillableElementsFromSet(
1152 const WebVector<WebFormControlElement>& control_elements, 1132 const WebVector<WebFormControlElement>& control_elements) {
1153 RequirementsMask requirements) {
1154 std::vector<blink::WebFormControlElement> autofillable_elements; 1133 std::vector<blink::WebFormControlElement> autofillable_elements;
1155 for (size_t i = 0; i < control_elements.size(); ++i) { 1134 for (size_t i = 0; i < control_elements.size(); ++i) {
1156 WebFormControlElement element = control_elements[i]; 1135 WebFormControlElement element = control_elements[i];
1157 if (!IsAutofillableElement(element)) 1136 if (!IsAutofillableElement(element))
1158 continue; 1137 continue;
1159 1138
1160 if (requirements & REQUIRE_AUTOCOMPLETE) {
1161 // TODO(isherman): WebKit currently doesn't handle the autocomplete
1162 // attribute for select or textarea elements, but it probably should.
1163 const WebInputElement* input_element =
1164 toWebInputElement(&control_elements[i]);
1165 if (IsAutofillableInputElement(input_element) &&
1166 !SatisfiesRequireAutocomplete(*input_element))
1167 continue;
1168 }
1169
1170 autofillable_elements.push_back(element); 1139 autofillable_elements.push_back(element);
1171 } 1140 }
1172 return autofillable_elements; 1141 return autofillable_elements;
1173 } 1142 }
1174 1143
1175 std::vector<WebFormControlElement> ExtractAutofillableElementsInForm( 1144 std::vector<WebFormControlElement> ExtractAutofillableElementsInForm(
1176 const WebFormElement& form_element, 1145 const WebFormElement& form_element) {
1177 RequirementsMask requirements) {
1178 WebVector<WebFormControlElement> control_elements; 1146 WebVector<WebFormControlElement> control_elements;
1179 form_element.getFormControlElements(control_elements); 1147 form_element.getFormControlElements(control_elements);
1180 1148
1181 return ExtractAutofillableElementsFromSet(control_elements, requirements); 1149 return ExtractAutofillableElementsFromSet(control_elements);
1182 } 1150 }
1183 1151
1184 void WebFormControlElementToFormField(const WebFormControlElement& element, 1152 void WebFormControlElementToFormField(const WebFormControlElement& element,
1185 ExtractMask extract_mask, 1153 ExtractMask extract_mask,
1186 FormFieldData* field) { 1154 FormFieldData* field) {
1187 DCHECK(field); 1155 DCHECK(field);
1188 DCHECK(!element.isNull()); 1156 DCHECK(!element.isNull());
1189 CR_DEFINE_STATIC_LOCAL(WebString, kAutocomplete, ("autocomplete")); 1157 CR_DEFINE_STATIC_LOCAL(WebString, kAutocomplete, ("autocomplete"));
1190 CR_DEFINE_STATIC_LOCAL(WebString, kRole, ("role")); 1158 CR_DEFINE_STATIC_LOCAL(WebString, kRole, ("role"));
1191 1159
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1259 // Constrain the maximum data length to prevent a malicious site from DOS'ing 1227 // Constrain the maximum data length to prevent a malicious site from DOS'ing
1260 // the browser: http://crbug.com/49332 1228 // the browser: http://crbug.com/49332
1261 TruncateString(&value, kMaxDataLength); 1229 TruncateString(&value, kMaxDataLength);
1262 1230
1263 field->value = value; 1231 field->value = value;
1264 } 1232 }
1265 1233
1266 bool WebFormElementToFormData( 1234 bool WebFormElementToFormData(
1267 const blink::WebFormElement& form_element, 1235 const blink::WebFormElement& form_element,
1268 const blink::WebFormControlElement& form_control_element, 1236 const blink::WebFormControlElement& form_control_element,
1269 RequirementsMask requirements,
1270 ExtractMask extract_mask, 1237 ExtractMask extract_mask,
1271 FormData* form, 1238 FormData* form,
1272 FormFieldData* field) { 1239 FormFieldData* field) {
1273 const WebFrame* frame = form_element.document().frame(); 1240 const WebFrame* frame = form_element.document().frame();
1274 if (!frame) 1241 if (!frame)
1275 return false; 1242 return false;
1276 1243
1277 if (requirements & REQUIRE_AUTOCOMPLETE && !form_element.autoComplete())
1278 return false;
1279
1280 form->name = GetFormIdentifier(form_element); 1244 form->name = GetFormIdentifier(form_element);
1281 form->origin = frame->document().url(); 1245 form->origin = frame->document().url();
1282 form->action = frame->document().completeURL(form_element.action()); 1246 form->action = frame->document().completeURL(form_element.action());
1283 form->user_submitted = form_element.wasUserSubmitted(); 1247 form->user_submitted = form_element.wasUserSubmitted();
1284 1248
1285 // If the completed URL is not valid, just use the action we get from 1249 // If the completed URL is not valid, just use the action we get from
1286 // WebKit. 1250 // WebKit.
1287 if (!form->action.is_valid()) 1251 if (!form->action.is_valid())
1288 form->action = GURL(form_element.action()); 1252 form->action = GURL(form_element.action());
1289 1253
1290 WebVector<WebFormControlElement> control_elements; 1254 WebVector<WebFormControlElement> control_elements;
1291 form_element.getFormControlElements(control_elements); 1255 form_element.getFormControlElements(control_elements);
1292 1256
1293 std::vector<blink::WebElement> dummy_fieldset; 1257 std::vector<blink::WebElement> dummy_fieldset;
1294 return FormOrFieldsetsToFormData(&form_element, &form_control_element, 1258 return FormOrFieldsetsToFormData(&form_element, &form_control_element,
1295 dummy_fieldset, control_elements, 1259 dummy_fieldset, control_elements,
1296 requirements, extract_mask, form, field); 1260 extract_mask, form, field);
1297 } 1261 }
1298 1262
1299 std::vector<WebFormControlElement> 1263 std::vector<WebFormControlElement>
1300 GetUnownedAutofillableFormFieldElements( 1264 GetUnownedAutofillableFormFieldElements(
1301 const WebElementCollection& elements, 1265 const WebElementCollection& elements,
1302 std::vector<WebElement>* fieldsets) { 1266 std::vector<WebElement>* fieldsets) {
1303 std::vector<WebFormControlElement> unowned_fieldset_children; 1267 std::vector<WebFormControlElement> unowned_fieldset_children;
1304 for (WebElement element = elements.firstItem(); 1268 for (WebElement element = elements.firstItem();
1305 !element.isNull(); 1269 !element.isNull();
1306 element = elements.nextItem()) { 1270 element = elements.nextItem()) {
1307 if (element.isFormControlElement()) { 1271 if (element.isFormControlElement()) {
1308 WebFormControlElement control = element.to<WebFormControlElement>(); 1272 WebFormControlElement control = element.to<WebFormControlElement>();
1309 if (control.form().isNull()) 1273 if (control.form().isNull())
1310 unowned_fieldset_children.push_back(control); 1274 unowned_fieldset_children.push_back(control);
1311 } 1275 }
1312 1276
1313 if (fieldsets && element.hasHTMLTagName("fieldset") && 1277 if (fieldsets && element.hasHTMLTagName("fieldset") &&
1314 !IsElementInsideFormOrFieldSet(element)) { 1278 !IsElementInsideFormOrFieldSet(element)) {
1315 fieldsets->push_back(element); 1279 fieldsets->push_back(element);
1316 } 1280 }
1317 } 1281 }
1318 return ExtractAutofillableElementsFromSet(unowned_fieldset_children, 1282 return ExtractAutofillableElementsFromSet(unowned_fieldset_children);
1319 REQUIRE_NONE);
1320 } 1283 }
1321 1284
1322 bool UnownedFormElementsAndFieldSetsToFormData( 1285 bool UnownedFormElementsAndFieldSetsToFormData(
1323 const std::vector<blink::WebElement>& fieldsets, 1286 const std::vector<blink::WebElement>& fieldsets,
1324 const std::vector<blink::WebFormControlElement>& control_elements, 1287 const std::vector<blink::WebFormControlElement>& control_elements,
1325 const blink::WebFormControlElement* element, 1288 const blink::WebFormControlElement* element,
1326 const GURL& origin, 1289 const GURL& origin,
1327 RequirementsMask requirements,
1328 ExtractMask extract_mask, 1290 ExtractMask extract_mask,
1329 FormData* form, 1291 FormData* form,
1330 FormFieldData* field) { 1292 FormFieldData* field) {
1331 form->origin = origin; 1293 form->origin = origin;
1332 form->user_submitted = false; 1294 form->user_submitted = false;
1333 form->is_form_tag = false; 1295 form->is_form_tag = false;
1334 1296
1335 return FormOrFieldsetsToFormData(nullptr, element, fieldsets, 1297 return FormOrFieldsetsToFormData(nullptr, element, fieldsets,
1336 control_elements, requirements, extract_mask, 1298 control_elements, extract_mask, form, field);
1337 form, field);
1338 } 1299 }
1339 1300
1340 bool FindFormAndFieldForFormControlElement(const WebFormControlElement& element, 1301 bool FindFormAndFieldForFormControlElement(const WebFormControlElement& element,
1341 FormData* form, 1302 FormData* form,
1342 FormFieldData* field, 1303 FormFieldData* field) {
1343 RequirementsMask requirements) {
1344 if (!IsAutofillableElement(element)) 1304 if (!IsAutofillableElement(element))
1345 return false; 1305 return false;
1346 1306
1347 ExtractMask extract_mask = 1307 ExtractMask extract_mask =
1348 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS); 1308 static_cast<ExtractMask>(EXTRACT_VALUE | EXTRACT_OPTIONS);
1349 const WebFormElement form_element = element.form(); 1309 const WebFormElement form_element = element.form();
1350 if (form_element.isNull()) { 1310 if (form_element.isNull()) {
1351 // No associated form, try the synthetic form for unowned form elements. 1311 // No associated form, try the synthetic form for unowned form elements.
1352 WebDocument document = element.document(); 1312 WebDocument document = element.document();
1353 std::vector<WebElement> fieldsets; 1313 std::vector<WebElement> fieldsets;
1354 std::vector<WebFormControlElement> control_elements = 1314 std::vector<WebFormControlElement> control_elements =
1355 GetUnownedAutofillableFormFieldElements(document.all(), &fieldsets); 1315 GetUnownedAutofillableFormFieldElements(document.all(), &fieldsets);
1356 return UnownedFormElementsAndFieldSetsToFormData( 1316 return UnownedFormElementsAndFieldSetsToFormData(
1357 fieldsets, control_elements, &element, document.url(), requirements, 1317 fieldsets, control_elements, &element, document.url(), extract_mask,
1358 extract_mask, form, field); 1318 form, field);
1359 } 1319 }
1360 1320
1361 return WebFormElementToFormData(form_element, 1321 return WebFormElementToFormData(form_element,
1362 element, 1322 element,
1363 requirements,
1364 extract_mask, 1323 extract_mask,
1365 form, 1324 form,
1366 field); 1325 field);
1367 } 1326 }
1368 1327
1369 void FillForm(const FormData& form, const WebFormControlElement& element) { 1328 void FillForm(const FormData& form, const WebFormControlElement& element) {
1370 WebFormElement form_element = element.form(); 1329 WebFormElement form_element = element.form();
1371 if (form_element.isNull()) { 1330 if (form_element.isNull()) {
1372 ForEachMatchingUnownedFormField(element, 1331 ForEachMatchingUnownedFormField(element,
1373 form, 1332 form,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1424 bool ClearPreviewedFormWithElement(const WebFormControlElement& element, 1383 bool ClearPreviewedFormWithElement(const WebFormControlElement& element,
1425 bool was_autofilled) { 1384 bool was_autofilled) {
1426 WebFormElement form_element = element.form(); 1385 WebFormElement form_element = element.form();
1427 std::vector<WebFormControlElement> control_elements; 1386 std::vector<WebFormControlElement> control_elements;
1428 if (form_element.isNull()) { 1387 if (form_element.isNull()) {
1429 control_elements = GetUnownedAutofillableFormFieldElements( 1388 control_elements = GetUnownedAutofillableFormFieldElements(
1430 element.document().all(), nullptr); 1389 element.document().all(), nullptr);
1431 if (!IsElementInControlElementSet(element, control_elements)) 1390 if (!IsElementInControlElementSet(element, control_elements))
1432 return false; 1391 return false;
1433 } else { 1392 } else {
1434 control_elements = ExtractAutofillableElementsInForm( 1393 control_elements = ExtractAutofillableElementsInForm(form_element);
1435 form_element, ExtractionRequirements());
1436 } 1394 }
1437 1395
1438 for (size_t i = 0; i < control_elements.size(); ++i) { 1396 for (size_t i = 0; i < control_elements.size(); ++i) {
1439 // There might be unrelated elements in this form which have already been 1397 // There might be unrelated elements in this form which have already been
1440 // auto-filled. For example, the user might have already filled the address 1398 // auto-filled. For example, the user might have already filled the address
1441 // part of a form and now be dealing with the credit card section. We only 1399 // part of a form and now be dealing with the credit card section. We only
1442 // want to reset the auto-filled status for fields that were previewed. 1400 // want to reset the auto-filled status for fields that were previewed.
1443 WebFormControlElement control_element = control_elements[i]; 1401 WebFormControlElement control_element = control_elements[i];
1444 1402
1445 // Only text input, textarea and select elements can be previewed. 1403 // Only text input, textarea and select elements can be previewed.
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1540 1498
1541 gfx::RectF GetScaledBoundingBox(float scale, WebElement* element) { 1499 gfx::RectF GetScaledBoundingBox(float scale, WebElement* element) {
1542 gfx::Rect bounding_box(element->boundsInViewportSpace()); 1500 gfx::Rect bounding_box(element->boundsInViewportSpace());
1543 return gfx::RectF(bounding_box.x() * scale, 1501 return gfx::RectF(bounding_box.x() * scale,
1544 bounding_box.y() * scale, 1502 bounding_box.y() * scale,
1545 bounding_box.width() * scale, 1503 bounding_box.width() * scale,
1546 bounding_box.height() * scale); 1504 bounding_box.height() * scale);
1547 } 1505 }
1548 1506
1549 } // namespace autofill 1507 } // namespace autofill
OLDNEW
« no previous file with comments | « components/autofill/content/renderer/form_autofill_util.h ('k') | components/autofill/content/renderer/form_cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698