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

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

Issue 166963002: TranslateManager is no longer a singleton (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@temp
Patch Set: Review comments Created 6 years, 10 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 5a83624db83926e93fe3f4e1de7c8bce0bcb753b..8f905a311895406e3473335923efe501df301744 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -6,7 +6,6 @@
#include "base/bind.h"
#include "base/command_line.h"
-#include "base/memory/singleton.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
#include "base/prefs/pref_service.h"
@@ -90,13 +89,7 @@ void NotifyTranslateError(const TranslateErrorDetails& details) {
} // namespace
-TranslateManager::~TranslateManager() {
-}
-
-// static
-TranslateManager* TranslateManager::GetInstance() {
- return Singleton<TranslateManager>::get();
-}
+TranslateManager::~TranslateManager() {}
// static
bool TranslateManager::IsTranslatableURL(const GURL& url) {
@@ -124,6 +117,8 @@ void TranslateManager::Observe(int type,
case content::NOTIFICATION_NAV_ENTRY_COMMITTED: {
NavigationController* controller =
content::Source<NavigationController>(source).ptr();
+ DCHECK_EQ(&translate_tab_helper_->GetWebContents()->GetController(),
+ controller);
content::LoadCommittedDetails* load_details =
content::Details<content::LoadCommittedDetails>(details).ptr();
NavigationEntry* entry = controller->GetActiveEntry();
@@ -132,9 +127,7 @@ void TranslateManager::Observe(int type,
return;
}
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(controller->GetWebContents());
- if (!translate_tab_helper)
+ if (!translate_tab_helper_->GetWebContents())
return;
// If the navigation happened while offline don't show the translate
@@ -145,7 +138,7 @@ void TranslateManager::Observe(int type,
}
if (!load_details->is_main_frame &&
- translate_tab_helper->GetLanguageState().translation_declined()) {
+ translate_tab_helper_->GetLanguageState().translation_declined()) {
// Some sites (such as Google map) may trigger sub-frame navigations
// when the user interacts with the page. We don't want to show a new
// infobar if the user already dismissed one in that case.
@@ -159,19 +152,19 @@ void TranslateManager::Observe(int type,
// When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent,
// so the translation needs to be explicitly initiated, but only when the
// page needs translation.
- if (!translate_tab_helper->GetLanguageState().page_needs_translation())
+ if (!translate_tab_helper_->GetLanguageState().page_needs_translation())
return;
// Note that we delay it as the TranslateManager gets this notification
// before the WebContents and the WebContents processing might remove the
// current infobars. Since InitTranslation might add an infobar, it must
// be done after that.
- base::MessageLoop::current()->PostTask(FROM_HERE,
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
base::Bind(
&TranslateManager::InitiateTranslationPosted,
weak_method_factory_.GetWeakPtr(),
- controller->GetWebContents()->GetRenderProcessHost()->GetID(),
- controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(),
- translate_tab_helper->GetLanguageState().original_language(), 0));
+ translate_tab_helper_->GetLanguageState().original_language(),
+ 0));
break;
}
case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: {
@@ -179,21 +172,20 @@ void TranslateManager::Observe(int type,
content::Details<const LanguageDetectionDetails>(details).ptr();
WebContents* tab = content::Source<WebContents>(source).ptr();
+ DCHECK_EQ(translate_tab_helper_->GetWebContents(), tab);
// We may get this notifications multiple times. Make sure to translate
blundell 2014/02/18 09:21:46 Orthogonal to your CL, but this comment seems misp
droger 2014/02/18 10:16:51 Done.
// only once.
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(tab);
- if (!translate_tab_helper)
+ if (!translate_tab_helper_->GetWebContents())
return;
- LanguageState& language_state = translate_tab_helper->GetLanguageState();
+ LanguageState& language_state = translate_tab_helper_->GetLanguageState();
if (language_state.page_needs_translation() &&
!language_state.translation_pending() &&
!language_state.translation_declined() &&
!language_state.IsPageTranslated()) {
std::string language = lang_det_details->adopted_language;
- InitiateTranslation(tab, language);
+ InitiateTranslation(language);
}
break;
}
@@ -201,10 +193,9 @@ void TranslateManager::Observe(int type,
// Only add translate infobar if it doesn't exist; if it already exists,
// just update the state, the actual infobar would have received the same
// notification and update the visual display accordingly.
- WebContents* tab = content::Source<WebContents>(source).ptr();
PageTranslatedDetails* page_translated_details =
content::Details<PageTranslatedDetails>(details).ptr();
- PageTranslated(tab, page_translated_details);
+ PageTranslated(page_translated_details);
break;
}
default:
@@ -221,23 +212,27 @@ TranslateManager::RegisterTranslateErrorCallback(
return g_callback_list_->Add(callback);
}
-TranslateManager::TranslateManager()
- : max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts),
- weak_method_factory_(this) {
- notification_registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
- content::NotificationService::AllSources());
+TranslateManager::TranslateManager(TranslateTabHelper* helper)
+ : max_reload_check_attempts_(kMaxTranslateLoadCheckAttempts),
+ translate_tab_helper_(helper),
+ weak_method_factory_(this) {
+
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
+
+ notification_registrar_.Add(
+ this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
+ content::Source<NavigationController>(&web_contents->GetController()));
notification_registrar_.Add(this,
chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
- content::NotificationService::AllSources());
- notification_registrar_.Add(this, chrome::NOTIFICATION_PAGE_TRANSLATED,
- content::NotificationService::AllSources());
+ content::Source<WebContents>(web_contents));
+ notification_registrar_.Add(this,
+ chrome::NOTIFICATION_PAGE_TRANSLATED,
+ content::Source<WebContents>(web_contents));
}
-void TranslateManager::InitiateTranslation(WebContents* web_contents,
- const std::string& page_lang) {
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- if (!translate_tab_helper)
+void TranslateManager::InitiateTranslation(const std::string& page_lang) {
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
+ if (!web_contents)
return;
Profile* profile =
@@ -329,18 +324,18 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
if (!auto_target_lang.empty()) {
TranslateBrowserMetrics::ReportInitiationStatus(
TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG);
- TranslatePage(web_contents, language_code, auto_target_lang);
+ TranslatePage(language_code, auto_target_lang);
return;
}
}
- LanguageState& language_state = translate_tab_helper->GetLanguageState();
+ LanguageState& language_state = translate_tab_helper_->GetLanguageState();
std::string auto_translate_to = language_state.AutoTranslateTo();
if (!auto_translate_to.empty()) {
// This page was navigated through a click from a translated page.
TranslateBrowserMetrics::ReportInitiationStatus(
TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK);
- TranslatePage(web_contents, language_code, auto_translate_to);
+ TranslatePage(language_code, auto_translate_to);
return;
}
@@ -348,26 +343,19 @@ void TranslateManager::InitiateTranslation(WebContents* web_contents,
TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR);
// Prompts the user if he/she wants the page translated.
- translate_tab_helper->ShowTranslateUI(TranslateTabHelper::BEFORE_TRANSLATE,
- web_contents,
- language_code,
- target_lang,
- TranslateErrors::NONE);
+ translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::BEFORE_TRANSLATE,
+ language_code,
+ target_lang,
+ TranslateErrors::NONE);
}
-void TranslateManager::InitiateTranslationPosted(int process_id,
- int render_id,
- const std::string& page_lang,
+void TranslateManager::InitiateTranslationPosted(const std::string& page_lang,
int attempt) {
- // The tab might have been closed.
- WebContents* web_contents =
- tab_util::GetWebContentsByID(process_id, render_id);
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
if (!web_contents)
return;
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- if (translate_tab_helper->GetLanguageState().translation_pending())
+ if (translate_tab_helper_->GetLanguageState().translation_pending())
return;
// During a reload we need web content to be available before the
@@ -378,19 +366,19 @@ void TranslateManager::InitiateTranslationPosted(int process_id,
int backoff = attempt * max_reload_check_attempts_;
base::MessageLoop::current()->PostDelayedTask(
FROM_HERE, base::Bind(&TranslateManager::InitiateTranslationPosted,
- weak_method_factory_.GetWeakPtr(), process_id,
- render_id, page_lang, ++attempt),
+ weak_method_factory_.GetWeakPtr(),
+ page_lang, ++attempt),
base::TimeDelta::FromMilliseconds(backoff));
return;
}
- InitiateTranslation(web_contents,
- TranslateDownloadManager::GetLanguageCode(page_lang));
+ InitiateTranslation(TranslateDownloadManager::GetLanguageCode(page_lang));
}
-void TranslateManager::TranslatePage(WebContents* web_contents,
- const std::string& original_source_lang,
+void TranslateManager::TranslatePage(const std::string& original_source_lang,
const std::string& target_lang) {
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
+ DCHECK(web_contents);
NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
if (!entry) {
NOTREACHED();
@@ -405,39 +393,34 @@ void TranslateManager::TranslatePage(WebContents* web_contents,
if (!TranslateDownloadManager::IsSupportedLanguage(source_lang))
source_lang = std::string(translate::kUnknownLanguageCode);
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- DCHECK(translate_tab_helper);
- translate_tab_helper->ShowTranslateUI(TranslateTabHelper::TRANSLATING,
- web_contents,
- source_lang,
- target_lang,
- TranslateErrors::NONE);
+ translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::TRANSLATING,
+ source_lang,
+ target_lang,
+ TranslateErrors::NONE);
TranslateScript* script = TranslateDownloadManager::GetInstance()->script();
DCHECK(script != NULL);
const std::string& script_data = script->data();
if (!script_data.empty()) {
- DoTranslatePage(web_contents, script_data, source_lang, target_lang);
+ DoTranslatePage(script_data, source_lang, target_lang);
return;
}
// The script is not available yet. Queue that request and query for the
// script. Once it is downloaded we'll do the translate.
- content::RenderViewHost* rvh = web_contents->GetRenderViewHost();
- PendingRequest request;
- request.render_process_id = rvh->GetProcess()->GetID();
- request.render_view_id = rvh->GetRoutingID();
- request.page_id = entry->GetPageID();
- request.source_lang = source_lang;
- request.target_lang = target_lang;
-
- script->Request(base::Bind(&TranslateManager::OnTranslateScriptFetchComplete,
- weak_method_factory_.GetWeakPtr(), request));
+ TranslateScript::RequestCallback callback =
+ base::Bind(&TranslateManager::OnTranslateScriptFetchComplete,
+ weak_method_factory_.GetWeakPtr(),
+ entry->GetPageID(),
+ source_lang,
+ target_lang);
+
+ script->Request(callback);
}
-void TranslateManager::RevertTranslation(WebContents* web_contents) {
+void TranslateManager::RevertTranslation() {
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
if (!entry) {
NOTREACHED();
@@ -446,15 +429,14 @@ void TranslateManager::RevertTranslation(WebContents* web_contents) {
web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation(
web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID()));
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- translate_tab_helper->GetLanguageState().SetCurrentLanguage(
- translate_tab_helper->GetLanguageState().original_language());
+ translate_tab_helper_->GetLanguageState().SetCurrentLanguage(
+ translate_tab_helper_->GetLanguageState().original_language());
}
-void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
+void TranslateManager::ReportLanguageDetectionError() {
TranslateBrowserMetrics::ReportLanguageDetectionError();
// We'll open the URL in a new tab so that the user can tell us more.
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
if (!browser) {
NOTREACHED();
@@ -469,12 +451,10 @@ void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
kUrlQueryName,
page_url.spec());
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
report_error_url = net::AppendQueryParameter(
report_error_url,
kSourceLanguageQueryName,
- translate_tab_helper->GetLanguageState().original_language());
+ translate_tab_helper_->GetLanguageState().original_language());
report_error_url = TranslateURLUtil::AddHostLocaleToUrl(report_error_url);
report_error_url = TranslateURLUtil::AddApiKeyToUrl(report_error_url);
@@ -483,29 +463,26 @@ void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
content::PAGE_TRANSITION_AUTO_BOOKMARK);
}
-void TranslateManager::DoTranslatePage(WebContents* web_contents,
- const std::string& translate_script,
+void TranslateManager::DoTranslatePage(const std::string& translate_script,
const std::string& source_lang,
const std::string& target_lang) {
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
if (!entry) {
NOTREACHED();
return;
}
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- if (!translate_tab_helper)
+ if (!web_contents)
blundell 2014/02/18 09:21:46 This should be above the check that starts on 470.
return;
- translate_tab_helper->GetLanguageState().set_translation_pending(true);
+ translate_tab_helper_->GetLanguageState().set_translation_pending(true);
web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage(
web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(),
translate_script, source_lang, target_lang));
}
-void TranslateManager::PageTranslated(WebContents* web_contents,
- PageTranslatedDetails* details) {
+void TranslateManager::PageTranslated(PageTranslatedDetails* details) {
if ((details->error_type == TranslateErrors::NONE) &&
details->source_language != translate::kUnknownLanguageCode &&
!TranslateDownloadManager::IsSupportedLanguage(
@@ -513,15 +490,14 @@ void TranslateManager::PageTranslated(WebContents* web_contents,
details->error_type = TranslateErrors::UNSUPPORTED_LANGUAGE;
}
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- DCHECK(translate_tab_helper);
- translate_tab_helper->ShowTranslateUI(TranslateTabHelper::AFTER_TRANSLATE,
- web_contents,
- details->source_language,
- details->target_language,
- details->error_type);
+ DCHECK(translate_tab_helper_->GetWebContents());
+
+ translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::AFTER_TRANSLATE,
+ details->source_language,
+ details->target_language,
+ details->error_type);
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
if (details->error_type != TranslateErrors::NONE &&
!web_contents->GetBrowserContext()->IsOffTheRecord()) {
TranslateErrorDetails error_details;
@@ -532,17 +508,19 @@ void TranslateManager::PageTranslated(WebContents* web_contents,
}
}
-void TranslateManager::OnTranslateScriptFetchComplete(PendingRequest request,
- bool success,
- const std::string& data) {
- WebContents* web_contents = tab_util::GetWebContentsByID(
- request.render_process_id, request.render_view_id);
+void TranslateManager::OnTranslateScriptFetchComplete(
+ int page_id,
+ const std::string& source_lang,
+ const std::string& target_lang,
+ bool success,
+ const std::string& data) {
+ WebContents* web_contents = translate_tab_helper_->GetWebContents();
if (!web_contents) {
// The tab went away while we were retrieving the script.
return;
}
NavigationEntry* entry = web_contents->GetController().GetActiveEntry();
- if (!entry || entry->GetPageID() != request.page_id) {
+ if (!entry || entry->GetPageID() != page_id) {
// We navigated away from the page the translation was triggered on.
return;
}
@@ -552,17 +530,12 @@ void TranslateManager::OnTranslateScriptFetchComplete(PendingRequest request,
TranslateScript* translate_script =
TranslateDownloadManager::GetInstance()->script();
DCHECK(translate_script);
- DoTranslatePage(
- web_contents, data, request.source_lang, request.target_lang);
+ DoTranslatePage(data, source_lang, target_lang);
} else {
- TranslateTabHelper* translate_tab_helper =
- TranslateTabHelper::FromWebContents(web_contents);
- DCHECK(translate_tab_helper);
- translate_tab_helper->ShowTranslateUI(TranslateTabHelper::TRANSLATE_ERROR,
- web_contents,
- request.source_lang,
- request.target_lang,
- TranslateErrors::NETWORK);
+ translate_tab_helper_->ShowTranslateUI(TranslateTabHelper::TRANSLATE_ERROR,
+ source_lang,
+ target_lang,
+ TranslateErrors::NETWORK);
if (!web_contents->GetBrowserContext()->IsOffTheRecord()) {
TranslateErrorDetails error_details;
error_details.time = base::Time::Now();

Powered by Google App Engine
This is Rietveld 408576698