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