diff options
author | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 20:28:41 +0000 |
---|---|---|
committer | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-08 20:28:41 +0000 |
commit | c3f62571ab2ae78977fd31dda8adc3b718964c8c (patch) | |
tree | 2a2d3c4187f922bbc62b3fe42fe404540af921d0 | |
parent | fafba8c375dd39726049b820708a9d5e61f60b50 (diff) | |
download | chromium_src-c3f62571ab2ae78977fd31dda8adc3b718964c8c.zip chromium_src-c3f62571ab2ae78977fd31dda8adc3b718964c8c.tar.gz chromium_src-c3f62571ab2ae78977fd31dda8adc3b718964c8c.tar.bz2 |
Don't fire onchange event for <select> elements that are unchanged by Autofill.
BUG=77967
TEST=interactive_ui_tests --gtest_filter=AutofillTest.OnChangeAfterAutofill
Review URL: http://codereview.chromium.org/6815027
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80980 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/autofill/autofill_browsertest.cc | 47 | ||||
-rw-r--r-- | chrome/renderer/autofill/form_manager.cc | 12 |
2 files changed, 49 insertions, 10 deletions
diff --git a/chrome/browser/autofill/autofill_browsertest.cc b/chrome/browser/autofill/autofill_browsertest.cc index f55c592..0463e49 100644 --- a/chrome/browser/autofill/autofill_browsertest.cc +++ b/chrome/browser/autofill/autofill_browsertest.cc @@ -270,7 +270,8 @@ IN_PROC_BROWSER_TEST_F(AutofillTest, OnChangeAfterAutofill) { "<script>" "focused_fired = false;" "unfocused_fired = false;" - "select_fired = false;" + "changed_select_fired = false;" + "unchanged_select_fired = false;" "document.getElementById('firstname').onchange = function() {" " focused_fired = true;" "};" @@ -278,8 +279,12 @@ IN_PROC_BROWSER_TEST_F(AutofillTest, OnChangeAfterAutofill) { " unfocused_fired = true;" "};" "document.getElementById('state').onchange = function() {" - " select_fired = true;" + " changed_select_fired = true;" "};" + "document.getElementById('country').onchange = function() {" + " unchanged_select_fired = true;" + "};" + "document.getElementById('country').value = 'US';" "</script>"; // Load the test page. @@ -288,14 +293,38 @@ IN_PROC_BROWSER_TEST_F(AutofillTest, OnChangeAfterAutofill) { GURL(std::string(kDataURIPrefix) + kTestFormString + kOnChangeScript))); // Invoke Autofill. - TryBasicFormFill(); + FocusFirstNameField(); + + // Start filling the first name field with "M" and wait for the popup to be + // shown. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_M, false, true, false, false, + NotificationType::AUTOFILL_DID_SHOW_SUGGESTIONS, + Source<RenderViewHost>(render_view_host()))); + + // Press the down arrow to select the suggestion and preview the autofilled + // form. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_DOWN, false, false, false, false, + NotificationType::AUTOFILL_DID_FILL_FORM_DATA, + Source<RenderViewHost>(render_view_host()))); + + // Press Enter to accept the autofill suggestions. + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( + browser(), ui::VKEY_RETURN, false, false, false, false, + NotificationType::AUTOFILL_DID_FILL_FORM_DATA, + Source<RenderViewHost>(render_view_host()))); + + // The form should be filled. + ExpectFilledTestForm(); // The change event should have already fired for unfocused fields, both of // <input> and of <select> type. However, it should not yet have fired for the // focused field. bool focused_fired = false; bool unfocused_fired = false; - bool select_fired = false; + bool changed_select_fired = false; + bool unchanged_select_fired = false; ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( render_view_host(), L"", L"domAutomationController.send(focused_fired);", &focused_fired)); @@ -304,10 +333,16 @@ IN_PROC_BROWSER_TEST_F(AutofillTest, OnChangeAfterAutofill) { L"domAutomationController.send(unfocused_fired);", &unfocused_fired)); ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( render_view_host(), L"", - L"domAutomationController.send(select_fired);", &select_fired)); + L"domAutomationController.send(changed_select_fired);", + &changed_select_fired)); + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( + render_view_host(), L"", + L"domAutomationController.send(unchanged_select_fired);", + &unchanged_select_fired)); EXPECT_FALSE(focused_fired); EXPECT_TRUE(unfocused_fired); - EXPECT_TRUE(select_fired); + EXPECT_TRUE(changed_select_fired); + EXPECT_FALSE(unchanged_select_fired); // Unfocus the first name field. Its change event should fire. ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( diff --git a/chrome/renderer/autofill/form_manager.cc b/chrome/renderer/autofill/form_manager.cc index b7022a7..6b6a9c5 100644 --- a/chrome/renderer/autofill/form_manager.cc +++ b/chrome/renderer/autofill/form_manager.cc @@ -694,8 +694,10 @@ bool FormManager::ClearFormWithNode(const WebNode& node) { } else { DCHECK(IsSelectElement(element)); WebSelectElement select_element = element.to<WebSelectElement>(); - select_element.setValue(form_element->control_values[i]); - select_element.dispatchFormControlChangeEvent(); + if (select_element.value() != form_element->control_values[i]) { + select_element.setValue(form_element->control_values[i]); + select_element.dispatchFormControlChangeEvent(); + } } } @@ -900,8 +902,10 @@ void FormManager::FillFormField(WebFormControlElement* field, } else { DCHECK(IsSelectElement(*field)); WebSelectElement select_element = field->to<WebSelectElement>(); - select_element.setValue(data->value); - select_element.dispatchFormControlChangeEvent(); + if (select_element.value() != data->value) { + select_element.setValue(data->value); + select_element.dispatchFormControlChangeEvent(); + } } } |