Chromium Code Reviews| Index: chrome/browser/translate/translate_language_list.cc |
| diff --git a/chrome/browser/translate/translate_language_list.cc b/chrome/browser/translate/translate_language_list.cc |
| index bc3a590a5c3cf190e07b8bf430563751345d92f5..f398ef7575e8f8e31a1be3a9831beb668028877d 100644 |
| --- a/chrome/browser/translate/translate_language_list.cc |
| +++ b/chrome/browser/translate/translate_language_list.cc |
| @@ -107,7 +107,10 @@ const char kAlphaLanguageQueryName[] = "alpha"; |
| const char kAlphaLanguageQueryValue[] = "1"; |
| // Retry parameter for fetching supporting language list. |
| -const int kMaxRetryLanguageListFetch = 5; |
| +const int kMaxRetryLanguageListFetchOn5xx = 5; |
| + |
| +// Retry parameter for LanguageListFetcher. |
| +const int kMaxRetryLanguageListFetcher = 16; |
| // Assign following IDs to URLFetchers so that tests can distinguish each |
| // request in order to simiulate respectively. |
| @@ -193,7 +196,8 @@ void SetSupportedLanguages(const std::string& language_list, |
| TranslateLanguageList::LanguageListFetcher::LanguageListFetcher( |
| bool include_alpha_languages) |
| : include_alpha_languages_(include_alpha_languages), |
| - state_(IDLE) { |
| + state_(IDLE), |
| + retry_count_(0) { |
| } |
| TranslateLanguageList::LanguageListFetcher::~LanguageListFetcher() { |
| @@ -201,13 +205,19 @@ TranslateLanguageList::LanguageListFetcher::~LanguageListFetcher() { |
| bool TranslateLanguageList::LanguageListFetcher::Request( |
| const TranslateLanguageList::LanguageListFetcher::Callback& callback) { |
| - // This function is not supporsed to be called before previous operaion is not |
| + // This function is not supposed to be called before previous operaion is not |
| // finished. |
| if (state_ == REQUESTING) { |
| NOTREACHED(); |
| return false; |
| } |
| + if (retry_count_ >= kMaxRetryLanguageListFetcher) { |
| + NotifyEvent(__LINE__, "Request is omitted due to retry limit"); |
| + return false; |
| + } |
| + retry_count_++; |
| + |
| state_ = REQUESTING; |
| callback_ = callback; |
| @@ -235,7 +245,10 @@ bool TranslateLanguageList::LanguageListFetcher::Request( |
| fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | |
| net::LOAD_DO_NOT_SAVE_COOKIES); |
| fetcher_->SetRequestContext(g_browser_process->system_request_context()); |
| - fetcher_->SetMaxRetriesOn5xx(kMaxRetryLanguageListFetch); |
| + // Set retry parameter for HTTP status code 5xx. This doesn't work against |
| + // 106 (net::ERR_INTERNET_DISCONNECTED) and so on. |
| + // TranslateLanguageList handles network status, and implements retry. |
| + fetcher_->SetMaxRetriesOn5xx(kMaxRetryLanguageListFetchOn5xx); |
| fetcher_->Start(); |
| return true; |
| @@ -262,6 +275,7 @@ void TranslateLanguageList::LanguageListFetcher::OnURLFetchComplete( |
| NotifyEvent(__LINE__, message); |
| } |
| + // Transfer URLFetcher's ownership before invoking a callback. |
| scoped_ptr<const net::URLFetcher> delete_ptr(fetcher_.release()); |
| callback_.Run(include_alpha_languages_, state_ == COMPLETED, data); |
| } |
| @@ -280,6 +294,8 @@ TranslateLanguageList::TranslateLanguageList() { |
| language_list_fetcher_.reset(new LanguageListFetcher(false)); |
| alpha_language_list_fetcher_.reset(new LanguageListFetcher(true)); |
| + |
| + resource_request_allowed_notifier_.Init(this); |
| } |
| TranslateLanguageList::~TranslateLanguageList() { |
| @@ -291,6 +307,11 @@ void TranslateLanguageList::GetSupportedLanguages( |
| std::set<std::string>::const_iterator iter = all_supported_languages_.begin(); |
| for (; iter != all_supported_languages_.end(); ++iter) |
| languages->push_back(*iter); |
| + |
| + // Update language lists if they are not updated after Chrome was launched |
| + // for later requests. |
| + if (language_list_fetcher_.get() || alpha_language_list_fetcher_.get()) |
| + RequestLanguageList(); |
| } |
| std::string TranslateLanguageList::GetLanguageCode( |
| @@ -317,6 +338,12 @@ bool TranslateLanguageList::IsAlphaLanguage(const std::string& language) { |
| } |
| void TranslateLanguageList::RequestLanguageList() { |
| + // If resource requests are not allowed, we'll get a callback when they are. |
| + if (resource_request_allowed_notifier_.ResourceRequestsAllowed()) |
| + OnResourceRequestsAllowed(); |
| +} |
| + |
| +void TranslateLanguageList::OnResourceRequestsAllowed() { |
| if (language_list_fetcher_.get() && |
| (language_list_fetcher_->state() == LanguageListFetcher::IDLE || |
| language_list_fetcher_->state() == LanguageListFetcher::FAILED)) { |
| @@ -338,8 +365,16 @@ void TranslateLanguageList::OnLanguageListFetchComplete( |
| bool include_alpha_languages, |
| bool success, |
| const std::string& data) { |
| - if (!success) |
| + if (!success) { |
| + resource_request_allowed_notifier_.ResourceRequestsAllowed(); |
| + // Since it fails just now, omit to schedule resource requests if |
| + // ResourceRequestAllowedNotifier think it's ready. Otherwise, a callback |
| + // will be invoked later to reuest resources again. |
|
MAD
2013/06/17 14:48:41
reuest -> request?
Takashi Toyoshima
2013/06/19 10:06:15
Done.
|
| + // The LanguageListFetcher has a limit |kMaxRetryLanguageListFetcher| and |
| + // aborts re-try not to invoke OnLanguageListFetchComplete anymore if it's |
| + // asked to re-try too many times. |
| return; |
| + } |
| if (!include_alpha_languages) { |
| SetSupportedLanguages(data, &supported_languages_); |