Index: chrome/renderer/translate/translate_helper_browsertest.cc |
diff --git a/chrome/renderer/translate/translate_helper_browsertest.cc b/chrome/renderer/translate/translate_helper_browsertest.cc |
index 501b3d99dbf45bea49108080a56cf74028a95074..dca087f426265cfdfe3a6b5c7c205f9f6b4f8620 100644 |
--- a/chrome/renderer/translate/translate_helper_browsertest.cc |
+++ b/chrome/renderer/translate/translate_helper_browsertest.cc |
@@ -9,12 +9,14 @@ |
#include "base/time/time.h" |
#include "chrome/common/chrome_isolated_world_ids.h" |
#include "chrome/test/base/chrome_render_view_test.h" |
-#include "components/translate/content/common/translate_messages.h" |
+#include "components/translate/content/common/translate.mojom.h" |
#include "components/translate/content/renderer/translate_helper.h" |
#include "components/translate/core/common/translate_constants.h" |
#include "content/public/renderer/render_frame.h" |
#include "content/public/renderer/render_view.h" |
#include "extensions/common/constants.h" |
+#include "mojo/public/cpp/bindings/binding_set.h" |
+#include "services/shell/public/cpp/interface_provider.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/WebKit/public/web/WebLocalFrame.h" |
@@ -23,6 +25,46 @@ using testing::AtLeast; |
using testing::Return; |
using testing::_; |
+namespace { |
+ |
+class FakeContentTranslateDriver |
+ : public translate::mojom::ContentTranslateDriver { |
+ public: |
+ FakeContentTranslateDriver() |
+ : called_new_page_(false), page_needs_translation_(false) {} |
+ ~FakeContentTranslateDriver() override {} |
+ |
+ void BindHandle(mojo::ScopedMessagePipeHandle handle) { |
+ bindings_.AddBinding( |
+ this, mojo::MakeRequest<translate::mojom::ContentTranslateDriver>( |
+ std::move(handle))); |
+ } |
+ |
+ // translate::mojom::ContentTranslateDriver implementation. |
+ void RegisterPage(translate::mojom::PagePtr page, |
+ const translate::LanguageDetectionDetails& details, |
+ bool page_needs_translation) override { |
+ called_new_page_ = true; |
+ details_ = details; |
+ page_needs_translation_ = page_needs_translation; |
+ } |
+ |
+ void ResetNewPageValues() { |
+ called_new_page_ = false; |
+ details_ = base::nullopt; |
+ page_needs_translation_ = false; |
+ } |
+ |
+ bool called_new_page_; |
+ base::Optional<translate::LanguageDetectionDetails> details_; |
+ bool page_needs_translation_; |
+ |
+ private: |
+ mojo::BindingSet<translate::mojom::ContentTranslateDriver> bindings_; |
+}; |
+ |
+} // namespace |
+ |
class TestTranslateHelper : public translate::TranslateHelper { |
public: |
explicit TestTranslateHelper(content::RenderFrame* render_frame) |
@@ -40,7 +82,31 @@ class TestTranslateHelper : public translate::TranslateHelper { |
void TranslatePage(const std::string& source_lang, |
const std::string& target_lang, |
const std::string& translate_script) { |
- OnTranslatePage(0, translate_script, source_lang, target_lang); |
+ // Reset result values firstly. |
+ page_translated_ = false; |
+ trans_result_cancelled_ = false; |
+ trans_result_original_lang_ = base::nullopt; |
+ trans_result_translated_lang_ = base::nullopt; |
+ trans_result_error_type_ = translate::TranslateErrors::NONE; |
+ |
+ // Will get new result values via OnPageTranslated. |
+ Translate(translate_script, source_lang, target_lang, |
+ base::Bind(&TestTranslateHelper::OnPageTranslated, |
+ base::Unretained(this))); |
+ } |
+ |
+ bool GetPageTranslatedResult(std::string* original_lang, |
+ std::string* target_lang, |
+ translate::TranslateErrors::Type* error) { |
+ if (!page_translated_) |
+ return false; |
+ if (original_lang) |
+ *original_lang = *trans_result_original_lang_; |
+ if (target_lang) |
+ *target_lang = *trans_result_translated_lang_; |
+ if (error) |
+ *error = trans_result_error_type_; |
+ return true; |
} |
MOCK_METHOD0(IsTranslateLibAvailable, bool()); |
@@ -56,6 +122,23 @@ class TestTranslateHelper : public translate::TranslateHelper { |
MOCK_METHOD1(ExecuteScriptAndGetDoubleResult, double(const std::string&)); |
private: |
+ void OnPageTranslated(bool cancelled, |
+ const std::string& original_lang, |
+ const std::string& translated_lang, |
+ translate::TranslateErrors::Type error_type) { |
+ page_translated_ = true; |
+ trans_result_cancelled_ = cancelled; |
+ trans_result_original_lang_ = original_lang; |
+ trans_result_translated_lang_ = translated_lang; |
+ trans_result_error_type_ = error_type; |
+ } |
+ |
+ bool page_translated_; |
+ bool trans_result_cancelled_; |
+ base::Optional<std::string> trans_result_original_lang_; |
+ base::Optional<std::string> trans_result_translated_lang_; |
+ translate::TranslateErrors::Type trans_result_error_type_; |
+ |
DISALLOW_COPY_AND_ASSIGN(TestTranslateHelper); |
}; |
@@ -67,6 +150,14 @@ class TranslateHelperBrowserTest : public ChromeRenderViewTest { |
void SetUp() override { |
ChromeRenderViewTest::SetUp(); |
translate_helper_ = new TestTranslateHelper(view_->GetMainRenderFrame()); |
+ |
+ shell::InterfaceProvider* remote_interfaces = |
+ view_->GetMainRenderFrame()->GetRemoteInterfaces(); |
+ shell::InterfaceProvider::TestApi test_api(remote_interfaces); |
+ test_api.SetBinderForName( |
+ translate::mojom::ContentTranslateDriver::Name_, |
+ base::Bind(&FakeContentTranslateDriver::BindHandle, |
+ base::Unretained(&fake_translate_driver_))); |
} |
void TearDown() override { |
@@ -74,27 +165,8 @@ class TranslateHelperBrowserTest : public ChromeRenderViewTest { |
ChromeRenderViewTest::TearDown(); |
} |
- bool GetPageTranslatedMessage(std::string* original_lang, |
- std::string* target_lang, |
- translate::TranslateErrors::Type* error) { |
- const IPC::Message* message = |
- render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_PageTranslated::ID); |
- if (!message) |
- return false; |
- std::tuple<std::string, std::string, translate::TranslateErrors::Type> |
- translate_param; |
- ChromeFrameHostMsg_PageTranslated::Read(message, &translate_param); |
- if (original_lang) |
- *original_lang = std::get<0>(translate_param); |
- if (target_lang) |
- *target_lang = std::get<1>(translate_param); |
- if (error) |
- *error = std::get<2>(translate_param); |
- return true; |
- } |
- |
TestTranslateHelper* translate_helper_; |
+ FakeContentTranslateDriver fake_translate_driver_; |
private: |
DISALLOW_COPY_AND_ASSIGN(TranslateHelperBrowserTest); |
@@ -118,7 +190,7 @@ TEST_F(TranslateHelperBrowserTest, TranslateLibNeverReady) { |
base::RunLoop().RunUntilIdle(); |
translate::TranslateErrors::Type error; |
- ASSERT_TRUE(GetPageTranslatedMessage(NULL, NULL, &error)); |
+ ASSERT_TRUE(translate_helper_->GetPageTranslatedResult(NULL, NULL, &error)); |
EXPECT_EQ(translate::TranslateErrors::INITIALIZATION_ERROR, error); |
} |
@@ -157,9 +229,8 @@ TEST_F(TranslateHelperBrowserTest, TranslateSuccess) { |
std::string received_original_lang; |
std::string received_target_lang; |
translate::TranslateErrors::Type error; |
- ASSERT_TRUE(GetPageTranslatedMessage(&received_original_lang, |
- &received_target_lang, |
- &error)); |
+ ASSERT_TRUE(translate_helper_->GetPageTranslatedResult( |
+ &received_original_lang, &received_target_lang, &error)); |
EXPECT_EQ(original_lang, received_original_lang); |
EXPECT_EQ(target_lang, received_target_lang); |
EXPECT_EQ(translate::TranslateErrors::NONE, error); |
@@ -198,7 +269,7 @@ TEST_F(TranslateHelperBrowserTest, TranslateFailure) { |
base::RunLoop().RunUntilIdle(); |
translate::TranslateErrors::Type error; |
- ASSERT_TRUE(GetPageTranslatedMessage(NULL, NULL, &error)); |
+ ASSERT_TRUE(translate_helper_->GetPageTranslatedResult(NULL, NULL, &error)); |
EXPECT_EQ(translate::TranslateErrors::TRANSLATION_ERROR, error); |
} |
@@ -236,7 +307,8 @@ TEST_F(TranslateHelperBrowserTest, UndefinedSourceLang) { |
translate::TranslateErrors::Type error; |
std::string original_lang; |
std::string target_lang; |
- ASSERT_TRUE(GetPageTranslatedMessage(&original_lang, &target_lang, &error)); |
+ ASSERT_TRUE(translate_helper_->GetPageTranslatedResult(&original_lang, |
+ &target_lang, &error)); |
EXPECT_EQ("de", original_lang); |
EXPECT_EQ("fr", target_lang); |
EXPECT_EQ(translate::TranslateErrors::NONE, error); |
@@ -275,9 +347,8 @@ TEST_F(TranslateHelperBrowserTest, MultipleSimilarTranslations) { |
std::string received_original_lang; |
std::string received_target_lang; |
translate::TranslateErrors::Type error; |
- ASSERT_TRUE(GetPageTranslatedMessage(&received_original_lang, |
- &received_target_lang, |
- &error)); |
+ ASSERT_TRUE(translate_helper_->GetPageTranslatedResult( |
+ &received_original_lang, &received_target_lang, &error)); |
EXPECT_EQ(original_lang, received_original_lang); |
EXPECT_EQ(target_lang, received_target_lang); |
EXPECT_EQ(translate::TranslateErrors::NONE, error); |
@@ -313,9 +384,8 @@ TEST_F(TranslateHelperBrowserTest, MultipleDifferentTranslations) { |
std::string received_original_lang; |
std::string received_target_lang; |
translate::TranslateErrors::Type error; |
- ASSERT_TRUE(GetPageTranslatedMessage(&received_original_lang, |
- &received_target_lang, |
- &error)); |
+ ASSERT_TRUE(translate_helper_->GetPageTranslatedResult( |
+ &received_original_lang, &received_target_lang, &error)); |
EXPECT_EQ(original_lang, received_original_lang); |
EXPECT_EQ(new_target_lang, received_target_lang); |
EXPECT_EQ(translate::TranslateErrors::NONE, error); |
@@ -323,144 +393,117 @@ TEST_F(TranslateHelperBrowserTest, MultipleDifferentTranslations) { |
// Tests that we send the right translate language message for a page and that |
// we respect the "no translate" meta-tag. |
-TEST_F(ChromeRenderViewTest, TranslatablePage) { |
+TEST_F(TranslateHelperBrowserTest, TranslatablePage) { |
LoadHTML("<html><body>A random page with random content.</body></html>"); |
- const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_TRUE(std::get<1>(params)) << "Page should be translatable."; |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_TRUE(fake_translate_driver_.page_needs_translation_) |
+ << "Page should be translatable."; |
+ fake_translate_driver_.ResetNewPageValues(); |
// Now the page specifies the META tag to prevent translation. |
LoadHTML("<html><head><meta name=\"google\" value=\"notranslate\"></head>" |
"<body>A random page with random content.</body></html>"); |
- message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_FALSE(std::get<1>(params)) << "Page should not be translatable."; |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_FALSE(fake_translate_driver_.page_needs_translation_) |
+ << "Page should not be translatable."; |
+ fake_translate_driver_.ResetNewPageValues(); |
// Try the alternate version of the META tag (content instead of value). |
LoadHTML("<html><head><meta name=\"google\" content=\"notranslate\"></head>" |
"<body>A random page with random content.</body></html>"); |
- message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_FALSE(std::get<1>(params)) << "Page should not be translatable."; |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_FALSE(fake_translate_driver_.page_needs_translation_) |
+ << "Page should not be translatable."; |
} |
// Tests that the language meta tag takes precedence over the CLD when reporting |
// the page's language. |
-TEST_F(ChromeRenderViewTest, LanguageMetaTag) { |
+TEST_F(TranslateHelperBrowserTest, LanguageMetaTag) { |
LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"es\">" |
"</head><body>A random page with random content.</body></html>"); |
- const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("es", std::get<0>(params).adopted_language); |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("es", fake_translate_driver_.details_->adopted_language); |
+ fake_translate_driver_.ResetNewPageValues(); |
// Makes sure we support multiple languages specified. |
LoadHTML("<html><head><meta http-equiv=\"content-language\" " |
"content=\" fr , es,en \">" |
"</head><body>A random page with random content.</body></html>"); |
- message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("fr", std::get<0>(params).adopted_language); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("fr", fake_translate_driver_.details_->adopted_language); |
} |
// Tests that the language meta tag works even with non-all-lower-case. |
// http://code.google.com/p/chromium/issues/detail?id=145689 |
-TEST_F(ChromeRenderViewTest, LanguageMetaTagCase) { |
+TEST_F(TranslateHelperBrowserTest, LanguageMetaTagCase) { |
LoadHTML("<html><head><meta http-equiv=\"Content-Language\" content=\"es\">" |
"</head><body>A random page with random content.</body></html>"); |
- const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("es", std::get<0>(params).adopted_language); |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("es", fake_translate_driver_.details_->adopted_language); |
+ fake_translate_driver_.ResetNewPageValues(); |
// Makes sure we support multiple languages specified. |
LoadHTML("<html><head><meta http-equiv=\"Content-Language\" " |
"content=\" fr , es,en \">" |
"</head><body>A random page with random content.</body></html>"); |
- message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("fr", std::get<0>(params).adopted_language); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("fr", fake_translate_driver_.details_->adopted_language); |
} |
// Tests that the language meta tag is converted to Chrome standard of dashes |
// instead of underscores and proper capitalization. |
// http://code.google.com/p/chromium/issues/detail?id=159487 |
-TEST_F(ChromeRenderViewTest, LanguageCommonMistakesAreCorrected) { |
+TEST_F(TranslateHelperBrowserTest, LanguageCommonMistakesAreCorrected) { |
LoadHTML("<html><head><meta http-equiv='Content-Language' content='EN_us'>" |
"</head><body>A random page with random content.</body></html>"); |
- const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("en", std::get<0>(params).adopted_language); |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("en", fake_translate_driver_.details_->adopted_language); |
+ fake_translate_driver_.ResetNewPageValues(); |
LoadHTML("<html><head><meta http-equiv='Content-Language' content='ZH_tw'>" |
"</head><body>A random page with random content.</body></html>"); |
- message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("zh-TW", std::get<0>(params).adopted_language); |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("zh-TW", fake_translate_driver_.details_->adopted_language); |
} |
// Tests that a back navigation gets a translate language message. |
-TEST_F(ChromeRenderViewTest, BackToTranslatablePage) { |
+TEST_F(TranslateHelperBrowserTest, BackToTranslatablePage) { |
LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"zh\">" |
"</head><body>This page is in Chinese.</body></html>"); |
- const IPC::Message* message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Param params; |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("zh", std::get<0>(params).adopted_language); |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("zh", fake_translate_driver_.details_->adopted_language); |
+ fake_translate_driver_.ResetNewPageValues(); |
content::PageState back_state = GetCurrentPageState(); |
LoadHTML("<html><head><meta http-equiv=\"content-language\" content=\"fr\">" |
"</head><body>This page is in French.</body></html>"); |
- message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("fr", std::get<0>(params).adopted_language); |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("fr", fake_translate_driver_.details_->adopted_language); |
+ fake_translate_driver_.ResetNewPageValues(); |
GoBack(GURL("data:text/html;charset=utf-8,<html><head>" |
"<meta http-equiv=\"content-language\" content=\"zh\">" |
"</head><body>This page is in Chinese.</body></html>"), |
back_state); |
- message = render_thread_->sink().GetUniqueMessageMatching( |
- ChromeFrameHostMsg_TranslateLanguageDetermined::ID); |
- ASSERT_NE(static_cast<IPC::Message*>(NULL), message); |
- ChromeFrameHostMsg_TranslateLanguageDetermined::Read(message, ¶ms); |
- EXPECT_EQ("zh", std::get<0>(params).adopted_language); |
- render_thread_->sink().ClearMessages(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(fake_translate_driver_.called_new_page_); |
+ EXPECT_EQ("zh", fake_translate_driver_.details_->adopted_language); |
} |