| Index: trunk/src/chrome/browser/translate/translate_manager_browsertest.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/translate/translate_manager_browsertest.cc (revision 255311)
|
| +++ trunk/src/chrome/browser/translate/translate_manager_browsertest.cc (working copy)
|
| @@ -2,20 +2,1585 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "chrome/browser/translate/translate_manager.h"
|
| +#include <algorithm>
|
| +#include <set>
|
| +#include <vector>
|
|
|
| +#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 "url/gurl.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"
|
|
|
| -class TranslateManagerBrowserTest : public InProcessBrowserTest {};
|
|
|
| +// 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(¤t_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(¤t_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(¤t_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(¤t_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());
|
| +}
|
| +
|
| +#endif // defined(USE_AURA)
|
| +
|
| // Test is flaky on Win http://crbug.com/166334
|
| #if defined(OS_WIN)
|
| #define MAYBE_PRE_TranslateSessionRestore DISABLED_PRE_TranslateSessionRestore
|
| @@ -24,7 +1589,7 @@
|
| #endif
|
| // Test that session restore restores the translate infobar and other translate
|
| // settings.
|
| -IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
|
| +IN_PROC_BROWSER_TEST_F(InProcessBrowserTest,
|
| MAYBE_PRE_TranslateSessionRestore) {
|
| SessionStartupPref pref(SessionStartupPref::LAST);
|
| SessionStartupPref::SetStartupPref(browser()->profile(), pref);
|
| @@ -56,8 +1621,7 @@
|
| #else
|
| #define MAYBE_TranslateSessionRestore TranslateSessionRestore
|
| #endif
|
| -IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
|
| - MAYBE_TranslateSessionRestore) {
|
| +IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, MAYBE_TranslateSessionRestore) {
|
| content::WebContents* current_web_contents =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| content::Source<content::WebContents> source(current_web_contents);
|
|
|