Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "components/translate/core/browser/translate_manager.h" | 5 #include "components/translate/core/browser/translate_manager.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
| 10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| 11 #include "chrome/browser/prefs/session_startup_pref.h" | 11 #include "chrome/browser/prefs/session_startup_pref.h" |
| 12 #include "chrome/browser/translate/chrome_translate_client.h" | 12 #include "chrome/browser/translate/chrome_translate_client.h" |
| 13 #include "chrome/browser/ui/browser.h" | 13 #include "chrome/browser/ui/browser.h" |
| 14 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 14 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 15 #include "chrome/test/base/in_process_browser_test.h" | 15 #include "chrome/test/base/in_process_browser_test.h" |
| 16 #include "chrome/test/base/ui_test_utils.h" | 16 #include "chrome/test/base/ui_test_utils.h" |
| 17 #include "components/translate/core/common/language_detection_details.h" | 17 #include "components/translate/core/common/language_detection_details.h" |
| 18 #include "content/public/browser/notification_service.h" | 18 #include "content/public/browser/notification_service.h" |
| 19 #include "net/url_request/test_url_fetcher_factory.h" | |
| 20 #include "net/url_request/url_fetcher_delegate.h" | |
| 19 #include "url/gurl.h" | 21 #include "url/gurl.h" |
| 20 | 22 |
| 21 class TranslateManagerBrowserTest : public InProcessBrowserTest { | 23 class TranslateManagerBrowserTest : public InProcessBrowserTest { |
| 22 public: | 24 public: |
| 23 TranslateManagerBrowserTest() {} | 25 TranslateManagerBrowserTest() {} |
| 24 ~TranslateManagerBrowserTest() override {} | 26 ~TranslateManagerBrowserTest() override {} |
| 25 | 27 |
| 26 void WaitUntilLanguageDetected() { language_detected_signal_->Wait(); } | 28 void WaitUntilLanguageDetected() { language_detected_signal_->Wait(); } |
| 29 void WaitUntilPageTranslated() { page_translated_signal_->Wait(); } | |
| 27 | 30 |
| 28 void ResetObserver() { | 31 void ResetObserver() { |
| 29 language_detected_signal_.reset(new LangageDetectionObserver( | 32 language_detected_signal_.reset(new LangageDetectionObserver( |
| 30 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, | 33 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, |
| 31 content::NotificationService::AllSources())); | 34 content::NotificationService::AllSources())); |
| 35 page_translated_signal_.reset(new content::WindowedNotificationObserver( | |
| 36 chrome::NOTIFICATION_PAGE_TRANSLATED, | |
| 37 content::NotificationService::AllSources())); | |
| 38 } | |
| 39 | |
| 40 void SimulateURLFetch(bool success) { | |
|
Gaja
2017/06/08 07:41:52
Please let me know if this function should be move
groby-ooo-7-16
2017/06/13 00:33:00
Ideally, we can make this a shared test fixture, n
| |
| 41 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
| 42 ASSERT_TRUE(fetcher); | |
| 43 net::Error error = success ? net::OK : net::ERR_FAILED; | |
| 44 | |
| 45 std::string script = | |
| 46 " var google = {};" | |
| 47 "google.translate = (function() {" | |
| 48 " return {" | |
| 49 " TranslateService: function() {" | |
| 50 " return {" | |
| 51 " isAvailable : function() {" | |
| 52 " return true;" | |
| 53 " }," | |
| 54 " restore : function() {" | |
| 55 " return;" | |
| 56 " }," | |
| 57 " getDetectedLanguage : function() {" | |
| 58 " return \"fr\";" | |
| 59 " }," | |
| 60 " translatePage : function(originalLang, targetLang," | |
| 61 " onTranslateProgress) {" | |
| 62 " var error = (originalLang == 'auto') ? true : false;" | |
| 63 " onTranslateProgress(100, true, error);" | |
| 64 " }" | |
| 65 " };" | |
| 66 " }" | |
| 67 " };" | |
| 68 "})();" | |
| 69 "cr.googleTranslate.onTranslateElementLoad();"; | |
| 70 | |
| 71 fetcher->set_url(fetcher->GetOriginalURL()); | |
| 72 fetcher->set_status(net::URLRequestStatus::FromError(error)); | |
| 73 fetcher->set_response_code(success ? 200 : 500); | |
| 74 fetcher->SetResponseString(script); | |
| 75 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
| 32 } | 76 } |
| 33 | 77 |
| 34 protected: | 78 protected: |
| 35 // InProcessBrowserTest members. | 79 // InProcessBrowserTest members. |
| 36 void SetUp() override { | 80 void SetUp() override { |
| 37 InProcessBrowserTest::SetUp(); | 81 InProcessBrowserTest::SetUp(); |
| 38 } | 82 } |
| 39 void SetUpOnMainThread() override { | 83 void SetUpOnMainThread() override { |
| 40 ResetObserver(); | 84 ResetObserver(); |
| 41 InProcessBrowserTest::SetUpOnMainThread(); | 85 InProcessBrowserTest::SetUpOnMainThread(); |
| 42 } | 86 } |
| 43 | 87 |
| 44 private: | 88 private: |
| 89 net::TestURLFetcherFactory url_fetcher_factory_; | |
| 90 | |
| 45 using LangageDetectionObserver = | 91 using LangageDetectionObserver = |
| 46 ui_test_utils::WindowedNotificationObserverWithDetails< | 92 ui_test_utils::WindowedNotificationObserverWithDetails< |
| 47 translate::LanguageDetectionDetails>; | 93 translate::LanguageDetectionDetails>; |
| 48 | 94 |
| 49 std::unique_ptr<LangageDetectionObserver> language_detected_signal_; | 95 std::unique_ptr<LangageDetectionObserver> language_detected_signal_; |
| 96 std::unique_ptr<content::WindowedNotificationObserver> | |
| 97 page_translated_signal_; | |
| 50 }; | 98 }; |
| 51 | 99 |
| 52 // Tests that the CLD (Compact Language Detection) works properly. | 100 // Tests that the CLD (Compact Language Detection) works properly. |
| 53 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) { | 101 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) { |
| 54 ASSERT_TRUE(embedded_test_server()->Start()); | 102 ASSERT_TRUE(embedded_test_server()->Start()); |
| 55 | 103 |
| 56 content::WebContents* current_web_contents = | 104 content::WebContents* current_web_contents = |
| 57 browser()->tab_strip_model()->GetActiveWebContents(); | 105 browser()->tab_strip_model()->GetActiveWebContents(); |
| 58 ChromeTranslateClient* chrome_translate_client = | 106 ChromeTranslateClient* chrome_translate_client = |
| 59 ChromeTranslateClient::FromWebContents(current_web_contents); | 107 ChromeTranslateClient::FromWebContents(current_web_contents); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 81 ResetObserver(); | 129 ResetObserver(); |
| 82 // Now navigate to a page in French. | 130 // Now navigate to a page in French. |
| 83 ui_test_utils::NavigateToURL( | 131 ui_test_utils::NavigateToURL( |
| 84 browser(), GURL(embedded_test_server()->GetURL("/french_page.html"))); | 132 browser(), GURL(embedded_test_server()->GetURL("/french_page.html"))); |
| 85 WaitUntilLanguageDetected(); | 133 WaitUntilLanguageDetected(); |
| 86 | 134 |
| 87 EXPECT_EQ("fr", | 135 EXPECT_EQ("fr", |
| 88 chrome_translate_client->GetLanguageState().original_language()); | 136 chrome_translate_client->GetLanguageState().original_language()); |
| 89 } | 137 } |
| 90 | 138 |
| 139 // Test that the translation was successful. | |
| 140 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) { | |
| 141 ASSERT_TRUE(embedded_test_server()->Start()); | |
| 142 | |
| 143 content::WebContents* current_web_contents = | |
| 144 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 145 ChromeTranslateClient* chrome_translate_client = | |
| 146 ChromeTranslateClient::FromWebContents(current_web_contents); | |
| 147 | |
| 148 // There is a possible race condition, when the language is not yet detected, | |
| 149 // so we check for that and wait if necessary. | |
| 150 if (chrome_translate_client->GetLanguageState().original_language().empty()) | |
| 151 WaitUntilLanguageDetected(); | |
| 152 | |
| 153 EXPECT_EQ("und", | |
| 154 chrome_translate_client->GetLanguageState().original_language()); | |
| 155 | |
| 156 // Open a new tab with a page in French. | |
| 157 ResetObserver(); | |
| 158 // AddTabAtIndex(0, GURL("about:blank"), ui::PAGE_TRANSITION_TYPED); | |
| 159 AddTabAtIndex(0, GURL(embedded_test_server()->GetURL("/french_page.html")), | |
| 160 ui::PAGE_TRANSITION_TYPED); | |
| 161 current_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); | |
| 162 chrome_translate_client = | |
| 163 ChromeTranslateClient::FromWebContents(current_web_contents); | |
| 164 WaitUntilLanguageDetected(); | |
| 165 | |
| 166 EXPECT_EQ("fr", | |
| 167 chrome_translate_client->GetLanguageState().original_language()); | |
| 168 | |
| 169 // Translate the page through TranslateManager. | |
| 170 translate::TranslateManager* manager = | |
| 171 chrome_translate_client->GetTranslateManager(); | |
| 172 manager->TranslatePage( | |
| 173 chrome_translate_client->GetLanguageState().original_language(), "en", | |
| 174 true); | |
| 175 | |
| 176 SimulateURLFetch(true); | |
| 177 | |
| 178 // Wait for NOTIFICATION_PAGE_TRANSLATED notification. | |
| 179 WaitUntilPageTranslated(); | |
| 180 | |
| 181 EXPECT_FALSE(chrome_translate_client->GetLanguageState().translation_error()); | |
| 182 } | |
| 183 | |
| 184 // Test if there was an error during translation. | |
| 185 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) { | |
| 186 ASSERT_TRUE(embedded_test_server()->Start()); | |
| 187 | |
| 188 content::WebContents* current_web_contents = | |
| 189 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 190 ChromeTranslateClient* chrome_translate_client = | |
| 191 ChromeTranslateClient::FromWebContents(current_web_contents); | |
| 192 | |
| 193 // There is a possible race condition, when the language is not yet detected, | |
| 194 // so we check for that and wait if necessary. | |
| 195 if (chrome_translate_client->GetLanguageState().original_language().empty()) | |
| 196 WaitUntilLanguageDetected(); | |
| 197 | |
| 198 EXPECT_EQ("und", | |
| 199 chrome_translate_client->GetLanguageState().original_language()); | |
| 200 | |
| 201 // Open a new tab with about:blank page. | |
| 202 ResetObserver(); | |
| 203 AddTabAtIndex(0, GURL("about:blank"), ui::PAGE_TRANSITION_TYPED); | |
| 204 current_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); | |
| 205 chrome_translate_client = | |
| 206 ChromeTranslateClient::FromWebContents(current_web_contents); | |
| 207 WaitUntilLanguageDetected(); | |
| 208 | |
| 209 EXPECT_EQ("und", | |
| 210 chrome_translate_client->GetLanguageState().original_language()); | |
| 211 | |
| 212 // Translate the page through TranslateManager. | |
| 213 translate::TranslateManager* manager = | |
| 214 chrome_translate_client->GetTranslateManager(); | |
| 215 manager->TranslatePage( | |
| 216 chrome_translate_client->GetLanguageState().original_language(), "en", | |
| 217 true); | |
| 218 | |
| 219 SimulateURLFetch(true); | |
| 220 | |
| 221 // Wait for NOTIFICATION_PAGE_TRANSLATED notification. | |
| 222 WaitUntilPageTranslated(); | |
| 223 | |
| 224 EXPECT_TRUE(chrome_translate_client->GetLanguageState().translation_error()); | |
| 225 } | |
| 226 | |
| 91 // Test that session restore restores the translate infobar and other translate | 227 // Test that session restore restores the translate infobar and other translate |
| 92 // settings. | 228 // settings. |
| 93 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, | 229 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, |
| 94 PRE_TranslateSessionRestore) { | 230 PRE_TranslateSessionRestore) { |
| 95 SessionStartupPref pref(SessionStartupPref::LAST); | 231 SessionStartupPref pref(SessionStartupPref::LAST); |
| 96 SessionStartupPref::SetStartupPref(browser()->profile(), pref); | 232 SessionStartupPref::SetStartupPref(browser()->profile(), pref); |
| 97 | 233 |
| 98 content::WebContents* current_web_contents = | 234 content::WebContents* current_web_contents = |
| 99 browser()->tab_strip_model()->GetActiveWebContents(); | 235 browser()->tab_strip_model()->GetActiveWebContents(); |
| 100 ChromeTranslateClient* chrome_translate_client = | 236 ChromeTranslateClient* chrome_translate_client = |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 140 ChromeTranslateClient::FromWebContents(restored_web_contents); | 276 ChromeTranslateClient::FromWebContents(restored_web_contents); |
| 141 if (restored_translate_client->GetLanguageState() | 277 if (restored_translate_client->GetLanguageState() |
| 142 .current_language() | 278 .current_language() |
| 143 .empty()) { | 279 .empty()) { |
| 144 ResetObserver(); | 280 ResetObserver(); |
| 145 WaitUntilLanguageDetected(); | 281 WaitUntilLanguageDetected(); |
| 146 } | 282 } |
| 147 EXPECT_EQ("fr", | 283 EXPECT_EQ("fr", |
| 148 restored_translate_client->GetLanguageState().current_language()); | 284 restored_translate_client->GetLanguageState().current_language()); |
| 149 } | 285 } |
| OLD | NEW |