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

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: done 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 8a42e01c8e7aadf6954e947c8003d51afe5b5e3a..e7f9ecf84f861d350e8d332ee5ca3dcb486bab76 100644
--- a/chrome/browser/translate/translate_language_list.cc
+++ b/chrome/browser/translate/translate_language_list.cc
@@ -6,6 +6,7 @@
#include <set>
+#include "base/bind.h"
#include "base/json/json_reader.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
@@ -155,75 +156,104 @@ void SetSupportedLanguages(const std::string& language_list,
}
}
-net::URLFetcher* CreateAndStartFetch(int id,
- const GURL& url,
- net::URLFetcherDelegate* delegate) {
- DCHECK(delegate);
- VLOG(9) << "Fetch supporting language list from: " << url.spec().c_str();
+} // namespace
- scoped_ptr<net::URLFetcher> fetcher;
- fetcher.reset(net::URLFetcher::Create(id,
- url,
- net::URLFetcher::GET,
- delegate));
- 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);
- fetcher->Start();
-
- return fetcher.release();
+TranslateLanguageList::LanguageListFetcher::LanguageListFetcher(
+ bool include_alpha_languages)
+ : include_alpha_languages_(include_alpha_languages),
+ state_(IDLE) {
}
-} // namespace
+TranslateLanguageList::LanguageListFetcher::~LanguageListFetcher() {
+}
-// This must be kept in sync with the &cb= value in the kLanguageListFetchURL.
-const char TranslateLanguageList::kLanguageListCallbackName[] = "sl(";
-const char TranslateLanguageList::kTargetLanguagesKey[] = "tl";
+void TranslateLanguageList::LanguageListFetcher::Request(
+ const TranslateLanguageList::LanguageListFetcher::Callback& callback) {
+ if (state_ == REQUESTING) {
+ callback.Run(include_alpha_languages_, false, std::string());
MAD 2013/06/07 13:29:24 If callbacks are comparable, shouldn't we simply D
Takashi Toyoshima 2013/06/07 14:42:55 (state_ == REQUESTING) means another Request() is
MAD 2013/06/07 15:02:15 As I mentioned below, if callback == callback_ whe
Takashi Toyoshima 2013/06/10 13:36:57 Ah, now I understand what you concerned about. I
+ return;
+ }
-TranslateLanguageList::TranslateLanguageList() {
- // We default to our hard coded list of languages in
- // |kDefaultSupportedLanguages|. This list will be overriden by a server
- // providing supported langauges list.
- for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i)
- supported_languages_.insert(kDefaultSupportedLanguages[i]);
- UpdateSupportedLanguages();
+ state_ = REQUESTING;
+ callback_ = callback;
+
+ GURL url = GURL(kLanguageListFetchURL);
+ url = TranslateURLUtil::AddHostLocaleToUrl(url);
+ url = TranslateURLUtil::AddApiKeyToUrl(url);
+ if (include_alpha_languages_) {
+ url = net::AppendQueryParameter(url,
+ kAlphaLanguageQueryName,
+ kAlphaLanguageQueryValue);
+ }
+
+ VLOG(9) << "Fetch supporting language list from: " << url.spec().c_str();
Takashi Toyoshima 2013/06/07 05:17:17 FYI, VLOG(9) will be replace with translate-intern
MAD 2013/06/07 15:02:15 OK.
+
+ fetcher_.reset(net::URLFetcher::Create(include_alpha_languages_ ? 2 : 1,
MAD 2013/06/07 13:29:24 I didn't notice in previous version that we were u
Takashi Toyoshima 2013/06/07 14:42:55 In another change, I defined const int for these 1
MAD 2013/06/07 15:02:15 OK thanks.
Takashi Toyoshima 2013/06/10 13:36:57 Done.
+ url,
+ net::URLFetcher::GET,
+ this));
+ 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);
+ fetcher_->Start();
}
-TranslateLanguageList::~TranslateLanguageList() {}
+void TranslateLanguageList::LanguageListFetcher::OnURLFetchComplete(
+ const net::URLFetcher* source) {
+ DCHECK(fetcher_.get() == source);
-void TranslateLanguageList::OnURLFetchComplete(const net::URLFetcher* source) {
- scoped_ptr<const net::URLFetcher> delete_ptr;
+ scoped_ptr<const net::URLFetcher> delete_ptr(fetcher_.release());
hajimehoshi 2013/06/07 04:15:44 Remove this line (as we discussed).
Takashi Toyoshima 2013/06/07 05:17:17 Thanks. And after another discussion, I notice tha
if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS &&
source->GetResponseCode() == net::HTTP_OK) {
+ state_ = COMPLETED;
std::string data;
source->GetResponseAsString(&data);
- if (language_list_fetcher_.get() == source) {
- delete_ptr.reset(language_list_fetcher_.release());
- SetSupportedLanguages(data, &supported_languages_);
- } else if (alpha_language_list_fetcher_.get() == source) {
- delete_ptr.reset(alpha_language_list_fetcher_.release());
- SetSupportedLanguages(data, &supported_alpha_languages_);
- } else {
- NOTREACHED();
- }
- UpdateSupportedLanguages();
+ callback_.Run(include_alpha_languages_, true, data);
} else {
// TODO(toyoshim): Try again. http://crbug.com/244202 .
// Also In CrOS, FetchLanguageList is not called at launching Chrome. It
// will solve this problem that check if FetchLanguageList is already
// called, and call it if needed in InitSupportedLanguage().
VLOG(9) << "Failed to Fetch languages from: " << kLanguageListFetchURL;
+ state_ = FAILED;
+ callback_.Run(include_alpha_languages_, false, std::string());
}
}
+// This must be kept in sync with the &cb= value in the kLanguageListFetchURL.
+const char TranslateLanguageList::kLanguageListCallbackName[] = "sl(";
+const char TranslateLanguageList::kTargetLanguagesKey[] = "tl";
+
+TranslateLanguageList::TranslateLanguageList() {
+ // We default to our hard coded list of languages in
+ // |kDefaultSupportedLanguages|. This list will be overriden by a server
+ // providing supported langauges list.
+ for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i)
+ supported_languages_.insert(kDefaultSupportedLanguages[i]);
+ UpdateSupportedLanguages();
+
+ language_list_fetcher_.reset(new LanguageListFetcher(false));
+ alpha_language_list_fetcher_.reset(new LanguageListFetcher(true));
+
+ net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
+}
+
+TranslateLanguageList::~TranslateLanguageList() {
+ net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
+}
+
void TranslateLanguageList::GetSupportedLanguages(
std::vector<std::string>* languages) {
DCHECK(languages && languages->empty());
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.
+ RequestLanguageList();
}
std::string TranslateLanguageList::GetLanguageCode(
@@ -250,27 +280,47 @@ bool TranslateLanguageList::IsAlphaLanguage(const std::string& language) {
}
void TranslateLanguageList::RequestLanguageList() {
- if (language_list_fetcher_.get() || alpha_language_list_fetcher_.get())
- return;
+ if (language_list_fetcher_.get() &&
+ (language_list_fetcher_->state() == LanguageListFetcher::IDLE ||
+ language_list_fetcher_->state() == LanguageListFetcher::FAILED)) {
+ language_list_fetcher_->Request(
+ base::Bind(&TranslateLanguageList::OnLanguageListFetchComplete,
+ base::Unretained(this)));
+ }
- // Fetch the stable language list.
- GURL language_list_fetch_url = GURL(kLanguageListFetchURL);
- language_list_fetch_url =
- TranslateURLUtil::AddHostLocaleToUrl(language_list_fetch_url);
- language_list_fetch_url =
- TranslateURLUtil::AddApiKeyToUrl(language_list_fetch_url);
+ if (alpha_language_list_fetcher_.get() &&
+ (alpha_language_list_fetcher_->state() == LanguageListFetcher::IDLE ||
+ alpha_language_list_fetcher_->state() == LanguageListFetcher::FAILED)) {
+ alpha_language_list_fetcher_->Request(
+ base::Bind(&TranslateLanguageList::OnLanguageListFetchComplete,
+ base::Unretained(this)));
+ }
+}
- language_list_fetcher_.reset(
- CreateAndStartFetch(1, language_list_fetch_url, this));
+void TranslateLanguageList::OnNetworkChanged(
+ net::NetworkChangeNotifier::ConnectionType type) {
+ VLOG(9) << "OnNetworkChanged: " << type << ", "
+ << (net::NetworkChangeNotifier::IsOffline() ? " offline" : "online");
+ if (net::NetworkChangeNotifier::IsOffline())
+ return;
+ RequestLanguageList();
+}
- // Fetch the alpha language list.
- language_list_fetch_url = net::AppendQueryParameter(
- language_list_fetch_url,
- kAlphaLanguageQueryName,
- kAlphaLanguageQueryValue);
+void TranslateLanguageList::OnLanguageListFetchComplete(
+ bool include_alpha_languages,
+ bool success,
+ const std::string& data) {
+ if (!success)
MAD 2013/06/07 13:29:24 If we would only call here when there's a real err
Takashi Toyoshima 2013/06/07 14:42:55 Retry is issued when network status is changed to
MAD 2013/06/07 15:02:15 And what I meant is that, since you return an erro
Takashi Toyoshima 2013/06/10 13:36:57 Thank you for clarification. After understanding y
+ return;
- alpha_language_list_fetcher_.reset(
- CreateAndStartFetch(2, language_list_fetch_url, this));
+ if (!include_alpha_languages) {
+ SetSupportedLanguages(data, &supported_languages_);
+ language_list_fetcher_.reset();
+ } else {
+ SetSupportedLanguages(data, &supported_alpha_languages_);
+ alpha_language_list_fetcher_.reset();
+ }
+ UpdateSupportedLanguages();
}
void TranslateLanguageList::UpdateSupportedLanguages() {

Powered by Google App Engine
This is Rietveld 408576698