blob: 7ddb486dcc4705599e6ef81af38e2907a37e137d [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/translate/core/browser/translate_manager.h"
#include <memory>
#include "build/build_config.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/translate/chrome_translate_client.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/translate/core/common/language_detection_details.h"
#include "content/public/browser/notification_service.h"
#include "url/gurl.h"
class TranslateManagerBrowserTest : public InProcessBrowserTest {
public:
TranslateManagerBrowserTest() {}
~TranslateManagerBrowserTest() override {}
void WaitUntilLanguageDetected() { language_detected_signal_->Wait(); }
void ResetObserver() {
language_detected_signal_.reset(new LangageDetectionObserver(
chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
content::NotificationService::AllSources()));
}
protected:
// InProcessBrowserTest members.
void SetUp() override {
InProcessBrowserTest::SetUp();
}
void SetUpOnMainThread() override {
ResetObserver();
InProcessBrowserTest::SetUpOnMainThread();
}
private:
using LangageDetectionObserver =
ui_test_utils::WindowedNotificationObserverWithDetails<
translate::LanguageDetectionDetails>;
std::unique_ptr<LangageDetectionObserver> language_detected_signal_;
};
// Tests that the CLD (Compact Language Detection) works properly.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) {
ASSERT_TRUE(embedded_test_server()->Start());
content::WebContents* current_web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ChromeTranslateClient* chrome_translate_client =
ChromeTranslateClient::FromWebContents(current_web_contents);
// The InProcessBrowserTest opens a new tab, let's wait for that first.
// There is a possible race condition, when the language is not yet detected,
// so we check for that and wait if necessary.
if (chrome_translate_client->GetLanguageState().original_language().empty())
WaitUntilLanguageDetected();
EXPECT_EQ("und",
chrome_translate_client->GetLanguageState().original_language());
// Open a new tab with a page in English.
ResetObserver();
AddTabAtIndex(0, GURL(embedded_test_server()->GetURL("/english_page.html")),
ui::PAGE_TRANSITION_TYPED);
current_web_contents = browser()->tab_strip_model()->GetActiveWebContents();
chrome_translate_client =
ChromeTranslateClient::FromWebContents(current_web_contents);
WaitUntilLanguageDetected();
EXPECT_EQ("en",
chrome_translate_client->GetLanguageState().original_language());
ResetObserver();
// Now navigate to a page in French.
ui_test_utils::NavigateToURL(
browser(), GURL(embedded_test_server()->GetURL("/french_page.html")));
WaitUntilLanguageDetected();
EXPECT_EQ("fr",
chrome_translate_client->GetLanguageState().original_language());
}
// Test that session restore restores the translate infobar and other translate
// settings.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PRE_TranslateSessionRestore) {
SessionStartupPref pref(SessionStartupPref::LAST);
SessionStartupPref::SetStartupPref(browser()->profile(), pref);
content::WebContents* current_web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ChromeTranslateClient* chrome_translate_client =
ChromeTranslateClient::FromWebContents(current_web_contents);
// There is a possible race condition, when the language is not yet detected,
// so we check for that and wait if necessary.
if (chrome_translate_client->GetLanguageState().original_language().empty())
WaitUntilLanguageDetected();
EXPECT_EQ("und",
chrome_translate_client->GetLanguageState().original_language());
ResetObserver();
GURL french_url = ui_test_utils::GetTestUrl(
base::FilePath(), base::FilePath(FILE_PATH_LITERAL("french_page.html")));
ui_test_utils::NavigateToURL(browser(), french_url);
WaitUntilLanguageDetected();
EXPECT_EQ("fr",
chrome_translate_client->GetLanguageState().original_language());
}
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
TranslateSessionRestore) {
content::WebContents* active_web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ChromeTranslateClient* active_translate_client =
ChromeTranslateClient::FromWebContents(active_web_contents);
if (active_translate_client->GetLanguageState().current_language().empty())
WaitUntilLanguageDetected();
EXPECT_EQ("und",
active_translate_client->GetLanguageState().current_language());
// Make restored tab active to (on some platforms) initiate language
// detection.
browser()->tab_strip_model()->ActivateTabAt(0, true);
content::WebContents* restored_web_contents =
browser()->tab_strip_model()->GetWebContentsAt(0);
ChromeTranslateClient* restored_translate_client =
ChromeTranslateClient::FromWebContents(restored_web_contents);
if (restored_translate_client->GetLanguageState()
.current_language()
.empty()) {
ResetObserver();
WaitUntilLanguageDetected();
}
EXPECT_EQ("fr",
restored_translate_client->GetLanguageState().current_language());
}