Chromium Code Reviews| Index: chrome/browser/translate/translate_manager_render_view_host_unittest.cc |
| diff --git a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc |
| index db00e351f5aa4a82c3ba5bec64ed9ccd1895239c..7ef9b75821f8f3f7d10e3947cd616f26852262a2 100644 |
| --- a/chrome/browser/translate/translate_manager_render_view_host_unittest.cc |
| +++ b/chrome/browser/translate/translate_manager_render_view_host_unittest.cc |
| @@ -36,7 +36,7 @@ |
| #include "components/prefs/pref_change_registrar.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/translate/content/browser/content_translate_driver.h" |
| -#include "components/translate/content/common/translate_messages.h" |
| +#include "components/translate/content/public/interfaces/translate.mojom.h" |
| #include "components/translate/core/browser/translate_accept_languages.h" |
| #include "components/translate/core/browser/translate_download_manager.h" |
| #include "components/translate/core/browser/translate_language_list.h" |
| @@ -52,8 +52,8 @@ |
| #include "content/public/browser/notification_registrar.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/url_constants.h" |
| -#include "content/public/test/mock_render_process_host.h" |
| #include "content/public/test/test_renderer_host.h" |
| +#include "mojo/public/cpp/bindings/binding.h" |
| #include "net/base/net_errors.h" |
| #include "net/url_request/test_url_fetcher_factory.h" |
| #include "net/url_request/url_fetcher_delegate.h" |
| @@ -115,6 +115,62 @@ class MockTranslateBubbleFactory : public TranslateBubbleFactory { |
| DISALLOW_COPY_AND_ASSIGN(MockTranslateBubbleFactory); |
| }; |
| +class FakePageImpl : public translate::mojom::Page { |
| + public: |
| + FakePageImpl() |
| + : called_translate_(false), |
| + called_revert_translation_(false), |
| + binding_(this) {} |
| + ~FakePageImpl() override {} |
| + |
| + translate::mojom::PagePtr BindToNewPagePtr() { |
| + binding_.Close(); |
| + translate_callback_pending_.Reset(); |
| + return binding_.CreateInterfacePtrAndBind(); |
| + } |
| + |
| + // translate::mojom::Page implementation. |
| + void Translate(const std::string& translate_script, |
| + const std::string& source_lang, |
| + const std::string& target_lang, |
| + const TranslateCallback& callback) override { |
| + // Ensure pending callback get called. |
|
Tom Sepez
2016/08/01 17:08:17
nit: gets
leonhsl(Using Gerrit)
2016/08/02 02:52:23
Done. And also addressed other similar places.
|
| + if (translate_callback_pending_) { |
| + translate_callback_pending_.Run(true, "", "", |
| + translate::TranslateErrors::NONE); |
| + translate_callback_pending_.Reset(); |
| + } |
| + |
| + called_translate_ = true; |
| + source_lang_ = source_lang; |
| + target_lang_ = target_lang; |
| + |
| + translate_callback_pending_ = callback; |
| + } |
| + |
| + void RevertTranslation() override { called_revert_translation_ = true; } |
| + |
| + void PageTranslated(bool cancelled, |
| + const std::string& source_lang, |
| + const std::string& target_lang, |
| + translate::TranslateErrors::Type error) { |
| + translate_callback_pending_.Run(cancelled, source_lang, target_lang, error); |
| + translate_callback_pending_.Reset(); |
| + } |
| + |
| + bool called_translate_; |
| + base::Optional<std::string> source_lang_; |
| + base::Optional<std::string> target_lang_; |
| + bool called_revert_translation_; |
| + |
| + private: |
| + TranslateCallback translate_callback_pending_; |
| + |
| + mojo::Binding<translate::mojom::Page> binding_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(FakePageImpl); |
| +}; |
| + |
| } // namespace |
| // An observer that keeps track of whether a navigation entry was committed. |
| @@ -238,42 +294,57 @@ class TranslateManagerRenderViewHostTest |
| bool page_translatable) { |
| translate::LanguageDetectionDetails details; |
| details.adopted_language = lang; |
| - main_rfh()->OnMessageReceived( |
| - ChromeFrameHostMsg_TranslateLanguageDetermined(0, details, |
| - page_translatable)); |
| + ChromeTranslateClient::FromWebContents(web_contents()) |
| + ->translate_driver() |
| + .RegisterPage(fake_page_.BindToNewPagePtr(), details, |
| + page_translatable); |
| } |
| - void SimulateOnPageTranslated(int routing_id, |
| - const std::string& source_lang, |
| + void SimulateOnPageTranslated(const std::string& source_lang, |
| const std::string& target_lang, |
| translate::TranslateErrors::Type error) { |
| - main_rfh()->OnMessageReceived(ChromeFrameHostMsg_PageTranslated( |
| - routing_id, source_lang, target_lang, error)); |
| + // Ensure fake_page_ Translate() call get dispatched. |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + fake_page_.PageTranslated(false, source_lang, target_lang, error); |
| + |
| + // Ensure fake_page_ Translate() response callback get dispatched. |
| + base::RunLoop().RunUntilIdle(); |
| } |
| void SimulateOnPageTranslated(const std::string& source_lang, |
| const std::string& target_lang) { |
| - SimulateOnPageTranslated( |
| - 0, source_lang, target_lang, translate::TranslateErrors::NONE); |
| + SimulateOnPageTranslated(source_lang, target_lang, |
| + translate::TranslateErrors::NONE); |
| } |
| bool GetTranslateMessage(std::string* original_lang, |
| std::string* target_lang) { |
| - const IPC::Message* message = process()->sink().GetFirstMessageMatching( |
| - ChromeFrameMsg_TranslatePage::ID); |
| - if (!message) |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + if (!fake_page_.called_translate_) |
| return false; |
| - std::tuple<int, std::string, std::string, std::string> translate_param; |
| - ChromeFrameMsg_TranslatePage::Read(message, &translate_param); |
| - // Ignore get<0>(translate_param) which is the page seq no. |
| - // Ignore get<1>(translate_param) which is the script injected in the page. |
| + EXPECT_TRUE(fake_page_.source_lang_); |
| + EXPECT_TRUE(fake_page_.target_lang_); |
| + |
| if (original_lang) |
| - *original_lang = std::get<2>(translate_param); |
| + *original_lang = *fake_page_.source_lang_; |
| if (target_lang) |
| - *target_lang = std::get<3>(translate_param); |
| + *target_lang = *fake_page_.target_lang_; |
| + |
| + // Reset |
| + fake_page_.called_translate_ = false; |
| + fake_page_.source_lang_ = base::nullopt; |
| + fake_page_.target_lang_ = base::nullopt; |
| + |
| return true; |
| } |
| + bool IsTranslationReverted() { |
| + base::RunLoop().RunUntilIdle(); |
| + return fake_page_.called_revert_translation_; |
| + } |
| + |
| InfoBarService* infobar_service() { |
| return InfoBarService::FromWebContents(web_contents()); |
| } |
| @@ -404,8 +475,6 @@ class TranslateManagerRenderViewHostTest |
| } |
| virtual void TearDown() { |
| - process()->sink().ClearMessages(); |
| - |
| notification_registrar_.Remove( |
| this, |
| chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, |
| @@ -492,6 +561,8 @@ class TranslateManagerRenderViewHostTest |
| std::set<infobars::InfoBarDelegate*> removed_infobars_; |
| std::unique_ptr<MockTranslateBubbleFactory> bubble_factory_; |
| + FakePageImpl fake_page_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(TranslateManagerRenderViewHostTest); |
| }; |
| @@ -621,7 +692,6 @@ TEST_F(TranslateManagerRenderViewHostTest, NormalTranslate) { |
| infobar->translate_step()); |
| // Simulate clicking translate. |
| - process()->sink().ClearMessages(); |
| infobar->Translate(); |
| // The "Translating..." infobar should be showing. |
| @@ -649,7 +719,6 @@ TEST_F(TranslateManagerRenderViewHostTest, NormalTranslate) { |
| infobar->translate_step()); |
| // Simulate changing the original language and translating. |
| - process()->sink().ClearMessages(); |
| std::string new_original_lang = infobar->language_code_at(0); |
| infobar->UpdateOriginalLanguage(new_original_lang); |
| infobar->Translate(); |
| @@ -662,7 +731,6 @@ TEST_F(TranslateManagerRenderViewHostTest, NormalTranslate) { |
| ASSERT_TRUE(infobar != NULL); |
| // Simulate changing the target language and translating. |
| - process()->sink().ClearMessages(); |
| std::string new_target_lang = infobar->language_code_at(1); |
| infobar->UpdateTargetLanguage(new_target_lang); |
| infobar->Translate(); |
| @@ -704,7 +772,6 @@ TEST_F(TranslateManagerRenderViewHostTest, TranslateScriptNotAvailable) { |
| infobar->translate_step()); |
| // Simulate clicking translate. |
| - process()->sink().ClearMessages(); |
| infobar->Translate(); |
| SimulateTranslateScriptURLFetch(false); |
| @@ -766,8 +833,8 @@ TEST_F(TranslateManagerRenderViewHostTest, TranslateUnknownLanguage) { |
| menu.reset(CreateContextMenu()); |
| menu->Init(); |
| menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0); |
| - SimulateOnPageTranslated( |
| - 1, "en", "en", translate::TranslateErrors::IDENTICAL_LANGUAGES); |
| + SimulateOnPageTranslated("en", "en", |
| + translate::TranslateErrors::IDENTICAL_LANGUAGES); |
| infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR, |
| @@ -781,8 +848,8 @@ TEST_F(TranslateManagerRenderViewHostTest, TranslateUnknownLanguage) { |
| menu.reset(CreateContextMenu()); |
| menu->Init(); |
| menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0); |
| - SimulateOnPageTranslated( |
| - 2, std::string(), "en", translate::TranslateErrors::UNKNOWN_LANGUAGE); |
| + SimulateOnPageTranslated(std::string(), "en", |
| + translate::TranslateErrors::UNKNOWN_LANGUAGE); |
| infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| EXPECT_EQ(translate::TRANSLATE_STEP_TRANSLATE_ERROR, |
| @@ -843,7 +910,6 @@ TEST_F(TranslateManagerRenderViewHostTest, AutoTranslateOnNavigate) { |
| SimulateOnPageTranslated("fr", "en"); |
| // Now navigate to a new page in the same language. |
| - process()->sink().ClearMessages(); |
| SimulateNavigation(GURL("http://news.google.fr"), "fr", true); |
| // This should have automatically triggered a translation. |
| @@ -853,7 +919,6 @@ TEST_F(TranslateManagerRenderViewHostTest, AutoTranslateOnNavigate) { |
| EXPECT_EQ("en", target_lang); |
| // Now navigate to a page in a different language. |
| - process()->sink().ClearMessages(); |
| SimulateNavigation(GURL("http://news.google.es"), "es", true); |
| // This should not have triggered a translate. |
| @@ -1097,7 +1162,6 @@ TEST_F(TranslateManagerRenderViewHostTest, ServerReportsUnsupportedLanguage) { |
| EnableBubbleTest(); |
| SimulateNavigation(GURL("http://mail.google.fr"), "fr", true); |
| - process()->sink().ClearMessages(); |
| SimulateTranslatePress(); |
| SimulateTranslateScriptURLFetch(true); |
| // Simulate the render notifying the translation has been done, but it |
| @@ -1118,11 +1182,8 @@ TEST_F(TranslateManagerRenderViewHostTest, ServerReportsUnsupportedLanguage) { |
| // Pressing the button on that infobar should revert to the original |
| // language. |
| - process()->sink().ClearMessages(); |
| infobar->MessageInfoBarButtonPressed(); |
| - const IPC::Message* message = process()->sink().GetFirstMessageMatching( |
| - ChromeFrameMsg_RevertTranslation::ID); |
| - EXPECT_TRUE(message != NULL); |
| + EXPECT_TRUE(IsTranslationReverted()); |
| // And it should have removed the infobar. |
| EXPECT_TRUE(GetTranslateInfoBar() == NULL); |
| } |
| @@ -1373,7 +1434,6 @@ TEST_F(TranslateManagerRenderViewHostTest, AlwaysTranslateLanguagePref) { |
| EXPECT_TRUE(GetTranslateMessage(&original_lang, &target_lang)); |
| EXPECT_EQ("fr", original_lang); |
| EXPECT_EQ("en", target_lang); |
| - process()->sink().ClearMessages(); |
| // Try another language, it should not be autotranslated. |
| SimulateNavigation(GURL("http://www.google.es"), "es", true); |
| @@ -1450,7 +1510,6 @@ TEST_F(TranslateManagerRenderViewHostTest, ContextMenu) { |
| EXPECT_TRUE(GetTranslateMessage(&original_lang, &target_lang)); |
| EXPECT_EQ("fr", original_lang); |
| EXPECT_EQ("en", target_lang); |
| - process()->sink().ClearMessages(); |
| // This should also have reverted the blacklisting of this site and language. |
| EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr")); |
| @@ -1473,7 +1532,6 @@ TEST_F(TranslateManagerRenderViewHostTest, ContextMenu) { |
| ASSERT_TRUE(infobar != NULL); |
| infobar->Translate(); |
| EXPECT_TRUE(GetTranslateMessage(&original_lang, &target_lang)); |
| - process()->sink().ClearMessages(); |
| menu.reset(CreateContextMenu()); |
| menu->Init(); |
| EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); |
| @@ -1488,7 +1546,6 @@ TEST_F(TranslateManagerRenderViewHostTest, ContextMenu) { |
| ASSERT_TRUE(infobar != NULL); |
| infobar->Translate(); |
| EXPECT_TRUE(GetTranslateMessage(&original_lang, &target_lang)); |
| - process()->sink().ClearMessages(); |
| menu.reset(CreateContextMenu()); |
| menu->Init(); |
| EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE)); |
| @@ -1548,7 +1605,6 @@ TEST_F(TranslateManagerRenderViewHostTest, BeforeTranslateExtraButtons) { |
| if (i < 7) { |
| EXPECT_FALSE(infobar->ShouldShowAlwaysTranslateShortcut()); |
| infobar->Translate(); |
| - process()->sink().ClearMessages(); |
| } else { |
| EXPECT_TRUE(infobar->ShouldShowAlwaysTranslateShortcut()); |
| } |
| @@ -1564,7 +1620,6 @@ TEST_F(TranslateManagerRenderViewHostTest, BeforeTranslateExtraButtons) { |
| // That should have triggered a page translate. |
| std::string original_lang, target_lang; |
| EXPECT_TRUE(GetTranslateMessage(&original_lang, &target_lang)); |
| - process()->sink().ClearMessages(); |
| // Now test that declining the translation causes a "never translate" button |
| // to be shown (in non incognito mode only). |
| @@ -1591,7 +1646,6 @@ TEST_F(TranslateManagerRenderViewHostTest, BeforeTranslateExtraButtons) { |
| EXPECT_TRUE(translate_prefs->IsBlockedLanguage("de")); |
| // No translation should have occured and the infobar should be gone. |
| EXPECT_FALSE(GetTranslateMessage(&original_lang, &target_lang)); |
| - process()->sink().ClearMessages(); |
| ASSERT_TRUE(GetTranslateInfoBar() == NULL); |
| } |
| @@ -1625,9 +1679,10 @@ TEST_F(TranslateManagerRenderViewHostTest, ScriptExpires) { |
| SimulateNavigation(GURL("http://www.google.fr"), "fr", true); |
| translate::TranslateInfoBarDelegate* infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| - process()->sink().ClearMessages(); |
| infobar->Translate(); |
| SimulateTranslateScriptURLFetch(true); |
| + // The translate request should have been sent. |
| + EXPECT_TRUE(GetTranslateMessage(NULL, NULL)); |
| SimulateOnPageTranslated("fr", "en"); |
| // A task should have been posted to clear the script, run it. |
| @@ -1637,12 +1692,10 @@ TEST_F(TranslateManagerRenderViewHostTest, ScriptExpires) { |
| SimulateNavigation(GURL("http://www.google.es"), "es", true); |
| infobar = GetTranslateInfoBar(); |
| ASSERT_TRUE(infobar != NULL); |
| - process()->sink().ClearMessages(); |
| infobar->Translate(); |
| // If we don't simulate the URL fetch, the TranslateManager should be waiting |
| // for the script and no message should have been sent to the renderer. |
| - EXPECT_TRUE(process()->sink().GetFirstMessageMatching( |
| - ChromeFrameMsg_TranslatePage::ID) == NULL); |
| + EXPECT_FALSE(GetTranslateMessage(NULL, NULL)); |
| // Now simulate the URL fetch. |
| SimulateTranslateScriptURLFetch(true); |
| // Now the message should have been sent. |
| @@ -1679,7 +1732,6 @@ TEST_F(TranslateManagerRenderViewHostTest, BubbleNormalTranslate) { |
| bubble->GetViewState()); |
| // Simulate clicking translate. |
| - process()->sink().ClearMessages(); |
| bubble->Translate(); |
| // Check the bubble shows "Translating...". |
| @@ -1722,7 +1774,6 @@ TEST_F(TranslateManagerRenderViewHostTest, BubbleTranslateScriptNotAvailable) { |
| bubble->GetViewState()); |
| // Simulate clicking translate. |
| - process()->sink().ClearMessages(); |
| bubble->Translate(); |
| SimulateTranslateScriptURLFetch(false); |