diff options
author | ziran.sun@samsung.com <ziran.sun@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-09 21:31:44 +0000 |
---|---|---|
committer | ziran.sun@samsung.com <ziran.sun@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-09 21:31:44 +0000 |
commit | 9be8ba95def51b39dd0f790d14a7f3dbfb5a2edf (patch) | |
tree | 227addb38c9426352e62e906e812ded9b6d69822 | |
parent | c67e7090c18dba2a9eee439628718d2c80427c64 (diff) | |
download | chromium_src-9be8ba95def51b39dd0f790d14a7f3dbfb5a2edf.zip chromium_src-9be8ba95def51b39dd0f790d14a7f3dbfb5a2edf.tar.gz chromium_src-9be8ba95def51b39dd0f790d14a7f3dbfb5a2edf.tar.bz2 |
Add autofill preview support for Textarea
BUG=314976
R=isherman@chromium.org
Review URL: https://codereview.chromium.org/112663005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@243977 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/renderer/autofill/form_autofill_browsertest.cc | 67 | ||||
-rw-r--r-- | components/autofill/content/renderer/form_autofill_util.cc | 94 |
2 files changed, 103 insertions, 58 deletions
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc index ecb90ab..e12acc40 100644 --- a/chrome/renderer/autofill/form_autofill_browsertest.cc +++ b/chrome/renderer/autofill/form_autofill_browsertest.cc @@ -161,7 +161,7 @@ class FormAutofillTest : public ChromeRenderViewTest { typedef void (*FillFormFunction)(const FormData& form, const WebInputElement& element); - typedef WebString (WebInputElement::*GetValueFunction)(void) const; + typedef WebString (*GetValueFunction)(WebFormControlElement element); // Test FormFillxxx functions. void TestFormFillFunctions(const char* html, @@ -235,13 +235,11 @@ class FormAutofillTest : public ChromeRenderViewTest { if (element.formControlType() == "select-one") { value = element.to<WebSelectElement>().value(); } else if (element.formControlType() == "textarea") { - value = element.to<WebTextAreaElement>().value(); + value = get_value_function(element); } else { ASSERT_TRUE(element.formControlType() == "text" || element.formControlType() == "month"); - WebInputElement input_element = GetMainFrame()->document().getElementById( - ASCIIToUTF16(field_case.name)).to<WebInputElement>(); - value = (input_element.*get_value_function)(); + value = get_value_function(element); } const WebString expected_value = ASCIIToUTF16(field_case.expected_value); @@ -264,6 +262,20 @@ class FormAutofillTest : public ChromeRenderViewTest { FillFormIncludingNonFocusableElements(form, element.form()); } + static WebString GetValueWrapper(WebFormControlElement element) { + if (element.formControlType() == "textarea") + return element.to<WebTextAreaElement>().value(); + + return element.to<WebInputElement>().value(); + } + + static WebString GetSuggestedValueWrapper(WebFormControlElement element) { + if (element.formControlType() == "textarea") + return element.to<WebTextAreaElement>().suggestedValue(); + + return element.to<WebInputElement>().suggestedValue(); + } + private: DISALLOW_COPY_AND_ASSIGN(FormAutofillTest); }; @@ -1115,7 +1127,7 @@ TEST_F(FormAutofillTest, FillForm) { "some multi-\nline value", "Go\naway!"}, }; TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), - FillForm, &WebInputElement::value); + FillForm, &GetValueWrapper); // Verify preview selection. WebInputElement firstname = GetMainFrame()->document(). getElementById("firstname").to<WebInputElement>(); @@ -1165,34 +1177,47 @@ TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) { }; TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), &FillFormIncludingNonFocusableElementsWrapper, - &WebInputElement::value); + &GetValueWrapper); } TEST_F(FormAutofillTest, PreviewForm) { - static const char* html = - "<FORM name=\"TestForm\" action=\"http://buh.com\" method=\"post\">" - " <INPUT type=\"text\" id=\"firstname\"/>" - " <INPUT type=\"text\" id=\"lastname\"/>" - " <INPUT type=\"text\" id=\"notempty\" value=\"Hi\"/>" - " <INPUT type=\"text\" autocomplete=\"off\" id=\"noautocomplete\"/>" - " <INPUT type=\"text\" disabled=\"disabled\" id=\"notenabled\"/>" - " <INPUT type=\"submit\" name=\"reply-send\" value=\"Send\"/>" - "</FORM>"; - static const AutofillFieldCase field_cases[] = { // Normal empty fields should be previewed. {"text", "firstname", "", "", true, "suggested firstname", "suggested firstname"}, {"text", "lastname", "", "", true, "suggested lastname", "suggested lastname"}, + // Hidden fields should not be extracted to form_data. // Non empty fields should not be previewed. - {"text", "notempty", "Hi", "", false, "filled notempty", ""}, + {"text", "notempty", "Hi", "", false, "suggested notempty", ""}, // "noautocomplete" should not be extracted to form_data. // Disabled fields should not be previewed. - {"text", "notenabled", "", "", false, "filled notenabled", ""}, + {"text", "notenabled", "", "", false, "suggested notenabled", ""}, + // Readonly fields should not be previewed. + {"text", "readonly", "", "", false, "suggested readonly", ""}, + // Fields with "visibility: hidden" should not be previewed. + {"text", "invisible", "", "", false, "suggested invisible", + ""}, + // Fields with "display:none" should not previewed. + {"text", "displaynone", "", "", false, "suggested displaynone", + ""}, + // Regular <input type="month"> should not be previewed. + {"month", "month", "", "", false, "2017-11", ""}, + // Non-empty <input type="month"> should not be previewed. + {"month", "month-nonempty", "2011-12", "", false, "2017-11", ""}, + // Regular select fields preview is not yet supported + {"select-one", "select", "", "", false, "TX", ""}, + // Select fields preview is not yet supported + {"select-one", "select-nonempty", "CA", "", false, "TX", "CA"}, + // Normal textarea elements should be previewed. + {"textarea", "textarea", "", "", true, "suggested multi-\nline value", + "suggested multi-\nline value"}, + // Nonempty textarea elements should not be previewed. + {"textarea", "textarea-nonempty", "Go\naway!", "", false, + "suggested multi-\nline value", ""}, }; - TestFormFillFunctions(html, field_cases, arraysize(field_cases), &PreviewForm, - &WebInputElement::suggestedValue); + TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), + &PreviewForm, &GetSuggestedValueWrapper); // Verify preview selection. WebInputElement firstname = GetMainFrame()->document(). diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index 9876748..74d5b68 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc @@ -570,21 +570,26 @@ void PreviewFormField(const FormFieldData& data, if (data.value.empty()) return; - // Only preview input fields. Excludes checkboxes and radio buttons, as there - // is no provision for setSuggestedCheckedValue in WebInputElement. + // Preview input and textarea fields. For input fields, excludes checkboxes + // and radio buttons, as there is no provision for setSuggestedCheckedValue + // in WebInputElement. WebInputElement* input_element = toWebInputElement(field); - if (!IsTextInput(input_element)) - return; - - // If the maxlength attribute contains a negative value, maxLength() - // returns the default maxlength value. - input_element->setSuggestedValue( + if (IsTextInput(input_element)) { + // If the maxlength attribute contains a negative value, maxLength() + // returns the default maxlength value. + input_element->setSuggestedValue( data.value.substr(0, input_element->maxLength())); - input_element->setAutofilled(true); - if (is_initiating_node) { - // Select the part of the text that the user didn't type. - input_element->setSelectionRange(input_element->value().length(), - input_element->suggestedValue().length()); + input_element->setAutofilled(true); + if (is_initiating_node) { + // Select the part of the text that the user didn't type. + input_element->setSelectionRange( + input_element->value().length(), + input_element->suggestedValue().length()); + } + } else if (IsTextAreaElement(*field)) { + WebTextAreaElement textarea = field->to<WebTextAreaElement>(); + textarea.setSuggestedValue(data.value); + field->setAutofilled(true); } } @@ -1047,38 +1052,53 @@ bool ClearPreviewedFormWithElement(const WebInputElement& element, ExtractAutofillableElements(form_element, REQUIRE_AUTOCOMPLETE, &control_elements); for (size_t i = 0; i < control_elements.size(); ++i) { - // Only text input elements can be previewed. - WebInputElement* input_element = toWebInputElement(&control_elements[i]); - if (!IsTextInput(input_element)) - continue; - - // If the input element is not auto-filled, we did not preview it, so there - // is nothing to reset. - if (!input_element->isAutofilled()) - continue; - // There might be unrelated elements in this form which have already been // auto-filled. For example, the user might have already filled the address // part of a form and now be dealing with the credit card section. We only // want to reset the auto-filled status for fields that were previewed. - if (input_element->suggestedValue().isEmpty()) + WebFormControlElement control_element = control_elements[i]; + + // Only text input and textarea elements can be previewed. + WebInputElement* input_element = toWebInputElement(&control_element); + if (!IsTextInput(input_element) && !IsTextAreaElement(control_element)) + continue; + + // If the element is not auto-filled, we did not preview it, + // so there is nothing to reset. + if(!control_element.isAutofilled()) + continue; + + if ((IsTextInput(input_element) && + input_element->suggestedValue().isEmpty()) || + (IsTextAreaElement(control_element) && + control_element.to<WebTextAreaElement>().suggestedValue().isEmpty())) continue; // Clear the suggested value. For the initiating node, also restore the // original value. - input_element->setSuggestedValue(WebString()); - bool is_initiating_node = (element == *input_element); - if (is_initiating_node) - input_element->setAutofilled(was_autofilled); - else - input_element->setAutofilled(false); - - // Clearing the suggested value in the focused node (above) can cause - // selection to be lost. We force selection range to restore the text - // cursor. - if (is_initiating_node) { - int length = input_element->value().length(); - input_element->setSelectionRange(length, length); + if (IsTextInput(input_element)) { + input_element->setSuggestedValue(WebString()); + bool is_initiating_node = (element == *input_element); + if (is_initiating_node) + input_element->setAutofilled(was_autofilled); + else + input_element->setAutofilled(false); + + // Clearing the suggested value in the focused node (above) can cause + // selection to be lost. We force selection range to restore the text + // cursor. + if (is_initiating_node) { + int length = input_element->value().length(); + input_element->setSelectionRange(length, length); + } + } else if (IsTextAreaElement(control_element)) { + WebTextAreaElement text_area = control_element.to<WebTextAreaElement>(); + text_area.setSuggestedValue(WebString()); + bool is_initiating_node = (element == text_area); + if (is_initiating_node) + control_element.setAutofilled(was_autofilled); + else + control_element.setAutofilled(false); } } |