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.
5 #ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
6 #define CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_
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 "components/translate/core/common/translate_errors.h"
19 #include "content/public/browser/notification_observer.h"
20 #include "content/public/browser/notification_registrar.h"
22 template <typename T
> struct DefaultSingletonTraits
;
24 struct LanguageDetectionDetails
;
25 struct PageTranslatedDetails
;
28 struct ShortcutConfiguration
;
29 class TranslateAcceptLanguages
;
30 struct TranslateErrorDetails
;
31 struct TranslateEventDetails
;
32 class TranslateInfoBarDelegate
;
33 class TranslateLanguageList
;
34 class TranslateScript
;
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.
49 class TranslateManager
: public content::NotificationObserver
{
51 // Returns the singleton instance.
52 static TranslateManager
* GetInstance();
54 virtual ~TranslateManager();
56 // Returns true if the URL can be translated.
57 static bool IsTranslatableURL(const GURL
& url
);
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
);
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();
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
);
71 // Returns true if |language| is supported by the translation server.
72 static bool IsSupportedLanguage(const std::string
& language
);
74 // Returns true if |language| is supported by the translation server as a
76 static bool IsAlphaLanguage(const std::string
& language
);
78 // Returns true if |language| is an Accept language for the user profile.
79 static bool IsAcceptLanguage(Profile
* profile
, const std::string
& language
);
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:
85 // the accept-language list
86 // If no language is found then an empty string is returned.
87 static std::string
GetTargetLanguage(PrefService
* prefs
);
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
,
94 // Returns true if the new translate bubble is enabled.
95 static bool IsTranslateBubbleEnabled();
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
);
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();
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
);
113 // Reverts the contents of the page in |web_contents| to its original
115 void RevertTranslation(content::WebContents
* web_contents
);
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
);
122 // Clears the translate script, so it will be fetched next time we translate.
123 void ClearTranslateScript();
125 // content::NotificationObserver implementation:
126 virtual void Observe(int type
,
127 const content::NotificationSource
& source
,
128 const content::NotificationDetails
& details
) OVERRIDE
;
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
);
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
;
140 // The observer class for TranslateManager.
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;
151 // Adds/removes observer.
152 void AddObserver(Observer
* obs
);
153 void RemoveObserver(Observer
* obs
);
155 // Notifies to the observers when translate event happens.
156 void NotifyTranslateEvent(const TranslateEventDetails
& details
);
162 friend struct DefaultSingletonTraits
<TranslateManager
>;
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
;
171 std::string source_lang
;
172 std::string target_lang
;
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
);
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
);
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
);
191 // Shows the after translate or error infobar depending on the details.
192 void PageTranslated(content::WebContents
* web_contents
,
193 PageTranslatedDetails
* details
);
195 void OnTranslateScriptFetchComplete(bool success
, const std::string
& data
);
197 // Notifies to the observers when a language is detected.
198 void NotifyLanguageDetection(const LanguageDetectionDetails
& details
);
200 // Notifies to the observers when translate failed.
201 void NotifyTranslateError(const TranslateErrorDetails
& details
);
203 // Shows the translate bubble.
204 void ShowBubble(content::WebContents
* web_contents
,
205 TranslateBubbleModel::ViewState view_state
,
206 TranslateErrors::Type error_type
);
208 // Returns the different parameters used to decide whether extra shortcuts
210 static ShortcutConfiguration
ShortcutConfig();
212 content::NotificationRegistrar notification_registrar_
;
214 // Max number of attempts before checking if a page has been reloaded.
215 int max_reload_check_attempts_
;
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
220 std::vector
<PendingRequest
> pending_requests_
;
222 // List of registered observers.
223 ObserverList
<Observer
> observer_list_
;
225 // An instance of TranslateLanguageList which manages supported language list.
226 scoped_ptr
<TranslateLanguageList
> language_list_
;
228 // An instance of TranslateScript which manages JavaScript source for
230 scoped_ptr
<TranslateScript
> script_
;
232 // An instance of TranslateAcceptLanguages which manages Accept languages of
234 scoped_ptr
<TranslateAcceptLanguages
> accept_languages_
;
236 base::WeakPtrFactory
<TranslateManager
> weak_method_factory_
;
238 DISALLOW_COPY_AND_ASSIGN(TranslateManager
);
241 #endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_MANAGER_H_