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

Unified Diff: chrome/browser/translate/translate_manager.cc

Issue 15317007: Translate: split supporting language list handling to TranslateLanguageList (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reviewed Created 7 years, 7 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_manager.cc
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
index 1046922ec62af6e459ac1b4fa785e94b5041e1be..34ce89fff2f4add70ce0cb59d41ccaf369796a0f 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -7,7 +7,6 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
-#include "base/json/json_reader.h"
#include "base/memory/singleton.h"
#include "base/message_loop.h"
#include "base/metrics/histogram.h"
@@ -24,9 +23,11 @@
#include "chrome/browser/tab_contents/tab_util.h"
#include "chrome/browser/translate/page_translated_details.h"
#include "chrome/browser/translate/translate_infobar_delegate.h"
+#include "chrome/browser/translate/translate_language_list.h"
#include "chrome/browser/translate/translate_manager_metrics.h"
#include "chrome/browser/translate/translate_prefs.h"
#include "chrome/browser/translate/translate_tab_helper.h"
+#include "chrome/browser/translate/translate_url_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
@@ -70,100 +71,17 @@ using content::WebContents;
namespace {
-// The default list of languages the Google translation server supports.
-// We use this list until we receive the list that the server exposes.
-// For information, here is the list of languages that Chrome can be run in
-// but that the translation server does not support:
-// am Amharic
-// bn Bengali
-// gu Gujarati
-// kn Kannada
-// ml Malayalam
-// mr Marathi
-// ta Tamil
-// te Telugu
-const char* const kDefaultSupportedLanguages[] = {
- "af", // Afrikaans
- "sq", // Albanian
- "ar", // Arabic
- "be", // Belarusian
- "bg", // Bulgarian
- "ca", // Catalan
- "zh-CN", // Chinese (Simplified)
- "zh-TW", // Chinese (Traditional)
- "hr", // Croatian
- "cs", // Czech
- "da", // Danish
- "nl", // Dutch
- "en", // English
- "eo", // Esperanto
- "et", // Estonian
- "tl", // Filipino
- "fi", // Finnish
- "fr", // French
- "gl", // Galician
- "de", // German
- "el", // Greek
- "ht", // Haitian Creole
- "iw", // Hebrew
- "hi", // Hindi
- "hu", // Hungarian
- "is", // Icelandic
- "id", // Indonesian
- "ga", // Irish
- "it", // Italian
- "ja", // Japanese
- "ko", // Korean
- "lv", // Latvian
- "lt", // Lithuanian
- "mk", // Macedonian
- "ms", // Malay
- "mt", // Maltese
- "no", // Norwegian
- "fa", // Persian
- "pl", // Polish
- "pt", // Portuguese
- "ro", // Romanian
- "ru", // Russian
- "sr", // Serbian
- "sk", // Slovak
- "sl", // Slovenian
- "es", // Spanish
- "sw", // Swahili
- "sv", // Swedish
- "th", // Thai
- "tr", // Turkish
- "uk", // Ukrainian
- "vi", // Vietnamese
- "cy", // Welsh
- "yi", // Yiddish
-};
-
const char kTranslateScriptURL[] =
"https://translate.google.com/translate_a/element.js";
const char kTranslateScriptHeader[] = "Google-Translate-Element-Mode: library";
const char kReportLanguageDetectionErrorURL[] =
"https://translate.google.com/translate_error?client=cr&action=langidc";
-const char kLanguageListFetchURL[] =
- "https://translate.googleapis.com/translate_a/l?client=chrome&cb=sl";
-
-// Used in kTranslateScriptURL to request supporting languages list including
-// "alpha languages".
-const char kAlphaLanguageQueryName[] = "alpha";
-const char kAlphaLanguageQueryValue[] = "1";
-
-// Used in all translate URLs to specify API Key.
-const char kApiKeyName[] = "key";
// Used in kTranslateScriptURL to specify a callback function name.
const char kCallbackQueryName[] = "cb";
const char kCallbackQueryValue[] =
"cr.googleTranslate.onTranslateElementLoad";
-// Used in kTranslateScriptURL and kLanguageListFetchURL to specify the
-// application locale.
-const char kHostLocaleQueryName[] = "hl";
-
// Used in kReportLanguageDetectionErrorURL to specify the original page
// language.
const char kSourceLanguageQueryName[] = "sl";
@@ -179,31 +97,10 @@ const int kTranslateLoadCheckDelayMs = 150;
// loading before giving up the translation
const int kMaxTranslateLoadCheckAttempts = 20;
-const int kMaxRetryLanguageListFetch = 5;
const int kTranslateScriptExpirationDelayDays = 1;
-GURL AddApiKeyToUrl(const GURL& url) {
- return net::AppendQueryParameter(url, kApiKeyName, google_apis::GetAPIKey());
-}
-
-GURL AddHostLocaleToUrl(const GURL& url) {
- return net::AppendQueryParameter(
- url,
- kHostLocaleQueryName,
- TranslateManager::GetLanguageCode(
- g_browser_process->GetApplicationLocale()));
-}
-
} // namespace
-// This must be kept in sync with the &cb= value in the kLanguageListFetchURL.
-const char TranslateManager::kLanguageListCallbackName[] = "sl(";
-const char TranslateManager::kTargetLanguagesKey[] = "tl";
-
-// static
-base::LazyInstance<std::set<std::string> >
- TranslateManager::supported_languages_ = LAZY_INSTANCE_INITIALIZER;
-
TranslateManager::~TranslateManager() {
weak_method_factory_.InvalidateWeakPtrs();
}
@@ -233,88 +130,30 @@ bool TranslateManager::IsTranslatableURL(const GURL& url) {
}
// static
-void TranslateManager::SetSupportedLanguages(const std::string& language_list) {
- // The format is:
- // sl({"sl": {"XX": "LanguageName", ...}, "tl": {"XX": "LanguageName", ...}})
- // Where "sl(" is set in kLanguageListCallbackName
- // and "tl" is kTargetLanguagesKey
- if (!StartsWithASCII(language_list, kLanguageListCallbackName, false) ||
- !EndsWith(language_list, ")", false)) {
- // We don't have a NOTREACHED here since this can happen in ui_tests, even
- // though the the BrowserMain function won't call us with parameters.ui_task
- // is NULL some tests don't set it, so we must bail here.
- return;
- }
- static const size_t kLanguageListCallbackNameLength =
- strlen(kLanguageListCallbackName);
- std::string languages_json = language_list.substr(
- kLanguageListCallbackNameLength,
- language_list.size() - kLanguageListCallbackNameLength - 1);
- scoped_ptr<Value> json_value(
- base::JSONReader::Read(languages_json, base::JSON_ALLOW_TRAILING_COMMAS));
- if (json_value == NULL || !json_value->IsType(Value::TYPE_DICTIONARY)) {
- NOTREACHED();
- return;
- }
- // The first level dictionary contains two sub-dict, one for source languages
- // and the other for target languages, we want to use the target languages.
- DictionaryValue* language_dict =
- static_cast<DictionaryValue*>(json_value.get());
- DictionaryValue* target_languages = NULL;
- if (!language_dict->GetDictionary(kTargetLanguagesKey, &target_languages) ||
- target_languages == NULL) {
- NOTREACHED();
- return;
- }
- // Now we can clear our current state...
- std::set<std::string>* supported_languages = supported_languages_.Pointer();
- supported_languages->clear();
- // ... and replace it with the values we just fetched from the server.
- for (DictionaryValue::Iterator iter(*target_languages); !iter.IsAtEnd();
- iter.Advance()) {
- supported_languages_.Pointer()->insert(iter.key());
- }
-}
-
-// static
-void TranslateManager::InitSupportedLanguages() {
- // If our list of supported languages have not been set yet, we default
- // to our hard coded list of languages in kDefaultSupportedLanguages.
- if (supported_languages_.Pointer()->empty()) {
- for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i)
- supported_languages_.Pointer()->insert(kDefaultSupportedLanguages[i]);
- }
-}
-
-// static
void TranslateManager::GetSupportedLanguages(
std::vector<std::string>* languages) {
- DCHECK(languages && languages->empty());
- InitSupportedLanguages();
- std::set<std::string>* supported_languages = supported_languages_.Pointer();
- std::set<std::string>::const_iterator iter = supported_languages->begin();
- for (; iter != supported_languages->end(); ++iter)
- languages->push_back(*iter);
+ if (GetInstance()->language_list_.get()) {
+ GetInstance()->language_list_->GetSupportedLanguages(languages);
+ return;
+ }
+ NOTREACHED();
}
// static
std::string TranslateManager::GetLanguageCode(
const std::string& chrome_locale) {
- // Only remove the country code for country specific languages we don't
- // support specifically yet.
- if (IsSupportedLanguage(chrome_locale))
- return chrome_locale;
-
- size_t hypen_index = chrome_locale.find('-');
- if (hypen_index == std::string::npos)
- return chrome_locale;
- return chrome_locale.substr(0, hypen_index);
+ if (GetInstance()->language_list_.get())
+ return GetInstance()->language_list_->GetLanguageCode(chrome_locale);
+ NOTREACHED();
+ return chrome_locale;
}
// static
-bool TranslateManager::IsSupportedLanguage(const std::string& page_language) {
- InitSupportedLanguages();
- return supported_languages_.Pointer()->count(page_language) != 0;
+bool TranslateManager::IsSupportedLanguage(const std::string& language) {
+ if (GetInstance()->language_list_.get())
+ return GetInstance()->language_list_->IsSupportedLanguage(language);
+ NOTREACHED();
+ return false;
}
void TranslateManager::Observe(int type,
@@ -430,8 +269,7 @@ void TranslateManager::Observe(int type,
}
void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
- if (translate_script_request_pending_.get() != source &&
- language_list_request_pending_.get() != source) {
+ if (translate_script_request_pending_.get() != source) {
// Looks like crash on Mac is possibly caused with callback entering here
// with unknown fetcher when network is refreshed.
scoped_ptr<const net::URLFetcher> delete_ptr(source);
@@ -439,8 +277,8 @@ void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
}
bool error =
- (source->GetStatus().status() != net::URLRequestStatus::SUCCESS ||
- source->GetResponseCode() != net::HTTP_OK);
+ source->GetStatus().status() != net::URLRequestStatus::SUCCESS ||
+ source->GetResponseCode() != net::HTTP_OK;
if (translate_script_request_pending_.get() == source) {
scoped_ptr<const net::URLFetcher> delete_ptr(
translate_script_request_pending_.release());
@@ -502,16 +340,6 @@ void TranslateManager::OnURLFetchComplete(const net::URLFetcher* source) {
}
}
pending_requests_.clear();
- } else { // if (translate_script_request_pending_.get() == source)
- scoped_ptr<const net::URLFetcher> delete_ptr(
- language_list_request_pending_.release());
- if (!error) {
- std::string data;
- source->GetResponseAsString(&data);
- SetSupportedLanguages(data);
- } else {
- VLOG(9) << "Failed to Fetch languages from: " << kLanguageListFetchURL;
- }
}
}
@@ -541,6 +369,7 @@ TranslateManager::TranslateManager()
content::NotificationService::AllSources());
notification_registrar_.Add(this, chrome::NOTIFICATION_PAGE_TRANSLATED,
content::NotificationService::AllSources());
+ language_list_.reset(new TranslateLanguageList);
}
void TranslateManager::InitiateTranslation(WebContents* web_contents,
@@ -761,8 +590,8 @@ void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
kSourceLanguageQueryName,
translate_tab_helper->language_state().original_language());
- report_error_url = AddHostLocaleToUrl(report_error_url);
- report_error_url = AddApiKeyToUrl(report_error_url);
+ report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url);
+ report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url);
chrome::AddSelectedTabWithURL(browser, report_error_url,
content::PAGE_TRANSITION_AUTO_BOOKMARK);
@@ -878,8 +707,7 @@ void TranslateManager::InitAcceptLanguages(PrefService* prefs) {
void TranslateManager::FetchLanguageListFromTranslateServer(
PrefService* prefs) {
- if (language_list_request_pending_.get() != NULL)
- return;
+ DCHECK(language_list_.get());
// We don't want to do this when translate is disabled.
DCHECK(prefs != NULL);
@@ -889,34 +717,12 @@ void TranslateManager::FetchLanguageListFromTranslateServer(
return;
}
- GURL language_list_fetch_url = GURL(kLanguageListFetchURL);
- language_list_fetch_url = AddHostLocaleToUrl(language_list_fetch_url);
- language_list_fetch_url = AddApiKeyToUrl(language_list_fetch_url);
-
- const CommandLine& command_line = *CommandLine::ForCurrentProcess();
- if (command_line.HasSwitch(switches::kEnableTranslateAlphaLanguages)) {
- language_list_fetch_url = net::AppendQueryParameter(
- language_list_fetch_url,
- kAlphaLanguageQueryName,
- kAlphaLanguageQueryValue);
- }
-
- VLOG(9) << "Fetch supporting language list from: "
- << language_list_fetch_url.spec().c_str();
-
- language_list_request_pending_.reset(net::URLFetcher::Create(
- 1, language_list_fetch_url, net::URLFetcher::GET, this));
- language_list_request_pending_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
- net::LOAD_DO_NOT_SAVE_COOKIES);
- language_list_request_pending_->SetRequestContext(
- g_browser_process->system_request_context());
- language_list_request_pending_->SetMaxRetriesOn5xx(
- kMaxRetryLanguageListFetch);
- language_list_request_pending_->Start();
+ if (language_list_.get())
+ language_list_->RequestLanguageList();
}
void TranslateManager::CleanupPendingUlrFetcher() {
- language_list_request_pending_.reset();
+ language_list_.reset();
translate_script_request_pending_.reset();
}
@@ -948,8 +754,10 @@ void TranslateManager::RequestTranslateScript() {
kCallbackQueryName,
kCallbackQueryValue);
- translate_script_url = AddHostLocaleToUrl(translate_script_url);
- translate_script_url = AddApiKeyToUrl(translate_script_url);
+ translate_script_url =
+ TranslateURLUtil::AddHostLocaleToUrl(translate_script_url);
+ translate_script_url =
+ TranslateURLUtil::AddApiKeyToUrl(translate_script_url);
translate_script_request_pending_.reset(net::URLFetcher::Create(
0, translate_script_url, net::URLFetcher::GET, this));
@@ -965,7 +773,7 @@ void TranslateManager::RequestTranslateScript() {
// static
std::string TranslateManager::GetTargetLanguage(PrefService* prefs) {
std::string ui_lang =
- GetLanguageCode(g_browser_process->GetApplicationLocale());
+ GetLanguageCode(g_browser_process->GetApplicationLocale());
if (IsSupportedLanguage(ui_lang))
return ui_lang;
« no previous file with comments | « chrome/browser/translate/translate_manager.h ('k') | chrome/browser/translate/translate_manager_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698