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 7056f6dc739d32f41c196c49f3607657e87eaa3d..081303e3ffda19deddf37480119d236effb599df 100644 |
| --- a/chrome/browser/translate/translate_language_list.cc |
| +++ b/chrome/browser/translate/translate_language_list.cc |
| @@ -105,7 +105,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. |
| @@ -184,7 +187,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() { |
| @@ -192,13 +196,20 @@ 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; |
| } |
| + // Limits LanguageListFetcher level retry to kMaxRetryLanguageListFetcher |
|
Alexei Svitkine (slow)
2013/06/13 14:46:02
Nit: I don't think the comment is needed, the code
Takashi Toyoshima
2013/06/14 09:10:48
Done.
|
| + if (retry_count_ >= kMaxRetryLanguageListFetcher) { |
| + NotifyEvent(__LINE__, "Request is omitted due to retry limitation"); |
|
Alexei Svitkine (slow)
2013/06/13 14:46:02
Nit: limitation -> limit
(The two have slightly d
Takashi Toyoshima
2013/06/14 09:10:48
Wow, thank you:)
I didn't know.
Done!
|
| + return false; |
| + } |
| + retry_count_++; |
| + |
| state_ = REQUESTING; |
| callback_ = callback; |
| @@ -226,7 +237,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; |
| @@ -257,6 +271,7 @@ void TranslateLanguageList::LanguageListFetcher::OnURLFetchComplete( |
| callback_.Run(include_alpha_languages_, state_ == COMPLETED, data); |
| } |
| +// Transfer URLFetcher's ownership before invoking a callback. |
|
Alexei Svitkine (slow)
2013/06/13 14:46:02
This comment seems out of place...
Takashi Toyoshima
2013/06/14 09:10:48
Oops. Sorry, it looks like that I made wrong rebas
|
| // This must be kept in sync with the &cb= value in the kLanguageListFetchURL. |
| const char TranslateLanguageList::kLanguageListCallbackName[] = "sl("; |
| const char TranslateLanguageList::kTargetLanguagesKey[] = "tl"; |
| @@ -271,6 +286,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() { |
| @@ -282,6 +299,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( |
| @@ -308,6 +330,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)) { |
| @@ -329,8 +357,13 @@ 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. |
|
Alexei Svitkine (slow)
2013/06/13 14:46:02
Can you expand this comment to mention that fetche
Takashi Toyoshima
2013/06/14 09:10:48
Done.
|
| return; |
| + } |
| if (!include_alpha_languages) { |
| SetSupportedLanguages(data, &supported_languages_); |