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

Unified 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: review #15 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 side-by-side diff with in-line comments
Download patch
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..36a54ff836c1cbefb3b6dad47dff87a2b8b6d5ab 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,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;
@@ -226,7 +236,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;
@@ -253,6 +266,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);
}
@@ -271,6 +285,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 +298,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 +329,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 +356,17 @@ 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.
+ // 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.
+ to invoke OnLanguageListFetchComplete.
Alexei Svitkine (slow) 2013/06/14 22:06:05 Nit: remove this line?
Takashi Toyoshima 2013/06/17 07:20:04 Sorry for poor nit... Removed.
return;
+ }
if (!include_alpha_languages) {
SetSupportedLanguages(data, &supported_languages_);
« 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