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 <tuple> | 5 #include <tuple> |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "chrome/common/chrome_isolated_world_ids.h" | 10 #include "chrome/common/chrome_isolated_world_ids.h" |
11 #include "chrome/test/base/chrome_render_view_test.h" | 11 #include "chrome/test/base/chrome_render_view_test.h" |
12 #include "components/translate/content/common/translate_messages.h" | 12 #include "components/translate/content/common/translate.mojom.h" |
13 #include "components/translate/content/renderer/translate_helper.h" | 13 #include "components/translate/content/renderer/translate_helper.h" |
14 #include "components/translate/core/common/translate_constants.h" | 14 #include "components/translate/core/common/translate_constants.h" |
15 #include "content/public/renderer/render_frame.h" | 15 #include "content/public/renderer/render_frame.h" |
16 #include "content/public/renderer/render_view.h" | 16 #include "content/public/renderer/render_view.h" |
17 #include "extensions/common/constants.h" | 17 #include "extensions/common/constants.h" |
| 18 #include "mojo/public/cpp/bindings/binding_set.h" |
| 19 #include "services/shell/public/cpp/interface_provider.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
20 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 22 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
21 | 23 |
22 using testing::AtLeast; | 24 using testing::AtLeast; |
23 using testing::Return; | 25 using testing::Return; |
24 using testing::_; | 26 using testing::_; |
25 | 27 |
| 28 namespace { |
| 29 |
| 30 class FakeContentTranslateDriver |
| 31 : public translate::mojom::ContentTranslateDriver { |
| 32 public: |
| 33 FakeContentTranslateDriver() |
| 34 : called_new_page_(false), page_needs_translation_(false) {} |
| 35 ~FakeContentTranslateDriver() override {} |
| 36 |
| 37 void BindHandle(mojo::ScopedMessagePipeHandle handle) { |
| 38 bindings_.AddBinding( |
| 39 this, mojo::MakeRequest<translate::mojom::ContentTranslateDriver>( |
| 40 std::move(handle))); |
| 41 } |
| 42 |
| 43 // translate::mojom::ContentTranslateDriver implementation. |
| 44 void RegisterPage(translate::mojom::PagePtr page, |
| 45 const translate::LanguageDetectionDetails& details, |
| 46 bool page_needs_translation) override { |
| 47 called_new_page_ = true; |
| 48 details_ = details; |
| 49 page_needs_translation_ = page_needs_translation; |
| 50 } |
| 51 |
| 52 void ResetNewPageValues() { |
| 53 called_new_page_ = false; |
| 54 details_ = base::nullopt; |
| 55 page_needs_translation_ = false; |
| 56 } |
| 57 |
| 58 bool called_new_page_; |
| 59 base::Optional<translate::LanguageDetectionDetails> details_; |
| 60 bool page_needs_translation_; |
| 61 |
| 62 private: |
| 63 mojo::BindingSet<translate::mojom::ContentTranslateDriver> bindings_; |
| 64 }; |
| 65 |
| 66 } // namespace |
| 67 |
26 class TestTranslateHelper : public translate::TranslateHelper { | 68 class TestTranslateHelper : public translate::TranslateHelper { |
27 public: | 69 public: |
28 explicit TestTranslateHelper(content::RenderFrame* render_frame) | 70 explicit TestTranslateHelper(content::RenderFrame* render_frame) |
29 : translate::TranslateHelper(render_frame, | 71 : translate::TranslateHelper(render_frame, |
30 chrome::ISOLATED_WORLD_ID_TRANSLATE, | 72 chrome::ISOLATED_WORLD_ID_TRANSLATE, |
31 0, | 73 0, |
32 extensions::kExtensionScheme) {} | 74 extensions::kExtensionScheme) {} |
33 | 75 |
34 base::TimeDelta AdjustDelay(int delayInMs) override { | 76 base::TimeDelta AdjustDelay(int delayInMs) override { |
35 // Just returns base::TimeDelta() which has initial value 0. | 77 // Just returns base::TimeDelta() which has initial value 0. |
36 // Tasks doesn't need to be delayed in tests. | 78 // Tasks doesn't need to be delayed in tests. |
37 return base::TimeDelta(); | 79 return base::TimeDelta(); |
38 } | 80 } |
39 | 81 |
40 void TranslatePage(const std::string& source_lang, | 82 void TranslatePage(const std::string& source_lang, |
41 const std::string& target_lang, | 83 const std::string& target_lang, |
42 const std::string& translate_script) { | 84 const std::string& translate_script) { |
43 OnTranslatePage(0, translate_script, source_lang, target_lang); | 85 // Reset result values firstly. |
| 86 page_translated_ = false; |
| 87 trans_result_cancelled_ = false; |
| 88 trans_result_original_lang_ = base::nullopt; |
| 89 trans_result_translated_lang_ = base::nullopt; |
| 90 trans_result_error_type_ = translate::TranslateErrors::NONE; |
| 91 |
| 92 // Will get new result values via OnPageTranslated. |
| 93 Translate(translate_script, source_lang, target_lang, |
| 94 base::Bind(&TestTranslateHelper::OnPageTranslated, |
| 95 base::Unretained(this))); |
| 96 } |
| 97 |
| 98 bool GetPageTranslatedResult(std::string* original_lang, |
| 99 std::string* target_lang, |
| 100 translate::TranslateErrors::Type* error) { |
| 101 if (!page_translated_) |
| 102 return false; |
| 103 if (original_lang) |
| 104 *original_lang = *trans_result_original_lang_; |
| 105 if (target_lang) |
| 106 *target_lang = *trans_result_translated_lang_; |
| 107 if (error) |
| 108 *error = trans_result_error_type_; |
| 109 return true; |
44 } | 110 } |
45 | 111 |
46 MOCK_METHOD0(IsTranslateLibAvailable, bool()); | 112 MOCK_METHOD0(IsTranslateLibAvailable, bool()); |
47 MOCK_METHOD0(IsTranslateLibReady, bool()); | 113 MOCK_METHOD0(IsTranslateLibReady, bool()); |
48 MOCK_METHOD0(HasTranslationFinished, bool()); | 114 MOCK_METHOD0(HasTranslationFinished, bool()); |
49 MOCK_METHOD0(HasTranslationFailed, bool()); | 115 MOCK_METHOD0(HasTranslationFailed, bool()); |
50 MOCK_METHOD0(GetOriginalPageLanguage, std::string()); | 116 MOCK_METHOD0(GetOriginalPageLanguage, std::string()); |
51 MOCK_METHOD0(StartTranslation, bool()); | 117 MOCK_METHOD0(StartTranslation, bool()); |
52 MOCK_METHOD1(ExecuteScript, void(const std::string&)); | 118 MOCK_METHOD1(ExecuteScript, void(const std::string&)); |
53 MOCK_METHOD2(ExecuteScriptAndGetBoolResult, bool(const std::string&, bool)); | 119 MOCK_METHOD2(ExecuteScriptAndGetBoolResult, bool(const std::string&, bool)); |
54 MOCK_METHOD1(ExecuteScriptAndGetStringResult, | 120 MOCK_METHOD1(ExecuteScriptAndGetStringResult, |
55 std::string(const std::string&)); | 121 std::string(const std::string&)); |
56 MOCK_METHOD1(ExecuteScriptAndGetDoubleResult, double(const std::string&)); | 122 MOCK_METHOD1(ExecuteScriptAndGetDoubleResult, double(const std::string&)); |
57 | 123 |
58 private: | 124 private: |
| 125 void OnPageTranslated(bool cancelled, |
| 126 const std::string& original_lang, |
| 127 const std::string& translated_lang, |
| 128 translate::TranslateErrors::Type error_type) { |
| 129 page_translated_ = true; |
| 130 trans_result_cancelled_ = cancelled; |
| 131 trans_result_original_lang_ = original_lang; |
| 132 trans_result_translated_lang_ = translated_lang; |
| 133 trans_result_error_type_ = error_type; |
| 134 } |
| 135 |
| 136 bool page_translated_; |
| 137 bool trans_result_cancelled_; |
| 138 base::Optional<std::string> trans_result_original_lang_; |
| 139 base::Optional<std::string> trans_result_translated_lang_; |
| 140 translate::TranslateErrors::Type trans_result_error_type_; |
| 141 |
59 DISALLOW_COPY_AND_ASSIGN(TestTranslateHelper); | 142 DISALLOW_COPY_AND_ASSIGN(TestTranslateHelper); |
60 }; | 143 }; |
61 | 144 |
62 class TranslateHelperBrowserTest : public ChromeRenderViewTest { | 145 class TranslateHelperBrowserTest : public ChromeRenderViewTest { |
63 public: | 146 public: |
64 TranslateHelperBrowserTest() : translate_helper_(NULL) {} | 147 TranslateHelperBrowserTest() : translate_helper_(NULL) {} |
65 | 148 |
66 protected: | 149 protected: |
67 void SetUp() override { | 150 void SetUp() override { |
68 ChromeRenderViewTest::SetUp(); | 151 ChromeRenderViewTest::SetUp(); |
69 translate_helper_ = new TestTranslateHelper(view_->GetMainRenderFrame()); | 152 translate_helper_ = new TestTranslateHelper(view_->GetMainRenderFrame()); |
| 153 |
| 154 shell::InterfaceProvider* remote_interfaces = |
| 155 view_->GetMainRenderFrame()->GetRemoteInterfaces(); |
| 156 shell::InterfaceProvider::TestApi test_api(remote_interfaces); |
| 157 test_api.SetBinderForName( |
| 158 translate::mojom::ContentTranslateDriver::Name_, |
| 159 base::Bind(&FakeContentTranslateDriver::BindHandle, |
| 160 base::Unretained(&fake_translate_driver_))); |
70 } | 161 } |
71 | 162 |
72 void TearDown() override { | 163 void TearDown() override { |
73 delete translate_helper_; | 164 delete translate_helper_; |
74 ChromeRenderViewTest::TearDown(); | 165 ChromeRenderViewTest::TearDown(); |
75 } | 166 } |
76 | 167 |
77 bool GetPageTranslatedMessage(std::string* original_lang, | |
78 std::string* target_lang, | |
79 translate::TranslateErrors::Type* error) { | |
80 const IPC::Message* message = | |
81 render_thread_->sink().GetUniqueMessageMatching( | |
82 ChromeFrameHostMsg_PageTranslated::ID); | |
83 if (!message) | |
84 return false; | |
85 std::tuple<std::string, std::string, translate::TranslateErrors::Type> | |
86 translate_param; | |
87 ChromeFrameHostMsg_PageTranslated::Read(message, &translate_param); | |
88 if (original_lang) | |
89 *original_lang = std::get<0>(translate_param); | |
90 if (target_lang) | |
91 *target_lang = std::get<1>(translate_param); | |
92 if (error) | |
93 *error = std::get<2>(translate_param); | |
94 return true; | |
95 } | |
96 | |
97 TestTranslateHelper* translate_helper_; | 168 TestTranslateHelper* translate_helper_; |
| 169 FakeContentTranslateDriver fake_translate_driver_; |
98 | 170 |
99 private: | 171 private: |
100 DISALLOW_COPY_AND_ASSIGN(TranslateHelperBrowserTest); | 172 DISALLOW_COPY_AND_ASSIGN(TranslateHelperBrowserTest); |
101 }; | 173 }; |
102 | 174 |
103 // Tests that the browser gets notified of the translation failure if the | 175 // Tests that the browser gets notified of the translation failure if the |
104 // translate library fails/times-out during initialization. | 176 // translate library fails/times-out during initialization. |
105 TEST_F(TranslateHelperBrowserTest, TranslateLibNeverReady) { | 177 TEST_F(TranslateHelperBrowserTest, TranslateLibNeverReady) { |
106 // We make IsTranslateLibAvailable true so we don't attempt to inject the | 178 // We make IsTranslateLibAvailable true so we don't attempt to inject the |
107 // library. | 179 // library. |
108 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) | 180 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) |
109 .Times(AtLeast(1)) | 181 .Times(AtLeast(1)) |
110 .WillRepeatedly(Return(true)); | 182 .WillRepeatedly(Return(true)); |
111 | 183 |
112 EXPECT_CALL(*translate_helper_, IsTranslateLibReady()) | 184 EXPECT_CALL(*translate_helper_, IsTranslateLibReady()) |
113 .Times(AtLeast(5)) // See kMaxTranslateInitCheckAttempts in | 185 .Times(AtLeast(5)) // See kMaxTranslateInitCheckAttempts in |
114 // translate_helper.cc | 186 // translate_helper.cc |
115 .WillRepeatedly(Return(false)); | 187 .WillRepeatedly(Return(false)); |
116 | 188 |
117 translate_helper_->TranslatePage("en", "fr", std::string()); | 189 translate_helper_->TranslatePage("en", "fr", std::string()); |
118 base::RunLoop().RunUntilIdle(); | 190 base::RunLoop().RunUntilIdle(); |
119 | 191 |
120 translate::TranslateErrors::Type error; | 192 translate::TranslateErrors::Type error; |
121 ASSERT_TRUE(GetPageTranslatedMessage(NULL, NULL, &error)); | 193 ASSERT_TRUE(translate_helper_->GetPageTranslatedResult(NULL, NULL, &error)); |
122 EXPECT_EQ(translate::TranslateErrors::INITIALIZATION_ERROR, error); | 194 EXPECT_EQ(translate::TranslateErrors::INITIALIZATION_ERROR, error); |
123 } | 195 } |
124 | 196 |
125 // Tests that the browser gets notified of the translation success when the | 197 // Tests that the browser gets notified of the translation success when the |
126 // translation succeeds. | 198 // translation succeeds. |
127 TEST_F(TranslateHelperBrowserTest, TranslateSuccess) { | 199 TEST_F(TranslateHelperBrowserTest, TranslateSuccess) { |
128 // We make IsTranslateLibAvailable true so we don't attempt to inject the | 200 // We make IsTranslateLibAvailable true so we don't attempt to inject the |
129 // library. | 201 // library. |
130 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) | 202 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) |
131 .Times(AtLeast(1)) | 203 .Times(AtLeast(1)) |
(...skipping 18 matching lines...) Expand all Loading... |
150 ExecuteScriptAndGetDoubleResult(_)).Times(3); | 222 ExecuteScriptAndGetDoubleResult(_)).Times(3); |
151 | 223 |
152 std::string original_lang("en"); | 224 std::string original_lang("en"); |
153 std::string target_lang("fr"); | 225 std::string target_lang("fr"); |
154 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); | 226 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); |
155 base::RunLoop().RunUntilIdle(); | 227 base::RunLoop().RunUntilIdle(); |
156 | 228 |
157 std::string received_original_lang; | 229 std::string received_original_lang; |
158 std::string received_target_lang; | 230 std::string received_target_lang; |
159 translate::TranslateErrors::Type error; | 231 translate::TranslateErrors::Type error; |
160 ASSERT_TRUE(GetPageTranslatedMessage(&received_original_lang, | 232 ASSERT_TRUE(translate_helper_->GetPageTranslatedResult( |
161 &received_target_lang, | 233 &received_original_lang, &received_target_lang, &error)); |
162 &error)); | |
163 EXPECT_EQ(original_lang, received_original_lang); | 234 EXPECT_EQ(original_lang, received_original_lang); |
164 EXPECT_EQ(target_lang, received_target_lang); | 235 EXPECT_EQ(target_lang, received_target_lang); |
165 EXPECT_EQ(translate::TranslateErrors::NONE, error); | 236 EXPECT_EQ(translate::TranslateErrors::NONE, error); |
166 } | 237 } |
167 | 238 |
168 // Tests that the browser gets notified of the translation failure when the | 239 // Tests that the browser gets notified of the translation failure when the |
169 // translation fails. | 240 // translation fails. |
170 TEST_F(TranslateHelperBrowserTest, TranslateFailure) { | 241 TEST_F(TranslateHelperBrowserTest, TranslateFailure) { |
171 // We make IsTranslateLibAvailable true so we don't attempt to inject the | 242 // We make IsTranslateLibAvailable true so we don't attempt to inject the |
172 // library. | 243 // library. |
(...skipping 18 matching lines...) Expand all Loading... |
191 .WillRepeatedly(Return(false)); | 262 .WillRepeatedly(Return(false)); |
192 | 263 |
193 // V8 call for performance monitoring should be ignored. | 264 // V8 call for performance monitoring should be ignored. |
194 EXPECT_CALL(*translate_helper_, | 265 EXPECT_CALL(*translate_helper_, |
195 ExecuteScriptAndGetDoubleResult(_)).Times(2); | 266 ExecuteScriptAndGetDoubleResult(_)).Times(2); |
196 | 267 |
197 translate_helper_->TranslatePage("en", "fr", std::string()); | 268 translate_helper_->TranslatePage("en", "fr", std::string()); |
198 base::RunLoop().RunUntilIdle(); | 269 base::RunLoop().RunUntilIdle(); |
199 | 270 |
200 translate::TranslateErrors::Type error; | 271 translate::TranslateErrors::Type error; |
201 ASSERT_TRUE(GetPageTranslatedMessage(NULL, NULL, &error)); | 272 ASSERT_TRUE(translate_helper_->GetPageTranslatedResult(NULL, NULL, &error)); |
202 EXPECT_EQ(translate::TranslateErrors::TRANSLATION_ERROR, error); | 273 EXPECT_EQ(translate::TranslateErrors::TRANSLATION_ERROR, error); |
203 } | 274 } |
204 | 275 |
205 // Tests that when the browser translate a page for which the language is | 276 // Tests that when the browser translate a page for which the language is |
206 // undefined we query the translate element to get the language. | 277 // undefined we query the translate element to get the language. |
207 TEST_F(TranslateHelperBrowserTest, UndefinedSourceLang) { | 278 TEST_F(TranslateHelperBrowserTest, UndefinedSourceLang) { |
208 // We make IsTranslateLibAvailable true so we don't attempt to inject the | 279 // We make IsTranslateLibAvailable true so we don't attempt to inject the |
209 // library. | 280 // library. |
210 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) | 281 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) |
211 .Times(AtLeast(1)) | 282 .Times(AtLeast(1)) |
(...skipping 17 matching lines...) Expand all Loading... |
229 ExecuteScriptAndGetDoubleResult(_)).Times(3); | 300 ExecuteScriptAndGetDoubleResult(_)).Times(3); |
230 | 301 |
231 translate_helper_->TranslatePage(translate::kUnknownLanguageCode, | 302 translate_helper_->TranslatePage(translate::kUnknownLanguageCode, |
232 "fr", | 303 "fr", |
233 std::string()); | 304 std::string()); |
234 base::RunLoop().RunUntilIdle(); | 305 base::RunLoop().RunUntilIdle(); |
235 | 306 |
236 translate::TranslateErrors::Type error; | 307 translate::TranslateErrors::Type error; |
237 std::string original_lang; | 308 std::string original_lang; |
238 std::string target_lang; | 309 std::string target_lang; |
239 ASSERT_TRUE(GetPageTranslatedMessage(&original_lang, &target_lang, &error)); | 310 ASSERT_TRUE(translate_helper_->GetPageTranslatedResult(&original_lang, |
| 311 &target_lang, &error)); |
240 EXPECT_EQ("de", original_lang); | 312 EXPECT_EQ("de", original_lang); |
241 EXPECT_EQ("fr", target_lang); | 313 EXPECT_EQ("fr", target_lang); |
242 EXPECT_EQ(translate::TranslateErrors::NONE, error); | 314 EXPECT_EQ(translate::TranslateErrors::NONE, error); |
243 } | 315 } |
244 | 316 |
245 // Tests that starting a translation while a similar one is pending does not | 317 // Tests that starting a translation while a similar one is pending does not |
246 // break anything. | 318 // break anything. |
247 TEST_F(TranslateHelperBrowserTest, MultipleSimilarTranslations) { | 319 TEST_F(TranslateHelperBrowserTest, MultipleSimilarTranslations) { |
248 // We make IsTranslateLibAvailable true so we don't attempt to inject the | 320 // We make IsTranslateLibAvailable true so we don't attempt to inject the |
249 // library. | 321 // library. |
(...skipping 18 matching lines...) Expand all Loading... |
268 std::string target_lang("fr"); | 340 std::string target_lang("fr"); |
269 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); | 341 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); |
270 // While this is running call again TranslatePage to make sure noting bad | 342 // While this is running call again TranslatePage to make sure noting bad |
271 // happens. | 343 // happens. |
272 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); | 344 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); |
273 base::RunLoop().RunUntilIdle(); | 345 base::RunLoop().RunUntilIdle(); |
274 | 346 |
275 std::string received_original_lang; | 347 std::string received_original_lang; |
276 std::string received_target_lang; | 348 std::string received_target_lang; |
277 translate::TranslateErrors::Type error; | 349 translate::TranslateErrors::Type error; |
278 ASSERT_TRUE(GetPageTranslatedMessage(&received_original_lang, | 350 ASSERT_TRUE(translate_helper_->GetPageTranslatedResult( |
279 &received_target_lang, | 351 &received_original_lang, &received_target_lang, &error)); |
280 &error)); | |
281 EXPECT_EQ(original_lang, received_original_lang); | 352 EXPECT_EQ(original_lang, received_original_lang); |
282 EXPECT_EQ(target_lang, received_target_lang); | 353 EXPECT_EQ(target_lang, received_target_lang); |
283 EXPECT_EQ(translate::TranslateErrors::NONE, error); | 354 EXPECT_EQ(translate::TranslateErrors::NONE, error); |
284 } | 355 } |
285 | 356 |
286 // Tests that starting a translation while a different one is pending works. | 357 // Tests that starting a translation while a different one is pending works. |
287 TEST_F(TranslateHelperBrowserTest, MultipleDifferentTranslations) { | 358 TEST_F(TranslateHelperBrowserTest, MultipleDifferentTranslations) { |
288 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) | 359 EXPECT_CALL(*translate_helper_, IsTranslateLibAvailable()) |
289 .Times(AtLeast(1)) | 360 .Times(AtLeast(1)) |
290 .WillRepeatedly(Return(true)); | 361 .WillRepeatedly(Return(true)); |
(...skipping 15 matching lines...) Expand all Loading... |
306 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); | 377 translate_helper_->TranslatePage(original_lang, target_lang, std::string()); |
307 // While this is running call again TranslatePage with a new target lang. | 378 // While this is running call again TranslatePage with a new target lang. |
308 std::string new_target_lang("de"); | 379 std::string new_target_lang("de"); |
309 translate_helper_->TranslatePage( | 380 translate_helper_->TranslatePage( |
310 original_lang, new_target_lang, std::string()); | 381 original_lang, new_target_lang, std::string()); |
311 base::RunLoop().RunUntilIdle(); | 382 base::RunLoop().RunUntilIdle(); |
312 | 383 |
313 std::string received_original_lang; | 384 std::string received_original_lang; |
314 std::string received_target_lang; | 385 std::string received_target_lang; |
315 translate::TranslateErrors::Type error; | 386 translate::TranslateErrors::Type error; |
316 ASSERT_TRUE(GetPageTranslatedMessage(&received_original_lang, | 387 ASSERT_TRUE(translate_helper_->GetPageTranslatedResult( |
317 &received_target_lang, | 388 &received_original_lang, &received_target_lang, &error)); |
318 &error)); | |
319 EXPECT_EQ(original_lang, received_original_lang); | 389 EXPECT_EQ(original_lang, received_original_lang); |
320 EXPECT_EQ(new_target_lang, received_target_lang); | 390 EXPECT_EQ(new_target_lang, received_target_lang); |
321 EXPECT_EQ(translate::TranslateErrors::NONE, error); | 391 EXPECT_EQ(translate::TranslateErrors::NONE, error); |
322 } | 392 } |
323 | 393 |
324 // Tests that we send the right translate language message for a page and that | 394 // Tests that we send the right translate language message for a page and that |
325 // we respect the "no translate" meta-tag. | 395 // we respect the "no translate" meta-tag. |
326 TEST_F(ChromeRenderViewTest, TranslatablePage) { | 396 TEST_F(TranslateHelperBrowserTest, TranslatablePage) { |
327 LoadHTML("<html><body>A random page with random content.</body></html>"); | 397 LoadHTML("<html><body>A random page with random content.</body></html>"); |
328 | 398 |
329 const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( | 399 base::RunLoop().RunUntilIdle(); |
330 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 400 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
331 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 401 EXPECT_TRUE(fake_translate_driver_.page_needs_translation_) |
332 ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; | 402 << "Page should be translatable."; |
333 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | 403 fake_translate_driver_.ResetNewPageValues(); |
334 EXPECT_TRUE(std::get<1>(params)) << "Page should be translatable."; | |
335 render_thread_->sink().ClearMessages(); | |
336 | 404 |
337 // Now the page specifies the META tag to prevent translation. | 405 // Now the page specifies the META tag to prevent translation. |
338 LoadHTML("<html><head><meta name=\"google\" value=\"notranslate\"></head>" | 406 LoadHTML("<html><head><meta name=\"google\" value=\"notranslate\"></head>" |
339 "<body>A random page with random content.</body></html>"); | 407 "<body>A random page with random content.</body></html>"); |
340 | 408 |
341 message = render_thread_->sink().GetUniqueMessageMatching( | 409 base::RunLoop().RunUntilIdle(); |
342 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 410 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
343 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 411 EXPECT_FALSE(fake_translate_driver_.page_needs_translation_) |
344 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | 412 << "Page should not be translatable."; |
345 EXPECT_FALSE(std::get<1>(params)) << "Page should not be translatable."; | 413 fake_translate_driver_.ResetNewPageValues(); |
346 render_thread_->sink().ClearMessages(); | |
347 | 414 |
348 // Try the alternate version of the META tag (content instead of value). | 415 // Try the alternate version of the META tag (content instead of value). |
349 LoadHTML("<html><head><meta name=\"google\" content=\"notranslate\"></head>" | 416 LoadHTML("<html><head><meta name=\"google\" content=\"notranslate\"></head>" |
350 "<body>A random page with random content.</body></html>"); | 417 "<body>A random page with random content.</body></html>"); |
351 | 418 |
352 message = render_thread_->sink().GetUniqueMessageMatching( | 419 base::RunLoop().RunUntilIdle(); |
353 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 420 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
354 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 421 EXPECT_FALSE(fake_translate_driver_.page_needs_translation_) |
355 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | 422 << "Page should not be translatable."; |
356 EXPECT_FALSE(std::get<1>(params)) << "Page should not be translatable."; | |
357 } | 423 } |
358 | 424 |
359 // Tests that the language meta tag takes precedence over the CLD when reporting | 425 // Tests that the language meta tag takes precedence over the CLD when reporting |
360 // the page's language. | 426 // the page's language. |
361 TEST_F(ChromeRenderViewTest, LanguageMetaTag) { | 427 TEST_F(TranslateHelperBrowserTest, LanguageMetaTag) { |
362 LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"es\">" | 428 LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"es\">" |
363 "</head><body>A random page with random content.</body></html>"); | 429 "</head><body>A random page with random content.</body></html>"); |
364 | 430 |
365 const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( | 431 base::RunLoop().RunUntilIdle(); |
366 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 432 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
367 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 433 EXPECT_EQ("es", fake_translate_driver_.details_->adopted_language); |
368 ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; | 434 fake_translate_driver_.ResetNewPageValues(); |
369 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | |
370 EXPECT_EQ("es", std::get<0>(params).adopted_language); | |
371 render_thread_->sink().ClearMessages(); | |
372 | 435 |
373 // Makes sure we support multiple languages specified. | 436 // Makes sure we support multiple languages specified. |
374 LoadHTML("<html><head><meta http-equiv=\"content-language\" " | 437 LoadHTML("<html><head><meta http-equiv=\"content-language\" " |
375 "content=\" fr , es,en \">" | 438 "content=\" fr , es,en \">" |
376 "</head><body>A random page with random content.</body></html>"); | 439 "</head><body>A random page with random content.</body></html>"); |
377 message = render_thread_->sink().GetUniqueMessageMatching( | 440 |
378 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 441 base::RunLoop().RunUntilIdle(); |
379 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 442 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
380 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | 443 EXPECT_EQ("fr", fake_translate_driver_.details_->adopted_language); |
381 EXPECT_EQ("fr", std::get<0>(params).adopted_language); | |
382 } | 444 } |
383 | 445 |
384 // Tests that the language meta tag works even with non-all-lower-case. | 446 // Tests that the language meta tag works even with non-all-lower-case. |
385 // http://code.google.com/p/chromium/issues/detail?id=145689 | 447 // http://code.google.com/p/chromium/issues/detail?id=145689 |
386 TEST_F(ChromeRenderViewTest, LanguageMetaTagCase) { | 448 TEST_F(TranslateHelperBrowserTest, LanguageMetaTagCase) { |
387 LoadHTML("<html><head><meta http-equiv=\"Content-Language\" content=\"es\">" | 449 LoadHTML("<html><head><meta http-equiv=\"Content-Language\" content=\"es\">" |
388 "</head><body>A random page with random content.</body></html>"); | 450 "</head><body>A random page with random content.</body></html>"); |
389 const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( | 451 base::RunLoop().RunUntilIdle(); |
390 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 452 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
391 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 453 EXPECT_EQ("es", fake_translate_driver_.details_->adopted_language); |
392 ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; | 454 fake_translate_driver_.ResetNewPageValues(); |
393 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | |
394 EXPECT_EQ("es", std::get<0>(params).adopted_language); | |
395 render_thread_->sink().ClearMessages(); | |
396 | 455 |
397 // Makes sure we support multiple languages specified. | 456 // Makes sure we support multiple languages specified. |
398 LoadHTML("<html><head><meta http-equiv=\"Content-Language\" " | 457 LoadHTML("<html><head><meta http-equiv=\"Content-Language\" " |
399 "content=\" fr , es,en \">" | 458 "content=\" fr , es,en \">" |
400 "</head><body>A random page with random content.</body></html>"); | 459 "</head><body>A random page with random content.</body></html>"); |
401 message = render_thread_->sink().GetUniqueMessageMatching( | 460 base::RunLoop().RunUntilIdle(); |
402 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 461 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
403 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 462 EXPECT_EQ("fr", fake_translate_driver_.details_->adopted_language); |
404 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | |
405 EXPECT_EQ("fr", std::get<0>(params).adopted_language); | |
406 } | 463 } |
407 | 464 |
408 // Tests that the language meta tag is converted to Chrome standard of dashes | 465 // Tests that the language meta tag is converted to Chrome standard of dashes |
409 // instead of underscores and proper capitalization. | 466 // instead of underscores and proper capitalization. |
410 // http://code.google.com/p/chromium/issues/detail?id=159487 | 467 // http://code.google.com/p/chromium/issues/detail?id=159487 |
411 TEST_F(ChromeRenderViewTest, LanguageCommonMistakesAreCorrected) { | 468 TEST_F(TranslateHelperBrowserTest, LanguageCommonMistakesAreCorrected) { |
412 LoadHTML("<html><head><meta http-equiv='Content-Language' content='EN_us'>" | 469 LoadHTML("<html><head><meta http-equiv='Content-Language' content='EN_us'>" |
413 "</head><body>A random page with random content.</body></html>"); | 470 "</head><body>A random page with random content.</body></html>"); |
414 const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( | 471 base::RunLoop().RunUntilIdle(); |
415 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 472 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
416 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 473 EXPECT_EQ("en", fake_translate_driver_.details_->adopted_language); |
417 ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; | 474 fake_translate_driver_.ResetNewPageValues(); |
418 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | |
419 EXPECT_EQ("en", std::get<0>(params).adopted_language); | |
420 render_thread_->sink().ClearMessages(); | |
421 | 475 |
422 LoadHTML("<html><head><meta http-equiv='Content-Language' content='ZH_tw'>" | 476 LoadHTML("<html><head><meta http-equiv='Content-Language' content='ZH_tw'>" |
423 "</head><body>A random page with random content.</body></html>"); | 477 "</head><body>A random page with random content.</body></html>"); |
424 message = render_thread_->sink().GetUniqueMessageMatching( | 478 base::RunLoop().RunUntilIdle(); |
425 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 479 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
426 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 480 EXPECT_EQ("zh-TW", fake_translate_driver_.details_->adopted_language); |
427 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | |
428 EXPECT_EQ("zh-TW", std::get<0>(params).adopted_language); | |
429 render_thread_->sink().ClearMessages(); | |
430 } | 481 } |
431 | 482 |
432 // Tests that a back navigation gets a translate language message. | 483 // Tests that a back navigation gets a translate language message. |
433 TEST_F(ChromeRenderViewTest, BackToTranslatablePage) { | 484 TEST_F(TranslateHelperBrowserTest, BackToTranslatablePage) { |
434 LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"zh\">" | 485 LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"zh\">" |
435 "</head><body>This page is in Chinese.</body></html>"); | 486 "</head><body>This page is in Chinese.</body></html>"); |
436 const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( | 487 base::RunLoop().RunUntilIdle(); |
437 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 488 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
438 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 489 EXPECT_EQ("zh", fake_translate_driver_.details_->adopted_language); |
439 ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; | 490 fake_translate_driver_.ResetNewPageValues(); |
440 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | |
441 EXPECT_EQ("zh", std::get<0>(params).adopted_language); | |
442 render_thread_->sink().ClearMessages(); | |
443 | 491 |
444 content::PageState back_state = GetCurrentPageState(); | 492 content::PageState back_state = GetCurrentPageState(); |
445 | 493 |
446 LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"fr\">" | 494 LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"fr\">" |
447 "</head><body>This page is in French.</body></html>"); | 495 "</head><body>This page is in French.</body></html>"); |
448 message = render_thread_->sink().GetUniqueMessageMatching( | 496 base::RunLoop().RunUntilIdle(); |
449 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 497 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
450 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 498 EXPECT_EQ("fr", fake_translate_driver_.details_->adopted_language); |
451 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | 499 fake_translate_driver_.ResetNewPageValues(); |
452 EXPECT_EQ("fr", std::get<0>(params).adopted_language); | |
453 render_thread_->sink().ClearMessages(); | |
454 | 500 |
455 GoBack(GURL("data:text/html;charset=utf-8,<html><head>" | 501 GoBack(GURL("data:text/html;charset=utf-8,<html><head>" |
456 "<meta http-equiv=\"content-language\" content=\"zh\">" | 502 "<meta http-equiv=\"content-language\" content=\"zh\">" |
457 "</head><body>This page is in Chinese.</body></html>"), | 503 "</head><body>This page is in Chinese.</body></html>"), |
458 back_state); | 504 back_state); |
459 | 505 |
460 message = render_thread_->sink().GetUniqueMessageMatching( | 506 base::RunLoop().RunUntilIdle(); |
461 ChromeFrameHostMsg_TranslateLanguageDetermined::ID); | 507 ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
462 ASSERT_NE(static_cast<IPC::Message*>(NULL), message); | 508 EXPECT_EQ("zh", fake_translate_driver_.details_->adopted_language); |
463 ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); | |
464 EXPECT_EQ("zh", std::get<0>(params).adopted_language); | |
465 render_thread_->sink().ClearMessages(); | |
466 } | 509 } |
OLD | NEW |