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) { |
| 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(embedded_test_server()->GetURL("/french_page.html")), |
| 159 ui::PAGE_TRANSITION_TYPED); |
| 160 current_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); |
| 161 chrome_translate_client = |
| 162 ChromeTranslateClient::FromWebContents(current_web_contents); |
| 163 WaitUntilLanguageDetected(); |
| 164 |
| 165 EXPECT_EQ("fr", |
| 166 chrome_translate_client->GetLanguageState().original_language()); |
| 167 |
| 168 // Translate the page through TranslateManager. |
| 169 translate::TranslateManager* manager = |
| 170 chrome_translate_client->GetTranslateManager(); |
| 171 manager->TranslatePage( |
| 172 chrome_translate_client->GetLanguageState().original_language(), "en", |
| 173 true); |
| 174 |
| 175 SimulateURLFetch(true); |
| 176 |
| 177 // Wait for NOTIFICATION_PAGE_TRANSLATED notification. |
| 178 WaitUntilPageTranslated(); |
| 179 |
| 180 EXPECT_FALSE(chrome_translate_client->GetLanguageState().translation_error()); |
| 181 } |
| 182 |
| 183 // Test if there was an error during translation. |
| 184 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) { |
| 185 ASSERT_TRUE(embedded_test_server()->Start()); |
| 186 |
| 187 content::WebContents* current_web_contents = |
| 188 browser()->tab_strip_model()->GetActiveWebContents(); |
| 189 ChromeTranslateClient* chrome_translate_client = |
| 190 ChromeTranslateClient::FromWebContents(current_web_contents); |
| 191 |
| 192 // There is a possible race condition, when the language is not yet detected, |
| 193 // so we check for that and wait if necessary. |
| 194 if (chrome_translate_client->GetLanguageState().original_language().empty()) |
| 195 WaitUntilLanguageDetected(); |
| 196 |
| 197 EXPECT_EQ("und", |
| 198 chrome_translate_client->GetLanguageState().original_language()); |
| 199 |
| 200 // Open a new tab with about:blank page. |
| 201 ResetObserver(); |
| 202 AddTabAtIndex(0, GURL("about:blank"), ui::PAGE_TRANSITION_TYPED); |
| 203 current_web_contents = browser()->tab_strip_model()->GetActiveWebContents(); |
| 204 chrome_translate_client = |
| 205 ChromeTranslateClient::FromWebContents(current_web_contents); |
| 206 WaitUntilLanguageDetected(); |
| 207 |
| 208 EXPECT_EQ("und", |
| 209 chrome_translate_client->GetLanguageState().original_language()); |
| 210 |
| 211 // Translate the page through TranslateManager. |
| 212 translate::TranslateManager* manager = |
| 213 chrome_translate_client->GetTranslateManager(); |
| 214 manager->TranslatePage( |
| 215 chrome_translate_client->GetLanguageState().original_language(), "en", |
| 216 true); |
| 217 |
| 218 SimulateURLFetch(true); |
| 219 |
| 220 // Wait for NOTIFICATION_PAGE_TRANSLATED notification. |
| 221 WaitUntilPageTranslated(); |
| 222 |
| 223 EXPECT_TRUE(chrome_translate_client->GetLanguageState().translation_error()); |
| 224 } |
| 225 |
91 // Test that session restore restores the translate infobar and other translate | 226 // Test that session restore restores the translate infobar and other translate |
92 // settings. | 227 // settings. |
93 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, | 228 IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, |
94 PRE_TranslateSessionRestore) { | 229 PRE_TranslateSessionRestore) { |
95 SessionStartupPref pref(SessionStartupPref::LAST); | 230 SessionStartupPref pref(SessionStartupPref::LAST); |
96 SessionStartupPref::SetStartupPref(browser()->profile(), pref); | 231 SessionStartupPref::SetStartupPref(browser()->profile(), pref); |
97 | 232 |
98 content::WebContents* current_web_contents = | 233 content::WebContents* current_web_contents = |
99 browser()->tab_strip_model()->GetActiveWebContents(); | 234 browser()->tab_strip_model()->GetActiveWebContents(); |
100 ChromeTranslateClient* chrome_translate_client = | 235 ChromeTranslateClient* chrome_translate_client = |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 ChromeTranslateClient::FromWebContents(restored_web_contents); | 275 ChromeTranslateClient::FromWebContents(restored_web_contents); |
141 if (restored_translate_client->GetLanguageState() | 276 if (restored_translate_client->GetLanguageState() |
142 .current_language() | 277 .current_language() |
143 .empty()) { | 278 .empty()) { |
144 ResetObserver(); | 279 ResetObserver(); |
145 WaitUntilLanguageDetected(); | 280 WaitUntilLanguageDetected(); |
146 } | 281 } |
147 EXPECT_EQ("fr", | 282 EXPECT_EQ("fr", |
148 restored_translate_client->GetLanguageState().current_language()); | 283 restored_translate_client->GetLanguageState().current_language()); |
149 } | 284 } |
OLD | NEW |