| 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 |