[email protected] | 2253b3b | 2012-06-03 22:39:15 | [diff] [blame] | 1 | // 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] | 28636de | 2014-04-09 13:00:26 | [diff] [blame] | 5 | #include "components/translate/core/browser/translate_manager.h" |
[email protected] | 275f3166 | 2014-03-07 18:10:47 | [diff] [blame] | 6 | |
dcheng | 4af4858 | 2016-04-19 00:29:35 | [diff] [blame] | 7 | #include <memory> |
| 8 | |
avi | 664c07b | 2015-12-26 02:18:31 | [diff] [blame] | 9 | #include "build/build_config.h" |
[email protected] | 275f3166 | 2014-03-07 18:10:47 | [diff] [blame] | 10 | #include "chrome/browser/chrome_notification_types.h" |
| 11 | #include "chrome/browser/prefs/session_startup_pref.h" |
[email protected] | 255ab97 | 2014-06-04 12:14:22 | [diff] [blame] | 12 | #include "chrome/browser/translate/chrome_translate_client.h" |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 13 | #include "chrome/browser/ui/browser.h" |
[email protected] | 47ae2337 | 2013-01-29 01:50:48 | [diff] [blame] | 14 | #include "chrome/browser/ui/tabs/tab_strip_model.h" |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 15 | #include "chrome/test/base/in_process_browser_test.h" |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 16 | #include "chrome/test/base/ui_test_utils.h" |
[email protected] | eba93c9 | 2014-01-07 17:34:17 | [diff] [blame] | 17 | #include "components/translate/core/common/language_detection_details.h" |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 18 | #include "content/public/browser/notification_service.h" |
[email protected] | 275f3166 | 2014-03-07 18:10:47 | [diff] [blame] | 19 | #include "url/gurl.h" |
[email protected] | 2253b3b | 2012-06-03 22:39:15 | [diff] [blame] | 20 | |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 21 | class TranslateManagerBrowserTest : public InProcessBrowserTest { |
| 22 | public: |
| 23 | TranslateManagerBrowserTest() {} |
| 24 | ~TranslateManagerBrowserTest() override {} |
| 25 | |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 26 | 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 { |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 37 | 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 | |
dcheng | 4af4858 | 2016-04-19 00:29:35 | [diff] [blame] | 49 | std::unique_ptr<LangageDetectionObserver> language_detected_signal_; |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 50 | }; |
| 51 | |
| 52 | // Tests that the CLD (Compact Language Detection) works properly. |
| 53 | IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) { |
svaldez | 799d159 | 2015-12-03 21:10:08 | [diff] [blame] | 54 | ASSERT_TRUE(embedded_test_server()->Start()); |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 55 | |
dglazkov | 7d0ddfc | 2016-02-03 04:47:59 | [diff] [blame] | 56 | content::WebContents* current_web_contents = |
| 57 | browser()->tab_strip_model()->GetActiveWebContents(); |
dglazkov | 7d0ddfc | 2016-02-03 04:47:59 | [diff] [blame] | 58 | ChromeTranslateClient* chrome_translate_client = |
| 59 | ChromeTranslateClient::FromWebContents(current_web_contents); |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 60 | // 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(); |
dglazkov | 7d0ddfc | 2016-02-03 04:47:59 | [diff] [blame] | 65 | |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 66 | 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); |
dglazkov | 7d0ddfc | 2016-02-03 04:47:59 | [diff] [blame] | 76 | WaitUntilLanguageDetected(); |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 77 | |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 78 | EXPECT_EQ("en", |
| 79 | chrome_translate_client->GetLanguageState().original_language()); |
| 80 | |
| 81 | ResetObserver(); |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 82 | // Now navigate to a page in French. |
| 83 | ui_test_utils::NavigateToURL( |
svaldez | 799d159 | 2015-12-03 21:10:08 | [diff] [blame] | 84 | browser(), GURL(embedded_test_server()->GetURL("/french_page.html"))); |
dglazkov | 7d0ddfc | 2016-02-03 04:47:59 | [diff] [blame] | 85 | WaitUntilLanguageDetected(); |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 86 | |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 87 | EXPECT_EQ("fr", |
| 88 | chrome_translate_client->GetLanguageState().original_language()); |
| 89 | } |
[email protected] | e625b760 | 2013-10-28 09:24:56 | [diff] [blame] | 90 | |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 91 | // Test that session restore restores the translate infobar and other translate |
| 92 | // settings. |
[email protected] | 275f3166 | 2014-03-07 18:10:47 | [diff] [blame] | 93 | IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, |
dglazkov | ae603e1c | 2016-02-03 22:12:17 | [diff] [blame] | 94 | PRE_TranslateSessionRestore) { |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 95 | SessionStartupPref pref(SessionStartupPref::LAST); |
| 96 | SessionStartupPref::SetStartupPref(browser()->profile(), pref); |
| 97 | |
[email protected] | 0502471 | 2013-07-31 09:46:29 | [diff] [blame] | 98 | content::WebContents* current_web_contents = |
[email protected] | 47ae2337 | 2013-01-29 01:50:48 | [diff] [blame] | 99 | browser()->tab_strip_model()->GetActiveWebContents(); |
[email protected] | 255ab97 | 2014-06-04 12:14:22 | [diff] [blame] | 100 | ChromeTranslateClient* chrome_translate_client = |
| 101 | ChromeTranslateClient::FromWebContents(current_web_contents); |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 102 | |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 103 | // 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()); |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 110 | |
| 111 | ResetObserver(); |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 112 | |
| 113 | GURL french_url = ui_test_utils::GetTestUrl( |
[email protected] | 650b2d5 | 2013-02-10 03:41:45 | [diff] [blame] | 114 | base::FilePath(), base::FilePath(FILE_PATH_LITERAL("french_page.html"))); |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 115 | ui_test_utils::NavigateToURL(browser(), french_url); |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 116 | |
| 117 | WaitUntilLanguageDetected(); |
[email protected] | 255ab97 | 2014-06-04 12:14:22 | [diff] [blame] | 118 | EXPECT_EQ("fr", |
| 119 | chrome_translate_client->GetLanguageState().original_language()); |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 120 | } |
| 121 | |
[email protected] | 275f3166 | 2014-03-07 18:10:47 | [diff] [blame] | 122 | IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, |
dglazkov | ae603e1c | 2016-02-03 22:12:17 | [diff] [blame] | 123 | TranslateSessionRestore) { |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 124 | content::WebContents* active_web_contents = |
| 125 | browser()->tab_strip_model()->GetActiveWebContents(); |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 126 | 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); |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 136 | |
| 137 | content::WebContents* restored_web_contents = |
| 138 | browser()->tab_strip_model()->GetWebContentsAt(0); |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 139 | ChromeTranslateClient* restored_translate_client = |
| 140 | ChromeTranslateClient::FromWebContents(restored_web_contents); |
| 141 | if (restored_translate_client->GetLanguageState() |
| 142 | .current_language() |
| 143 | .empty()) { |
dglazkov | 7d0ddfc | 2016-02-03 04:47:59 | [diff] [blame] | 144 | ResetObserver(); |
dglazkov | edf618bb | 2015-10-30 19:47:04 | [diff] [blame] | 145 | WaitUntilLanguageDetected(); |
dglazkov | 7d0ddfc | 2016-02-03 04:47:59 | [diff] [blame] | 146 | } |
dglazkov | 50fcc02 | 2016-02-03 05:55:19 | [diff] [blame] | 147 | EXPECT_EQ("fr", |
| 148 | restored_translate_client->GetLanguageState().current_language()); |
[email protected] | f8a2e13 | 2012-08-31 18:16:20 | [diff] [blame] | 149 | } |