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_); |