Commit 38f0d106 authored by droger's avatar droger Committed by Commit bot

Move Translate browser-side IPC handling to the component.

This CL moves a bit of translate logic from chrome/ to the translate
component.

Some IPC messages are still forwarded to chrome (through
ContentTranslateDriver::Observer) because of translate notifications.
This is temporary though, because once translate notifications are
removed, ChromeTranslateClient will no longer need to be an Observer.

Another motivation for this change is that the renderer-side of translate
IPC (TranslateHelper) is moving to the component (in another CL),
and thus the browser-side has to move too for consistency (this CL).

BUG=335087
TBR=msw

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

Cr-Commit-Position: refs/heads/master@{#295073}
parent c536893d
...@@ -61,6 +61,7 @@ ChromeTranslateClient::ChromeTranslateClient(content::WebContents* web_contents) ...@@ -61,6 +61,7 @@ ChromeTranslateClient::ChromeTranslateClient(content::WebContents* web_contents)
new translate::TranslateManager(this, prefs::kAcceptLanguages)), new translate::TranslateManager(this, prefs::kAcceptLanguages)),
cld_data_provider_( cld_data_provider_(
translate::CreateBrowserCldDataProviderFor(web_contents)) { translate::CreateBrowserCldDataProviderFor(web_contents)) {
translate_driver_.AddObserver(this);
translate_driver_.set_translate_manager(translate_manager_.get()); translate_driver_.set_translate_manager(translate_manager_.get());
// Customization: for the standalone data source, we configure the path to // Customization: for the standalone data source, we configure the path to
// CLD data immediately on startup. // CLD data immediately on startup.
...@@ -81,6 +82,7 @@ ChromeTranslateClient::ChromeTranslateClient(content::WebContents* web_contents) ...@@ -81,6 +82,7 @@ ChromeTranslateClient::ChromeTranslateClient(content::WebContents* web_contents)
} }
ChromeTranslateClient::~ChromeTranslateClient() { ChromeTranslateClient::~ChromeTranslateClient() {
translate_driver_.RemoveObserver(this);
} }
translate::LanguageState& ChromeTranslateClient::GetLanguageState() { translate::LanguageState& ChromeTranslateClient::GetLanguageState() {
...@@ -263,20 +265,7 @@ void ChromeTranslateClient::ShowReportLanguageDetectionErrorUI( ...@@ -263,20 +265,7 @@ void ChromeTranslateClient::ShowReportLanguageDetectionErrorUI(
} }
bool ChromeTranslateClient::OnMessageReceived(const IPC::Message& message) { bool ChromeTranslateClient::OnMessageReceived(const IPC::Message& message) {
bool handled = true; return cld_data_provider_->OnMessageReceived(message);
IPC_BEGIN_MESSAGE_MAP(ChromeTranslateClient, message)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_TranslateAssignedSequenceNumber,
OnTranslateAssignedSequenceNumber)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_TranslateLanguageDetermined,
OnLanguageDetermined)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_PageTranslated, OnPageTranslated)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
if (!handled) {
handled = cld_data_provider_->OnMessageReceived(message);
}
return handled;
} }
void ChromeTranslateClient::WebContentsDestroyed() { void ChromeTranslateClient::WebContentsDestroyed() {
...@@ -286,19 +275,12 @@ void ChromeTranslateClient::WebContentsDestroyed() { ...@@ -286,19 +275,12 @@ void ChromeTranslateClient::WebContentsDestroyed() {
translate_manager_.reset(); translate_manager_.reset();
} }
void ChromeTranslateClient::OnTranslateAssignedSequenceNumber(int page_seq_no) { // ContentTranslateDriver::Observer implementation.
translate_manager_->set_current_seq_no(page_seq_no);
}
void ChromeTranslateClient::OnLanguageDetermined( void ChromeTranslateClient::OnLanguageDetermined(
const translate::LanguageDetectionDetails& details, const translate::LanguageDetectionDetails& details) {
bool page_needs_translation) { // TODO: Remove translate notifications and have the clients be
GetLanguageState().LanguageDetermined(details.adopted_language, // ContentTranslateDriver::Observer directly instead.
page_needs_translation);
if (web_contents())
translate_manager_->InitiateTranslation(details.adopted_language);
content::NotificationService::current()->Notify( content::NotificationService::current()->Notify(
chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED, chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
content::Source<content::WebContents>(web_contents()), content::Source<content::WebContents>(web_contents()),
...@@ -309,10 +291,9 @@ void ChromeTranslateClient::OnPageTranslated( ...@@ -309,10 +291,9 @@ void ChromeTranslateClient::OnPageTranslated(
const std::string& original_lang, const std::string& original_lang,
const std::string& translated_lang, const std::string& translated_lang,
translate::TranslateErrors::Type error_type) { translate::TranslateErrors::Type error_type) {
// TODO: Remove translate notifications and have the clients be
// ContentTranslateDriver::Observer directly instead.
DCHECK(web_contents()); DCHECK(web_contents());
translate_manager_->PageTranslated(
original_lang, translated_lang, error_type);
translate::PageTranslatedDetails details; translate::PageTranslatedDetails details;
details.source_language = original_lang; details.source_language = original_lang;
details.target_language = translated_lang; details.target_language = translated_lang;
......
...@@ -17,10 +17,6 @@ ...@@ -17,10 +17,6 @@
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h" #include "content/public/browser/web_contents_user_data.h"
namespace base {
class File;
} // namespace base
namespace content { namespace content {
class BrowserContext; class BrowserContext;
class WebContents; class WebContents;
...@@ -33,7 +29,6 @@ class ScopedCLDDynamicDataHarness; ...@@ -33,7 +29,6 @@ class ScopedCLDDynamicDataHarness;
class PrefService; class PrefService;
namespace translate { namespace translate {
struct LanguageDetectionDetails;
class LanguageState; class LanguageState;
class TranslateAcceptLanguages; class TranslateAcceptLanguages;
class TranslatePrefs; class TranslatePrefs;
...@@ -42,6 +37,7 @@ class TranslateManager; ...@@ -42,6 +37,7 @@ class TranslateManager;
class ChromeTranslateClient class ChromeTranslateClient
: public translate::TranslateClient, : public translate::TranslateClient,
public translate::ContentTranslateDriver::Observer,
public content::WebContentsObserver, public content::WebContentsObserver,
public content::WebContentsUserData<ChromeTranslateClient> { public content::WebContentsUserData<ChromeTranslateClient> {
public: public:
...@@ -100,6 +96,14 @@ class ChromeTranslateClient ...@@ -100,6 +96,14 @@ class ChromeTranslateClient
virtual void ShowReportLanguageDetectionErrorUI( virtual void ShowReportLanguageDetectionErrorUI(
const GURL& report_url) OVERRIDE; const GURL& report_url) OVERRIDE;
// ContentTranslateDriver::Observer implementation.
virtual void OnLanguageDetermined(
const translate::LanguageDetectionDetails& details) OVERRIDE;
virtual void OnPageTranslated(
const std::string& original_lang,
const std::string& translated_lang,
translate::TranslateErrors::Type error_type) OVERRIDE;
private: private:
explicit ChromeTranslateClient(content::WebContents* web_contents); explicit ChromeTranslateClient(content::WebContents* web_contents);
friend class content::WebContentsUserData<ChromeTranslateClient>; friend class content::WebContentsUserData<ChromeTranslateClient>;
...@@ -108,14 +112,6 @@ class ChromeTranslateClient ...@@ -108,14 +112,6 @@ class ChromeTranslateClient
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void WebContentsDestroyed() OVERRIDE; virtual void WebContentsDestroyed() OVERRIDE;
// IPC handlers.
void OnTranslateAssignedSequenceNumber(int page_seq_no);
void OnLanguageDetermined(const translate::LanguageDetectionDetails& details,
bool page_needs_translation);
void OnPageTranslated(const std::string& original_lang,
const std::string& translated_lang,
translate::TranslateErrors::Type error_type);
// Shows the translate bubble. // Shows the translate bubble.
void ShowBubble(translate::TranslateStep step, void ShowBubble(translate::TranslateStep step,
translate::TranslateErrors::Type error_type); translate::TranslateErrors::Type error_type);
......
...@@ -2243,14 +2243,15 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) { ...@@ -2243,14 +2243,15 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
CoreTabHelper::FromWebContents(web_contents)->set_delegate(delegate); CoreTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
SearchEngineTabHelper::FromWebContents(web_contents)->set_delegate(delegate); SearchEngineTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
SearchTabHelper::FromWebContents(web_contents)->set_delegate(delegate); SearchTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
if (delegate) translate::ContentTranslateDriver& content_translate_driver =
ChromeTranslateClient::FromWebContents(web_contents)->translate_driver();
if (delegate) {
ZoomController::FromWebContents(web_contents)->AddObserver(this); ZoomController::FromWebContents(web_contents)->AddObserver(this);
else content_translate_driver.AddObserver(translate_driver_observer_.get());
} else {
ZoomController::FromWebContents(web_contents)->RemoveObserver(this); ZoomController::FromWebContents(web_contents)->RemoveObserver(this);
ChromeTranslateClient* chrome_translate_client = content_translate_driver.RemoveObserver(translate_driver_observer_.get());
ChromeTranslateClient::FromWebContents(web_contents); }
chrome_translate_client->translate_driver().set_observer(
delegate ? delegate->translate_driver_observer_.get() : NULL);
} }
void Browser::CloseFrame() { void Browser::CloseFrame() {
......
...@@ -35,7 +35,6 @@ ContentTranslateDriver::ContentTranslateDriver( ...@@ -35,7 +35,6 @@ ContentTranslateDriver::ContentTranslateDriver(
: content::WebContentsObserver(nav_controller->GetWebContents()), : content::WebContentsObserver(nav_controller->GetWebContents()),
navigation_controller_(nav_controller), navigation_controller_(nav_controller),
translate_manager_(NULL), translate_manager_(NULL),
observer_(NULL),
max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts), max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts),
weak_pointer_factory_(this) { weak_pointer_factory_(this) {
DCHECK(navigation_controller_); DCHECK(navigation_controller_);
...@@ -43,6 +42,14 @@ ContentTranslateDriver::ContentTranslateDriver( ...@@ -43,6 +42,14 @@ ContentTranslateDriver::ContentTranslateDriver(
ContentTranslateDriver::~ContentTranslateDriver() {} ContentTranslateDriver::~ContentTranslateDriver() {}
void ContentTranslateDriver::AddObserver(Observer* observer) {
observer_list_.AddObserver(observer);
}
void ContentTranslateDriver::RemoveObserver(Observer* observer) {
observer_list_.RemoveObserver(observer);
}
void ContentTranslateDriver::InitiateTranslation(const std::string& page_lang, void ContentTranslateDriver::InitiateTranslation(const std::string& page_lang,
int attempt) { int attempt) {
if (translate_manager_->GetLanguageState().translation_pending()) if (translate_manager_->GetLanguageState().translation_pending())
...@@ -77,19 +84,16 @@ bool ContentTranslateDriver::IsLinkNavigation() { ...@@ -77,19 +84,16 @@ bool ContentTranslateDriver::IsLinkNavigation() {
} }
void ContentTranslateDriver::OnTranslateEnabledChanged() { void ContentTranslateDriver::OnTranslateEnabledChanged() {
if (observer_) { content::WebContents* web_contents = navigation_controller_->GetWebContents();
content::WebContents* web_contents = FOR_EACH_OBSERVER(
navigation_controller_->GetWebContents(); Observer, observer_list_, OnTranslateEnabledChanged(web_contents));
observer_->OnTranslateEnabledChanged(web_contents);
}
} }
void ContentTranslateDriver::OnIsPageTranslatedChanged() { void ContentTranslateDriver::OnIsPageTranslatedChanged() {
if (observer_) {
content::WebContents* web_contents = content::WebContents* web_contents =
navigation_controller_->GetWebContents(); navigation_controller_->GetWebContents();
observer_->OnIsPageTranslatedChanged(web_contents); FOR_EACH_OBSERVER(
} Observer, observer_list_, OnIsPageTranslatedChanged(web_contents));
} }
void ContentTranslateDriver::TranslatePage(int page_seq_no, void ContentTranslateDriver::TranslatePage(int page_seq_no,
...@@ -212,4 +216,46 @@ void ContentTranslateDriver::DidNavigateAnyFrame( ...@@ -212,4 +216,46 @@ void ContentTranslateDriver::DidNavigateAnyFrame(
details.is_in_page, details.is_main_frame, reload); details.is_in_page, details.is_main_frame, reload);
} }
bool ContentTranslateDriver::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ContentTranslateDriver, message)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_TranslateAssignedSequenceNumber,
OnTranslateAssignedSequenceNumber)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_TranslateLanguageDetermined,
OnLanguageDetermined)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_PageTranslated, OnPageTranslated)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}
void ContentTranslateDriver::OnTranslateAssignedSequenceNumber(
int page_seq_no) {
translate_manager_->set_current_seq_no(page_seq_no);
}
void ContentTranslateDriver::OnLanguageDetermined(
const LanguageDetectionDetails& details,
bool page_needs_translation) {
translate_manager_->GetLanguageState().LanguageDetermined(
details.adopted_language, page_needs_translation);
if (web_contents())
translate_manager_->InitiateTranslation(details.adopted_language);
FOR_EACH_OBSERVER(Observer, observer_list_, OnLanguageDetermined(details));
}
void ContentTranslateDriver::OnPageTranslated(
const std::string& original_lang,
const std::string& translated_lang,
TranslateErrors::Type error_type) {
translate_manager_->PageTranslated(
original_lang, translated_lang, error_type);
FOR_EACH_OBSERVER(
Observer,
observer_list_,
OnPageTranslated(original_lang, translated_lang, error_type));
}
} // namespace translate } // namespace translate
...@@ -7,7 +7,9 @@ ...@@ -7,7 +7,9 @@
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/translate/core/browser/translate_driver.h" #include "components/translate/core/browser/translate_driver.h"
#include "components/translate/core/common/translate_errors.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
namespace content { namespace content {
...@@ -17,6 +19,7 @@ class WebContents; ...@@ -17,6 +19,7 @@ class WebContents;
namespace translate { namespace translate {
struct LanguageDetectionDetails;
class TranslateManager; class TranslateManager;
// Content implementation of TranslateDriver. // Content implementation of TranslateDriver.
...@@ -28,10 +31,20 @@ class ContentTranslateDriver : public TranslateDriver, ...@@ -28,10 +31,20 @@ class ContentTranslateDriver : public TranslateDriver,
class Observer { class Observer {
public: public:
// Handles when the value of IsPageTranslated is changed. // Handles when the value of IsPageTranslated is changed.
virtual void OnIsPageTranslatedChanged(content::WebContents* source) = 0; virtual void OnIsPageTranslatedChanged(content::WebContents* source) {};
// Handles when the value of translate_enabled is changed. // Handles when the value of translate_enabled is changed.
virtual void OnTranslateEnabledChanged(content::WebContents* source) = 0; virtual void OnTranslateEnabledChanged(content::WebContents* source) {};
// Called when the page language has been determined.
virtual void OnLanguageDetermined(
const translate::LanguageDetectionDetails& details) {};
// Called when the page has been translated.
virtual void OnPageTranslated(
const std::string& original_lang,
const std::string& translated_lang,
translate::TranslateErrors::Type error_type) {};
protected: protected:
virtual ~Observer() {} virtual ~Observer() {}
...@@ -40,8 +53,9 @@ class ContentTranslateDriver : public TranslateDriver, ...@@ -40,8 +53,9 @@ class ContentTranslateDriver : public TranslateDriver,
ContentTranslateDriver(content::NavigationController* nav_controller); ContentTranslateDriver(content::NavigationController* nav_controller);
virtual ~ContentTranslateDriver(); virtual ~ContentTranslateDriver();
// Sets the Observer. Calling this method is optional. // Adds or Removes observers.
void set_observer(Observer* observer) { observer_ = observer; } void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
// Number of attempts before waiting for a page to be fully reloaded. // Number of attempts before waiting for a page to be fully reloaded.
void set_translate_max_reload_attempts(int attempts) { void set_translate_max_reload_attempts(int attempts) {
...@@ -79,6 +93,15 @@ class ContentTranslateDriver : public TranslateDriver, ...@@ -79,6 +93,15 @@ class ContentTranslateDriver : public TranslateDriver,
virtual void DidNavigateAnyFrame( virtual void DidNavigateAnyFrame(
const content::LoadCommittedDetails& details, const content::LoadCommittedDetails& details,
const content::FrameNavigateParams& params) OVERRIDE; const content::FrameNavigateParams& params) OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// IPC handlers.
void OnTranslateAssignedSequenceNumber(int page_seq_no);
void OnLanguageDetermined(const LanguageDetectionDetails& details,
bool page_needs_translation);
void OnPageTranslated(const std::string& original_lang,
const std::string& translated_lang,
TranslateErrors::Type error_type);
private: private:
// The navigation controller of the tab we are associated with. // The navigation controller of the tab we are associated with.
...@@ -86,7 +109,7 @@ class ContentTranslateDriver : public TranslateDriver, ...@@ -86,7 +109,7 @@ class ContentTranslateDriver : public TranslateDriver,
TranslateManager* translate_manager_; TranslateManager* translate_manager_;
Observer* observer_; ObserverList<Observer, true> observer_list_;
// Max number of attempts before checking if a page has been reloaded. // Max number of attempts before checking if a page has been reloaded.
int max_reload_check_attempts_; int max_reload_check_attempts_;
......
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