Home | History | Annotate | Download | only in browser
      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.
     66   size_t num_languages() const { return ui_delegate_.GetNumberOfLanguages(); }
     67 
     68   // Returns the ISO code for the language at |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|.
     74   base::string16 language_name_at(size_t index) const {
     75     return ui_delegate_.GetLanguageNameAt(index);
     76   }
     77 
     78   translate::TranslateStep translate_step() const { return step_; }
     79 
     80   bool is_off_the_record() { return is_off_the_record_; }
     81 
     82   TranslateErrors::Type error_type() const { return error_type_; }
     83 
     84   size_t original_language_index() const {
     85     return ui_delegate_.GetOriginalLanguageIndex();
     86   }
     87   void UpdateOriginalLanguageIndex(size_t language_index);
     88 
     89   size_t target_language_index() const {
     90     return ui_delegate_.GetTargetLanguageIndex();
     91   }
     92   void UpdateTargetLanguageIndex(size_t language_index);
     93 
     94   // Convenience methods.
     95   std::string original_language_code() const {
     96     return ui_delegate_.GetOriginalLanguageCode();
     97   }
     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).
    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.
    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.
    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