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

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: (rebase to 16841020) 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 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_);
« 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