Commit bb1c86cd authored by droger@chromium.org's avatar droger@chromium.org

Introduce TranslateService and TranslateDownloadManager

This CL removes the TranslateDelegate interface and introduces
TranslateService and TranslateDownloadManager.

This will enable (in a future CL) to move TranslateScript and
TranslateLanguageList in the Translate component, and
TranslateDownloadManager will own them.

BUG=332736

Review URL: https://codereview.chromium.org/145023015

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@247724 0039d316-1c4b-4281-b951-d872f2087c98
parent 4c318d05
......@@ -81,6 +81,7 @@
#include "chrome/common/url_constants.h"
#include "chrome/installer/util/google_update_constants.h"
#include "components/policy/core/common/policy_service.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/notification_details.h"
......@@ -636,6 +637,7 @@ void BrowserProcessImpl::SetApplicationLocale(const std::string& locale) {
locale_ = locale;
extension_l10n_util::SetProcessLocale(locale);
chrome::ChromeContentBrowserClient::SetApplicationLocale(locale);
TranslateDownloadManager::GetInstance()->set_application_locale(locale);
}
DownloadStatusUpdater* BrowserProcessImpl::download_status_updater() {
......
......@@ -92,6 +92,7 @@
#include "chrome/browser/shell_integration.h"
#include "chrome/browser/three_d_api_observer.h"
#include "chrome/browser/translate/translate_manager.h"
#include "chrome/browser/translate/translate_service.h"
#include "chrome/browser/ui/app_list/app_list_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
......@@ -546,7 +547,6 @@ ChromeBrowserMainParts::ChromeBrowserMainParts(
shutdown_watcher_(new ShutdownWatcherHelper()),
startup_timer_(new performance_monitor::StartupTimer()),
browser_field_trials_(parameters.command_line),
translate_manager_(NULL),
profile_(NULL),
run_message_loop_(true),
notify_result_(ProcessSingleton::PROCESS_NONE),
......@@ -1277,9 +1277,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
return chrome::RESULT_CODE_MACHINE_LEVEL_INSTALL_EXISTS;
#endif
// Create the TranslateManager singleton.
translate_manager_ = TranslateManager::GetInstance();
DCHECK(translate_manager_ != NULL);
TranslateService::Initialize();
// Needs to be done before PostProfileInit, since login manager on CrOS is
// called inside PostProfileInit.
......@@ -1560,10 +1558,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
#endif
}
if (translate_manager_ != NULL) {
translate_manager_->FetchLanguageListFromTranslateServer(
profile_->GetPrefs());
}
TranslateManager::GetInstance()->FetchLanguageListFromTranslateServer(
profile_->GetPrefs());
}
run_message_loop_ = true;
......@@ -1660,8 +1656,7 @@ void ChromeBrowserMainParts::PostMainMessageLoopRun() {
// Some tests don't set parameters.ui_task, so they started translate
// language fetch that was never completed so we need to cleanup here
// otherwise it will be done by the destructor in a wrong thread.
if (parameters().ui_task == NULL && translate_manager_ != NULL)
translate_manager_->CleanupPendingUlrFetcher();
TranslateService::Shutdown(parameters().ui_task == NULL);
if (notify_result_ == ProcessSingleton::PROCESS_NONE)
process_singleton_->Cleanup();
......
......@@ -28,7 +28,6 @@ class StartupBrowserCreator;
class StartupTimeBomb;
class ShutdownWatcherHelper;
class ThreeDAPIObserver;
class TranslateManager;
namespace chrome_browser {
// For use by ShowMissingLocaleMessageBox.
......@@ -169,7 +168,6 @@ class ChromeBrowserMainParts : public content::BrowserMainParts {
// Android's first run is done in Java instead of native.
scoped_ptr<first_run::MasterPrefs> master_prefs_;
#endif
TranslateManager* translate_manager_;
Profile* profile_;
bool run_message_loop_;
ProcessSingleton::NotifyResult notify_result_;
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/translate/chrome_translate_delegate.h"
#include "base/memory/singleton.h"
#include "chrome/browser/browser_process.h"
ChromeTranslateDelegate* ChromeTranslateDelegate::GetInstance() {
return Singleton<ChromeTranslateDelegate>::get();
}
ChromeTranslateDelegate::ChromeTranslateDelegate() {}
ChromeTranslateDelegate::~ChromeTranslateDelegate() {}
// TranslateDelegate methods.
net::URLRequestContextGetter* ChromeTranslateDelegate::GetURLRequestContext() {
return g_browser_process->system_request_context();
}
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_TRANSLATE_CHROME_TRANSLATE_DELEGATE_H_
#define CHROME_BROWSER_TRANSLATE_CHROME_TRANSLATE_DELEGATE_H_
#include "components/translate/core/browser/translate_delegate.h"
#include <string>
#include "base/compiler_specific.h"
template <typename T>
struct DefaultSingletonTraits;
namespace net {
class URLRequestContextGetter;
}
// Chrome embedder for the translate component.
class ChromeTranslateDelegate : public TranslateDelegate {
public:
// Returns the singleton instance.
// TODO(droger): Improve the ownership model. See http://crbug.com/332736.
static ChromeTranslateDelegate* GetInstance();
virtual ~ChromeTranslateDelegate();
private:
friend struct DefaultSingletonTraits<ChromeTranslateDelegate>;
ChromeTranslateDelegate();
// TranslateDelegate methods.
virtual net::URLRequestContextGetter* GetURLRequestContext() OVERRIDE;
};
#endif // CHROME_BROWSER_TRANSLATE_CHROME_TRANSLATE_DELEGATE_H_
......@@ -13,11 +13,10 @@
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/translate/chrome_translate_delegate.h"
#include "chrome/browser/translate/translate_manager.h"
#include "chrome/browser/translate/translate_url_util.h"
#include "components/translate/core/browser/translate_browser_metrics.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_event_details.h"
#include "components/translate/core/browser/translate_url_fetcher.h"
#include "net/base/url_util.h"
......@@ -168,7 +167,8 @@ void SetSupportedLanguages(const std::string& language_list,
return;
}
const std::string& locale = g_browser_process->GetApplicationLocale();
const std::string& locale =
TranslateDownloadManager::GetInstance()->application_locale();
// Now we can clear language list.
target_language_set->clear();
......@@ -227,8 +227,7 @@ TranslateLanguageList::TranslateLanguageList() {
if (update_is_disabled)
return;
language_list_fetcher_.reset(new TranslateURLFetcher(
kFetcherId, ChromeTranslateDelegate::GetInstance()));
language_list_fetcher_.reset(new TranslateURLFetcher(kFetcherId));
language_list_fetcher_->set_max_retry_on_5xx(kMaxRetryOn5xx);
}
......
......@@ -23,6 +23,7 @@
#include "chrome/browser/translate/translate_manager.h"
#include "chrome/browser/translate/translate_prefs.h"
#include "chrome/browser/translate/translate_script.h"
#include "chrome/browser/translate/translate_service.h"
#include "chrome/browser/translate/translate_tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
......@@ -38,6 +39,7 @@
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/common/language_detection_details.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/navigation_entry.h"
......@@ -233,6 +235,7 @@ class TranslateManagerBrowserTest : public ChromeRenderViewHostTestHarness,
// WebContents second). Also clears the translate script so it is fetched
// everytime and sets the expiration delay to a large value by default (in
// case it was zeroed in a previous test).
TranslateService::Initialize();
TranslateManager::GetInstance()->ClearTranslateScript();
TranslateManager::GetInstance()->
SetTranslateScriptExpirationDelay(60 * 60 * 1000);
......@@ -258,6 +261,12 @@ class TranslateManagerBrowserTest : public ChromeRenderViewHostTestHarness,
TestingBrowserProcess::DeleteInstance();
}
void SetApplicationLocale(const std::string& locale) {
g_browser_process->SetApplicationLocale(locale);
TranslateDownloadManager::GetInstance()->set_application_locale(
g_browser_process->GetApplicationLocale());
}
void SimulateTranslateScriptURLFetch(bool success) {
net::TestURLFetcher* fetcher =
url_fetcher_factory_.GetFetcherByID(TranslateScript::kFetcherId);
......@@ -982,7 +991,7 @@ TEST_F(TranslateManagerBrowserTest, ServerReportsUnsupportedLanguage) {
// Chrome is in a language that the translate server does not support.
TEST_F(TranslateManagerBrowserTest, UnsupportedUILanguage) {
std::string original_lang = g_browser_process->GetApplicationLocale();
g_browser_process->SetApplicationLocale("qbz");
SetApplicationLocale("qbz");
// Make sure that the accept language list only contains unsupported languages
Profile* profile =
......@@ -1004,14 +1013,14 @@ TEST_F(TranslateManagerBrowserTest, UnsupportedUILanguage) {
EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
g_browser_process->SetApplicationLocale(original_lang);
SetApplicationLocale(original_lang);
}
// Tests that the first supported accept language is selected
TEST_F(TranslateManagerBrowserTest, TranslateAcceptLanguage) {
// Set locate to non-existant language
std::string original_lang = g_browser_process->GetApplicationLocale();
g_browser_process->SetApplicationLocale("qbz");
SetApplicationLocale("qbz");
// Set Qbz and French as the only accepted languages
Profile* profile =
......
......@@ -11,7 +11,6 @@
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/translate/chrome_translate_delegate.h"
#include "chrome/browser/translate/translate_url_util.h"
#include "chrome/common/chrome_switches.h"
#include "components/translate/core/browser/translate_url_fetcher.h"
......@@ -105,8 +104,7 @@ void TranslateScript::Request(const Callback& callback) {
translate_script_url =
TranslateURLUtil::AddApiKeyToUrl(translate_script_url);
fetcher_.reset(new TranslateURLFetcher(
kFetcherId, ChromeTranslateDelegate::GetInstance()));
fetcher_.reset(new TranslateURLFetcher(kFetcherId));
fetcher_->set_extra_request_header(kRequestHeader);
fetcher_->Request(
translate_script_url,
......
......@@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "base/strings/stringprintf.h"
#include "chrome/common/chrome_switches.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "net/base/load_flags.h"
#include "net/base/url_util.h"
#include "net/http/http_request_headers.h"
......@@ -23,6 +24,7 @@ class TranslateScriptTest : public testing::Test {
virtual void SetUp() {
script_.reset(new TranslateScript);
DCHECK(script_.get());
TranslateDownloadManager::GetInstance()->set_application_locale("en");
}
virtual void TearDown() {
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/translate/translate_service.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/translate/translate_manager.h"
#include "components/translate/core/browser/translate_download_manager.h"
// static
void TranslateService::Initialize() {
// Create the TranslateManager singleton.
TranslateManager::GetInstance();
TranslateDownloadManager* download_manager =
TranslateDownloadManager::GetInstance();
download_manager->set_request_context(
g_browser_process->system_request_context());
download_manager->set_application_locale(
g_browser_process->GetApplicationLocale());
}
// static
void TranslateService::Shutdown(bool cleanup_pending_fetcher) {
if (cleanup_pending_fetcher)
TranslateManager::GetInstance()->CleanupPendingUlrFetcher();
TranslateDownloadManager::GetInstance()->set_request_context(NULL);
}
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_SERVICE_H_
#define CHROME_BROWSER_TRANSLATE_TRANSLATE_SERVICE_H_
// Singleton managing the resources required for Translate.
class TranslateService {
public:
// Must be called before the Translate feature can be used.
static void Initialize();
// Must be called to shut down the Translate feature.
static void Shutdown(bool cleanup_pending_fetcher);
};
#endif // CHROME_BROWSER_TRANSLATE_TRANSLATE_SERVICE_H_
......@@ -4,8 +4,8 @@
#include "chrome/browser/translate/translate_url_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/translate/translate_manager.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "google_apis/google_api_keys.h"
#include "net/base/url_util.h"
......@@ -31,7 +31,7 @@ GURL AddHostLocaleToUrl(const GURL& url) {
url,
kHostLocaleQueryName,
TranslateManager::GetLanguageCode(
g_browser_process->GetApplicationLocale()));
TranslateDownloadManager::GetInstance()->application_locale()));
}
} // namespace TranslateURLUtil
......@@ -2511,8 +2511,6 @@
'browser/thumbnails/thumbnailing_algorithm.h',
'browser/thumbnails/thumbnailing_context.cc',
'browser/thumbnails/thumbnailing_context.h',
'browser/translate/chrome_translate_delegate.cc',
'browser/translate/chrome_translate_delegate.h',
'browser/translate/options_menu_model.cc',
'browser/translate/options_menu_model.h',
'browser/translate/translate_accept_languages.h',
......@@ -2527,6 +2525,8 @@
'browser/translate/translate_prefs.h',
'browser/translate/translate_script.cc',
'browser/translate/translate_script.h',
'browser/translate/translate_service.cc',
'browser/translate/translate_service.h',
'browser/translate/translate_tab_helper.cc',
'browser/translate/translate_tab_helper.h',
'browser/translate/translate_ui_delegate.cc',
......
......@@ -11,6 +11,7 @@
'language_usage_metrics',
'translate_core_common',
'../base/base.gyp:base',
'../net/net.gyp:net',
'../url/url.gyp:url_lib',
],
'include_dirs': [
......@@ -22,7 +23,8 @@
'translate/core/browser/page_translated_details.h',
'translate/core/browser/translate_browser_metrics.cc',
'translate/core/browser/translate_browser_metrics.h',
'translate/core/browser/translate_delegate.h',
'translate/core/browser/translate_download_manager.cc',
'translate/core/browser/translate_download_manager.h',
'translate/core/browser/translate_driver.h',
'translate/core/browser/translate_error_details.h',
'translate/core/browser/translate_event_details.cc',
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_DELEGATE_H_
#define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_DELEGATE_H_
namespace net {
class URLRequestContextGetter;
}
// A concrete instance of TranslateDelegate has to be provided by the embedder
// of the Translate component.
class TranslateDelegate {
public:
//Returns the URL request context in which the Translate component should make
//requests.
virtual net::URLRequestContextGetter* GetURLRequestContext() = 0;
};
#endif // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_DELEGATE_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/translate/core/browser/translate_download_manager.h"
#include "base/memory/singleton.h"
// static
TranslateDownloadManager* TranslateDownloadManager::GetInstance() {
return Singleton<TranslateDownloadManager>::get();
}
TranslateDownloadManager::TranslateDownloadManager() {}
TranslateDownloadManager::~TranslateDownloadManager() {}
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TRANSLATE_CORE_BROWER_TRANSLATE_DOWNLOAD_MANAGER_H_
#define COMPONENTS_TRANSLATE_CORE_BROWER_TRANSLATE_DOWNLOAD_MANAGER_H_
#include <string>
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "net/url_request/url_request_context_getter.h"
template <typename T> struct DefaultSingletonTraits;
// Manages the downloaded resources for Translate, such as the translate script
// and the language list.
// TODO(droger): TranslateDownloadManager should own TranslateLanguageList and
// TranslateScript. See http://crbug.com/335074 and http://crbug.com/335077.
class TranslateDownloadManager {
public:
// Returns the singleton instance.
static TranslateDownloadManager* GetInstance();
// The request context used to download the resources.
// Should be set before this class can be used.
net::URLRequestContextGetter* request_context() { return request_context_; }
void set_request_context(net::URLRequestContextGetter* context) {
request_context_ = context;
}
// The application locale.
// Should be set before this class can be used.
const std::string& application_locale() {
DCHECK(!application_locale_.empty());
return application_locale_;
}
void set_application_locale(const std::string& locale) {
application_locale_ = locale;
}
private:
friend struct DefaultSingletonTraits<TranslateDownloadManager>;
TranslateDownloadManager();
virtual ~TranslateDownloadManager();
std::string application_locale_;
scoped_refptr<net::URLRequestContextGetter> request_context_;
};
#endif // COMPONENTS_TRANSLATE_CORE_BROWER_TRANSLATE_DOWNLOAD_MANAGER_H_
......@@ -4,7 +4,7 @@
#include "components/translate/core/browser/translate_url_fetcher.h"
#include "components/translate/core/browser/translate_delegate.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "net/base/load_flags.h"
#include "net/http/http_status_code.h"
#include "net/url_request/url_fetcher.h"
......@@ -17,11 +17,9 @@ const int kMaxRetry = 16;
} // namespace
TranslateURLFetcher::TranslateURLFetcher(int id, TranslateDelegate* delegate)
: id_(id),
translate_delegate_(delegate),
state_(IDLE),
retry_count_(0) {
TranslateURLFetcher::TranslateURLFetcher(int id) : id_(id),
state_(IDLE),
retry_count_(0) {
}
TranslateURLFetcher::~TranslateURLFetcher() {
......@@ -52,7 +50,8 @@ bool TranslateURLFetcher::Request(
this));
fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
net::LOAD_DO_NOT_SAVE_COOKIES);
fetcher_->SetRequestContext(translate_delegate_->GetURLRequestContext());
fetcher_->SetRequestContext(
TranslateDownloadManager::GetInstance()->request_context());
// 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.
......
......@@ -10,8 +10,8 @@
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h"
class TranslateDelegate;
// Downloads raw Translate data such as the Translate script and the language
// list.
class TranslateURLFetcher : public net::URLFetcherDelegate {
public:
// Callback type for Request().
......@@ -25,8 +25,7 @@ class TranslateURLFetcher : public net::URLFetcherDelegate {
FAILED, // The last fetch request was finished with a failure.
};
// |delegate| is expected to outlive the TranslateURLFetcher.
explicit TranslateURLFetcher(int id, TranslateDelegate* delegate);
explicit TranslateURLFetcher(int id);
virtual ~TranslateURLFetcher();
int max_retry_on_5xx() {
......@@ -62,9 +61,6 @@ class TranslateURLFetcher : public net::URLFetcherDelegate {
// ID which is assigned to the URLFetcher.
const int id_;
// Used to get information from the embedder of Translate.
TranslateDelegate* translate_delegate_;
// Internal state.
enum State state_;
......
......@@ -11,7 +11,8 @@ static_library("translate_core_browser") {
"core/browser/page_translated_details.h",
"core/browser/translate_browser_metrics.cc",
"core/browser/translate_browser_metrics.h",
"core/browser/translate_delegate.h",
"core/browser/translate_download_manager.cc",
"core/browser/translate_download_manager.h",
"core/browser/translate_driver.h",
"core/browser/translate_error_details.h",
"core/browser/translate_event_details.cc",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment