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() { |