1 // Copyright (c) 2011 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 #pragma once 8 9 #include <map> 10 #include <set> 11 #include <string> 12 #include <vector> 13 14 #include "base/lazy_instance.h" 15 #include "base/task.h" 16 #include "chrome/browser/prefs/pref_change_registrar.h" 17 #include "chrome/common/net/url_fetcher.h" 18 #include "chrome/common/translate_errors.h" 19 #include "content/common/notification_observer.h" 20 #include "content/common/notification_registrar.h" 21 22 template <typename T> struct DefaultSingletonTraits; 23 class GURL; 24 struct PageTranslatedDetails; 25 class PrefService; 26 class TabContents; 27 class TranslateInfoBarDelegate; 28 29 // The TranslateManager class is responsible for showing an info-bar when a page 30 // in a language different than the user language is loaded. It triggers the 31 // page translation the user requests. 32 // It is a singleton. 33 34 class TranslateManager : public NotificationObserver, 35 public URLFetcher::Delegate { 36 public: 37 // Returns the singleton instance. 38 static TranslateManager* GetInstance(); 39 40 virtual ~TranslateManager(); 41 42 // Translates the page contents from |source_lang| to |target_lang|. 43 // The actual translation might be performed asynchronously if the translate 44 // script is not yet available. 45 void TranslatePage(TabContents* tab_contents, 46 const std::string& source_lang, 47 const std::string& target_lang); 48 49 // Reverts the contents of the page in |tab_contents| to its original 50 // language. 51 void RevertTranslation(TabContents* tab_contents); 52 53 // Reports to the Google translate server that a page language was incorrectly 54 // detected. This call is initiated by the user selecting the "report" menu 55 // under options in the translate infobar. 56 void ReportLanguageDetectionError(TabContents* tab_contents); 57 58 // Clears the translate script, so it will be fetched next time we translate. ClearTranslateScript()59 void ClearTranslateScript() { translate_script_.clear(); } 60 61 // NotificationObserver implementation: 62 virtual void Observe(NotificationType type, 63 const NotificationSource& source, 64 const NotificationDetails& details); 65 66 // URLFetcher::Delegate implementation: 67 virtual void OnURLFetchComplete(const URLFetcher* source, 68 const GURL& url, 69 const net::URLRequestStatus& status, 70 int response_code, 71 const ResponseCookies& cookies, 72 const std::string& data); 73 74 // Used by unit-tests to override the default delay after which the translate 75 // script is fetched again from the translation server. set_translate_script_expiration_delay(int delay_ms)76 void set_translate_script_expiration_delay(int delay_ms) { 77 translate_script_expiration_delay_ = delay_ms; 78 } 79 80 // Convenience method to know if a tab is showing a translate infobar. 81 static bool IsShowingTranslateInfobar(TabContents* tab); 82 83 // Returns true if the URL can be translated. 84 static bool IsTranslatableURL(const GURL& url); 85 86 // Fills |languages| with the list of languages that the translate server can 87 // translate to and from. 88 static void GetSupportedLanguages(std::vector<std::string>* languages); 89 90 // Returns the language code that can be used with the Translate method for a 91 // specified |chrome_locale|. 92 static std::string GetLanguageCode(const std::string& chrome_locale); 93 94 // Returns true if |language| is supported by the translation server. 95 static bool IsSupportedLanguage(const std::string& language); 96 97 protected: 98 TranslateManager(); 99 100 private: 101 friend struct DefaultSingletonTraits<TranslateManager>; 102 103 // Structure that describes a translate request. 104 // Translation may be deferred while the translate script is being retrieved 105 // from the translate server. 106 struct PendingRequest { 107 int render_process_id; 108 int render_view_id; 109 int page_id; 110 std::string source_lang; 111 std::string target_lang; 112 }; 113 114 // Starts the translation process on |tab| containing the page in the 115 // |page_lang| language. 116 void InitiateTranslation(TabContents* tab, const std::string& page_lang); 117 118 // If the tab identified by |process_id| and |render_id| has been closed, this 119 // does nothing, otherwise it calls InitiateTranslation. 120 void InitiateTranslationPosted(int process_id, 121 int render_id, 122 const std::string& page_lang); 123 124 // Sends a translation request to the RenderView of |tab_contents|. 125 void DoTranslatePage(TabContents* tab_contents, 126 const std::string& translate_script, 127 const std::string& source_lang, 128 const std::string& target_lang); 129 130 // Shows the after translate or error infobar depending on the details. 131 void PageTranslated(TabContents* tab, PageTranslatedDetails* details); 132 133 // Returns true if the passed language has been configured by the user as an 134 // accept language. 135 bool IsAcceptLanguage(TabContents* tab, const std::string& language); 136 137 // Initializes the |accept_languages_| language table based on the associated 138 // preference in |prefs|. 139 void InitAcceptLanguages(PrefService* prefs); 140 141 // Fetches the JS translate script (the script that is injected in the page 142 // to translate it). 143 void RequestTranslateScript(); 144 145 // Shows the specified translate |infobar| in the given |tab|. If a current 146 // translate infobar is showing, it just replaces it with the new one. 147 void ShowInfoBar(TabContents* tab, TranslateInfoBarDelegate* infobar); 148 149 // Returns the language to translate to, which is the language the UI is 150 // configured in. Returns an empty string if that language is not supported 151 // by the translation service. 152 static std::string GetTargetLanguage(); 153 154 // Returns the translate info bar showing in |tab| or NULL if none is showing. 155 static TranslateInfoBarDelegate* GetTranslateInfoBarDelegate( 156 TabContents* tab); 157 158 NotificationRegistrar notification_registrar_; 159 PrefChangeRegistrar pref_change_registrar_; 160 161 // A map that associates a profile with its parsed "accept languages". 162 typedef std::set<std::string> LanguageSet; 163 typedef std::map<PrefService*, LanguageSet> PrefServiceLanguagesMap; 164 PrefServiceLanguagesMap accept_languages_; 165 166 ScopedRunnableMethodFactory<TranslateManager> method_factory_; 167 168 // The JS injected in the page to do the translation. 169 std::string translate_script_; 170 171 // Delay in milli-seconds after which the translate script is fetched again 172 // from the translate server. 173 int translate_script_expiration_delay_; 174 175 // Whether the translate JS is currently being retrieved. 176 bool translate_script_request_pending_; 177 178 // The list of pending translate requests. Translate requests are queued when 179 // the translate script is not ready and has to be fetched from the translate 180 // server. 181 std::vector<PendingRequest> pending_requests_; 182 183 // The languages supported by the translation server. 184 static base::LazyInstance<std::set<std::string> > supported_languages_; 185 186 DISALLOW_COPY_AND_ASSIGN(TranslateManager); 187 }; 188 189 #endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_ 190