OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/translate/translate_language_list.h" | 5 #include "chrome/browser/translate/translate_language_list.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 | 96 |
97 // Constant URL string to fetch server supporting language list. | 97 // Constant URL string to fetch server supporting language list. |
98 const char kLanguageListFetchURL[] = | 98 const char kLanguageListFetchURL[] = |
99 "https://translate.googleapis.com/translate_a/l?client=chrome&cb=sl"; | 99 "https://translate.googleapis.com/translate_a/l?client=chrome&cb=sl"; |
100 | 100 |
101 // Used in kTranslateScriptURL to request supporting languages list including | 101 // Used in kTranslateScriptURL to request supporting languages list including |
102 // "alpha languages". | 102 // "alpha languages". |
103 const char kAlphaLanguageQueryName[] = "alpha"; | 103 const char kAlphaLanguageQueryName[] = "alpha"; |
104 const char kAlphaLanguageQueryValue[] = "1"; | 104 const char kAlphaLanguageQueryValue[] = "1"; |
105 | 105 |
106 // Retry parameter for fetching supporting language list. | |
107 const int kMaxRetryLanguageListFetch = 5; | |
108 | |
109 // Assign following IDs to URLFetchers so that tests can distinguish each | 106 // Assign following IDs to URLFetchers so that tests can distinguish each |
110 // request in order to simiulate respectively. | 107 // request in order to simiulate respectively. |
111 const int kFetcherIdForLanguageList = 1; | 108 const int kFetcherIdForLanguageList = 1; |
112 const int kFetcherIdForAlphaLanguageList = 2; | 109 const int kFetcherIdForAlphaLanguageList = 2; |
113 | 110 |
| 111 // Represent if the language list updater is disabled. |
| 112 bool update_is_disabled = false; |
| 113 |
114 // Show a message in chrome:://translate-internals Event Logs. | 114 // Show a message in chrome:://translate-internals Event Logs. |
115 void NotifyEvent(int line, const std::string& message) { | 115 void NotifyEvent(int line, const std::string& message) { |
116 TranslateManager* manager = TranslateManager::GetInstance(); | 116 TranslateManager* manager = TranslateManager::GetInstance(); |
117 DCHECK(manager); | 117 DCHECK(manager); |
118 | 118 |
119 TranslateEventDetails details(__FILE__, line, message); | 119 TranslateEventDetails details(__FILE__, line, message); |
120 manager->NotifyTranslateEvent(details); | 120 manager->NotifyTranslateEvent(details); |
121 } | 121 } |
122 | 122 |
123 // Parses |language_list| containing the list of languages that the translate | 123 // Parses |language_list| containing the list of languages that the translate |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 const char TranslateLanguageList::kTargetLanguagesKey[] = "tl"; | 206 const char TranslateLanguageList::kTargetLanguagesKey[] = "tl"; |
207 | 207 |
208 TranslateLanguageList::TranslateLanguageList() { | 208 TranslateLanguageList::TranslateLanguageList() { |
209 // We default to our hard coded list of languages in | 209 // We default to our hard coded list of languages in |
210 // |kDefaultSupportedLanguages|. This list will be overriden by a server | 210 // |kDefaultSupportedLanguages|. This list will be overriden by a server |
211 // providing supported langauges list. | 211 // providing supported langauges list. |
212 for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i) | 212 for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i) |
213 supported_languages_.insert(kDefaultSupportedLanguages[i]); | 213 supported_languages_.insert(kDefaultSupportedLanguages[i]); |
214 UpdateSupportedLanguages(); | 214 UpdateSupportedLanguages(); |
215 | 215 |
| 216 if (update_is_disabled) |
| 217 return; |
| 218 |
216 language_list_fetcher_.reset( | 219 language_list_fetcher_.reset( |
217 new TranslateURLFetcher(kFetcherIdForLanguageList)); | 220 new TranslateURLFetcher(kFetcherIdForLanguageList)); |
218 alpha_language_list_fetcher_.reset( | 221 alpha_language_list_fetcher_.reset( |
219 new TranslateURLFetcher(kFetcherIdForAlphaLanguageList)); | 222 new TranslateURLFetcher(kFetcherIdForAlphaLanguageList)); |
220 } | 223 } |
221 | 224 |
222 TranslateLanguageList::~TranslateLanguageList() { | 225 TranslateLanguageList::~TranslateLanguageList() { |
223 } | 226 } |
224 | 227 |
225 void TranslateLanguageList::GetSupportedLanguages( | 228 void TranslateLanguageList::GetSupportedLanguages( |
226 std::vector<std::string>* languages) { | 229 std::vector<std::string>* languages) { |
227 DCHECK(languages && languages->empty()); | 230 DCHECK(languages && languages->empty()); |
228 std::set<std::string>::const_iterator iter = all_supported_languages_.begin(); | 231 std::set<std::string>::const_iterator iter = all_supported_languages_.begin(); |
229 for (; iter != all_supported_languages_.end(); ++iter) | 232 for (; iter != all_supported_languages_.end(); ++iter) |
230 languages->push_back(*iter); | 233 languages->push_back(*iter); |
| 234 |
| 235 // Update language lists if they are not updated after Chrome was launched |
| 236 // for later requests. |
| 237 if (language_list_fetcher_.get() || alpha_language_list_fetcher_.get()) |
| 238 RequestLanguageList(); |
231 } | 239 } |
232 | 240 |
233 std::string TranslateLanguageList::GetLanguageCode( | 241 std::string TranslateLanguageList::GetLanguageCode( |
234 const std::string& chrome_locale) { | 242 const std::string& chrome_locale) { |
235 // Only remove the country code for country specific languages we don't | 243 // Only remove the country code for country specific languages we don't |
236 // support specifically yet. | 244 // support specifically yet. |
237 if (IsSupportedLanguage(chrome_locale)) | 245 if (IsSupportedLanguage(chrome_locale)) |
238 return chrome_locale; | 246 return chrome_locale; |
239 | 247 |
240 size_t hypen_index = chrome_locale.find('-'); | 248 size_t hypen_index = chrome_locale.find('-'); |
241 if (hypen_index == std::string::npos) | 249 if (hypen_index == std::string::npos) |
242 return chrome_locale; | 250 return chrome_locale; |
243 return chrome_locale.substr(0, hypen_index); | 251 return chrome_locale.substr(0, hypen_index); |
244 } | 252 } |
245 | 253 |
246 bool TranslateLanguageList::IsSupportedLanguage(const std::string& language) { | 254 bool TranslateLanguageList::IsSupportedLanguage(const std::string& language) { |
247 return all_supported_languages_.count(language) != 0; | 255 return all_supported_languages_.count(language) != 0; |
248 } | 256 } |
249 | 257 |
250 bool TranslateLanguageList::IsAlphaLanguage(const std::string& language) { | 258 bool TranslateLanguageList::IsAlphaLanguage(const std::string& language) { |
251 // |language| should exist only in the alpha language list. | 259 // |language| should exist only in the alpha language list. |
252 return supported_alpha_languages_.count(language) != 0 && | 260 return supported_alpha_languages_.count(language) != 0 && |
253 supported_languages_.count(language) == 0; | 261 supported_languages_.count(language) == 0; |
254 } | 262 } |
255 | 263 |
256 void TranslateLanguageList::RequestLanguageList() { | 264 void TranslateLanguageList::RequestLanguageList() { |
| 265 // If resource requests are not allowed, we'll get a callback when they are. |
| 266 if (resource_request_allowed_notifier_.ResourceRequestsAllowed()) |
| 267 OnResourceRequestsAllowed(); |
| 268 } |
| 269 |
| 270 void TranslateLanguageList::OnResourceRequestsAllowed() { |
257 if (language_list_fetcher_.get() && | 271 if (language_list_fetcher_.get() && |
258 (language_list_fetcher_->state() == TranslateURLFetcher::IDLE || | 272 (language_list_fetcher_->state() == TranslateURLFetcher::IDLE || |
259 language_list_fetcher_->state() == TranslateURLFetcher::FAILED)) { | 273 language_list_fetcher_->state() == TranslateURLFetcher::FAILED)) { |
260 GURL url = GetLanguageListFetchURL(false); | 274 GURL url = GetLanguageListFetchURL(false); |
261 | 275 |
262 std::string message = base::StringPrintf( | 276 std::string message = base::StringPrintf( |
263 "Language list fetch starts (URL: %s)", | 277 "Language list fetch starts (URL: %s)", |
264 url.spec().c_str()); | 278 url.spec().c_str()); |
265 NotifyEvent(__LINE__, message); | 279 NotifyEvent(__LINE__, message); |
266 | 280 |
267 language_list_fetcher_->Request( | 281 bool result = language_list_fetcher_->Request( |
268 url, | 282 url, |
269 base::Bind(&TranslateLanguageList::OnLanguageListFetchComplete, | 283 base::Bind(&TranslateLanguageList::OnLanguageListFetchComplete, |
270 base::Unretained(this))); | 284 base::Unretained(this))); |
| 285 if (!result) |
| 286 NotifyEvent(__LINE__, "Request is omitted due to retry limit"); |
271 } | 287 } |
272 | 288 |
273 if (alpha_language_list_fetcher_.get() && | 289 if (alpha_language_list_fetcher_.get() && |
274 (alpha_language_list_fetcher_->state() == TranslateURLFetcher::IDLE || | 290 (alpha_language_list_fetcher_->state() == TranslateURLFetcher::IDLE || |
275 alpha_language_list_fetcher_->state() == TranslateURLFetcher::FAILED)) { | 291 alpha_language_list_fetcher_->state() == TranslateURLFetcher::FAILED)) { |
276 GURL url = GetLanguageListFetchURL(true); | 292 GURL url = GetLanguageListFetchURL(true); |
277 | 293 |
278 std::string message = base::StringPrintf( | 294 std::string message = base::StringPrintf( |
279 "Alpha language list fetch starts (URL: %s)", | 295 "Alpha language list fetch starts (URL: %s)", |
280 url.spec().c_str()); | 296 url.spec().c_str()); |
281 NotifyEvent(__LINE__, message); | 297 NotifyEvent(__LINE__, message); |
282 | 298 |
283 alpha_language_list_fetcher_->Request( | 299 bool result = alpha_language_list_fetcher_->Request( |
284 url, | 300 url, |
285 base::Bind(&TranslateLanguageList::OnLanguageListFetchComplete, | 301 base::Bind(&TranslateLanguageList::OnLanguageListFetchComplete, |
286 base::Unretained(this))); | 302 base::Unretained(this))); |
| 303 if (!result) |
| 304 NotifyEvent(__LINE__, "Request is omitted due to retry limit"); |
287 } | 305 } |
288 } | 306 } |
289 | 307 |
| 308 // static |
| 309 void TranslateLanguageList::DisableUpdate() { |
| 310 update_is_disabled = true; |
| 311 } |
| 312 |
290 void TranslateLanguageList::OnLanguageListFetchComplete( | 313 void TranslateLanguageList::OnLanguageListFetchComplete( |
291 int id, | 314 int id, |
292 bool success, | 315 bool success, |
293 const std::string& data) { | 316 const std::string& data) { |
294 if (!success) { | 317 if (!success) { |
| 318 // Since it fails just now, omit to schedule resource requests if |
| 319 // ResourceRequestAllowedNotifier think it's ready. Otherwise, a callback |
| 320 // will be invoked later to request resources again. |
| 321 // The TranslateURLFetcher has a limit for retried requests and aborts |
| 322 // re-try not to invoke OnLanguageListFetchComplete anymore if it's asked to |
| 323 // re-try too many times. |
295 GURL url = GetLanguageListFetchURL(id == kFetcherIdForAlphaLanguageList); | 324 GURL url = GetLanguageListFetchURL(id == kFetcherIdForAlphaLanguageList); |
296 std::string message = base::StringPrintf( | 325 std::string message = base::StringPrintf( |
297 "Failed to Fetch languages from: %s", url.spec().c_str()); | 326 "Failed to Fetch languages from: %s", url.spec().c_str()); |
298 NotifyEvent(__LINE__, message); | 327 NotifyEvent(__LINE__, message); |
299 return; | 328 return; |
300 } | 329 } |
301 | 330 |
302 std::string message = base::StringPrintf( | 331 std::string message = base::StringPrintf( |
303 "%s list is updated", | 332 "%s list is updated", |
304 id == kFetcherIdForLanguageList ? "Language" : "Alpha language"); | 333 id == kFetcherIdForLanguageList ? "Language" : "Alpha language"); |
(...skipping 24 matching lines...) Expand all Loading... |
329 iter != supported_languages_.end(); | 358 iter != supported_languages_.end(); |
330 ++iter) { | 359 ++iter) { |
331 all_supported_languages_.insert(*iter); | 360 all_supported_languages_.insert(*iter); |
332 } | 361 } |
333 for (iter = supported_alpha_languages_.begin(); | 362 for (iter = supported_alpha_languages_.begin(); |
334 iter != supported_alpha_languages_.end(); | 363 iter != supported_alpha_languages_.end(); |
335 ++iter) { | 364 ++iter) { |
336 all_supported_languages_.insert(*iter); | 365 all_supported_languages_.insert(*iter); |
337 } | 366 } |
338 } | 367 } |
OLD | NEW |