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

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

Issue 112663005: Add autofill preview support for Textarea (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add test code Created 6 years, 11 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 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 565
566 // Sets the |field|'s "suggested" (non JS visible) value to the value in |data|. 566 // Sets the |field|'s "suggested" (non JS visible) value to the value in |data|.
567 // Also sets the "autofilled" attribute, causing the background to be yellow. 567 // Also sets the "autofilled" attribute, causing the background to be yellow.
568 void PreviewFormField(const FormFieldData& data, 568 void PreviewFormField(const FormFieldData& data,
569 bool is_initiating_node, 569 bool is_initiating_node,
570 blink::WebFormControlElement* field) { 570 blink::WebFormControlElement* field) {
571 // Nothing to preview. 571 // Nothing to preview.
572 if (data.value.empty()) 572 if (data.value.empty())
573 return; 573 return;
574 574
575 // Only preview input fields. Excludes checkboxes and radio buttons, as there 575 // Preview input and textarea fields. For input fields, excludes checkboxes
576 // is no provision for setSuggestedCheckedValue in WebInputElement. 576 // and radio buttons, as there is no provision for setSuggestedCheckedValue
577 // in WebInputElement.
577 WebInputElement* input_element = toWebInputElement(field); 578 WebInputElement* input_element = toWebInputElement(field);
578 if (!IsTextInput(input_element)) 579 if (IsTextInput(input_element)) {
579 return; 580 // If the maxlength attribute contains a negative value, maxLength()
580 581 // returns the default maxlength value.
581 // If the maxlength attribute contains a negative value, maxLength() 582 input_element->setSuggestedValue(
582 // returns the default maxlength value.
583 input_element->setSuggestedValue(
584 data.value.substr(0, input_element->maxLength())); 583 data.value.substr(0, input_element->maxLength()));
585 input_element->setAutofilled(true); 584 input_element->setAutofilled(true);
Ilya Sherman 2014/01/07 01:09:38 nit: Please de-indent this line two spaces.
ziran.sun 2014/01/07 16:40:41 Done.
586 if (is_initiating_node) { 585 if (is_initiating_node) {
587 // Select the part of the text that the user didn't type. 586 // Select the part of the text that the user didn't type.
588 input_element->setSelectionRange(input_element->value().length(), 587 input_element->setSelectionRange(input_element->value().length(),
589 input_element->suggestedValue().length()); 588 input_element->suggestedValue().length());
Ilya Sherman 2014/01/07 01:09:38 nit: Indentation is off here. Please format this
ziran.sun 2014/01/07 16:40:41 Done.
589 }
590 } else if (IsTextAreaElement(*field)) {
591 WebTextAreaElement textarea = field->to<WebTextAreaElement>();
592 textarea.setSuggestedValue(data.value);
593 field->setAutofilled(true);
590 } 594 }
591 } 595 }
592 596
593 std::string RetrievalMethodToString( 597 std::string RetrievalMethodToString(
594 const WebElementDescriptor::RetrievalMethod& method) { 598 const WebElementDescriptor::RetrievalMethod& method) {
595 switch (method) { 599 switch (method) {
596 case WebElementDescriptor::CSS_SELECTOR: 600 case WebElementDescriptor::CSS_SELECTOR:
597 return "CSS_SELECTOR"; 601 return "CSS_SELECTOR";
598 case WebElementDescriptor::ID: 602 case WebElementDescriptor::ID:
599 return "ID"; 603 return "ID";
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 bool ClearPreviewedFormWithElement(const WebInputElement& element, 1046 bool ClearPreviewedFormWithElement(const WebInputElement& element,
1043 bool was_autofilled) { 1047 bool was_autofilled) {
1044 WebFormElement form_element = element.form(); 1048 WebFormElement form_element = element.form();
1045 if (form_element.isNull()) 1049 if (form_element.isNull())
1046 return false; 1050 return false;
1047 1051
1048 std::vector<WebFormControlElement> control_elements; 1052 std::vector<WebFormControlElement> control_elements;
1049 ExtractAutofillableElements(form_element, REQUIRE_AUTOCOMPLETE, 1053 ExtractAutofillableElements(form_element, REQUIRE_AUTOCOMPLETE,
1050 &control_elements); 1054 &control_elements);
1051 for (size_t i = 0; i < control_elements.size(); ++i) { 1055 for (size_t i = 0; i < control_elements.size(); ++i) {
1052 // Only text input elements can be previewed. 1056 // Only text input and textarea elements can be previewed.
1053 WebInputElement* input_element = toWebInputElement(&control_elements[i]); 1057 WebInputElement* input_element = toWebInputElement(&control_elements[i]);
1054 if (!IsTextInput(input_element)) 1058 if (!IsTextInput(input_element) && !IsTextAreaElement(control_elements[i]))
1055 continue; 1059 continue;
1056 1060
1057 // If the input element is not auto-filled, we did not preview it, so there 1061 // If the element is not auto-filled, we did not preview it,
1058 // is nothing to reset. 1062 // so there is nothing to reset.
1059 if (!input_element->isAutofilled()) 1063 if(!control_elements[i].isAutofilled())
1060 continue; 1064 continue;
1061 1065
1062 // There might be unrelated elements in this form which have already been 1066 // There might be unrelated elements in this form which have already been
1063 // auto-filled. For example, the user might have already filled the address 1067 // auto-filled. For example, the user might have already filled the address
1064 // part of a form and now be dealing with the credit card section. We only 1068 // part of a form and now be dealing with the credit card section. We only
1065 // want to reset the auto-filled status for fields that were previewed. 1069 // want to reset the auto-filled status for fields that were previewed.
1066 if (input_element->suggestedValue().isEmpty()) 1070 WebFormControlElement control_element = control_elements[i];
Ilya Sherman 2014/01/07 01:09:38 nit: I'd recommend moving this to the top of the l
ziran.sun 2014/01/07 16:40:41 Done.
1071 if ((IsTextInput(input_element) &&
1072 input_element->suggestedValue().isEmpty())
1073 || (IsTextAreaElement(control_element) &&
1074 control_element.to<WebTextAreaElement>().suggestedValue().isEmpty()))
Ilya Sherman 2014/01/07 01:09:38 This is still not wrapped correctly. Specifically
ziran.sun 2014/01/07 16:40:41 Done.
1067 continue; 1075 continue;
1068 1076
1069 // Clear the suggested value. For the initiating node, also restore the 1077 // Clear the suggested value. For the initiating node, also restore the
1070 // original value. 1078 // original value.
1071 input_element->setSuggestedValue(WebString()); 1079 if (IsTextInput(input_element)) {
1072 bool is_initiating_node = (element == *input_element); 1080 input_element->setSuggestedValue(WebString());
1073 if (is_initiating_node) 1081 bool is_initiating_node = (element == *input_element);
1074 input_element->setAutofilled(was_autofilled); 1082 if (is_initiating_node)
1075 else 1083 input_element->setAutofilled(was_autofilled);
1076 input_element->setAutofilled(false); 1084 else
1085 input_element->setAutofilled(false);
Ilya Sherman 2014/01/07 01:09:38 Lines 1081-1085 are essentially duplicated on line
ziran.sun 2014/01/07 16:40:41 This could look ugly. Check other functions, e.g.
Ilya Sherman 2014/01/08 04:13:47 Alright, I guess it's ok as is. Thanks.
1077 1086
1078 // Clearing the suggested value in the focused node (above) can cause 1087 // Clearing the suggested value in the focused node (above) can cause
1079 // selection to be lost. We force selection range to restore the text 1088 // selection to be lost. We force selection range to restore the text
1080 // cursor. 1089 // cursor.
1081 if (is_initiating_node) { 1090 if (is_initiating_node) {
1082 int length = input_element->value().length(); 1091 int length = input_element->value().length();
1083 input_element->setSelectionRange(length, length); 1092 input_element->setSelectionRange(length, length);
1093 }
1094 } else if (IsTextAreaElement(control_element)) {
1095 WebTextAreaElement text_area = control_element.to<WebTextAreaElement>();
1096 text_area.setSuggestedValue(WebString());
1097 bool is_initiating_node = (element == text_area);
1098 if (is_initiating_node)
1099 control_element.setAutofilled(was_autofilled);
1100 else
1101 control_element.setAutofilled(false);
1084 } 1102 }
1085 } 1103 }
1086 1104
1087 return true; 1105 return true;
1088 } 1106 }
1089 1107
1090 bool FormWithElementIsAutofilled(const WebInputElement& element) { 1108 bool FormWithElementIsAutofilled(const WebInputElement& element) {
1091 WebFormElement form_element = element.form(); 1109 WebFormElement form_element = element.form();
1092 if (form_element.isNull()) 1110 if (form_element.isNull())
1093 return false; 1111 return false;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1151 break; 1169 break;
1152 } 1170 }
1153 } 1171 }
1154 if (!tag_is_allowed) 1172 if (!tag_is_allowed)
1155 return false; 1173 return false;
1156 } 1174 }
1157 return true; 1175 return true;
1158 } 1176 }
1159 1177
1160 } // namespace autofill 1178 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698