| 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 |