Home | History | Annotate | Download | only in translate
      1 // Copyright (c) 2012 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 CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
      6 #define CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/gtest_prod_util.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/memory/weak_ptr.h"
     15 #include "base/observer_list.h"
     16 #include "base/time/time.h"
     17 #include "chrome/browser/ui/translate/translate_bubble_model.h"
     18 #include "chrome/common/translate/translate_errors.h"
     19 #include "content/public/browser/notification_observer.h"
     20 #include "content/public/browser/notification_registrar.h"
     21 
     22 template <typename T> struct DefaultSingletonTraits;
     23 class GURL;
     24 struct LanguageDetectionDetails;
     25 struct PageTranslatedDetails;
     26 class PrefService;
     27 class Profile;
     28 struct ShortcutConfiguration;
     29 class TranslateAcceptLanguages;
     30 struct TranslateErrorDetails;
     31 struct TranslateEventDetails;
     32 class TranslateInfoBarDelegate;
     33 class TranslateLanguageList;
     34 class TranslateScript;
     35 
     36 namespace content {
     37 class WebContents;
     38 }
     39 
     40 namespace net {
     41 class URLFetcher;
     42 }
     43 
     44 // The TranslateManager class is responsible for showing an info-bar when a page
     45 // in a language different than the user language is loaded.  It triggers the
     46 // page translation the user requests.
     47 // It is a singleton.
     48 
     49 class TranslateManager : public content::NotificationObserver {
     50  public:
     51   // Returns the singleton instance.
     52   static TranslateManager* GetInstance();
     53 
     54   virtual ~TranslateManager();
     55 
     56   // Returns true if the URL can be translated.
     57   static bool IsTranslatableURL(const GURL& url);
     58 
     59   // Fills |languages| with the list of languages that the translate server can
     60   // translate to and from.
     61   static void GetSupportedLanguages(std::vector<std::string>* languages);
     62 
     63   // Returns the last-updated time when Chrome receives a language list from a
     64   // Translate server. Returns null time if Chrome hasn't received any lists.
     65   static base::Time GetSupportedLanguagesLastUpdated();
     66 
     67   // Returns the language code that can be used with the Translate method for a
     68   // specified |chrome_locale|.
     69   static std::string GetLanguageCode(const std::string& chrome_locale);
     70 
     71   // Returns true if |language| is supported by the translation server.
     72   static bool IsSupportedLanguage(const std::string& language);
     73 
     74   // Returns true if |language| is supported by the translation server as a
     75   // alpha language.
     76   static bool IsAlphaLanguage(const std::string& language);
     77 
     78   // Returns true if |language| is an Accept language for the user profile.
     79   static bool IsAcceptLanguage(Profile* profile, const std::string& language);
     80 
     81   // Returns the language to translate to. The language returned is the
     82   // first language found in the following list that is supported by the
     83   // translation service:
     84   //     the UI language
     85   //     the accept-language list
     86   // If no language is found then an empty string is returned.
     87   static std::string GetTargetLanguage(PrefService* prefs);
     88 
     89   // Returns the language to automatically translate to. |original_language| is
     90   // the webpage's original language.
     91   static std::string GetAutoTargetLanguage(const std::string& original_language,
     92                                            PrefService* prefs);
     93 
     94   // Returns true if the new translate bubble is enabled.
     95   static bool IsTranslateBubbleEnabled();
     96 
     97   // Let the caller decide if and when we should fetch the language list from
     98   // the translate server. This is a NOOP if switches::kDisableTranslate is set
     99   // or if prefs::kEnableTranslate is set to false.
    100   void FetchLanguageListFromTranslateServer(PrefService* prefs);
    101 
    102   // Allows caller to cleanup pending URLFetcher objects to make sure they
    103   // get released in the appropriate thread... Mainly for tests.
    104   void CleanupPendingUlrFetcher();
    105 
    106   // Translates the page contents from |source_lang| to |target_lang|.
    107   // The actual translation might be performed asynchronously if the translate
    108   // script is not yet available.
    109   void TranslatePage(content::WebContents* web_contents,
    110                      const std::string& source_lang,
    111                      const std::string& target_lang);
    112 
    113   // Reverts the contents of the page in |web_contents| to its original
    114   // language.
    115   void RevertTranslation(content::WebContents* web_contents);
    116 
    117   // Reports to the Google translate server that a page language was incorrectly
    118   // detected.  This call is initiated by the user selecting the "report" menu
    119   // under options in the translate infobar.
    120   void ReportLanguageDetectionError(content::WebContents* web_contents);
    121 
    122   // Clears the translate script, so it will be fetched next time we translate.
    123   void ClearTranslateScript();
    124 
    125   // content::NotificationObserver implementation:
    126   virtual void Observe(int type,
    127                        const content::NotificationSource& source,
    128                        const content::NotificationDetails& details) OVERRIDE;
    129 
    130   // Used by unit-tests to override some defaults:
    131   // Delay after which the translate script is fetched again from the
    132   // translation server.
    133   void SetTranslateScriptExpirationDelay(int delay_ms);
    134 
    135   // Number of attempts before waiting for a page to be fully reloaded.
    136   void set_translate_max_reload_attemps(int attempts) {
    137     max_reload_check_attempts_ = attempts;
    138   }
    139 
    140   // The observer class for TranslateManager.
    141   class Observer {
    142    public:
    143     virtual void OnLanguageDetection(
    144         const LanguageDetectionDetails& details) = 0;
    145     virtual void OnTranslateError(
    146         const TranslateErrorDetails& details) = 0;
    147     virtual void OnTranslateEvent(
    148         const TranslateEventDetails& details) = 0;
    149   };
    150 
    151   // Adds/removes observer.
    152   void AddObserver(Observer* obs);
    153   void RemoveObserver(Observer* obs);
    154 
    155   // Notifies to the observers when translate event happens.
    156   void NotifyTranslateEvent(const TranslateEventDetails& details);
    157 
    158  protected:
    159   TranslateManager();
    160 
    161  private:
    162   friend struct DefaultSingletonTraits<TranslateManager>;
    163 
    164   // Structure that describes a translate request.
    165   // Translation may be deferred while the translate script is being retrieved
    166   // from the translate server.
    167   struct PendingRequest {
    168     int render_process_id;
    169     int render_view_id;
    170     int page_id;
    171     std::string source_lang;
    172     std::string target_lang;
    173   };
    174 
    175   // Starts the translation process on |tab| containing the page in the
    176   // |page_lang| language.
    177   void InitiateTranslation(content::WebContents* web_contents,
    178                            const std::string& page_lang);
    179 
    180   // If the tab identified by |process_id| and |render_id| has been closed, this
    181   // does nothing, otherwise it calls InitiateTranslation.
    182   void InitiateTranslationPosted(int process_id, int render_id,
    183                                  const std::string& page_lang, int attempt);
    184 
    185   // Sends a translation request to the RenderView of |web_contents|.
    186   void DoTranslatePage(content::WebContents* web_contents,
    187                        const std::string& translate_script,
    188                        const std::string& source_lang,
    189                        const std::string& target_lang);
    190 
    191   // Shows the after translate or error infobar depending on the details.
    192   void PageTranslated(content::WebContents* web_contents,
    193                       PageTranslatedDetails* details);
    194 
    195   void OnTranslateScriptFetchComplete(bool success, const std::string& data);
    196 
    197   // Notifies to the observers when a language is detected.
    198   void NotifyLanguageDetection(const LanguageDetectionDetails& details);
    199 
    200   // Notifies to the observers when translate failed.
    201   void NotifyTranslateError(const TranslateErrorDetails& details);
    202 
    203   // Shows the translate bubble.
    204   void ShowBubble(content::WebContents* web_contents,
    205                   TranslateBubbleModel::ViewState view_state,
    206                   TranslateErrors::Type error_type);
    207 
    208   // Returns the different parameters used to decide whether extra shortcuts
    209   // are needed.
    210   static ShortcutConfiguration ShortcutConfig();
    211 
    212   content::NotificationRegistrar notification_registrar_;
    213 
    214   // Max number of attempts before checking if a page has been reloaded.
    215   int max_reload_check_attempts_;
    216 
    217   // The list of pending translate requests.  Translate requests are queued when
    218   // the translate script is not ready and has to be fetched from the translate
    219   // server.
    220   std::vector<PendingRequest> pending_requests_;
    221 
    222   // List of registered observers.
    223   ObserverList<Observer> observer_list_;
    224 
    225   // An instance of TranslateLanguageList which manages supported language list.
    226   scoped_ptr<TranslateLanguageList> language_list_;
    227 
    228   // An instance of TranslateScript which manages JavaScript source for
    229   // Translate.
    230   scoped_ptr<TranslateScript> script_;
    231 
    232   // An instance of TranslateAcceptLanguages which manages Accept languages of
    233   // each profiles.
    234   scoped_ptr<TranslateAcceptLanguages> accept_languages_;
    235 
    236   base::WeakPtrFactory<TranslateManager> weak_method_factory_;
    237 
    238   DISALLOW_COPY_AND_ASSIGN(TranslateManager);
    239 };
    240 
    241 #endif  // CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
    242