summaryrefslogtreecommitdiffstats
path: root/chrome/browser/tab_contents
diff options
context:
space:
mode:
authordroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-21 12:38:12 +0000
committerdroger@chromium.org <droger@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-21 12:38:12 +0000
commit3155c5273ea8bcbdf6b5c5e029377713b5430997 (patch)
tree48cc5388ff8910ccb99620fec0262435e860035f /chrome/browser/tab_contents
parentf2eaf5c5a5d109e566777711c68aa2d245fd9dfb (diff)
downloadchromium_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.cc130
-rw-r--r--chrome/browser/tab_contents/language_state.h137
-rw-r--r--chrome/browser/tab_contents/language_state_observer.h25
-rw-r--r--chrome/browser/tab_contents/language_state_unittest.cc117
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.cc10
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