• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 
5 #ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_INFOBAR_DELEGATE_H_
6 #define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_INFOBAR_DELEGATE_H_
7 
8 #include <string>
9 #include <utility>
10 #include <vector>
11 
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/weak_ptr.h"
15 #include "components/infobars/core/infobar_delegate.h"
16 #include "components/translate/core/browser/translate_prefs.h"
17 #include "components/translate/core/browser/translate_step.h"
18 #include "components/translate/core/browser/translate_ui_delegate.h"
19 #include "components/translate/core/common/translate_constants.h"
20 #include "components/translate/core/common/translate_errors.h"
21 
22 class TranslateClient;
23 class TranslateDriver;
24 class TranslateManager;
25 
26 namespace infobars {
27 class InfoBarManager;
28 }
29 
30 class TranslateInfoBarDelegate : public infobars::InfoBarDelegate {
31  public:
32   // The types of background color animations.
33   enum BackgroundAnimationType {
34     NONE,
35     NORMAL_TO_ERROR,
36     ERROR_TO_NORMAL
37   };
38 
39   static const size_t kNoIndex;
40 
41   virtual ~TranslateInfoBarDelegate();
42 
43   // Factory method to create a translate infobar.  |error_type| must be
44   // specified iff |step| == TRANSLATION_ERROR.  For other translate steps,
45   // |original_language| and |target_language| must be ASCII language codes
46   // (e.g. "en", "fr", etc.) for languages the TranslateManager supports
47   // translating.  The lone exception is when the user initiates translation
48   // from the context menu, in which case it's legal to call this with
49   // |step| == TRANSLATING and |original_language| == kUnknownLanguageCode.
50   //
51   // If |replace_existing_infobar| is true, the infobar is created and added to
52   // the infobar manager, replacing any other translate infobar already present
53   // there.  Otherwise, the infobar will only be added if there is no other
54   // translate infobar already present.
55   static void Create(bool replace_existing_infobar,
56                      const base::WeakPtr<TranslateManager>& translate_manager,
57                      infobars::InfoBarManager* infobar_manager,
58                      bool is_off_the_record,
59                      translate::TranslateStep step,
60                      const std::string& original_language,
61                      const std::string& target_language,
62                      TranslateErrors::Type error_type,
63                      bool triggered_from_menu);
64 
65   // Returns the number of languages supported.
num_languages()66   size_t num_languages() const { return ui_delegate_.GetNumberOfLanguages(); }
67 
68   // Returns the ISO code for the language at |index|.
language_code_at(size_t index)69   std::string language_code_at(size_t index) const {
70     return ui_delegate_.GetLanguageCodeAt(index);
71   }
72 
73   // Returns the displayable name for the language at |index|.
language_name_at(size_t index)74   base::string16 language_name_at(size_t index) const {
75     return ui_delegate_.GetLanguageNameAt(index);
76   }
77 
translate_step()78   translate::TranslateStep translate_step() const { return step_; }
79 
is_off_the_record()80   bool is_off_the_record() { return is_off_the_record_; }
81 
error_type()82   TranslateErrors::Type error_type() const { return error_type_; }
83 
original_language_index()84   size_t original_language_index() const {
85     return ui_delegate_.GetOriginalLanguageIndex();
86   }
87   void UpdateOriginalLanguageIndex(size_t language_index);
88 
target_language_index()89   size_t target_language_index() const {
90     return ui_delegate_.GetTargetLanguageIndex();
91   }
92   void UpdateTargetLanguageIndex(size_t language_index);
93 
94   // Convenience methods.
original_language_code()95   std::string original_language_code() const {
96     return ui_delegate_.GetOriginalLanguageCode();
97   }
target_language_code()98   std::string target_language_code() const {
99     return ui_delegate_.GetTargetLanguageCode();
100   }
101 
102   // Returns true if the current infobar indicates an error (in which case it
103   // should get a yellow background instead of a blue one).
is_error()104   bool is_error() const {
105     return step_ == translate::TRANSLATE_STEP_TRANSLATE_ERROR;
106   }
107 
108   // Return true if the translation was triggered by a menu entry instead of
109   // via an infobar/bubble or preference.
triggered_from_menu()110   bool triggered_from_menu() const {
111     return triggered_from_menu_;
112   }
113 
114   // Returns what kind of background fading effect the infobar should use when
115   // its is shown.
background_animation_type()116   BackgroundAnimationType background_animation_type() const {
117     return background_animation_;
118   }
119 
120   virtual void Translate();
121   virtual void RevertTranslation();
122   void ReportLanguageDetectionError();
123 
124   // Called when the user declines to translate a page, by either closing the
125   // infobar or pressing the "Don't translate" button.
126   virtual void TranslationDeclined();
127 
128   // Methods called by the Options menu delegate.
129   virtual bool IsTranslatableLanguageByPrefs();
130   virtual void ToggleTranslatableLanguageByPrefs();
131   virtual bool IsSiteBlacklisted();
132   virtual void ToggleSiteBlacklist();
133   virtual bool ShouldAlwaysTranslate();
134   virtual void ToggleAlwaysTranslate();
135 
136   // Methods called by the extra-buttons that can appear on the "before
137   // translate" infobar (when the user has accepted/declined the translation
138   // several times).
139   void AlwaysTranslatePageLanguage();
140   void NeverTranslatePageLanguage();
141 
142   // The following methods are called by the infobar that displays the status
143   // while translating and also the one displaying the error message.
144   base::string16 GetMessageInfoBarText();
145   base::string16 GetMessageInfoBarButtonText();
146   void MessageInfoBarButtonPressed();
147   bool ShouldShowMessageInfoBarButton();
148 
149   // Called by the before translate infobar to figure-out if it should show
150   // an extra shortcut to let the user black-list/white-list that language
151   // (based on how many times the user accepted/declined translation).
152   // The shortcut itself is platform specific, it can be a button or a new bar
153   // for example.
154   bool ShouldShowNeverTranslateShortcut();
155   bool ShouldShowAlwaysTranslateShortcut();
156 
157   // Adds the strings that should be displayed in the after translate infobar to
158   // |strings|. If |autodetermined_source_language| is false, the text in that
159   // infobar is:
160   // "The page has been translated from <lang1> to <lang2>."
161   // Otherwise:
162   // "The page has been translated to <lang1>."
163   // Because <lang1>, or <lang1> and <lang2> are displayed in menu buttons, the
164   // text is split in 2 or 3 chunks. |swap_languages| is set to true if
165   // |autodetermined_source_language| is false, and <lang1> and <lang2>
166   // should be inverted (some languages express the sentense as "The page has
167   // been translate to <lang2> from <lang1>."). It is ignored if
168   // |autodetermined_source_language| is true.
169   static void GetAfterTranslateStrings(std::vector<base::string16>* strings,
170                                        bool* swap_languages,
171                                        bool autodetermined_source_language);
172 
173   // Gets the TranslateDriver associated with this object.
174   // May return NULL if the driver has been destroyed.
175   TranslateDriver* GetTranslateDriver();
176 
177  protected:
178   TranslateInfoBarDelegate(
179       const base::WeakPtr<TranslateManager>& translate_manager,
180       bool is_off_the_record,
181       translate::TranslateStep step,
182       TranslateInfoBarDelegate* old_delegate,
183       const std::string& original_language,
184       const std::string& target_language,
185       TranslateErrors::Type error_type,
186       bool triggered_from_menu);
187 
188  private:
189   friend class TranslationInfoBarTest;
190   typedef std::pair<std::string, base::string16> LanguageNamePair;
191 
192   // InfoBarDelegate:
193   virtual void InfoBarDismissed() OVERRIDE;
194   virtual int GetIconID() const OVERRIDE;
195   virtual infobars::InfoBarDelegate::Type GetInfoBarType() const OVERRIDE;
196   virtual bool ShouldExpire(const NavigationDetails& details) const OVERRIDE;
197   virtual TranslateInfoBarDelegate* AsTranslateInfoBarDelegate() OVERRIDE;
198 
199   bool is_off_the_record_;
200   translate::TranslateStep step_;
201 
202   // The type of fading animation if any that should be used when showing this
203   // infobar.
204   BackgroundAnimationType background_animation_;
205 
206   TranslateUIDelegate ui_delegate_;
207   base::WeakPtr<TranslateManager> translate_manager_;
208 
209   // The error that occurred when trying to translate (NONE if no error).
210   TranslateErrors::Type error_type_;
211 
212   // The translation related preferences.
213   scoped_ptr<TranslatePrefs> prefs_;
214 
215   // Whether the translation was triggered via a menu click vs automatically
216   // (due to language detection, preferences...)
217   bool triggered_from_menu_;
218   DISALLOW_COPY_AND_ASSIGN(TranslateInfoBarDelegate);
219 };
220 
221 #endif  // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_INFOBAR_DELEGATE_H_
222