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 |