OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <string> | 5 #include <string> |
6 | 6 |
| 7 #include "base/utf_string_conversions.h" |
7 #include "app/keyboard_code_conversion.h" | 8 #include "app/keyboard_code_conversion.h" |
8 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
9 #include "base/ref_counted.h" | 10 #include "base/ref_counted.h" |
10 #include "base/scoped_ptr.h" | 11 #include "base/scoped_ptr.h" |
11 #include "base/string16.h" | 12 #include "base/string16.h" |
12 #include "chrome/browser/autofill/autofill_common_test.h" | 13 #include "chrome/browser/autofill/autofill_common_test.h" |
13 #include "chrome/browser/autofill/autofill_profile.h" | 14 #include "chrome/browser/autofill/autofill_profile.h" |
14 #include "chrome/browser/autofill/personal_data_manager.h" | 15 #include "chrome/browser/autofill/personal_data_manager.h" |
15 #include "chrome/browser/net/predictor_api.h" | 16 #include "chrome/browser/net/predictor_api.h" |
16 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
| 18 #include "chrome/browser/renderer_host/mock_render_process_host.h" |
| 19 #include "chrome/browser/renderer_host/render_view_host.h" |
17 #include "chrome/browser/tab_contents/tab_contents.h" | 20 #include "chrome/browser/tab_contents/tab_contents.h" |
| 21 #include "chrome/browser/translate/translate_infobar_delegate.h" |
| 22 #include "chrome/browser/translate/translate_manager.h" |
18 #include "chrome/browser/ui/browser.h" | 23 #include "chrome/browser/ui/browser.h" |
19 #include "chrome/browser/ui/browser_window.h" | 24 #include "chrome/browser/ui/browser_window.h" |
| 25 #include "chrome/common/net/test_url_fetcher_factory.h" |
20 #include "chrome/common/pref_names.h" | 26 #include "chrome/common/pref_names.h" |
| 27 #include "chrome/common/render_messages.h" |
| 28 #include "chrome/renderer/translate_helper.h" |
21 #include "chrome/test/in_process_browser_test.h" | 29 #include "chrome/test/in_process_browser_test.h" |
22 #include "chrome/test/ui_test_utils.h" | 30 #include "chrome/test/ui_test_utils.h" |
23 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
24 | 32 |
| 33 static const char* kTestFormString = |
| 34 "<form action=\"http://www.google.com/\" method=\"POST\">" |
| 35 "<label for=\"firstname\">First name:</label>" |
| 36 " <input type=\"text\" id=\"firstname\"" |
| 37 " onFocus=\"domAutomationController.send(true)\"" |
| 38 " /><br />" |
| 39 "<label for=\"lastname\">Last name:</label>" |
| 40 " <input type=\"text\" id=\"lastname\" /><br />" |
| 41 "<label for=\"address1\">Address line 1:</label>" |
| 42 " <input type=\"text\" id=\"address1\" /><br />" |
| 43 "<label for=\"address2\">Address line 2:</label>" |
| 44 " <input type=\"text\" id=\"address2\" /><br />" |
| 45 "<label for=\"city\">City:</label>" |
| 46 " <input type=\"text\" id=\"city\" /><br />" |
| 47 "<label for=\"state\">State:</label>" |
| 48 " <select id=\"state\">" |
| 49 " <option value=\"\" selected=\"yes\">--</option>" |
| 50 " <option value=\"CA\">California</option>" |
| 51 " <option value=\"TX\">Texas</option>" |
| 52 " </select><br />" |
| 53 "<label for=\"zip\">ZIP code:</label>" |
| 54 " <input type=\"text\" id=\"zip\" /><br />" |
| 55 "<label for=\"country\">Country:</label>" |
| 56 " <select id=\"country\">" |
| 57 " <option value=\"\" selected=\"yes\">--</option>" |
| 58 " <option value=\"CA\">Canada</option>" |
| 59 " <option value=\"US\">United States</option>" |
| 60 " </select><br />" |
| 61 "<label for=\"phone\">Phone number:</label>" |
| 62 " <input type=\"text\" id=\"phone\" /><br />" |
| 63 "</form>"; |
| 64 |
25 class AutoFillTest : public InProcessBrowserTest { | 65 class AutoFillTest : public InProcessBrowserTest { |
26 protected: | 66 protected: |
27 AutoFillTest() { | 67 AutoFillTest() { |
28 set_show_window(true); | 68 set_show_window(true); |
29 EnableDOMAutomation(); | 69 EnableDOMAutomation(); |
30 } | 70 } |
31 | 71 |
32 void SetUpProfile() { | 72 void SetUpProfile() { |
33 autofill_test::DisableSystemServices(browser()->profile()); | 73 autofill_test::DisableSystemServices(browser()->profile()); |
34 | 74 |
(...skipping 14 matching lines...) Expand all Loading... |
49 | 89 |
50 void ExpectFieldValue(const std::wstring& field_name, | 90 void ExpectFieldValue(const std::wstring& field_name, |
51 const std::string& expected_value) { | 91 const std::string& expected_value) { |
52 std::string value; | 92 std::string value; |
53 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( | 93 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( |
54 browser()->GetSelectedTabContents()->render_view_host(), L"", | 94 browser()->GetSelectedTabContents()->render_view_host(), L"", |
55 L"window.domAutomationController.send(" | 95 L"window.domAutomationController.send(" |
56 L"document.getElementById('" + field_name + L"').value);", &value)); | 96 L"document.getElementById('" + field_name + L"').value);", &value)); |
57 EXPECT_EQ(expected_value, value); | 97 EXPECT_EQ(expected_value, value); |
58 } | 98 } |
| 99 |
| 100 RenderViewHost* rvh() { |
| 101 return browser()->GetSelectedTabContents()->render_view_host(); |
| 102 } |
| 103 |
| 104 virtual void SetUp() { |
| 105 URLFetcher::set_factory(&url_fetcher_factory_); |
| 106 InProcessBrowserTest::SetUp(); |
| 107 } |
| 108 |
| 109 void SimulateURLFetch(bool success) { |
| 110 TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 111 ASSERT_TRUE(fetcher); |
| 112 URLRequestStatus status; |
| 113 status.set_status(success ? URLRequestStatus::SUCCESS : |
| 114 URLRequestStatus::FAILED); |
| 115 |
| 116 std::string script = " var google = {};" |
| 117 "google.translate = (function() {" |
| 118 " return {" |
| 119 " TranslateService: function() {" |
| 120 " return {" |
| 121 " isAvailable : function() {" |
| 122 " return true;" |
| 123 " }," |
| 124 " restore : function() {" |
| 125 " return;" |
| 126 " }," |
| 127 " getDetectedLanguage : function() {" |
| 128 " return \"ja\";" |
| 129 " }," |
| 130 " translatePage : function(originalLang, targetLang," |
| 131 " onTranslateProgress) {" |
| 132 " document.getElementsByTagName(\"body\")[0].innerHTML = '" + |
| 133 std::string(kTestFormString) + |
| 134 " ';" |
| 135 " onTranslateProgress(100, true, false);" |
| 136 " }" |
| 137 " };" |
| 138 " }" |
| 139 " };" |
| 140 "})();"; |
| 141 |
| 142 fetcher->delegate()->OnURLFetchComplete(fetcher, fetcher->original_url(), |
| 143 status, success ? 200 : 500, |
| 144 ResponseCookies(), |
| 145 script); |
| 146 } |
| 147 |
| 148 void TryBasicFormFillWithMKey() { |
| 149 ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), |
| 150 VIEW_ID_TAB_CONTAINER)); |
| 151 ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), |
| 152 VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| 153 |
| 154 bool result = false; |
| 155 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| 156 rvh(), L"", L"document.getElementById('firstname').focus();", &result)); |
| 157 ASSERT_TRUE(result); |
| 158 // Start filling the first name field with "M" and wait for the popup to be |
| 159 // shown. |
| 160 ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( |
| 161 browser(), app::VKEY_M, false, true, false, false, |
| 162 NotificationType::AUTOFILL_DID_SHOW_SUGGESTIONS, |
| 163 Source<RenderViewHost>(rvh()))); |
| 164 |
| 165 // Press the down arrow to select the suggestion and preview the autofilled |
| 166 // form. |
| 167 ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( |
| 168 browser(), app::VKEY_DOWN, false, false, false, false, |
| 169 NotificationType::AUTOFILL_DID_FILL_FORM_DATA, |
| 170 Source<RenderViewHost>(rvh()))); |
| 171 |
| 172 // The previewed values should not be accessible to JavaScript. |
| 173 ExpectFieldValue(L"firstname", "M"); |
| 174 ExpectFieldValue(L"lastname", ""); |
| 175 ExpectFieldValue(L"address1", ""); |
| 176 ExpectFieldValue(L"address2", ""); |
| 177 ExpectFieldValue(L"city", ""); |
| 178 ExpectFieldValue(L"state", ""); |
| 179 ExpectFieldValue(L"zip", ""); |
| 180 ExpectFieldValue(L"country", ""); |
| 181 ExpectFieldValue(L"phone", ""); |
| 182 // TODO(isherman): It would be nice to test that the previewed values are |
| 183 // displayed: http://crbug.com/57220 |
| 184 |
| 185 // Press Enter to accept the autofill suggestions. |
| 186 ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( |
| 187 browser(), app::VKEY_RETURN, false, false, false, false, |
| 188 NotificationType::AUTOFILL_DID_FILL_FORM_DATA, |
| 189 Source<RenderViewHost>(rvh()))); |
| 190 |
| 191 // The form should be filled. |
| 192 ExpectFieldValue(L"firstname", "Milton"); |
| 193 ExpectFieldValue(L"lastname", "Waddams"); |
| 194 ExpectFieldValue(L"address1", "4120 Freidrich Lane"); |
| 195 ExpectFieldValue(L"address2", "Basement"); |
| 196 ExpectFieldValue(L"city", "Austin"); |
| 197 ExpectFieldValue(L"state", "TX"); |
| 198 ExpectFieldValue(L"zip", "78744"); |
| 199 ExpectFieldValue(L"country", "US"); |
| 200 ExpectFieldValue(L"phone", "5125551234"); |
| 201 |
| 202 } |
| 203 |
| 204 private: |
| 205 TestURLFetcherFactory url_fetcher_factory_; |
59 }; | 206 }; |
60 | 207 |
61 // Test that basic form fill is working. | 208 // Test that basic form fill is working. |
62 IN_PROC_BROWSER_TEST_F(AutoFillTest, BasicFormFill) { | 209 IN_PROC_BROWSER_TEST_F(AutoFillTest, BasicFormFill) { |
63 SetUpProfile(); | 210 SetUpProfile(); |
64 | 211 |
65 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); | 212 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); |
| 213 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL(browser(), |
| 214 GURL("data:text/html;charset=utf-8," + std::string(kTestFormString)))); |
| 215 |
| 216 TryBasicFormFillWithMKey(); |
| 217 } |
| 218 |
| 219 // Test that basic form fill is working. |
| 220 IN_PROC_BROWSER_TEST_F(AutoFillTest, TranslateAndFormFill) { |
| 221 SetUpProfile(); |
| 222 |
| 223 GURL url("data:text/html;charset=utf-8," |
| 224 "<form action=\"http://www.google.com/\" method=\"POST\">" |
| 225 "<label for=\"firstname\">なまえ</label>" |
| 226 " <input type=\"text\" id=\"firstname\"" |
| 227 " onFocus=\"domAutomationController.send(true)\"" |
| 228 " /><br />" |
| 229 "<label for=\"lastname\">みょうじ</label>" |
| 230 " <input type=\"text\" id=\"lastname\" /><br />" |
| 231 "<label for=\"address1\">Address line 1:</label>" |
| 232 " <input type=\"text\" id=\"address1\" /><br />" |
| 233 "<label for=\"address2\">Address line 2:</label>" |
| 234 " <input type=\"text\" id=\"address2\" /><br />" |
| 235 "<label for=\"city\">City:</label>" |
| 236 " <input type=\"text\" id=\"city\" /><br />" |
| 237 "<label for=\"state\">State:</label>" |
| 238 " <select id=\"state\">" |
| 239 " <option value=\"\" selected=\"yes\">--</option>" |
| 240 " <option value=\"CA\">California</option>" |
| 241 " <option value=\"TX\">Texas</option>" |
| 242 " </select><br />" |
| 243 "<label for=\"zip\">ZIP code:</label>" |
| 244 " <input type=\"text\" id=\"zip\" /><br />" |
| 245 "<label for=\"country\">Country:</label>" |
| 246 " <select id=\"country\">" |
| 247 " <option value=\"\" selected=\"yes\">--</option>" |
| 248 " <option value=\"CA\">Canada</option>" |
| 249 " <option value=\"US\">United States</option>" |
| 250 " </select><br />" |
| 251 "<label for=\"phone\">Phone number:</label>" |
| 252 " <input type=\"text\" id=\"phone\" /><br />" |
| 253 "</form>"); |
| 254 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); |
66 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( | 255 ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( |
67 browser(), GURL("data:text/html;charset=utf-8," | 256 browser(), url)); |
68 "<form action=\"http://www.google.com/\" method=\"POST\">" | |
69 "<label for=\"firstname\">First name:</label>" | |
70 " <input type=\"text\" id=\"firstname\"" | |
71 " onFocus=\"domAutomationController.send(true)\"" | |
72 " /><br />" | |
73 "<label for=\"lastname\">Last name:</label>" | |
74 " <input type=\"text\" id=\"lastname\" /><br />" | |
75 "<label for=\"address1\">Address line 1:</label>" | |
76 " <input type=\"text\" id=\"address1\" /><br />" | |
77 "<label for=\"address2\">Address line 2:</label>" | |
78 " <input type=\"text\" id=\"address2\" /><br />" | |
79 "<label for=\"city\">City:</label>" | |
80 " <input type=\"text\" id=\"city\" /><br />" | |
81 "<label for=\"state\">State:</label>" | |
82 " <select id=\"state\">" | |
83 " <option value=\"\" selected=\"yes\">--</option>" | |
84 " <option value=\"CA\">California</option>" | |
85 " <option value=\"TX\">Texas</option>" | |
86 " </select><br />" | |
87 "<label for=\"zip\">ZIP code:</label>" | |
88 " <input type=\"text\" id=\"zip\" /><br />" | |
89 "<label for=\"country\">Country:</label>" | |
90 " <select id=\"country\">" | |
91 " <option value=\"\" selected=\"yes\">--</option>" | |
92 " <option value=\"CA\">Canada</option>" | |
93 " <option value=\"US\">United States</option>" | |
94 " </select><br />" | |
95 "<label for=\"phone\">Phone number:</label>" | |
96 " <input type=\"text\" id=\"phone\" /><br />" | |
97 "</form>"))); | |
98 | 257 |
99 ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), | 258 // Get translation bar. |
100 VIEW_ID_TAB_CONTAINER)); | 259 int page_id = browser()->GetSelectedTabContents()->controller(). |
101 ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), | 260 GetLastCommittedEntry()->page_id(); |
102 VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 261 rvh()->OnMessageReceived(ViewHostMsg_PageContents(0, url, page_id, |
| 262 UTF8ToUTF16("test"), "ja", true)); |
| 263 TranslateInfoBarDelegate* infobar = browser()->GetSelectedTabContents()-> |
| 264 GetInfoBarDelegateAt(0)->AsTranslateInfoBarDelegate(); |
103 | 265 |
104 RenderViewHost* render_view_host = | 266 ASSERT_TRUE(infobar != NULL); |
105 browser()->GetSelectedTabContents()->render_view_host(); | 267 EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); |
106 bool result; | |
107 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | |
108 render_view_host, L"", L"document.getElementById('firstname').focus();", | |
109 &result)); | |
110 ASSERT_TRUE(result); | |
111 | 268 |
112 // Start filling the first name field with "M" and wait for the popup to be | 269 // Simulate press translation button. |
113 // shown. | 270 infobar->Translate(); |
114 ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( | |
115 browser(), app::VKEY_M, false, true, false, false, | |
116 NotificationType::AUTOFILL_DID_SHOW_SUGGESTIONS, | |
117 Source<RenderViewHost>(render_view_host))); | |
118 | 271 |
119 // Press the down arrow to select the suggestion and preview the autofilled | 272 // Simulate the translate script being retrieved. |
120 // form. | 273 // Pass fake google.translate lib as the translate script. |
121 ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( | 274 SimulateURLFetch(true); |
122 browser(), app::VKEY_DOWN, false, false, false, false, | |
123 NotificationType::AUTOFILL_DID_FILL_FORM_DATA, | |
124 Source<RenderViewHost>(render_view_host))); | |
125 | 275 |
126 // The previewed values should not be accessible to JavaScript. | 276 // Simulate translation to kick onTranslateElementLoad. |
127 ExpectFieldValue(L"firstname", "M"); | 277 // But right now, the call stucks here. |
128 ExpectFieldValue(L"lastname", ""); | 278 // Once click the text field, it starts again. |
129 ExpectFieldValue(L"address1", ""); | 279 ASSERT_TRUE(ui_test_utils::ExecuteJavaScript( |
130 ExpectFieldValue(L"address2", ""); | 280 rvh(), L"", L"cr.googleTranslate.onTranslateElementLoad();")); |
131 ExpectFieldValue(L"city", ""); | |
132 ExpectFieldValue(L"state", ""); | |
133 ExpectFieldValue(L"zip", ""); | |
134 ExpectFieldValue(L"country", ""); | |
135 ExpectFieldValue(L"phone", ""); | |
136 // TODO(isherman): It would be nice to test that the previewed values are | |
137 // displayed: http://crbug.com/57220 | |
138 | 281 |
139 // Press Enter to accept the autofill suggestions. | 282 // Simulate the render notifying the translation has been done. |
140 ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( | 283 ui_test_utils::WaitForNotification(NotificationType::PAGE_TRANSLATED); |
141 browser(), app::VKEY_RETURN, false, false, false, false, | |
142 NotificationType::AUTOFILL_DID_FILL_FORM_DATA, | |
143 Source<RenderViewHost>(render_view_host))); | |
144 | 284 |
145 // The form should be filled. | 285 TryBasicFormFillWithMKey(); |
146 ExpectFieldValue(L"firstname", "Milton"); | |
147 ExpectFieldValue(L"lastname", "Waddams"); | |
148 ExpectFieldValue(L"address1", "4120 Freidrich Lane"); | |
149 ExpectFieldValue(L"address2", "Basement"); | |
150 ExpectFieldValue(L"city", "Austin"); | |
151 ExpectFieldValue(L"state", "TX"); | |
152 ExpectFieldValue(L"zip", "78744"); | |
153 ExpectFieldValue(L"country", "US"); | |
154 ExpectFieldValue(L"phone", "5125551234"); | |
155 } | 286 } |
OLD | NEW |