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