diff options
author | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-21 12:38:12 +0000 |
---|---|---|
committer | droger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-21 12:38:12 +0000 |
commit | 3155c5273ea8bcbdf6b5c5e029377713b5430997 (patch) | |
tree | 48cc5388ff8910ccb99620fec0262435e860035f /chrome/browser/tab_contents | |
parent | f2eaf5c5a5d109e566777711c68aa2d245fd9dfb (diff) | |
download | chromium_src-3155c5273ea8bcbdf6b5c5e029377713b5430997.zip chromium_src-3155c5273ea8bcbdf6b5c5e029377713b5430997.tar.gz chromium_src-3155c5273ea8bcbdf6b5c5e029377713b5430997.tar.bz2 |
Move LanguageState to the translate component
This CL introduces the TranslateDriver and a content implementation of it
(ContentTranslateDriver), and moves LanguageState to the translate component.
LanguageState gets information from the content driver through the
TranslateDriver API.
BUG=335092
Review URL: https://codereview.chromium.org/133273029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@246023 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/tab_contents')
-rw-r--r-- | chrome/browser/tab_contents/language_state.cc | 130 | ||||
-rw-r--r-- | chrome/browser/tab_contents/language_state.h | 137 | ||||
-rw-r--r-- | chrome/browser/tab_contents/language_state_observer.h | 25 | ||||
-rw-r--r-- | chrome/browser/tab_contents/language_state_unittest.cc | 117 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu.cc | 10 |
5 files changed, 5 insertions, 414 deletions
diff --git a/chrome/browser/tab_contents/language_state.cc b/chrome/browser/tab_contents/language_state.cc deleted file mode 100644 index 90296a8..0000000 --- a/chrome/browser/tab_contents/language_state.cc +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) 2011 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 "chrome/browser/tab_contents/language_state.h" - -#include "chrome/browser/tab_contents/language_state_observer.h" -#include "content/public/browser/navigation_controller.h" -#include "content/public/browser/navigation_details.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/web_contents.h" - -using content::NavigationController; - -LanguageState::LanguageState(NavigationController* nav_controller) - : is_page_translated_(false), - navigation_controller_(nav_controller), - page_needs_translation_(false), - translation_pending_(false), - translation_declined_(false), - in_page_navigation_(false), - translate_enabled_(false), - observer_(NULL) { -} - -LanguageState::~LanguageState() { -} - -void LanguageState::DidNavigate( - const content::LoadCommittedDetails& details) { - in_page_navigation_ = details.is_in_page; - if (in_page_navigation_ || !details.is_main_frame) - return; // Don't reset our states, the page has not changed. - - bool reload = - details.entry->GetTransitionType() == content::PAGE_TRANSITION_RELOAD || - details.type == content::NAVIGATION_TYPE_SAME_PAGE; - if (reload) { - // We might not get a LanguageDetermined notifications on reloads. Make sure - // to keep the original language and to set current_lang_ so - // IsPageTranslated() returns false. - current_lang_ = original_lang_; - } else { - prev_original_lang_ = original_lang_; - prev_current_lang_ = current_lang_; - original_lang_.clear(); - current_lang_.clear(); - } - - SetIsPageTranslated(false); - - translation_pending_ = false; - translation_declined_ = false; - - SetTranslateEnabled(false); -} - -void LanguageState::LanguageDetermined(const std::string& page_language, - bool page_needs_translation) { - if (in_page_navigation_ && !original_lang_.empty()) { - // In-page navigation, we don't expect our states to change. - // Note that we'll set the languages if original_lang_ is empty. This might - // happen if the we did not get called on the top-page. - return; - } - page_needs_translation_ = page_needs_translation; - original_lang_ = page_language; - current_lang_ = page_language; - SetIsPageTranslated(false); -} - -bool LanguageState::InTranslateNavigation() const { - // The user is in the same translate session if - // - no translation is pending - // - this page is in the same language as the previous page - // - the previous page had been translated - // - the new page was navigated through a link. - return - !translation_pending_ && - prev_original_lang_ == original_lang_ && - prev_original_lang_ != prev_current_lang_ && - navigation_controller_ && - navigation_controller_->GetActiveEntry() && - navigation_controller_->GetActiveEntry()->GetTransitionType() == - content::PAGE_TRANSITION_LINK; -} - -void LanguageState::SetCurrentLanguage(const std::string& language) { - current_lang_ = language; - SetIsPageTranslated(current_lang_ != original_lang_); -} - -std::string LanguageState::AutoTranslateTo() const { - if (InTranslateNavigation() && !is_page_translated_) - return prev_current_lang_; - - return std::string(); -} - -void LanguageState::SetTranslateEnabled(bool value) { - if (translate_enabled_ == value) - return; - - translate_enabled_ = value; - if (observer_) { - content::WebContents* web_contents = - navigation_controller_->GetWebContents(); - observer_->OnTranslateEnabledChanged(web_contents); - } -} - -bool LanguageState::HasLanguageChanged() const { - return original_lang_ != prev_original_lang_; -} - -void LanguageState::SetIsPageTranslated(bool value) { - if (is_page_translated_ == value) - return; - - is_page_translated_ = value; - if (observer_) { - content::WebContents* web_contents = - navigation_controller_->GetWebContents(); - observer_->OnIsPageTranslatedChanged(web_contents); - } - - // With the translation done, the translate feature must be enabled. - if (is_page_translated_) - SetTranslateEnabled(true); -} diff --git a/chrome/browser/tab_contents/language_state.h b/chrome/browser/tab_contents/language_state.h deleted file mode 100644 index 79a3f3b..0000000 --- a/chrome/browser/tab_contents/language_state.h +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) 2011 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. - -#ifndef CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_H_ -#define CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_H_ - -#include <string> - -#include "base/basictypes.h" - -class LanguageStateObserver; - -namespace content { -struct LoadCommittedDetails; -class NavigationController; -class WebContents; -} - -// This class holds the language state of the current page. -// There is one LanguageState instance per WebContents. -// It is used to determine when navigating to a new page whether it should -// automatically be translated. -// This auto-translate behavior is the expected behavior when: -// - user is on page in language A that they had translated to language B. -// - user clicks a link in that page that takes them to a page also in language -// A. - -class LanguageState { - public: - explicit LanguageState(content::NavigationController* nav_controller); - ~LanguageState(); - - // Should be called when the page did a new navigation (whether it is a main - // frame or sub-frame navigation). - void DidNavigate(const content::LoadCommittedDetails& details); - - // Should be called when the language of the page has been determined. - // |page_needs_translation| when false indicates that the browser should not - // offer to translate the page. - void LanguageDetermined(const std::string& page_language, - bool page_needs_translation); - - // Returns the language the current page should be translated to, based on the - // previous page languages and the transition. This should be called after - // the language page has been determined. - // Returns an empty string if the page should not be auto-translated. - std::string AutoTranslateTo() const; - - // Returns true if the user is navigating through translated links. - bool InTranslateNavigation() const; - - // Returns true if the current page in the associated tab has been translated. - bool IsPageTranslated() const { return original_lang_ != current_lang_; } - - const std::string& original_language() const { return original_lang_; } - - void SetCurrentLanguage(const std::string& language); - const std::string& current_language() const { return current_lang_; } - - bool page_needs_translation() const { return page_needs_translation_; } - - // Whether the page is currently in the process of being translated. - bool translation_pending() const { return translation_pending_; } - void set_translation_pending(bool value) { translation_pending_ = value; } - - // Whether the user has already declined to translate the page. - bool translation_declined() const { return translation_declined_; } - void set_translation_declined(bool value) { translation_declined_ = value; } - - // Whether the current page was navigated through an in-page (fragment) - // navigation. - bool in_page_navigation() const { return in_page_navigation_; } - - // Whether the translate is enabled. This value is supposed to be used for the - // Translate icon on the Omnibox. - bool translate_enabled() const { return translate_enabled_; } - void SetTranslateEnabled(bool value); - - // Whether the current page's language is different from the previous - // language. - bool HasLanguageChanged() const; - - void set_observer(LanguageStateObserver* observer) { observer_ = observer; } - - private: - void SetIsPageTranslated(bool value); - - // Whether the page is translated or not. - bool is_page_translated_; - - // The languages this page is in. Note that current_lang_ is different from - // original_lang_ when the page has been translated. - // Note that these might be empty if the page language has not been determined - // yet. - std::string original_lang_; - std::string current_lang_; - - // Same as above but for the previous page. - std::string prev_original_lang_; - std::string prev_current_lang_; - - // The navigation controller of the tab we are associated with. - content::NavigationController* navigation_controller_; - - // Whether it is OK to offer to translate the page. Some pages explictly - // specify that they should not be translated by the browser (this is the case - // for GMail for example, which provides its own translation features). - bool page_needs_translation_; - - // Whether a translation is currently pending (WebContents waiting for the - // PAGE_TRANSLATED notification). This is needed to avoid sending duplicate - // translate requests to a page. TranslateManager initiates translations - // when it received the LANGUAGE_DETERMINED notification. This is sent by - // the renderer with the page contents, every time the load stops for the - // main frame, so we may get several. - // TODO(jcampan): make the renderer send the language just once per navigation - // then we can get rid of that state. - bool translation_pending_; - - // Whether the user has declined to translate the page (by closing the infobar - // for example). This is necessary as a new infobar could be shown if a new - // load happens in the page after the user closed the infobar. - bool translation_declined_; - - // Whether the current navigation is a fragment navigation (in page). - bool in_page_navigation_; - - // Whether the Translate is enabled. - bool translate_enabled_; - - LanguageStateObserver* observer_; - - DISALLOW_COPY_AND_ASSIGN(LanguageState); -}; - -#endif // CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_H_ diff --git a/chrome/browser/tab_contents/language_state_observer.h b/chrome/browser/tab_contents/language_state_observer.h deleted file mode 100644 index d29affa..0000000 --- a/chrome/browser/tab_contents/language_state_observer.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2013 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. - -#ifndef CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_OBSERVER_H_ -#define CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_OBSERVER_H_ - -namespace content { -class WebContents; -} - -// The observer for the language state. -class LanguageStateObserver { - public: - // Handles when the value of IsPageTranslated is changed. - virtual void OnIsPageTranslatedChanged(content::WebContents* source) = 0; - - // Handles when the value of translate_enabled is changed. - virtual void OnTranslateEnabledChanged(content::WebContents* source) = 0; - - protected: - virtual ~LanguageStateObserver() {} -}; - -#endif // CHROME_BROWSER_TAB_CONTENTS_LANGUAGE_STATE_OBSERVER_H_ diff --git a/chrome/browser/tab_contents/language_state_unittest.cc b/chrome/browser/tab_contents/language_state_unittest.cc deleted file mode 100644 index bdfe613..0000000 --- a/chrome/browser/tab_contents/language_state_unittest.cc +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2013 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 "chrome/browser/tab_contents/language_state.h" - -#include "base/memory/scoped_ptr.h" -#include "chrome/browser/tab_contents/language_state_observer.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/test/base/browser_with_test_window_test.h" -#include "content/public/browser/web_contents.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -class MockLanguageStateObserver : public LanguageStateObserver { - public: - MockLanguageStateObserver() - : on_is_page_translated_changed_called_(false), - on_translate_enabled_changed_called_(false) { - } - - virtual ~MockLanguageStateObserver() {} - - virtual void OnIsPageTranslatedChanged( - content::WebContents* source) OVERRIDE { - on_is_page_translated_changed_called_ = true; - } - - virtual void OnTranslateEnabledChanged( - content::WebContents* source) OVERRIDE { - on_translate_enabled_changed_called_ = true; - } - - bool on_is_page_translated_changed_called() const { - return on_is_page_translated_changed_called_; - } - - bool on_translate_enabled_changed_called() const { - return on_translate_enabled_changed_called_; - } - - private: - bool on_is_page_translated_changed_called_; - bool on_translate_enabled_changed_called_; - - DISALLOW_COPY_AND_ASSIGN(MockLanguageStateObserver); -}; - -} // namespace - -typedef BrowserWithTestWindowTest LanguageStateTest; - -TEST_F(LanguageStateTest, IsPageTranslated) { - LanguageState language_state(NULL); - EXPECT_FALSE(language_state.IsPageTranslated()); - - // Navigate to a French page. - language_state.LanguageDetermined("fr", true); - EXPECT_EQ("fr", language_state.original_language()); - EXPECT_EQ("fr", language_state.current_language()); - EXPECT_FALSE(language_state.IsPageTranslated()); - - // Translate the page into English. - language_state.SetCurrentLanguage("en"); - EXPECT_EQ("fr", language_state.original_language()); - EXPECT_EQ("en", language_state.current_language()); - EXPECT_TRUE(language_state.IsPageTranslated()); - - // Move on another page in Japanese. - language_state.LanguageDetermined("ja", true); - EXPECT_EQ("ja", language_state.original_language()); - EXPECT_EQ("ja", language_state.current_language()); - EXPECT_FALSE(language_state.IsPageTranslated()); -} - -TEST_F(LanguageStateTest, Observer) { - GURL url("http://foo/"); - AddTab(browser(), url); - content::NavigationController& navigation_controller = - browser()->tab_strip_model()->GetWebContentsAt(0)->GetController(); - - scoped_ptr<MockLanguageStateObserver> observer( - new MockLanguageStateObserver); - LanguageState language_state(&navigation_controller); - language_state.set_observer(observer.get()); - - // Enable/Disable translate. - EXPECT_FALSE(language_state.translate_enabled()); - EXPECT_FALSE(observer->on_translate_enabled_changed_called()); - language_state.SetTranslateEnabled(true); - EXPECT_TRUE(language_state.translate_enabled()); - EXPECT_TRUE(observer->on_translate_enabled_changed_called()); - - observer.reset(new MockLanguageStateObserver); - language_state.set_observer(observer.get()); - language_state.SetTranslateEnabled(false); - EXPECT_FALSE(language_state.translate_enabled()); - EXPECT_TRUE(observer->on_translate_enabled_changed_called()); - - // Navigate to a French page. - observer.reset(new MockLanguageStateObserver); - language_state.set_observer(observer.get()); - language_state.LanguageDetermined("fr", true); - EXPECT_FALSE(language_state.translate_enabled()); - EXPECT_FALSE(observer->on_is_page_translated_changed_called()); - EXPECT_FALSE(observer->on_translate_enabled_changed_called()); - - // Translate. - language_state.SetCurrentLanguage("en"); - EXPECT_TRUE(language_state.IsPageTranslated()); - EXPECT_TRUE(observer->on_is_page_translated_changed_called()); - - // Translate feature must be enabled after an actual translation. - EXPECT_TRUE(language_state.translate_enabled()); - EXPECT_TRUE(observer->on_translate_enabled_changed_called()); -} diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc index 98787bf..daee215 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.cc +++ b/chrome/browser/tab_contents/render_view_context_menu.cc @@ -1229,7 +1229,7 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { if (!translate_tab_helper) return false; std::string original_lang = - translate_tab_helper->language_state().original_language(); + translate_tab_helper->GetLanguageState().original_language(); std::string target_lang = g_browser_process->GetApplicationLocale(); target_lang = TranslateManager::GetLanguageCode(target_lang); // Note that we intentionally enable the menu even if the original and @@ -1238,7 +1238,7 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { // language. return ((params_.edit_flags & WebContextMenuData::CanTranslate) != 0) && !original_lang.empty() && // Did we receive the page language yet? - !translate_tab_helper->language_state().IsPageTranslated() && + !translate_tab_helper->GetLanguageState().IsPageTranslated() && !source_web_contents_->GetInterstitialPage() && // There are some application locales which can't be used as a // target language for translation. @@ -1806,12 +1806,12 @@ void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) { TranslateTabHelper* translate_tab_helper = TranslateTabHelper::FromWebContents(source_web_contents_); if (!translate_tab_helper || - translate_tab_helper->language_state().IsPageTranslated() || - translate_tab_helper->language_state().translation_pending()) { + translate_tab_helper->GetLanguageState().IsPageTranslated() || + translate_tab_helper->GetLanguageState().translation_pending()) { return; } std::string original_lang = - translate_tab_helper->language_state().original_language(); + translate_tab_helper->GetLanguageState().original_language(); std::string target_lang = g_browser_process->GetApplicationLocale(); target_lang = TranslateManager::GetLanguageCode(target_lang); // Since the user decided to translate for that language and site, clears |