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..7c600cad84ac06f585f9ce4eb9bd240d9aca9c7a 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,11 +127,6 @@ void TranslateManager::Observe(int type, |
return; |
} |
- TranslateTabHelper* translate_tab_helper = |
- TranslateTabHelper::FromWebContents(controller->GetWebContents()); |
- if (!translate_tab_helper) |
- return; |
- |
// If the navigation happened while offline don't show the translate |
// bar since there will be nothing to translate. |
if (load_details->http_status_code == 0 || |
@@ -145,7 +135,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 +149,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 +169,17 @@ 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 |
// only once. |
- TranslateTabHelper* translate_tab_helper = |
- TranslateTabHelper::FromWebContents(tab); |
- if (!translate_tab_helper) |
- 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 +187,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,25 +206,26 @@ 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) |
- return; |
- |
+void TranslateManager::InitiateTranslation(const std::string& page_lang) { |
+ WebContents* web_contents = translate_tab_helper_->GetWebContents(); |
Profile* profile = |
Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
Profile* original_profile = profile->GetOriginalProfile(); |
@@ -329,18 +315,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,49 +334,35 @@ 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); |
- if (!web_contents) |
- return; |
- |
- TranslateTabHelper* translate_tab_helper = |
- TranslateTabHelper::FromWebContents(web_contents); |
- if (translate_tab_helper->GetLanguageState().translation_pending()) |
- return; |
- |
// During a reload we need web content to be available before the |
// translate script is executed. Otherwise we will run the translate script on |
// an empty DOM which will fail. Therefore we wait a bit to see if the page |
// has finished. |
+ WebContents* web_contents = translate_tab_helper_->GetWebContents(); |
if ((web_contents->IsLoading()) && attempt < kMaxTranslateLoadCheckAttempts) { |
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(); |
NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); |
if (!entry) { |
NOTREACHED(); |
@@ -405,39 +377,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 +413,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 +435,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 +447,23 @@ 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) |
blundell
2014/02/17 15:26:28
I think you should keep this check, checking again
droger
2014/02/17 16:52:48
Done.
|
- 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 +471,12 @@ void TranslateManager::PageTranslated(WebContents* web_contents, |
details->error_type = TranslateErrors::UNSUPPORTED_LANGUAGE; |
} |
- TranslateTabHelper* translate_tab_helper = |
- TranslateTabHelper::FromWebContents(web_contents); |
- DCHECK(translate_tab_helper); |
blundell
2014/02/17 15:26:28
You can change this to DCHECK(translate_tab_helper
droger
2014/02/17 16:52:48
Done.
|
- translate_tab_helper->ShowTranslateUI(TranslateTabHelper::AFTER_TRANSLATE, |
- web_contents, |
- details->source_language, |
- details->target_language, |
- details->error_type); |
+ 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 +487,15 @@ 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); |
- if (!web_contents) { |
- // The tab went away while we were retrieving the script. |
- return; |
- } |
+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(); |
blundell
2014/02/17 15:26:28
This can return NULL, so you need to keep the chec
droger
2014/02/17 16:52:48
I changed TranslateTabHelper so that in theory thi
|
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 +505,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(); |