Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: chrome/browser/translate/translate_language_list.cc

Issue 15949022: Translate: language list smart updater (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: disable network update on mac infobar tests Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/translate/translate_language_list.h ('k') | chrome/browser/translate/translate_manager_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698