Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2052)

Unified Diff: chrome/browser/translate/translate_manager_browsertest.cc

Issue 186063007: Move TranslateManager unit tests out of the browser_tests target. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: translatetests: comment Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/translate/translate_manager_render_view_host_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/translate/translate_manager_browsertest.cc
diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc
index d391272dd92fec8b584923d60e1ac5e42c8840f2..99335778774f53b20d8bd573aa88baaf70689ae8 100644
--- a/chrome/browser/translate/translate_manager_browsertest.cc
+++ b/chrome/browser/translate/translate_manager_browsertest.cc
@@ -2,1584 +2,19 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <algorithm>
-#include <set>
-#include <vector>
+#include "chrome/browser/translate/translate_manager.h"
-#include "base/command_line.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/prefs/pref_change_registrar.h"
-#include "base/prefs/pref_service.h"
-#include "base/strings/stringprintf.h"
-#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/extensions/test_extension_system.h"
-#include "chrome/browser/infobars/infobar.h"
-#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/prefs/session_startup_pref.h"
-#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
-#include "chrome/browser/translate/translate_infobar_delegate.h"
-#include "chrome/browser/translate/translate_manager.h"
-#include "chrome/browser/translate/translate_service.h"
#include "chrome/browser/translate/translate_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/translate/translate_bubble_factory.h"
-#include "chrome/browser/ui/translate/translate_bubble_model.h"
-#include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/common/render_messages.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/ui_test_utils.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"
-#include "components/translate/core/browser/translate_prefs.h"
-#include "components/translate/core/browser/translate_script.h"
#include "components/translate/core/common/language_detection_details.h"
-#include "components/translate/core/common/translate_pref_names.h"
-#include "content/public/browser/navigation_details.h"
-#include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/test/mock_render_process_host.h"
-#include "content/public/test/test_renderer_host.h"
-#include "net/url_request/test_url_fetcher_factory.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/WebKit/public/web/WebContextMenuData.h"
-
-
-// An observer that keeps track of whether a navigation entry was committed.
-class NavEntryCommittedObserver : public content::NotificationObserver {
- public:
- explicit NavEntryCommittedObserver(content::WebContents* web_contents) {
- registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
- content::Source<content::NavigationController>(
- &web_contents->GetController()));
- }
-
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) OVERRIDE {
- DCHECK(type == content::NOTIFICATION_NAV_ENTRY_COMMITTED);
- details_ =
- *(content::Details<content::LoadCommittedDetails>(details).ptr());
- }
-
- const content::LoadCommittedDetails& load_committed_details() const {
- return details_;
- }
-
- private:
- content::LoadCommittedDetails details_;
- content::NotificationRegistrar registrar_;
-
- DISALLOW_COPY_AND_ASSIGN(NavEntryCommittedObserver);
-};
-
-class TranslateManagerBrowserTest : public ChromeRenderViewHostTestHarness,
- public content::NotificationObserver {
- public:
- TranslateManagerBrowserTest()
- : pref_callback_(
- base::Bind(&TranslateManagerBrowserTest::OnPreferenceChanged,
- base::Unretained(this))) {
- }
-
- // Simulates navigating to a page and getting the page contents and language
- // for that navigation.
- void SimulateNavigation(const GURL& url,
- const std::string& lang,
- bool page_translatable) {
- NavigateAndCommit(url);
- SimulateOnTranslateLanguageDetermined(lang, page_translatable);
- }
-
- void SimulateOnTranslateLanguageDetermined(const std::string& lang,
- bool page_translatable) {
- LanguageDetectionDetails details;
- details.adopted_language = lang;
- content::RenderViewHostTester::TestOnMessageReceived(
- rvh(),
- ChromeViewHostMsg_TranslateLanguageDetermined(
- 0, details, page_translatable));
- }
-
- void SimulateOnPageTranslated(int routing_id,
- const std::string& source_lang,
- const std::string& target_lang,
- TranslateErrors::Type error) {
- content::RenderViewHostTester::TestOnMessageReceived(
- rvh(),
- ChromeViewHostMsg_PageTranslated(
- routing_id, 0, source_lang, target_lang, error));
- }
-
- void SimulateOnPageTranslated(const std::string& source_lang,
- const std::string& target_lang) {
- SimulateOnPageTranslated(0, source_lang, target_lang,
- TranslateErrors::NONE);
- }
-
- bool GetTranslateMessage(int* page_id,
- std::string* original_lang,
- std::string* target_lang) {
- const IPC::Message* message =
- process()->sink().GetFirstMessageMatching(
- ChromeViewMsg_TranslatePage::ID);
- if (!message)
- return false;
- Tuple4<int, std::string, std::string, std::string> translate_param;
- ChromeViewMsg_TranslatePage::Read(message, &translate_param);
- if (page_id)
- *page_id = translate_param.a;
- // Ignore translate_param.b which is the script injected in the page.
- if (original_lang)
- *original_lang = translate_param.c;
- if (target_lang)
- *target_lang = translate_param.d;
- return true;
- }
-
- InfoBarService* infobar_service() {
- return InfoBarService::FromWebContents(web_contents());
- }
-
- // Returns the translate infobar if there is 1 infobar and it is a translate
- // infobar.
- TranslateInfoBarDelegate* GetTranslateInfoBar() {
- return (infobar_service()->infobar_count() == 1) ?
- infobar_service()->infobar_at(0)->delegate()->
- AsTranslateInfoBarDelegate() : NULL;
- }
-
- // If there is 1 infobar and it is a translate infobar, closes it and returns
- // true. Returns false otherwise.
- bool CloseTranslateInfoBar() {
- InfoBarDelegate* infobar = GetTranslateInfoBar();
- if (!infobar)
- return false;
- infobar->InfoBarDismissed(); // Simulates closing the infobar.
- infobar_service()->RemoveInfoBar(infobar_service()->infobar_at(0));
- return true;
- }
-
- // Checks whether |infobar| has been removed and clears the removed infobar
- // list.
- bool CheckInfoBarRemovedAndReset(InfoBarDelegate* delegate) {
- bool found = removed_infobars_.count(delegate) != 0;
- removed_infobars_.clear();
- return found;
- }
-
- void ExpireTranslateScriptImmediately() {
- TranslateDownloadManager::GetInstance()->SetTranslateScriptExpirationDelay(
- 0);
- }
-
- // If there is 1 infobar and it is a translate infobar, deny translation and
- // returns true. Returns false otherwise.
- bool DenyTranslation() {
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- if (!infobar)
- return false;
- infobar->TranslationDeclined();
- infobar_service()->RemoveInfoBar(infobar_service()->infobar_at(0));
- return true;
- }
-
- void ReloadAndWait(bool successful_reload) {
- NavEntryCommittedObserver nav_observer(web_contents());
- if (successful_reload)
- Reload();
- else
- FailedReload();
-
- // Ensures it is really handled a reload.
- const content::LoadCommittedDetails& nav_details =
- nav_observer.load_committed_details();
- EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation.
- EXPECT_EQ(content::NAVIGATION_TYPE_EXISTING_PAGE, nav_details.type);
-
- // The TranslateManager class processes the navigation entry committed
- // notification in a posted task; process that task.
- base::MessageLoop::current()->RunUntilIdle();
- }
-
- virtual void Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type);
- removed_infobars_.insert(
- content::Details<InfoBar::RemovedDetails>(details)->first->delegate());
- }
-
- MOCK_METHOD1(OnPreferenceChanged, void(const std::string&));
-
- protected:
- virtual void SetUp() {
- // This test is a unit test but runs in the browser_tests suite. Therefore
- // it needs to manage its own TestingBrowserProcess.
- // TODO(jamescook): Figure out how to move this suite back to unit_tests.
- // Right now it fails to get the translate infobar if you run it there.
- TestingBrowserProcess::CreateInstance();
-
- TranslateService::Initialize();
- TranslateService::SetUseInfobar(true);
-
- // Clears the translate script so it is fetched everytime and sets the
- // expiration delay to a large value by default (in case it was zeroed in a
- // previous test).
- TranslateDownloadManager* download_manager =
- TranslateDownloadManager::GetInstance();
- download_manager->ClearTranslateScriptForTesting();
- download_manager->SetTranslateScriptExpirationDelay(60 * 60 * 1000);
-
- ChromeRenderViewHostTestHarness::SetUp();
- InfoBarService::CreateForWebContents(web_contents());
- TranslateTabHelper::CreateForWebContents(web_contents());
- TranslateManager* manager =
- TranslateTabHelper::GetManagerFromWebContents(web_contents());
- manager->set_translate_max_reload_attemps(0);
-
- notification_registrar_.Add(this,
- chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
- content::Source<InfoBarService>(infobar_service()));
- }
-
- virtual void TearDown() {
- process()->sink().ClearMessages();
-
- notification_registrar_.Remove(this,
- chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
- content::Source<InfoBarService>(infobar_service()));
-
- ChromeRenderViewHostTestHarness::TearDown();
- TestingBrowserProcess::DeleteInstance();
- }
-
- void SetApplicationLocale(const std::string& locale) {
- g_browser_process->SetApplicationLocale(locale);
- TranslateDownloadManager::GetInstance()->set_application_locale(
- g_browser_process->GetApplicationLocale());
- }
-
- void SimulateTranslateScriptURLFetch(bool success) {
- net::TestURLFetcher* fetcher =
- url_fetcher_factory_.GetFetcherByID(TranslateScript::kFetcherId);
- ASSERT_TRUE(fetcher);
- net::URLRequestStatus status;
- status.set_status(success ? net::URLRequestStatus::SUCCESS :
- net::URLRequestStatus::FAILED);
- fetcher->set_url(fetcher->GetOriginalURL());
- fetcher->set_status(status);
- fetcher->set_response_code(success ? 200 : 500);
- fetcher->delegate()->OnURLFetchComplete(fetcher);
- }
-
- void SimulateSupportedLanguagesURLFetch(
- bool success,
- const std::vector<std::string>& languages,
- bool use_alpha_languages,
- const std::vector<std::string>& alpha_languages) {
- net::URLRequestStatus status;
- status.set_status(success ? net::URLRequestStatus::SUCCESS :
- net::URLRequestStatus::FAILED);
-
- std::string data;
- if (success) {
- data = base::StringPrintf(
- "%s{\"sl\": {\"bla\": \"bla\"}, \"%s\": {",
- TranslateLanguageList::kLanguageListCallbackName,
- TranslateLanguageList::kTargetLanguagesKey);
- const char* comma = "";
- for (size_t i = 0; i < languages.size(); ++i) {
- data += base::StringPrintf(
- "%s\"%s\": \"UnusedFullName\"", comma, languages[i].c_str());
- if (i == 0)
- comma = ",";
- }
-
- if (use_alpha_languages) {
- data += base::StringPrintf("},\"%s\": {",
- TranslateLanguageList::kAlphaLanguagesKey);
- comma = "";
- for (size_t i = 0; i < alpha_languages.size(); ++i) {
- data += base::StringPrintf("%s\"%s\": 1", comma,
- alpha_languages[i].c_str());
- if (i == 0)
- comma = ",";
- }
- }
-
- data += "}})";
- }
- net::TestURLFetcher* fetcher =
- url_fetcher_factory_.GetFetcherByID(TranslateLanguageList::kFetcherId);
- ASSERT_TRUE(fetcher != NULL);
- fetcher->set_url(fetcher->GetOriginalURL());
- fetcher->set_status(status);
- fetcher->set_response_code(success ? 200 : 500);
- fetcher->SetResponseString(data);
- fetcher->delegate()->OnURLFetchComplete(fetcher);
- }
-
- void SetPrefObserverExpectation(const char* path) {
- EXPECT_CALL(*this, OnPreferenceChanged(std::string(path)));
- }
-
- PrefChangeRegistrar::NamedChangeCallback pref_callback_;
-
- private:
- content::NotificationRegistrar notification_registrar_;
- net::TestURLFetcherFactory url_fetcher_factory_;
-
- // The infobars that have been removed.
- // WARNING: the pointers point to deleted objects, use only for comparison.
- std::set<InfoBarDelegate*> removed_infobars_;
-
- DISALLOW_COPY_AND_ASSIGN(TranslateManagerBrowserTest);
-};
-
-class MockTranslateBubbleFactory : public TranslateBubbleFactory {
- public:
- MockTranslateBubbleFactory() {
- }
-
- virtual void ShowImplementation(BrowserWindow* window,
- content::WebContents* web_contents,
- TranslateTabHelper::TranslateStep step,
- TranslateErrors::Type error_type) OVERRIDE {
- if (model_) {
- model_->SetViewState(
- TranslateBubbleModelImpl::TranslateStepToViewState(step));
- return;
- }
-
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- std::string source_language =
- translate_tab_helper->GetLanguageState().original_language();
- std::string target_language = TranslateDownloadManager::GetLanguageCode(
- g_browser_process->GetApplicationLocale());
- scoped_ptr<TranslateUIDelegate> ui_delegate(
- new TranslateUIDelegate(web_contents,
- source_language,
- target_language));
- model_.reset(new TranslateBubbleModelImpl(step, ui_delegate.Pass()));
- }
-
- TranslateBubbleModel* model() { return model_.get(); }
-
- private:
- scoped_ptr<TranslateBubbleModel> model_;
-
- DISALLOW_COPY_AND_ASSIGN(MockTranslateBubbleFactory);
-};
-
-namespace {
-
-class TestRenderViewContextMenu : public RenderViewContextMenu {
- public:
- static TestRenderViewContextMenu* CreateContextMenu(
- content::WebContents* web_contents) {
- content::ContextMenuParams params;
- params.media_type = blink::WebContextMenuData::MediaTypeNone;
- params.x = 0;
- params.y = 0;
- params.has_image_contents = true;
- params.media_flags = 0;
- params.spellcheck_enabled = false;
- params.is_editable = false;
- params.page_url = web_contents->GetController().GetActiveEntry()->GetURL();
-#if defined(OS_MACOSX)
- params.writing_direction_default = 0;
- params.writing_direction_left_to_right = 0;
- params.writing_direction_right_to_left = 0;
-#endif // OS_MACOSX
- params.edit_flags = blink::WebContextMenuData::CanTranslate;
- return new TestRenderViewContextMenu(web_contents->GetMainFrame(), params);
- }
-
- bool IsItemPresent(int id) {
- return menu_model_.GetIndexOfCommandId(id) != -1;
- }
-
- virtual void PlatformInit() OVERRIDE { }
- virtual void PlatformCancel() OVERRIDE { }
- virtual bool GetAcceleratorForCommandId(
- int command_id,
- ui::Accelerator* accelerator) OVERRIDE { return false; }
-
- private:
- TestRenderViewContextMenu(content::RenderFrameHost* render_frame_host,
- const content::ContextMenuParams& params)
- : RenderViewContextMenu(render_frame_host, params) {
- }
-
- DISALLOW_COPY_AND_ASSIGN(TestRenderViewContextMenu);
-};
-
-} // namespace
-
-TEST_F(TranslateManagerBrowserTest, NormalTranslate) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // We should have an infobar.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
-
- // Simulate clicking translate.
- process()->sink().ClearMessages();
- infobar->Translate();
-
- // The "Translating..." infobar should be showing.
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
-
- // Simulate the translate script being retrieved (it only needs to be done
- // once in the test as it is cached).
- SimulateTranslateScriptURLFetch(true);
-
- // Test that we sent the right message to the renderer.
- int page_id = 0;
- std::string original_lang, target_lang;
- EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- EXPECT_EQ("fr", original_lang);
- EXPECT_EQ("en", target_lang);
-
- // Simulate the render notifying the translation has been done.
- SimulateOnPageTranslated("fr", "en");
-
- // The after translate infobar should be showing.
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::AFTER_TRANSLATE, infobar->translate_step());
-
- // Simulate changing the original language and translating.
- process()->sink().ClearMessages();
- std::string new_original_lang = infobar->language_code_at(0);
- infobar->UpdateOriginalLanguageIndex(0);
- infobar->Translate();
- EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- EXPECT_EQ(new_original_lang, original_lang);
- EXPECT_EQ("en", target_lang);
- // Simulate the render notifying the translation has been done.
- SimulateOnPageTranslated(new_original_lang, "en");
- infobar = GetTranslateInfoBar();
- 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->UpdateTargetLanguageIndex(1);
- infobar->Translate();
- EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- EXPECT_EQ(new_original_lang, original_lang);
- EXPECT_EQ(new_target_lang, target_lang);
- // Simulate the render notifying the translation has been done.
- SimulateOnPageTranslated(new_original_lang, new_target_lang);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(new_target_lang, infobar->target_language_code());
-
- // Reloading should trigger translation iff Always Translate is on.
- ReloadAndWait(true);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
- infobar->UpdateTargetLanguageIndex(1);
- infobar->ToggleAlwaysTranslate();
- ReloadAndWait(true);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
- EXPECT_EQ(new_target_lang, infobar->target_language_code());
-}
-
-TEST_F(TranslateManagerBrowserTest, TranslateScriptNotAvailable) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // We should have an infobar.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
-
- // Simulate clicking translate.
- process()->sink().ClearMessages();
- infobar->Translate();
- SimulateTranslateScriptURLFetch(false);
-
- // We should not have sent any message to translate to the renderer.
- EXPECT_FALSE(GetTranslateMessage(NULL, NULL, NULL));
-
- // And we should have an error infobar showing.
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
-}
-
-// Ensures we deal correctly with pages for which the browser does not recognize
-// the language (the translate server may or not detect the language).
-TEST_F(TranslateManagerBrowserTest, TranslateUnknownLanguage) {
- // Simulate navigating to a page ("und" is the string returned by the CLD for
- // languages it does not recognize).
- SimulateNavigation(GURL("http://www.google.mys"), "und", true);
-
- // We should not have an infobar as we don't know the language.
- ASSERT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Translate the page anyway throught the context menu.
- scoped_ptr<TestRenderViewContextMenu> menu(
- TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
-
- // To test that bug #49018 if fixed, make sure we deal correctly with errors.
- // Simulate a failure to fetch the translate script.
- SimulateTranslateScriptURLFetch(false);
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
- EXPECT_TRUE(infobar->is_error());
- infobar->MessageInfoBarButtonPressed();
- SimulateTranslateScriptURLFetch(true); // This time succeed.
-
- // Simulate the render notifying the translation has been done, the server
- // having detected the page was in a known and supported language.
- SimulateOnPageTranslated("fr", "en");
-
- // The after translate infobar should be showing.
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::AFTER_TRANSLATE, infobar->translate_step());
- EXPECT_EQ("fr", infobar->original_language_code());
- EXPECT_EQ("en", infobar->target_language_code());
-
- // Let's run the same steps but this time the server detects the page is
- // already in English.
- SimulateNavigation(GURL("http://www.google.com"), "und", true);
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
- SimulateOnPageTranslated(1, "en", "en", TranslateErrors::IDENTICAL_LANGUAGES);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
- EXPECT_EQ(TranslateErrors::IDENTICAL_LANGUAGES, infobar->error_type());
-
- // Let's run the same steps again but this time the server fails to detect the
- // page's language (it returns an empty string).
- SimulateNavigation(GURL("http://www.google.com"), "und", true);
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
- SimulateOnPageTranslated(2, std::string(), "en",
- TranslateErrors::UNKNOWN_LANGUAGE);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
- EXPECT_EQ(TranslateErrors::UNKNOWN_LANGUAGE, infobar->error_type());
-}
-
-// Tests that we show/don't show an info-bar for the languages.
-TEST_F(TranslateManagerBrowserTest, TestLanguages) {
- std::vector<std::string> languages;
- languages.push_back("en");
- languages.push_back("ja");
- languages.push_back("fr");
- languages.push_back("ht");
- languages.push_back("xx");
- languages.push_back("zh");
- languages.push_back("zh-CN");
- languages.push_back("und");
-
- GURL url("http://www.google.com");
- for (size_t i = 0; i < languages.size(); ++i) {
- std::string lang = languages[i];
- SCOPED_TRACE(::testing::Message() << "Iteration " << i <<
- " language=" << lang);
-
- // We should not have a translate infobar.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar == NULL);
-
- SimulateNavigation(url, lang, true);
-
- // Verify we have/don't have an info-bar as expected.
- infobar = GetTranslateInfoBar();
- bool expected =
- TranslateDownloadManager::IsSupportedLanguage(lang) && lang != "en";
- EXPECT_EQ(expected, infobar != NULL);
-
- if (infobar != NULL)
- EXPECT_TRUE(CloseTranslateInfoBar());
- }
-}
-
-// Test the fetching of languages from the translate server
-TEST_F(TranslateManagerBrowserTest, FetchLanguagesFromTranslateServer) {
- std::vector<std::string> server_languages;
- // A list of languages to fake being returned by the translate server.
- server_languages.push_back("aa");
- server_languages.push_back("ak");
- server_languages.push_back("ab");
- server_languages.push_back("en-CA");
- server_languages.push_back("zh");
- server_languages.push_back("yi");
- server_languages.push_back("fr-FR");
- server_languages.push_back("xx");
-
- std::vector<std::string> alpha_languages;
- alpha_languages.push_back("aa");
- alpha_languages.push_back("yi");
-
- // First, get the default languages list. Note that calling
- // GetSupportedLanguages() invokes RequestLanguageList() internally.
- std::vector<std::string> default_supported_languages;
- TranslateDownloadManager::GetSupportedLanguages(&default_supported_languages);
- // To make sure we got the defaults and don't confuse them with the mocks.
- ASSERT_NE(default_supported_languages.size(), server_languages.size());
-
- // Check that we still get the defaults until the URLFetch has completed.
- std::vector<std::string> current_supported_languages;
- TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
- EXPECT_EQ(default_supported_languages, current_supported_languages);
-
- // Also check that it didn't change if we failed the URL fetch.
- SimulateSupportedLanguagesURLFetch(false, std::vector<std::string>(),
- true, std::vector<std::string>());
- current_supported_languages.clear();
- TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
- EXPECT_EQ(default_supported_languages, current_supported_languages);
-
- // Now check that we got the appropriate set of languages from the server.
- SimulateSupportedLanguagesURLFetch(true, server_languages,
- true, alpha_languages);
- current_supported_languages.clear();
- TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
- // "xx" can't be displayed in the Translate inforbar, so this is eliminated.
- EXPECT_EQ(server_languages.size() - 1, current_supported_languages.size());
- // Not sure we need to guarantee the order of languages, so we find them.
- for (size_t i = 0; i < server_languages.size(); ++i) {
- const std::string& lang = server_languages[i];
- if (lang == "xx")
- continue;
- EXPECT_NE(current_supported_languages.end(),
- std::find(current_supported_languages.begin(),
- current_supported_languages.end(),
- lang));
- bool is_alpha = std::find(alpha_languages.begin(),
- alpha_languages.end(),
- lang) != alpha_languages.end();
- EXPECT_EQ(TranslateDownloadManager::IsAlphaLanguage(lang), is_alpha);
- }
-}
-
-// Test the fetching of languages from the translate server without 'al'
-// parameter.
-TEST_F(TranslateManagerBrowserTest,
- FetchLanguagesFromTranslateServerWithoutAlpha) {
- std::vector<std::string> server_languages;
- server_languages.push_back("aa");
- server_languages.push_back("ak");
- server_languages.push_back("ab");
- server_languages.push_back("en-CA");
- server_languages.push_back("zh");
- server_languages.push_back("yi");
- server_languages.push_back("fr-FR");
- server_languages.push_back("xx");
-
- std::vector<std::string> alpha_languages;
- alpha_languages.push_back("aa");
- alpha_languages.push_back("yi");
-
- // call GetSupportedLanguages to call RequestLanguageList internally.
- std::vector<std::string> default_supported_languages;
- TranslateDownloadManager::GetSupportedLanguages(&default_supported_languages);
-
- SimulateSupportedLanguagesURLFetch(true, server_languages,
- false, alpha_languages);
-
- std::vector<std::string> current_supported_languages;
- TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
-
- // "xx" can't be displayed in the Translate inforbar, so this is eliminated.
- EXPECT_EQ(server_languages.size() - 1, current_supported_languages.size());
-
- for (size_t i = 0; i < server_languages.size(); ++i) {
- const std::string& lang = server_languages[i];
- if (lang == "xx")
- continue;
- EXPECT_NE(current_supported_languages.end(),
- std::find(current_supported_languages.begin(),
- current_supported_languages.end(),
- lang));
- EXPECT_FALSE(TranslateDownloadManager::IsAlphaLanguage(lang));
- }
-}
-
-// Tests auto-translate on page.
-TEST_F(TranslateManagerBrowserTest, AutoTranslateOnNavigate) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // Simulate the user translating.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- infobar->Translate();
- // Simulate the translate script being retrieved.
- SimulateTranslateScriptURLFetch(true);
- 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.
- int page_id = 0;
- std::string original_lang, target_lang;
- EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- EXPECT_EQ(1, page_id);
- EXPECT_EQ("fr", original_lang);
- 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.
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
-}
-
-// Tests that multiple OnPageContents do not cause multiple infobars.
-TEST_F(TranslateManagerBrowserTest, MultipleOnPageContents) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // Simulate clicking 'Nope' (don't translate).
- EXPECT_TRUE(DenyTranslation());
- EXPECT_EQ(0U, infobar_service()->infobar_count());
-
- // Send a new PageContents, we should not show an infobar.
- SimulateOnTranslateLanguageDetermined("fr", true);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
-
- // Do the same steps but simulate closing the infobar this time.
- SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true);
- EXPECT_TRUE(CloseTranslateInfoBar());
- EXPECT_EQ(0U, infobar_service()->infobar_count());
- SimulateOnTranslateLanguageDetermined("fr", true);
- EXPECT_EQ(0U, infobar_service()->infobar_count());
-}
-
-// Test that reloading the page brings back the infobar if the
-// reload succeeded and does not bring it back the reload fails.
-TEST_F(TranslateManagerBrowserTest, Reload) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Reload should bring back the infobar if the reload succeeds.
- ReloadAndWait(true);
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // ...But not show it if the reload fails.
- ReloadAndWait(false);
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // If we set reload attempts to a high value, we will not see the infobar
- // immediately.
- TranslateManager* manager =
- TranslateTabHelper::GetManagerFromWebContents(web_contents());
- manager->set_translate_max_reload_attemps(100);
- ReloadAndWait(true);
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-}
-
-// Test that reloading the page by way of typing again the URL in the
-// location bar brings back the infobar.
-TEST_F(TranslateManagerBrowserTest, ReloadFromLocationBar) {
- GURL url("http://www.google.fr");
- SimulateNavigation(url, "fr", true);
-
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Create a pending navigation and simulate a page load. That should be the
- // equivalent of typing the URL again in the location bar.
- NavEntryCommittedObserver nav_observer(web_contents());
- web_contents()->GetController().LoadURL(url, content::Referrer(),
- content::PAGE_TRANSITION_TYPED,
- std::string());
- rvh_tester()->SendNavigate(0, url);
-
- // Test that we are really getting a same page navigation, the test would be
- // useless if it was not the case.
- const content::LoadCommittedDetails& nav_details =
- nav_observer.load_committed_details();
- EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation.
- EXPECT_EQ(content::NAVIGATION_TYPE_SAME_PAGE, nav_details.type);
-
- // The TranslateManager class processes the navigation entry committed
- // notification in a posted task; process that task.
- base::MessageLoop::current()->RunUntilIdle();
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests that a closed translate infobar does not reappear when navigating
-// in-page.
-TEST_F(TranslateManagerBrowserTest, CloseInfoBarInPageNavigation) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Navigate in page, no infobar should be shown.
- SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Navigate out of page, a new infobar should show.
- SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests that a closed translate infobar does not reappear when navigating
-// in a subframe. (http://crbug.com/48215)
-TEST_F(TranslateManagerBrowserTest, CloseInfoBarInSubframeNavigation) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Simulate a sub-frame auto-navigating.
- rvh_tester()->SendNavigateWithTransition(
- 1, GURL("http://pub.com"), content::PAGE_TRANSITION_AUTO_SUBFRAME);
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Simulate the user navigating in a sub-frame.
- rvh_tester()->SendNavigateWithTransition(
- 2, GURL("http://pub.com"), content::PAGE_TRANSITION_MANUAL_SUBFRAME);
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Navigate out of page, a new infobar should show.
- SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests that denying translation is sticky when navigating in page.
-TEST_F(TranslateManagerBrowserTest, DenyTranslateInPageNavigation) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // Simulate clicking 'Nope' (don't translate).
- EXPECT_TRUE(DenyTranslation());
-
- // Navigate in page, no infobar should be shown.
- SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Navigate out of page, a new infobar should show.
- SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests that after translating and closing the infobar, the infobar does not
-// return when navigating in page.
-TEST_F(TranslateManagerBrowserTest, TranslateCloseInfoBarInPageNavigation) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // Simulate the user translating.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- infobar->Translate();
- // Simulate the translate script being retrieved.
- SimulateTranslateScriptURLFetch(true);
- SimulateOnPageTranslated("fr", "en");
-
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Navigate in page, no infobar should be shown.
- SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Navigate out of page, a new infobar should show.
- // Note that we navigate to a page in a different language so we don't trigger
- // the auto-translate feature (it would translate the page automatically and
- // the before translate inforbar would not be shown).
- SimulateNavigation(GURL("http://www.google.de"), "de", true);
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests that the after translate the infobar still shows when navigating
-// in-page.
-TEST_F(TranslateManagerBrowserTest, TranslateInPageNavigation) {
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // Simulate the user translating.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- infobar->Translate();
- SimulateTranslateScriptURLFetch(true);
- SimulateOnPageTranslated("fr", "en");
- // The after translate infobar is showing.
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
-
- // Navigate out of page, a new infobar should show.
- // See note in TranslateCloseInfoBarInPageNavigation test on why it is
- // important to navigate to a page in a different language for this test.
- SimulateNavigation(GURL("http://www.google.de"), "de", true);
- // The old infobar is gone.
- EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar));
- // And there is a new one.
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests that no translate infobar is shown when navigating to a page in an
-// unsupported language.
-TEST_F(TranslateManagerBrowserTest, CLDReportsUnsupportedPageLanguage) {
- // Simulate navigating to a page and getting an unsupported language.
- SimulateNavigation(GURL("http://www.google.com"), "qbz", true);
-
- // No info-bar should be shown.
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-}
-
-// Tests that we deal correctly with unsupported languages returned by the
-// server.
-// The translation server might return a language we don't support.
-TEST_F(TranslateManagerBrowserTest, ServerReportsUnsupportedLanguage) {
- SimulateNavigation(GURL("http://mail.google.fr"), "fr", true);
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- process()->sink().ClearMessages();
- infobar->Translate();
- SimulateTranslateScriptURLFetch(true);
- // Simulate the render notifying the translation has been done, but it
- // reports a language we don't support.
- SimulateOnPageTranslated("qbz", "en");
-
- // An error infobar should be showing to report that we don't support this
- // language.
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
-
- // This infobar should have a button (so the string should not be empty).
- ASSERT_FALSE(infobar->GetMessageInfoBarButtonText().empty());
-
- // Pressing the button on that infobar should revert to the original language.
- process()->sink().ClearMessages();
- infobar->MessageInfoBarButtonPressed();
- const IPC::Message* message =
- process()->sink().GetFirstMessageMatching(
- ChromeViewMsg_RevertTranslation::ID);
- EXPECT_TRUE(message != NULL);
- // And it should have removed the infobar.
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-}
-
-// Tests that no translate infobar is shown and context menu is disabled, when
-// Chrome is in a language that the translate server does not support.
-TEST_F(TranslateManagerBrowserTest, UnsupportedUILanguage) {
- std::string original_lang = g_browser_process->GetApplicationLocale();
- SetApplicationLocale("qbz");
-
- // Make sure that the accept language list only contains unsupported languages
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- PrefService* prefs = profile->GetPrefs();
- prefs->SetString(prefs::kAcceptLanguages, "qbz");
-
- // Simulate navigating to a page in a language supported by the translate
- // server.
- SimulateNavigation(GURL("http://www.google.com"), "en", true);
-
- // No info-bar should be shown.
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // And the context menu option should be disabled too.
- scoped_ptr<TestRenderViewContextMenu> menu(
- TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
- EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
-
- SetApplicationLocale(original_lang);
-}
-
-// Tests that the first supported accept language is selected
-TEST_F(TranslateManagerBrowserTest, TranslateAcceptLanguage) {
- // Set locate to non-existant language
- std::string original_lang = g_browser_process->GetApplicationLocale();
- SetApplicationLocale("qbz");
-
- // Set Qbz and French as the only accepted languages
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- PrefService* prefs = profile->GetPrefs();
- prefs->SetString(prefs::kAcceptLanguages, "qbz,fr");
-
- // Go to a German page
- SimulateNavigation(GURL("http://google.de"), "de", true);
-
- // Expect the infobar to pop up
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-
- // Set Qbz and English-US as the only accepted languages to test the country
- // code removal code which was causing a crash as filed in Issue 90106,
- // a crash caused by a language with a country code that wasn't recognized.
- prefs->SetString(prefs::kAcceptLanguages, "qbz,en-us");
-
- // Go to a German page
- SimulateNavigation(GURL("http://google.de"), "de", true);
-
- // Expect the infobar to pop up
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests that the translate enabled preference is honored.
-TEST_F(TranslateManagerBrowserTest, TranslateEnabledPref) {
- // Make sure the pref allows translate.
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- PrefService* prefs = profile->GetPrefs();
- prefs->SetBoolean(prefs::kEnableTranslate, true);
-
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // An infobar should be shown.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- EXPECT_TRUE(infobar != NULL);
-
- // Disable translate.
- prefs->SetBoolean(prefs::kEnableTranslate, false);
-
- // Navigate to a new page, that should close the previous infobar.
- GURL url("http://www.youtube.fr");
- NavigateAndCommit(url);
- infobar = GetTranslateInfoBar();
- EXPECT_TRUE(infobar == NULL);
-
- // Simulate getting the page contents and language, that should not trigger
- // a translate infobar.
- SimulateOnTranslateLanguageDetermined("fr", true);
- infobar = GetTranslateInfoBar();
- EXPECT_TRUE(infobar == NULL);
-}
-
-// Tests the "Never translate <language>" pref.
-TEST_F(TranslateManagerBrowserTest, NeverTranslateLanguagePref) {
- GURL url("http://www.google.fr");
- SimulateNavigation(url, "fr", true);
-
- // An infobar should be shown.
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-
- // Select never translate this language.
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- PrefService* prefs = profile->GetPrefs();
- PrefChangeRegistrar registrar;
- registrar.Init(prefs);
- registrar.Add(TranslatePrefs::kPrefTranslateBlockedLanguages,
- pref_callback_);
- scoped_ptr<TranslatePrefs> translate_prefs(
- TranslateTabHelper::CreateTranslatePrefs(prefs));
- EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
- TranslateAcceptLanguages* accept_languages =
- TranslateTabHelper::GetTranslateAcceptLanguages(profile);
- EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
- SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateBlockedLanguages);
- translate_prefs->BlockLanguage("fr");
- EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
- EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
- EXPECT_FALSE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
-
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Navigate to a new page also in French.
- SimulateNavigation(GURL("http://wwww.youtube.fr"), "fr", true);
-
- // There should not be a translate infobar.
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Remove the language from the blacklist.
- SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateBlockedLanguages);
- translate_prefs->UnblockLanguage("fr");
- EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
- EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
- EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
-
- // Navigate to a page in French.
- SimulateNavigation(url, "fr", true);
-
- // There should be a translate infobar.
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests the "Never translate this site" pref.
-TEST_F(TranslateManagerBrowserTest, NeverTranslateSitePref) {
- GURL url("http://www.google.fr");
- std::string host(url.host());
- SimulateNavigation(url, "fr", true);
-
- // An infobar should be shown.
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-
- // Select never translate this site.
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- PrefService* prefs = profile->GetPrefs();
- PrefChangeRegistrar registrar;
- registrar.Init(prefs);
- registrar.Add(TranslatePrefs::kPrefTranslateSiteBlacklist, pref_callback_);
- scoped_ptr<TranslatePrefs> translate_prefs(
- TranslateTabHelper::CreateTranslatePrefs(prefs));
- EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(host));
- TranslateAcceptLanguages* accept_languages =
- TranslateTabHelper::GetTranslateAcceptLanguages(profile);
- EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
- SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateSiteBlacklist);
- translate_prefs->BlacklistSite(host);
- EXPECT_TRUE(translate_prefs->IsSiteBlacklisted(host));
- EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
-
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Navigate to a new page also on the same site.
- SimulateNavigation(GURL("http://www.google.fr/hello"), "fr", true);
-
- // There should not be a translate infobar.
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // Remove the site from the blacklist.
- SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateSiteBlacklist);
- translate_prefs->RemoveSiteFromBlacklist(host);
- EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(host));
- EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
-
- // Navigate to a page in French.
- SimulateNavigation(url, "fr", true);
-
- // There should be a translate infobar.
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
-}
-
-// Tests the "Always translate this language" pref.
-TEST_F(TranslateManagerBrowserTest, AlwaysTranslateLanguagePref) {
- // Select always translate French to English.
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- PrefService* prefs = profile->GetPrefs();
- PrefChangeRegistrar registrar;
- registrar.Init(prefs);
- registrar.Add(TranslatePrefs::kPrefTranslateWhitelists, pref_callback_);
- scoped_ptr<TranslatePrefs> translate_prefs(
- TranslateTabHelper::CreateTranslatePrefs(prefs));
- SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists);
- translate_prefs->WhitelistLanguagePair("fr", "en");
-
- // Load a page in French.
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // It should have triggered an automatic translation to English.
-
- // The translating infobar should be showing.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
- SimulateTranslateScriptURLFetch(true);
- int page_id = 0;
- std::string original_lang, target_lang;
- EXPECT_TRUE(GetTranslateMessage(&page_id, &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);
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
- EXPECT_TRUE(CloseTranslateInfoBar());
-
- // Let's switch to incognito mode, it should not be autotranslated in that
- // case either.
- TestingProfile* test_profile =
- static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
- test_profile->ForceIncognito(true);
- SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true);
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- EXPECT_TRUE(GetTranslateInfoBar() != NULL);
- EXPECT_TRUE(CloseTranslateInfoBar());
- test_profile->ForceIncognito(false); // Get back to non incognito.
-
- // Now revert the always translate pref and make sure we go back to expected
- // behavior, which is show a "before translate" infobar.
- SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists);
- translate_prefs->RemoveLanguagePairFromWhitelist("fr", "en");
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
-}
-
-// Context menu.
-TEST_F(TranslateManagerBrowserTest, ContextMenu) {
- // Blacklist www.google.fr and French for translation.
- GURL url("http://www.google.fr");
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- scoped_ptr<TranslatePrefs> translate_prefs(
- TranslateTabHelper::CreateTranslatePrefs(profile->GetPrefs()));
- translate_prefs->BlockLanguage("fr");
- translate_prefs->BlacklistSite(url.host());
- EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
- EXPECT_TRUE(translate_prefs->IsSiteBlacklisted(url.host()));
-
- // Simulate navigating to a page in French. The translate menu should show but
- // should only be enabled when the page language has been received.
- NavigateAndCommit(url);
- scoped_ptr<TestRenderViewContextMenu> menu(
- TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
- EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
-
- // Simulate receiving the language.
- SimulateOnTranslateLanguageDetermined("fr", true);
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
- EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
-
- // Use the menu to translate the page.
- menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
-
- // That should have triggered a translation.
- // The "translating..." infobar should be showing.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
- SimulateTranslateScriptURLFetch(true);
- int page_id = 0;
- std::string original_lang, target_lang;
- EXPECT_TRUE(GetTranslateMessage(&page_id, &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"));
- EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
-
- // Let's simulate the page being translated.
- SimulateOnPageTranslated("fr", "en");
-
- // The translate menu should now be disabled.
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
- EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
-
- // Test that selecting translate in the context menu WHILE the page is being
- // translated does nothing (this could happen if autotranslate kicks-in and
- // the user selects the menu while the translation is being performed).
- SimulateNavigation(GURL("http://www.google.es"), "es", true);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- infobar->Translate();
- EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- process()->sink().ClearMessages();
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
- menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
- // No message expected since the translation should have been ignored.
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
-
- // Now test that selecting translate in the context menu AFTER the page has
- // been translated does nothing.
- SimulateNavigation(GURL("http://www.google.de"), "de", true);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- infobar->Translate();
- EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- process()->sink().ClearMessages();
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
- SimulateOnPageTranslated("de", "en");
- menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
- // No message expected since the translation should have been ignored.
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
-
- // Test that the translate context menu is enabled when the page is in an
- // unknown language.
- SimulateNavigation(url, "und", true);
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
- EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
-
- // Test that the translate context menu is enabled even if the page is in an
- // unsupported language.
- SimulateNavigation(url, "qbz", true);
- menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
- EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
-}
-
-// Tests that an extra always/never translate button is shown on the "before
-// translate" infobar when the translation is accepted/declined 3 times,
-// only when not in incognito mode.
-TEST_F(TranslateManagerBrowserTest, BeforeTranslateExtraButtons) {
- Profile* profile =
- Profile::FromBrowserContext(web_contents()->GetBrowserContext());
- scoped_ptr<TranslatePrefs> translate_prefs(
- TranslateTabHelper::CreateTranslatePrefs(profile->GetPrefs()));
- translate_prefs->ResetTranslationAcceptedCount("fr");
- translate_prefs->ResetTranslationDeniedCount("fr");
- translate_prefs->ResetTranslationAcceptedCount("de");
- translate_prefs->ResetTranslationDeniedCount("de");
-
- // We'll do 4 times in incognito mode first to make sure the button is not
- // shown in that case, then 4 times in normal mode.
- TranslateInfoBarDelegate* infobar;
- TestingProfile* test_profile =
- static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
- static_cast<extensions::TestExtensionSystem*>(
- extensions::ExtensionSystem::Get(test_profile))->
- CreateProcessManager();
- test_profile->ForceIncognito(true);
- for (int i = 0; i < 8; ++i) {
- SCOPED_TRACE(::testing::Message() << "Iteration " << i <<
- " incognito mode=" << test_profile->IsOffTheRecord());
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
- if (i < 7) {
- EXPECT_FALSE(infobar->ShouldShowAlwaysTranslateShortcut());
- infobar->Translate();
- process()->sink().ClearMessages();
- } else {
- EXPECT_TRUE(infobar->ShouldShowAlwaysTranslateShortcut());
- }
- if (i == 3)
- test_profile->ForceIncognito(false);
- }
- // Simulate the user pressing "Always translate French".
- infobar->AlwaysTranslatePageLanguage();
- EXPECT_TRUE(translate_prefs->IsLanguagePairWhitelisted("fr", "en"));
- // Simulate the translate script being retrieved (it only needs to be done
- // once in the test as it is cached).
- SimulateTranslateScriptURLFetch(true);
- // That should have triggered a page translate.
- int page_id = 0;
- std::string original_lang, target_lang;
- EXPECT_TRUE(GetTranslateMessage(&page_id, &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).
- test_profile->ForceIncognito(true);
- for (int i = 0; i < 8; ++i) {
- SCOPED_TRACE(::testing::Message() << "Iteration " << i <<
- " incognito mode=" << test_profile->IsOffTheRecord());
- SimulateNavigation(GURL("http://www.google.de"), "de", true);
- infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
- if (i < 7) {
- EXPECT_FALSE(infobar->ShouldShowNeverTranslateShortcut());
- infobar->TranslationDeclined();
- } else {
- EXPECT_TRUE(infobar->ShouldShowNeverTranslateShortcut());
- }
- if (i == 3)
- test_profile->ForceIncognito(false);
- }
- // Simulate the user pressing "Never translate French".
- infobar->NeverTranslatePageLanguage();
- EXPECT_TRUE(translate_prefs->IsBlockedLanguage("de"));
- // No translation should have occured and the infobar should be gone.
- EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- process()->sink().ClearMessages();
- ASSERT_TRUE(GetTranslateInfoBar() == NULL);
-}
-
-// Tests that we don't show a translate infobar when a page instructs that it
-// should not be translated.
-TEST_F(TranslateManagerBrowserTest, NonTranslatablePage) {
- SimulateNavigation(GURL("http://mail.google.fr"), "fr", false);
-
- // We should not have an infobar.
- EXPECT_TRUE(GetTranslateInfoBar() == NULL);
-
- // The context menu is enabled to allow users to force translation.
- scoped_ptr<TestRenderViewContextMenu> menu(
- TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
- EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
-}
-
-// Tests that the script is expired and refetched as expected.
-TEST_F(TranslateManagerBrowserTest, ScriptExpires) {
- ExpireTranslateScriptImmediately();
-
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar != NULL);
- process()->sink().ClearMessages();
- infobar->Translate();
- SimulateTranslateScriptURLFetch(true);
- SimulateOnPageTranslated("fr", "en");
-
- // A task should have been posted to clear the script, run it.
- base::MessageLoop::current()->RunUntilIdle();
-
- // Do another navigation and translation.
- 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(
- ChromeViewMsg_TranslatePage::ID) == NULL);
- // Now simulate the URL fetch.
- SimulateTranslateScriptURLFetch(true);
- // Now the message should have been sent.
- int page_id = 0;
- std::string original_lang, target_lang;
- EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
- EXPECT_EQ("es", original_lang);
- EXPECT_EQ("en", target_lang);
-}
-
-TEST_F(TranslateManagerBrowserTest, DownloadsAndHistoryNotTranslated) {
- ASSERT_FALSE(TranslateManager::IsTranslatableURL(
- GURL(chrome::kChromeUIDownloadsURL)));
- ASSERT_FALSE(TranslateManager::IsTranslatableURL(
- GURL(chrome::kChromeUIHistoryURL)));
-}
-
-#if defined(USE_AURA)
-
-TEST_F(TranslateManagerBrowserTest, BubbleNormalTranslate) {
- // Prepare for the bubble
- TranslateService::SetUseInfobar(false);
- MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
- scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
- TranslateBubbleFactory::SetFactory(factory);
-
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // Check the bubble exists instead of the infobar.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar == NULL);
- TranslateBubbleModel* bubble = factory->model();
- ASSERT_TRUE(bubble != NULL);
- EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
- bubble->GetViewState());
-
- // Simulate clicking translate.
- process()->sink().ClearMessages();
- bubble->Translate();
-
- // Check the bubble shows "Translating...".
- bubble = factory->model();
- ASSERT_TRUE(bubble != NULL);
- EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
- bubble->GetViewState());
-
- // Simulate the translate script being retrieved (it only needs to be done
- // once in the test as it is cached).
- SimulateTranslateScriptURLFetch(true);
-
- // Simulate the render notifying the translation has been done.
- SimulateOnPageTranslated("fr", "en");
-
- // Check the bubble shows "Translated."
- bubble = factory->model();
- ASSERT_TRUE(bubble != NULL);
- EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE,
- bubble->GetViewState());
-}
-
-TEST_F(TranslateManagerBrowserTest, BubbleTranslateScriptNotAvailable) {
- // Prepare for the bubble
- TranslateService::SetUseInfobar(false);
- MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
- scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
- TranslateBubbleFactory::SetFactory(factory);
-
- SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
-
- // Check the bubble exists instead of the infobar.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar == NULL);
- TranslateBubbleModel* bubble = factory->model();
- ASSERT_TRUE(bubble != NULL);
- EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
- bubble->GetViewState());
-
- // Simulate clicking translate.
- process()->sink().ClearMessages();
- bubble->Translate();
- SimulateTranslateScriptURLFetch(false);
-
- // We should not have sent any message to translate to the renderer.
- EXPECT_FALSE(GetTranslateMessage(NULL, NULL, NULL));
-
- // And we should have an error infobar showing.
- bubble = factory->model();
- ASSERT_TRUE(bubble != NULL);
- EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ERROR,
- bubble->GetViewState());
-}
-
-TEST_F(TranslateManagerBrowserTest, BubbleUnknownLanguage) {
- // Prepare for the bubble
- TranslateService::SetUseInfobar(false);
- MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
- scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
- TranslateBubbleFactory::SetFactory(factory);
-
- // Simulate navigating to a page ("und" is the string returned by the CLD for
- // languages it does not recognize).
- SimulateNavigation(GURL("http://www.google.mys"), "und", true);
-
- // We should not have a bubble as we don't know the language.
- ASSERT_TRUE(factory->model() == NULL);
-
- // Translate the page anyway throught the context menu.
- scoped_ptr<TestRenderViewContextMenu> menu(
- TestRenderViewContextMenu::CreateContextMenu(web_contents()));
- menu->Init();
- menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
-
- // Check the bubble exists instead of the infobar.
- TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
- ASSERT_TRUE(infobar == NULL);
- TranslateBubbleModel* bubble = factory->model();
- ASSERT_TRUE(bubble != NULL);
- EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
- bubble->GetViewState());
-}
+#include "url/gurl.h"
-#endif // defined(USE_AURA)
+class TranslateManagerBrowserTest : public InProcessBrowserTest {};
// Test is flaky on Win http://crbug.com/166334
#if defined(OS_WIN)
@@ -1589,7 +24,7 @@ TEST_F(TranslateManagerBrowserTest, BubbleUnknownLanguage) {
#endif
// Test that session restore restores the translate infobar and other translate
// settings.
-IN_PROC_BROWSER_TEST_F(InProcessBrowserTest,
+IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
MAYBE_PRE_TranslateSessionRestore) {
SessionStartupPref pref(SessionStartupPref::LAST);
SessionStartupPref::SetStartupPref(browser()->profile(), pref);
@@ -1621,7 +56,8 @@ IN_PROC_BROWSER_TEST_F(InProcessBrowserTest,
#else
#define MAYBE_TranslateSessionRestore TranslateSessionRestore
#endif
-IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, MAYBE_TranslateSessionRestore) {
+IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
+ MAYBE_TranslateSessionRestore) {
content::WebContents* current_web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
content::Source<content::WebContents> source(current_web_contents);
« no previous file with comments | « no previous file | chrome/browser/translate/translate_manager_render_view_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698