Chromium Code Reviews| Index: chrome/browser/autofill/autofill_browsertest.cc |
| =================================================================== |
| --- chrome/browser/autofill/autofill_browsertest.cc (revision 67416) |
| +++ chrome/browser/autofill/autofill_browsertest.cc (working copy) |
| @@ -4,6 +4,7 @@ |
| #include <string> |
| +#include "base/utf_string_conversions.h" |
| #include "app/keyboard_code_conversion.h" |
| #include "base/basictypes.h" |
| #include "base/ref_counted.h" |
| @@ -13,16 +14,24 @@ |
| #include "chrome/browser/autofill/autofill_profile.h" |
| #include "chrome/browser/autofill/personal_data_manager.h" |
| #include "chrome/browser/net/predictor_api.h" |
| +#include "chrome/browser/renderer_host/mock_render_process_host.h" |
| #include "chrome/browser/profile.h" |
| #include "chrome/browser/tab_contents/tab_contents.h" |
| #include "chrome/browser/ui/browser.h" |
| +#include "chrome/browser/translate/translate_infobar_delegate.h" |
| +#include "chrome/browser/translate/translate_manager.h" |
| #include "chrome/browser/ui/browser_window.h" |
| +#include "chrome/browser/renderer_host/render_view_host.h" |
| +#include "chrome/common/net/test_url_fetcher_factory.h" |
| #include "chrome/common/pref_names.h" |
| +#include "chrome/common/render_messages.h" |
| +#include "chrome/renderer/translate_helper.h" |
| #include "chrome/test/in_process_browser_test.h" |
| #include "chrome/test/ui_test_utils.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| class AutoFillTest : public InProcessBrowserTest { |
| + TestURLFetcherFactory url_fetcher_factory_; |
| protected: |
| AutoFillTest() { |
| set_show_window(true); |
| @@ -56,6 +65,83 @@ |
| L"document.getElementById('" + field_name + L"').value);", &value)); |
| EXPECT_EQ(expected_value, value); |
| } |
| + |
| + RenderViewHost* rvh() { |
| + return browser()->GetSelectedTabContents()->render_view_host(); |
| + } |
| + |
| + virtual void SetUp() { |
| + URLFetcher::set_factory(&url_fetcher_factory_); |
| + InProcessBrowserTest::SetUp(); |
| + } |
| + |
| + void SimulateURLFetch(bool success) { |
| + TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| + ASSERT_TRUE(fetcher); |
| + URLRequestStatus status; |
| + status.set_status(success ? URLRequestStatus::SUCCESS : |
| + URLRequestStatus::FAILED); |
| + |
| + std::string script = " var google = {};" |
| + "google.translate = (function() {" |
| + " return {" |
| + " TranslateService: function() {" |
| + " return {" |
| + " isAvailable : function() {" |
| + " return true;" |
| + " }," |
| + " restore : function() {" |
| + " return;" |
| + " }," |
| + " getDetectedLanguage : function() {" |
| + " return \"ja\";" |
| + " }," |
| + " translatePage : function(originalLang, targetLang," |
| + " onTranslateProgress) {" |
| + " document.getElementsByTagName(\"body\")[0].innerHTML = '" |
| + " <form action=\"http://www.google.com/\" method=\"POST\">" |
| + " <label for=\"firstname\">First name:</label>" |
| + " <input type=\"text\" id=\"firstname\"" |
| + " onFocus=\"domAutomationController.send(true)\"" |
| + " /><br />" |
| + " <label for=\"lastname\">Last name:</label>" |
| + " <input type=\"text\" id=\"lastname\" /><br />" |
| + " <label for=\"address1\">Address line 1:</label>" |
| + " <input type=\"text\" id=\"address1\" /><br />" |
| + " <label for=\"address2\">Address line 2:</label>" |
| + " <input type=\"text\" id=\"address2\" /><br />" |
| + " <label for=\"city\">City:</label>" |
| + " <input type=\"text\" id=\"city\" /><br />" |
| + " <label for=\"state\">State:</label>" |
| + " <select id=\"state\">" |
| + " <option value=\"\" selected=\"yes\">--</option>" |
| + " <option value=\"CA\">California</option>" |
| + " <option value=\"TX\">Texas</option>" |
| + " </select><br />" |
| + " <label for=\"zip\">ZIP code:</label>" |
| + " <input type=\"text\" id=\"zip\" /><br />" |
| + " <label for=\"country\">Country:</label>" |
| + " <select id=\"country\">" |
| + " <option value=\"\" selected=\"yes\">--</option>" |
| + " <option value=\"CA\">Canada</option>" |
| + " <option value=\"US\">United States</option>" |
| + " </select><br />" |
| + " <label for=\"phone\">Phone number:</label>" |
| + " <input type=\"text\" id=\"phone\" /><br />" |
| + " </form>" |
| + " ';" |
| + " onTranslateProgress(100, true, false);" |
| + " }" |
| + " };" |
| + " }" |
| + " };" |
| + "})();"; |
| + |
|
honten.org
2010/12/05 01:34:34
Is this Ok to include javascript code as text stri
James Hawkins
2010/12/06 19:02:05
Should be fine to inline it.
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher, fetcher->original_url(), |
| + status, success ? 200 : 500, |
| + ResponseCookies(), |
| + script); |
| + } |
| }; |
| // Test that basic form fill is working. |
| @@ -153,3 +239,126 @@ |
| ExpectFieldValue(L"country", "US"); |
| ExpectFieldValue(L"phone", "5125551234"); |
| } |
| + |
| +// Test that basic form fill is working. |
| +IN_PROC_BROWSER_TEST_F(AutoFillTest, TranslateAndFormFill) { |
| + SetUpProfile(); |
| + |
| + GURL url("data:text/html;charset=utf-8," |
| + "<form action=\"http://www.google.com/\" method=\"POST\">" |
| + "<label for=\"firstname\">なまえ</label>" |
| + " <input type=\"text\" id=\"firstname\"" |
| + " onFocus=\"domAutomationController.send(true)\"" |
| + " /><br />" |
| + "<label for=\"lastname\">みょうじ</label>" |
| + " <input type=\"text\" id=\"lastname\" /><br />" |
|
honten.org
2010/12/05 01:34:34
Is is OK to use Japanese character here?
For now,
James Hawkins
2010/12/06 19:02:05
UTF8
|
| + "<label for=\"address1\">Address line 1:</label>" |
| + " <input type=\"text\" id=\"address1\" /><br />" |
| + "<label for=\"address2\">Address line 2:</label>" |
| + " <input type=\"text\" id=\"address2\" /><br />" |
| + "<label for=\"city\">City:</label>" |
| + " <input type=\"text\" id=\"city\" /><br />" |
| + "<label for=\"state\">State:</label>" |
| + " <select id=\"state\">" |
| + " <option value=\"\" selected=\"yes\">--</option>" |
| + " <option value=\"CA\">California</option>" |
| + " <option value=\"TX\">Texas</option>" |
| + " </select><br />" |
| + "<label for=\"zip\">ZIP code:</label>" |
| + " <input type=\"text\" id=\"zip\" /><br />" |
| + "<label for=\"country\">Country:</label>" |
| + " <select id=\"country\">" |
| + " <option value=\"\" selected=\"yes\">--</option>" |
| + " <option value=\"CA\">Canada</option>" |
| + " <option value=\"US\">United States</option>" |
| + " </select><br />" |
| + "<label for=\"phone\">Phone number:</label>" |
| + " <input type=\"text\" id=\"phone\" /><br />" |
| + "</form>"); |
| + ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); |
| + ASSERT_NO_FATAL_FAILURE(ui_test_utils::NavigateToURL( |
| + browser(), url)); |
| + |
| + // Get translation bar. |
| + int page_id = browser()->GetSelectedTabContents()->controller(). |
| + GetLastCommittedEntry()->page_id(); |
| + |
| + rvh()->OnMessageReceived(ViewHostMsg_PageContents(0, url, page_id, |
| + UTF8ToUTF16("test"), "ja", true)); |
| + TranslateInfoBarDelegate* infobar = browser()->GetSelectedTabContents()-> |
| + GetInfoBarDelegateAt(0)->AsTranslateInfoBarDelegate(); |
| + |
| + ASSERT_TRUE(infobar != NULL); |
| + EXPECT_EQ(TranslateInfoBarDelegate::BEFORE_TRANSLATE, infobar->type()); |
| + |
| + // Simulate press translation button. |
| + infobar->Translate(); |
| + |
| + // Simulate the translate script being retrieved. |
| + // Pass fake google.translate lib as the translate script. |
| + SimulateURLFetch(true); |
| + |
| + // Simulate translation to kick onTranslateElementLoad. |
| + // But right now, the call stucks here. |
| + // Once click the text field, it starts again. |
| + bool result; |
|
honten.org
2010/12/05 01:34:34
As I wrote as comment, this test stops at ExecuteJ
James Hawkins
2010/12/06 19:02:05
I don't have any ideas.
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| + rvh(), L"", L"cr.googleTranslate.onTranslateElementLoad();", &result)); |
| + ASSERT_TRUE(result); |
| + |
| + // Simulate the render notifying the translation has been done. |
| + rvh()->OnMessageReceived(ViewHostMsg_PageTranslated(0, 0, "ja", "en", |
| + TranslateErrors::NONE)); |
| + |
| + ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), |
| + VIEW_ID_TAB_CONTAINER)); |
| + ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), |
| + VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| + |
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| + rvh(), L"", L"document.getElementById('firstname').focus();", &result)); |
| + ASSERT_TRUE(result); |
| + // Start filling the first name field with "M" and wait for the popup to be |
| + // shown. |
| + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( |
| + browser(), app::VKEY_M, false, true, false, false, |
| + NotificationType::AUTOFILL_DID_SHOW_SUGGESTIONS, |
| + Source<RenderViewHost>(rvh()))); |
| + |
| + // Press the down arrow to select the suggestion and preview the autofilled |
| + // form. |
| + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( |
| + browser(), app::VKEY_DOWN, false, false, false, false, |
| + NotificationType::AUTOFILL_DID_FILL_FORM_DATA, |
| + Source<RenderViewHost>(rvh()))); |
| + |
| + // The previewed values should not be accessible to JavaScript. |
| + ExpectFieldValue(L"firstname", "M"); |
| + ExpectFieldValue(L"lastname", ""); |
| + ExpectFieldValue(L"address1", ""); |
| + ExpectFieldValue(L"address2", ""); |
| + ExpectFieldValue(L"city", ""); |
| + ExpectFieldValue(L"state", ""); |
| + ExpectFieldValue(L"zip", ""); |
| + ExpectFieldValue(L"country", ""); |
| + ExpectFieldValue(L"phone", ""); |
| + // TODO(isherman): It would be nice to test that the previewed values are |
| + // displayed: http://crbug.com/57220 |
| + |
| + // Press Enter to accept the autofill suggestions. |
| + ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( |
| + browser(), app::VKEY_RETURN, false, false, false, false, |
| + NotificationType::AUTOFILL_DID_FILL_FORM_DATA, |
| + Source<RenderViewHost>(rvh()))); |
| + |
| + // The form should be filled. |
| + ExpectFieldValue(L"firstname", "Milton"); |
| + ExpectFieldValue(L"lastname", "Waddams"); |
| + ExpectFieldValue(L"address1", "4120 Freidrich Lane"); |
| + ExpectFieldValue(L"address2", "Basement"); |
| + ExpectFieldValue(L"city", "Austin"); |
| + ExpectFieldValue(L"state", "TX"); |
| + ExpectFieldValue(L"zip", "78744"); |
| + ExpectFieldValue(L"country", "US"); |
| + ExpectFieldValue(L"phone", "5125551234"); |
| +} |