summaryrefslogtreecommitdiffstats
path: root/chrome/browser/translate
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/translate')
-rw-r--r--chrome/browser/translate/options_menu_model.cc7
-rw-r--r--chrome/browser/translate/options_menu_model.h8
-rw-r--r--chrome/browser/translate/translate_infobars_delegates.cc197
-rw-r--r--chrome/browser/translate/translate_infobars_delegates.h94
-rw-r--r--chrome/browser/translate/translate_manager.cc32
5 files changed, 149 insertions, 189 deletions
diff --git a/chrome/browser/translate/options_menu_model.cc b/chrome/browser/translate/options_menu_model.cc
index da1f896..376e2cb 100644
--- a/chrome/browser/translate/options_menu_model.cc
+++ b/chrome/browser/translate/options_menu_model.cc
@@ -10,12 +10,13 @@
#include "grit/generated_resources.h"
OptionsMenuModel::OptionsMenuModel(menus::SimpleMenuModel::Delegate* delegate,
- TranslateInfoBarDelegate* translate_delegate, bool before_translate)
+ TranslateInfoBarDelegate* translate_delegate)
: menus::SimpleMenuModel(delegate) {
string16 original_language =
TranslateInfoBarDelegate::GetDisplayNameForLocale(
translate_delegate->original_lang_code());
- if (before_translate) {
+ TranslateInfoBarDelegate::TranslateState state = translate_delegate->state();
+ if (state == TranslateInfoBarDelegate::kBeforeTranslate) {
AddCheckItem(IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_LANG,
l10n_util::GetStringFUTF16(
IDS_TRANSLATE_INFOBAR_OPTIONS_NEVER_TRANSLATE_LANG,
@@ -23,7 +24,7 @@ OptionsMenuModel::OptionsMenuModel(menus::SimpleMenuModel::Delegate* delegate,
AddCheckItem(IDC_TRANSLATE_OPTIONS_NEVER_TRANSLATE_SITE,
l10n_util::GetStringUTF16(
IDS_TRANSLATE_INFOBAR_OPTIONS_NEVER_TRANSLATE_SITE));
- } else {
+ } else if (state == TranslateInfoBarDelegate::kAfterTranslate) {
string16 target_language =
TranslateInfoBarDelegate::GetDisplayNameForLocale(
translate_delegate->target_lang_code());
diff --git a/chrome/browser/translate/options_menu_model.h b/chrome/browser/translate/options_menu_model.h
index e335059..c6de2f3 100644
--- a/chrome/browser/translate/options_menu_model.h
+++ b/chrome/browser/translate/options_menu_model.h
@@ -1,6 +1,6 @@
-// Copyright (c) 2009 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.
+// Copyright (c) 2009 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_TRANSLATE_OPTIONS_MENU_MODEL_H_
#define CHROME_BROWSER_TRANSLATE_OPTIONS_MENU_MODEL_H_
@@ -14,7 +14,7 @@ class TranslateInfoBarDelegate;
class OptionsMenuModel : public menus::SimpleMenuModel {
public:
explicit OptionsMenuModel(menus::SimpleMenuModel::Delegate* menu_delegate,
- TranslateInfoBarDelegate* translate_delegate, bool before_translate);
+ TranslateInfoBarDelegate* translate_delegate);
virtual ~OptionsMenuModel();
private:
diff --git a/chrome/browser/translate/translate_infobars_delegates.cc b/chrome/browser/translate/translate_infobars_delegates.cc
index 7bf2a4f..ed86b6c 100644
--- a/chrome/browser/translate/translate_infobars_delegates.cc
+++ b/chrome/browser/translate/translate_infobars_delegates.cc
@@ -32,6 +32,41 @@ void TranslateInfoBarDelegate::InfoBarClosed() {
// TranslateInfoBarDelegate: public: -------------------------------------------
+TranslateInfoBarDelegate::TranslateInfoBarDelegate(TabContents* tab_contents,
+ PrefService* user_prefs, TranslateState state, const GURL& url,
+ const std::string& original_lang_code, const std::string& target_lang_code)
+ : InfoBarDelegate(tab_contents),
+ tab_contents_(tab_contents),
+ prefs_(user_prefs),
+ state_(state),
+ site_(url.HostNoBrackets()),
+ original_lang_index_(-1),
+ target_lang_index_(-1),
+ never_translate_language_(false),
+ never_translate_site_(false),
+ always_translate_(false) {
+ TranslationService::GetSupportedLanguages(&supported_languages_);
+ for (size_t i = 0; i < supported_languages_.size(); ++i) {
+ if (original_lang_code == supported_languages_[i]) {
+ original_lang_index_ = i;
+ break;
+ }
+ }
+ DCHECK(original_lang_index_ > -1);
+ for (size_t i = 0; i < supported_languages_.size(); ++i) {
+ if (target_lang_code == supported_languages_[i]) {
+ target_lang_index_ = i;
+ break;
+ }
+ }
+ DCHECK(target_lang_index_ > -1);
+}
+
+void TranslateInfoBarDelegate::UpdateState(TranslateState new_state) {
+ if (state_ != new_state)
+ state_ = new_state;
+}
+
void TranslateInfoBarDelegate::ModifyOriginalLanguage(int lang_index) {
original_lang_index_ = lang_index;
// TODO(kuan): Send stats to Google Translate that original language has been
@@ -39,7 +74,7 @@ void TranslateInfoBarDelegate::ModifyOriginalLanguage(int lang_index) {
}
void TranslateInfoBarDelegate::ModifyTargetLanguage(int lang_index) {
- NOTREACHED() << "Subclass should override";
+ target_lang_index_ = lang_index;
}
void TranslateInfoBarDelegate::GetAvailableOriginalLanguages(
@@ -49,7 +84,7 @@ void TranslateInfoBarDelegate::GetAvailableOriginalLanguages(
void TranslateInfoBarDelegate::GetAvailableTargetLanguages(
std::vector<std::string>* languages) {
- NOTREACHED() << "Subclass should override";
+ TranslationService::GetSupportedLanguages(languages);
}
void TranslateInfoBarDelegate::Translate() {
@@ -58,30 +93,69 @@ void TranslateInfoBarDelegate::Translate() {
}
bool TranslateInfoBarDelegate::IsLanguageBlacklisted() {
- NOTREACHED() << "Subclass should override";
+ if (state_ == kBeforeTranslate) {
+ never_translate_language_ =
+ prefs_.IsLanguageBlacklisted(original_lang_code());
+ return never_translate_language_;
+ }
+ NOTREACHED() << "Invalid mehod called for translate state";
return false;
}
bool TranslateInfoBarDelegate::IsSiteBlacklisted() {
- NOTREACHED() << "Subclass should override";
+ if (state_ == kBeforeTranslate) {
+ never_translate_site_ = prefs_.IsSiteBlacklisted(site_);
+ return never_translate_site_;
+ }
+ NOTREACHED() << "Invalid mehod called for translate state";
return false;
}
bool TranslateInfoBarDelegate::ShouldAlwaysTranslate() {
- NOTREACHED() << "Subclass should override";
+ if (state_ == kAfterTranslate) {
+ always_translate_ = prefs_.IsLanguagePairWhitelisted(original_lang_code(),
+ target_lang_code());
+ return always_translate_;
+ }
+ NOTREACHED() << "Invalid mehod called for translate state";
return false;
}
void TranslateInfoBarDelegate::ToggleLanguageBlacklist() {
- NOTREACHED() << "Subclass should override";
+ if (state_ == kBeforeTranslate) {
+ never_translate_language_ = !never_translate_language_;
+ if (never_translate_language_)
+ prefs_.BlacklistLanguage(original_lang_code());
+ else
+ prefs_.RemoveLanguageFromBlacklist(original_lang_code());
+ } else {
+ NOTREACHED() << "Invalid mehod called for translate state";
+ }
}
void TranslateInfoBarDelegate::ToggleSiteBlacklist() {
- NOTREACHED() << "Subclass should override";
+ if (state_ == kBeforeTranslate) {
+ never_translate_site_ = !never_translate_site_;
+ if (never_translate_site_)
+ prefs_.BlacklistSite(site_);
+ else
+ prefs_.RemoveSiteFromBlacklist(site_);
+ } else {
+ NOTREACHED() << "Invalid mehod called for translate state";
+ }
}
void TranslateInfoBarDelegate::ToggleAlwaysTranslate() {
- NOTREACHED() << "Subclass should override";
+ if (state_ == kAfterTranslate) {
+ always_translate_ = !always_translate_;
+ if (always_translate_)
+ prefs_.WhitelistLanguagePair(original_lang_code(), target_lang_code());
+ else
+ prefs_.RemoveLanguagePairFromWhitelist(original_lang_code(),
+ target_lang_code());
+ } else {
+ NOTREACHED() << "Invalid mehod called for translate state";
+ }
}
// TranslateInfoBarDelegate: static: -------------------------------------------
@@ -92,113 +166,10 @@ string16 TranslateInfoBarDelegate::GetDisplayNameForLocale(
language_code, g_browser_process->GetApplicationLocale(), true);
}
-// TranslateInfoBarDelegate: protected: ----------------------------------------
-
-TranslateInfoBarDelegate::TranslateInfoBarDelegate(TabContents* tab_contents,
- PrefService* user_prefs, const std::string& original_lang_code,
- const std::string& target_lang_code)
- : InfoBarDelegate(tab_contents),
- tab_contents_(tab_contents),
- original_lang_index_(0),
- target_lang_index_(0),
- prefs_(user_prefs) {
- TranslationService::GetSupportedLanguages(&supported_languages_);
- for (size_t i = 0; i < supported_languages_.size(); ++i) {
- if (original_lang_code == supported_languages_[i]) {
- original_lang_index_ = i;
- break;
- }
- }
- for (size_t i = 0; i < supported_languages_.size(); ++i) {
- if (target_lang_code == supported_languages_[i]) {
- target_lang_index_ = i;
- break;
- }
- }
-}
-
-// BeforeTranslateInfoBarDelegate: public: -------------------------------------
-
-BeforeTranslateInfoBarDelegate::BeforeTranslateInfoBarDelegate(
- TabContents* tab_contents, PrefService* user_prefs, const GURL& url,
- const std::string& original_lang_code, const std::string& target_lang_code)
- : TranslateInfoBarDelegate(tab_contents, user_prefs, original_lang_code,
- target_lang_code),
- site_(url.HostNoBrackets()),
- never_translate_language_(false),
- never_translate_site_(false) {
-}
-
-bool BeforeTranslateInfoBarDelegate::IsLanguageBlacklisted() {
- never_translate_language_ =
- prefs_.IsLanguageBlacklisted(original_lang_code());
- return never_translate_language_;
-}
-
-void BeforeTranslateInfoBarDelegate::ToggleLanguageBlacklist() {
- never_translate_language_ = !never_translate_language_;
- if (never_translate_language_)
- prefs_.BlacklistLanguage(original_lang_code());
- else
- prefs_.RemoveLanguageFromBlacklist(original_lang_code());
-}
-
-bool BeforeTranslateInfoBarDelegate::IsSiteBlacklisted() {
- never_translate_site_ = prefs_.IsSiteBlacklisted(site_);
- return never_translate_site_;
-}
-
-void BeforeTranslateInfoBarDelegate::ToggleSiteBlacklist() {
- never_translate_site_ = !never_translate_site_;
- if (never_translate_site_)
- prefs_.BlacklistSite(site_);
- else
- prefs_.RemoveSiteFromBlacklist(site_);
-}
-
#if !defined(TOOLKIT_VIEWS)
-InfoBar* BeforeTranslateInfoBarDelegate::CreateInfoBar() {
- NOTIMPLEMENTED();
- return NULL;
-}
-#endif // !TOOLKIT_VIEWS
-
-// AfterTranslateInfoBarDelegate: public: --------------------------------------
-
-AfterTranslateInfoBarDelegate::AfterTranslateInfoBarDelegate(
- TabContents* tab_contents, PrefService* user_prefs,
- const std::string& original_lang_code, const std::string& target_lang_code)
- : TranslateInfoBarDelegate(tab_contents, user_prefs, original_lang_code,
- target_lang_code),
- always_translate_(false) {
-}
-
-void AfterTranslateInfoBarDelegate::GetAvailableTargetLanguages(
- std::vector<std::string>* languages) {
- TranslationService::GetSupportedLanguages(languages);
-}
-
-void AfterTranslateInfoBarDelegate::ModifyTargetLanguage(int lang_index) {
- target_lang_index_ = lang_index;
-}
-
-bool AfterTranslateInfoBarDelegate::ShouldAlwaysTranslate() {
- always_translate_ = prefs_.IsLanguagePairWhitelisted(original_lang_code(),
- target_lang_code());
- return always_translate_;
-}
-
-void AfterTranslateInfoBarDelegate::ToggleAlwaysTranslate() {
- always_translate_ = !always_translate_;
- if (always_translate_)
- prefs_.WhitelistLanguagePair(original_lang_code(), target_lang_code());
- else
- prefs_.RemoveLanguagePairFromWhitelist(original_lang_code(),
- target_lang_code());
-}
+// TranslateInfoBarDelegate: InfoBarDelegate overrides: ------------------------
-#if !defined(TOOLKIT_VIEWS)
-InfoBar* AfterTranslateInfoBarDelegate::CreateInfoBar() {
+InfoBar* TranslateInfoBarDelegate::CreateInfoBar() {
NOTIMPLEMENTED();
return NULL;
}
diff --git a/chrome/browser/translate/translate_infobars_delegates.h b/chrome/browser/translate/translate_infobars_delegates.h
index 5b10f3f..311b847 100644
--- a/chrome/browser/translate/translate_infobars_delegates.h
+++ b/chrome/browser/translate/translate_infobars_delegates.h
@@ -14,19 +14,29 @@ class SkBitmap;
// translate infobars.
class TranslateInfoBarDelegate : public InfoBarDelegate {
public:
- virtual void GetAvailableOriginalLanguages(
- std::vector<std::string>* languages);
- virtual void GetAvailableTargetLanguages(
- std::vector<std::string>* languages);
- virtual void ModifyOriginalLanguage(int lang_index);
- virtual void ModifyTargetLanguage(int lang_index);
- virtual void Translate();
- virtual bool IsLanguageBlacklisted();
- virtual void ToggleLanguageBlacklist();
- virtual bool IsSiteBlacklisted();
- virtual void ToggleSiteBlacklist();
- virtual bool ShouldAlwaysTranslate();
- virtual void ToggleAlwaysTranslate();
+ enum TranslateState {
+ kBeforeTranslate = 1,
+ kTranslating,
+ kAfterTranslate,
+ kTranslationFailed,
+ };
+
+ TranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs,
+ TranslateState state, const GURL& url,
+ const std::string& original_language, const std::string& target_language);
+
+ void UpdateState(TranslateState new_state);
+ void GetAvailableOriginalLanguages(std::vector<std::string>* languages);
+ void GetAvailableTargetLanguages(std::vector<std::string>* languages);
+ void ModifyOriginalLanguage(int lang_index);
+ void ModifyTargetLanguage(int lang_index);
+ void Translate();
+ bool IsLanguageBlacklisted();
+ void ToggleLanguageBlacklist();
+ bool IsSiteBlacklisted();
+ void ToggleSiteBlacklist();
+ bool ShouldAlwaysTranslate();
+ void ToggleAlwaysTranslate();
int original_lang_index() const {
return original_lang_index_;
@@ -46,77 +56,41 @@ class TranslateInfoBarDelegate : public InfoBarDelegate {
TabContents* tab_contents() const {
return tab_contents_;
}
+ TranslateState state() const {
+ return state_;
+ }
// Overridden from InfoBarDelegate.
virtual Type GetInfoBarType() {
return PAGE_ACTION_TYPE;
}
virtual SkBitmap* GetIcon() const;
- virtual bool EqualsDelegate(InfoBarDelegate* delegate) const;
virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate() {
return this;
}
+ virtual bool EqualsDelegate(InfoBarDelegate* delegate) const;
virtual void InfoBarClosed();
// Returns the printable version of the language code |language_code|.
static string16 GetDisplayNameForLocale(const std::string& language_code);
- protected:
- TranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs,
- const std::string& original_language, const std::string& target_language);
+ // Overridden from InfoBarDelegate:
+ virtual InfoBar* CreateInfoBar();
+ private:
TabContents* tab_contents_; // Weak.
+ TranslatePrefs prefs_;
+ TranslateState state_;
+ std::string site_;
int original_lang_index_;
int target_lang_index_;
- TranslatePrefs prefs_;
// The list of languages supported.
std::vector<std::string> supported_languages_;
-
- DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate);
-};
-
-class BeforeTranslateInfoBarDelegate : public TranslateInfoBarDelegate {
- public:
- BeforeTranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs,
- const GURL& url, const std::string& original_language,
- const std::string& target_language);
-
- // Overriden from TranslateInfoBarDelegate:
- virtual bool IsLanguageBlacklisted();
- virtual void ToggleLanguageBlacklist();
- virtual bool IsSiteBlacklisted();
- virtual void ToggleSiteBlacklist();
-
- // Overridden from InfoBarDelegate:
- virtual InfoBar* CreateInfoBar();
-
- private:
- std::string site_;
bool never_translate_language_;
bool never_translate_site_;
-
- DISALLOW_COPY_AND_ASSIGN(BeforeTranslateInfoBarDelegate);
-};
-
-class AfterTranslateInfoBarDelegate : public TranslateInfoBarDelegate {
- public:
- AfterTranslateInfoBarDelegate(TabContents* contents, PrefService* user_prefs,
- const std::string& original_language, const std::string& target_language);
-
- // Overriden from TranslateInfoBar:
- virtual void GetAvailableTargetLanguages(
- std::vector<std::string>* languages);
- virtual void ModifyTargetLanguage(int lang_index);
- virtual bool ShouldAlwaysTranslate();
- virtual void ToggleAlwaysTranslate();
-
- // Overridden from InfoBarDelegate:
- virtual InfoBar* CreateInfoBar();
-
- private:
bool always_translate_;
- DISALLOW_COPY_AND_ASSIGN(AfterTranslateInfoBarDelegate);
+ DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate);
};
#endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_INFOBARS_DELEGATES_H_
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
index 4022187..2398cca 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -44,15 +44,29 @@ void TranslateManager::Observe(NotificationType type,
break;
}
case NotificationType::PAGE_TRANSLATED: {
+ // Only add translate infobar if it doesn't exist; if it already exists,
+ // it would have received the same notification and acted accordingly.
TabContents* tab = Source<TabContents>(source).ptr();
- std::pair<std::string, std::string>* language_pair =
- (Details<std::pair<std::string, std::string> >(details).ptr());
- PrefService* prefs = GetPrefService(tab);
- tab->AddInfoBar(new AfterTranslateInfoBarDelegate(tab, prefs,
- language_pair->first,
- language_pair->second));
+ int i;
+ for (i = 0; i < tab->infobar_delegate_count(); ++i) {
+ InfoBarDelegate* info_bar = tab->GetInfoBarDelegateAt(i);
+ if (info_bar->AsTranslateInfoBarDelegate())
+ break;
+ }
+ if (i == tab->infobar_delegate_count()) {
+ NavigationEntry* entry = tab->controller().GetActiveEntry();
+ if (entry) {
+ std::pair<std::string, std::string>* language_pair =
+ (Details<std::pair<std::string, std::string> >(details).ptr());
+ PrefService* prefs = GetPrefService(tab);
+ tab->AddInfoBar(new TranslateInfoBarDelegate(tab, prefs,
+ TranslateInfoBarDelegate::kAfterTranslate, entry->url(),
+ language_pair->first, language_pair->second));
+ }
+ }
break;
}
+
default:
NOTREACHED();
}
@@ -113,9 +127,9 @@ void TranslateManager::InitiateTranslation(TabContents* tab,
}
// Prompts the user if he/she wants the page translated.
- tab->AddInfoBar(new BeforeTranslateInfoBarDelegate(tab, prefs,
- entry->url(),
- page_lang, ui_lang));
+ tab->AddInfoBar(new TranslateInfoBarDelegate(tab, prefs,
+ TranslateInfoBarDelegate::kBeforeTranslate, entry->url(),
+ page_lang, ui_lang));
}
PrefService* TranslateManager::GetPrefService(TabContents* tab) {