summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-08 20:28:41 +0000
committerisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-08 20:28:41 +0000
commitc3f62571ab2ae78977fd31dda8adc3b718964c8c (patch)
tree2a2d3c4187f922bbc62b3fe42fe404540af921d0
parentfafba8c375dd39726049b820708a9d5e61f60b50 (diff)
downloadchromium_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.cc47
-rw-r--r--chrome/renderer/autofill/form_manager.cc12
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();
+ }
}
}