blob: 7ddb486dcc4705599e6ef81af38e2907a37e137d [file] [log] [blame]
[email protected]2253b3b2012-06-03 22:39:151// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]28636de2014-04-09 13:00:265#include "components/translate/core/browser/translate_manager.h"
[email protected]275f31662014-03-07 18:10:476
dcheng4af48582016-04-19 00:29:357#include <memory>
8
avi664c07b2015-12-26 02:18:319#include "build/build_config.h"
[email protected]275f31662014-03-07 18:10:4710#include "chrome/browser/chrome_notification_types.h"
11#include "chrome/browser/prefs/session_startup_pref.h"
[email protected]255ab972014-06-04 12:14:2212#include "chrome/browser/translate/chrome_translate_client.h"
[email protected]f8a2e132012-08-31 18:16:2013#include "chrome/browser/ui/browser.h"
[email protected]47ae23372013-01-29 01:50:4814#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]f8a2e132012-08-31 18:16:2015#include "chrome/test/base/in_process_browser_test.h"
[email protected]f8a2e132012-08-31 18:16:2016#include "chrome/test/base/ui_test_utils.h"
[email protected]eba93c92014-01-07 17:34:1717#include "components/translate/core/common/language_detection_details.h"
dglazkovedf618bb2015-10-30 19:47:0418#include "content/public/browser/notification_service.h"
[email protected]275f31662014-03-07 18:10:4719#include "url/gurl.h"
[email protected]2253b3b2012-06-03 22:39:1520
dglazkovedf618bb2015-10-30 19:47:0421class TranslateManagerBrowserTest : public InProcessBrowserTest {
22 public:
23 TranslateManagerBrowserTest() {}
24 ~TranslateManagerBrowserTest() override {}
25
dglazkovedf618bb2015-10-30 19:47:0426 void WaitUntilLanguageDetected() { language_detected_signal_->Wait(); }
27
28 void ResetObserver() {
29 language_detected_signal_.reset(new LangageDetectionObserver(
30 chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
31 content::NotificationService::AllSources()));
32 }
33
34 protected:
35 // InProcessBrowserTest members.
36 void SetUp() override {
dglazkovedf618bb2015-10-30 19:47:0437 InProcessBrowserTest::SetUp();
38 }
39 void SetUpOnMainThread() override {
40 ResetObserver();
41 InProcessBrowserTest::SetUpOnMainThread();
42 }
43
44 private:
45 using LangageDetectionObserver =
46 ui_test_utils::WindowedNotificationObserverWithDetails<
47 translate::LanguageDetectionDetails>;
48
dcheng4af48582016-04-19 00:29:3549 std::unique_ptr<LangageDetectionObserver> language_detected_signal_;
dglazkovedf618bb2015-10-30 19:47:0450};
51
52// Tests that the CLD (Compact Language Detection) works properly.
53IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) {
svaldez799d1592015-12-03 21:10:0854 ASSERT_TRUE(embedded_test_server()->Start());
dglazkovedf618bb2015-10-30 19:47:0455
dglazkov7d0ddfc2016-02-03 04:47:5956 content::WebContents* current_web_contents =
57 browser()->tab_strip_model()->GetActiveWebContents();
dglazkov7d0ddfc2016-02-03 04:47:5958 ChromeTranslateClient* chrome_translate_client =
59 ChromeTranslateClient::FromWebContents(current_web_contents);
dglazkov50fcc022016-02-03 05:55:1960 // The InProcessBrowserTest opens a new tab, let's wait for that first.
61 // There is a possible race condition, when the language is not yet detected,
62 // so we check for that and wait if necessary.
63 if (chrome_translate_client->GetLanguageState().original_language().empty())
64 WaitUntilLanguageDetected();
dglazkov7d0ddfc2016-02-03 04:47:5965
dglazkov50fcc022016-02-03 05:55:1966 EXPECT_EQ("und",
67 chrome_translate_client->GetLanguageState().original_language());
68
69 // Open a new tab with a page in English.
70 ResetObserver();
71 AddTabAtIndex(0, GURL(embedded_test_server()->GetURL("/english_page.html")),
72 ui::PAGE_TRANSITION_TYPED);
73 current_web_contents = browser()->tab_strip_model()->GetActiveWebContents();
74 chrome_translate_client =
75 ChromeTranslateClient::FromWebContents(current_web_contents);
dglazkov7d0ddfc2016-02-03 04:47:5976 WaitUntilLanguageDetected();
dglazkov50fcc022016-02-03 05:55:1977
dglazkovedf618bb2015-10-30 19:47:0478 EXPECT_EQ("en",
79 chrome_translate_client->GetLanguageState().original_language());
80
81 ResetObserver();
dglazkovedf618bb2015-10-30 19:47:0482 // Now navigate to a page in French.
83 ui_test_utils::NavigateToURL(
svaldez799d1592015-12-03 21:10:0884 browser(), GURL(embedded_test_server()->GetURL("/french_page.html")));
dglazkov7d0ddfc2016-02-03 04:47:5985 WaitUntilLanguageDetected();
dglazkov50fcc022016-02-03 05:55:1986
dglazkovedf618bb2015-10-30 19:47:0487 EXPECT_EQ("fr",
88 chrome_translate_client->GetLanguageState().original_language());
89}
[email protected]e625b7602013-10-28 09:24:5690
[email protected]f8a2e132012-08-31 18:16:2091// Test that session restore restores the translate infobar and other translate
92// settings.
[email protected]275f31662014-03-07 18:10:4793IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
dglazkovae603e1c2016-02-03 22:12:1794 PRE_TranslateSessionRestore) {
[email protected]f8a2e132012-08-31 18:16:2095 SessionStartupPref pref(SessionStartupPref::LAST);
96 SessionStartupPref::SetStartupPref(browser()->profile(), pref);
97
[email protected]05024712013-07-31 09:46:2998 content::WebContents* current_web_contents =
[email protected]47ae23372013-01-29 01:50:4899 browser()->tab_strip_model()->GetActiveWebContents();
[email protected]255ab972014-06-04 12:14:22100 ChromeTranslateClient* chrome_translate_client =
101 ChromeTranslateClient::FromWebContents(current_web_contents);
[email protected]f8a2e132012-08-31 18:16:20102
dglazkov50fcc022016-02-03 05:55:19103 // There is a possible race condition, when the language is not yet detected,
104 // so we check for that and wait if necessary.
105 if (chrome_translate_client->GetLanguageState().original_language().empty())
106 WaitUntilLanguageDetected();
107
108 EXPECT_EQ("und",
109 chrome_translate_client->GetLanguageState().original_language());
dglazkovedf618bb2015-10-30 19:47:04110
111 ResetObserver();
[email protected]f8a2e132012-08-31 18:16:20112
113 GURL french_url = ui_test_utils::GetTestUrl(
[email protected]650b2d52013-02-10 03:41:45114 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("french_page.html")));
[email protected]f8a2e132012-08-31 18:16:20115 ui_test_utils::NavigateToURL(browser(), french_url);
dglazkovedf618bb2015-10-30 19:47:04116
117 WaitUntilLanguageDetected();
[email protected]255ab972014-06-04 12:14:22118 EXPECT_EQ("fr",
119 chrome_translate_client->GetLanguageState().original_language());
[email protected]f8a2e132012-08-31 18:16:20120}
121
[email protected]275f31662014-03-07 18:10:47122IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
dglazkovae603e1c2016-02-03 22:12:17123 TranslateSessionRestore) {
dglazkovedf618bb2015-10-30 19:47:04124 content::WebContents* active_web_contents =
125 browser()->tab_strip_model()->GetActiveWebContents();
dglazkov50fcc022016-02-03 05:55:19126 ChromeTranslateClient* active_translate_client =
127 ChromeTranslateClient::FromWebContents(active_web_contents);
128 if (active_translate_client->GetLanguageState().current_language().empty())
129 WaitUntilLanguageDetected();
130 EXPECT_EQ("und",
131 active_translate_client->GetLanguageState().current_language());
132
133 // Make restored tab active to (on some platforms) initiate language
134 // detection.
135 browser()->tab_strip_model()->ActivateTabAt(0, true);
dglazkovedf618bb2015-10-30 19:47:04136
137 content::WebContents* restored_web_contents =
138 browser()->tab_strip_model()->GetWebContentsAt(0);
dglazkov50fcc022016-02-03 05:55:19139 ChromeTranslateClient* restored_translate_client =
140 ChromeTranslateClient::FromWebContents(restored_web_contents);
141 if (restored_translate_client->GetLanguageState()
142 .current_language()
143 .empty()) {
dglazkov7d0ddfc2016-02-03 04:47:59144 ResetObserver();
dglazkovedf618bb2015-10-30 19:47:04145 WaitUntilLanguageDetected();
dglazkov7d0ddfc2016-02-03 04:47:59146 }
dglazkov50fcc022016-02-03 05:55:19147 EXPECT_EQ("fr",
148 restored_translate_client->GetLanguageState().current_language());
[email protected]f8a2e132012-08-31 18:16:20149}