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