Switch TranslateTabHelper to use WebContentsUserData.
BUG=107201
TEST=no visible change
Review URL: https://chromiumcodereview.appspot.com/10987052
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@159273 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/api/tabs/tabs.cc b/chrome/browser/extensions/api/tabs/tabs.cc
index b7152d1..20053f9 100644
--- a/chrome/browser/extensions/api/tabs/tabs.cc
+++ b/chrome/browser/extensions/api/tabs/tabs.cc
@@ -1825,16 +1825,17 @@
AddRef(); // Balanced in GotLanguage()
- TranslateTabHelper* helper = contents->translate_tab_helper();
- if (!helper->language_state().original_language().empty()) {
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(contents->web_contents());
+ if (!translate_tab_helper->language_state().original_language().empty()) {
// Delay the callback invocation until after the current JS call has
// returned.
MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
&DetectTabLanguageFunction::GotLanguage, this,
- helper->language_state().original_language()));
+ translate_tab_helper->language_state().original_language()));
return true;
}
- // The tab contents does not know its language yet. Let's wait until it
+ // The tab contents does not know its language yet. Let's wait until it
// receives it, or until the tab is closed/navigates to some other page.
registrar_.Add(this, chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
content::Source<WebContents>(contents->web_contents()));
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc
index c57365e..2c3bdae 100644
--- a/chrome/browser/tab_contents/render_view_context_menu.cc
+++ b/chrome/browser/tab_contents/render_view_context_menu.cc
@@ -1157,13 +1157,12 @@
return true;
case IDC_CONTENT_CONTEXT_TRANSLATE: {
- TabContents* tab_contents =
- TabContents::FromWebContents(source_web_contents_);
- if (!tab_contents)
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(source_web_contents_);
+ if (!translate_tab_helper)
return false;
- TranslateTabHelper* helper = tab_contents->translate_tab_helper();
std::string original_lang =
- helper->language_state().original_language();
+ translate_tab_helper->language_state().original_language();
std::string target_lang = g_browser_process->GetApplicationLocale();
target_lang = TranslateManager::GetLanguageCode(target_lang);
// Note that we intentionally enable the menu even if the original and
@@ -1171,14 +1170,14 @@
// translate a page that might contains text fragments in a different
// language.
return !!(params_.edit_flags & WebContextMenuData::CanTranslate) &&
- helper->language_state().page_translatable() &&
+ translate_tab_helper->language_state().page_translatable() &&
!original_lang.empty() && // Did we receive the page language yet?
// Only allow translating languages we explitly support and the
// unknown language (in which case the page language is detected on
// the server side).
(original_lang == chrome::kUnknownLanguageCode ||
TranslateManager::IsSupportedLanguage(original_lang)) &&
- !helper->language_state().IsPageTranslated() &&
+ !translate_tab_helper->language_state().IsPageTranslated() &&
!source_web_contents_->GetInterstitialPage() &&
TranslateManager::IsTranslatableURL(params_.page_url) &&
// There are some application locales which can't be used as a
@@ -1723,16 +1722,15 @@
case IDC_CONTENT_CONTEXT_TRANSLATE: {
// A translation might have been triggered by the time the menu got
// selected, do nothing in that case.
- TabContents* tab_contents =
- TabContents::FromWebContents(source_web_contents_);
- if (!tab_contents)
- return;
- TranslateTabHelper* helper = tab_contents->translate_tab_helper();
- if (helper->language_state().IsPageTranslated() ||
- helper->language_state().translation_pending()) {
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(source_web_contents_);
+ if (!translate_tab_helper ||
+ translate_tab_helper->language_state().IsPageTranslated() ||
+ translate_tab_helper->language_state().translation_pending()) {
return;
}
- std::string original_lang = helper->language_state().original_language();
+ std::string original_lang =
+ translate_tab_helper->language_state().original_language();
std::string target_lang = g_browser_process->GetApplicationLocale();
target_lang = TranslateManager::GetLanguageCode(target_lang);
// Since the user decided to translate for that language and site, clears
diff --git a/chrome/browser/translate/translate_infobar_delegate.cc b/chrome/browser/translate/translate_infobar_delegate.cc
index 84e7fff8..6eb40c4c 100644
--- a/chrome/browser/translate/translate_infobar_delegate.cc
+++ b/chrome/browser/translate/translate_infobar_delegate.cc
@@ -102,9 +102,9 @@
// translations when getting a LANGUAGE_DETERMINED from the page, which
// happens when a load stops. That could happen multiple times, including
// after the user already declined the translation.)
- TranslateTabHelper* helper = TabContents::FromWebContents(
- owner()->GetWebContents())->translate_tab_helper();
- helper->language_state().set_translation_declined(true);
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(owner()->GetWebContents());
+ translate_tab_helper->language_state().set_translation_declined(true);
}
bool TranslateInfoBarDelegate::IsLanguageBlacklisted() {
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc
index b9b4d76..277e86c 100644
--- a/chrome/browser/translate/translate_manager.cc
+++ b/chrome/browser/translate/translate_manager.cc
@@ -330,14 +330,13 @@
return;
}
- TabContents* tab_contents =
- TabContents::FromWebContents(controller->GetWebContents());
- if (!tab_contents || !tab_contents->translate_tab_helper())
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(controller->GetWebContents());
+ if (!translate_tab_helper)
return;
- TranslateTabHelper* helper = tab_contents->translate_tab_helper();
if (!load_details->is_main_frame &&
- helper->language_state().translation_declined()) {
+ translate_tab_helper->language_state().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.
@@ -350,7 +349,7 @@
// When doing a page reload, TAB_LANGUAGE_DETERMINED is not sent,
// so the translation needs to be explicitly initiated, but only when the
// page is translatable.
- if (!helper->language_state().page_translatable())
+ if (!translate_tab_helper->language_state().page_translatable())
return;
// Note that we delay it as the TranslateManager gets this notification
// before the WebContents and the WebContents processing might remove the
@@ -361,21 +360,20 @@
&TranslateManager::InitiateTranslationPosted,
weak_method_factory_.GetWeakPtr(),
controller->GetWebContents()->GetRenderProcessHost()->GetID(),
- controller->GetWebContents()->
- GetRenderViewHost()->GetRoutingID(),
- helper->language_state().original_language()));
+ controller->GetWebContents()->GetRenderViewHost()->GetRoutingID(),
+ translate_tab_helper->language_state().original_language()));
break;
}
case chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED: {
WebContents* tab = content::Source<WebContents>(source).ptr();
// We may get this notifications multiple times. Make sure to translate
// only once.
- TabContents* tab_contents = TabContents::FromWebContents(tab);
- if (!tab_contents || !tab_contents->translate_tab_helper())
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(tab);
+ if (!translate_tab_helper)
return;
- LanguageState& language_state =
- tab_contents->translate_tab_helper()->language_state();
+ LanguageState& language_state = translate_tab_helper->language_state();
if (language_state.page_translatable() &&
!language_state.translation_pending() &&
!language_state.translation_declined() &&
@@ -589,18 +587,20 @@
}
}
- TabContents* tab_contents = TabContents::FromWebContents(web_contents);
- if (!tab_contents || !tab_contents->translate_tab_helper())
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(web_contents);
+ if (!translate_tab_helper)
return;
- TranslateTabHelper* helper = tab_contents->translate_tab_helper();
- std::string auto_translate_to = helper->language_state().AutoTranslateTo();
+ std::string auto_translate_to =
+ translate_tab_helper->language_state().AutoTranslateTo();
if (!auto_translate_to.empty()) {
// This page was navigated through a click from a translated page.
TranslatePage(web_contents, language_code, auto_translate_to);
return;
}
+ TabContents* tab_contents = TabContents::FromWebContents(web_contents);
InfoBarTabHelper* infobar_helper = tab_contents->infobar_tab_helper();
// Prompts the user if he/she wants the page translated.
infobar_helper->AddInfoBar(
@@ -617,9 +617,9 @@
if (!web_contents)
return;
- TranslateTabHelper* helper =
- TabContents::FromWebContents(web_contents)->translate_tab_helper();
- if (helper->language_state().translation_pending())
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(web_contents);
+ if (translate_tab_helper->language_state().translation_pending())
return;
InitiateTranslation(web_contents, GetLanguageCode(page_lang));
@@ -667,10 +667,10 @@
web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_RevertTranslation(
web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID()));
- TranslateTabHelper* helper =
- TabContents::FromWebContents(web_contents)->translate_tab_helper();
- helper->language_state().set_current_language(
- helper->language_state().original_language());
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(web_contents);
+ translate_tab_helper->language_state().set_current_language(
+ translate_tab_helper->language_state().original_language());
}
void TranslateManager::ReportLanguageDetectionError(WebContents* web_contents) {
@@ -690,9 +690,10 @@
report_error_url_str += net::EscapeUrlEncodedData(page_url.spec(), true);
report_error_url_str += "&sl=";
- TranslateTabHelper* helper =
- TabContents::FromWebContents(web_contents)->translate_tab_helper();
- report_error_url_str += helper->language_state().original_language();
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(web_contents);
+ report_error_url_str +=
+ translate_tab_helper->language_state().original_language();
report_error_url_str += "&hl=";
report_error_url_str +=
GetLanguageCode(g_browser_process->GetApplicationLocale());
@@ -713,12 +714,12 @@
return;
}
- TabContents* tab_contents = TabContents::FromWebContents(web_contents);
- if (!tab_contents || !tab_contents->translate_tab_helper())
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(web_contents);
+ if (!translate_tab_helper)
return;
- tab_contents->translate_tab_helper()->
- language_state().set_translation_pending(true);
+ translate_tab_helper->language_state().set_translation_pending(true);
web_contents->GetRenderViewHost()->Send(new ChromeViewMsg_TranslatePage(
web_contents->GetRenderViewHost()->GetRoutingID(), entry->GetPageID(),
translate_script, source_lang, target_lang));
diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc
index a154b3a..477d4c2 100644
--- a/chrome/browser/translate/translate_manager_browsertest.cc
+++ b/chrome/browser/translate/translate_manager_browsertest.cc
@@ -1498,8 +1498,8 @@
SessionStartupPref::SetStartupPref(browser()->profile(), pref);
WebContents* current_web_contents = chrome::GetActiveWebContents(browser());
- TabContents* current_tab_contents = chrome::GetActiveTabContents(browser());
- TranslateTabHelper* helper = current_tab_contents->translate_tab_helper();
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(current_web_contents);
content::Source<WebContents> source(current_web_contents);
ui_test_utils::WindowedNotificationObserverWithDetails<std::string>
@@ -1514,7 +1514,7 @@
EXPECT_TRUE(fr_language_detected_signal.GetDetailsFor(
source.map_key(), &lang));
EXPECT_EQ("fr", lang);
- EXPECT_EQ("fr", helper->language_state().original_language());
+ EXPECT_EQ("fr", translate_tab_helper->language_state().original_language());
}
IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, TranslateSessionRestore) {
diff --git a/chrome/browser/translate/translate_tab_helper.cc b/chrome/browser/translate/translate_tab_helper.cc
index 16ce399..d6166fe 100644
--- a/chrome/browser/translate/translate_tab_helper.cc
+++ b/chrome/browser/translate/translate_tab_helper.cc
@@ -12,6 +12,8 @@
using content::WebContents;
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(TranslateTabHelper)
+
TranslateTabHelper::TranslateTabHelper(WebContents* web_contents)
: content::WebContentsObserver(web_contents),
language_state_(&web_contents->GetController()) {
diff --git a/chrome/browser/translate/translate_tab_helper.h b/chrome/browser/translate/translate_tab_helper.h
index ccfa7a6..65bbb2f 100644
--- a/chrome/browser/translate/translate_tab_helper.h
+++ b/chrome/browser/translate/translate_tab_helper.h
@@ -5,18 +5,22 @@
#ifndef CHROME_BROWSER_TRANSLATE_TRANSLATE_TAB_HELPER_H_
#define CHROME_BROWSER_TRANSLATE_TRANSLATE_TAB_HELPER_H_
+#include "chrome/browser/common/web_contents_user_data.h"
#include "chrome/browser/tab_contents/language_state.h"
#include "chrome/common/translate_errors.h"
#include "content/public/browser/web_contents_observer.h"
-class TranslateTabHelper : public content::WebContentsObserver {
+class TranslateTabHelper : public content::WebContentsObserver,
+ public WebContentsUserData<TranslateTabHelper> {
public:
- explicit TranslateTabHelper(content::WebContents* web_contents);
virtual ~TranslateTabHelper();
LanguageState& language_state() { return language_state_; }
private:
+ explicit TranslateTabHelper(content::WebContents* web_contents);
+ friend class WebContentsUserData<TranslateTabHelper>;
+
// content::WebContentsObserver implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void DidNavigateAnyFrame(
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc
index cf59085..7325b7d 100644
--- a/chrome/browser/ui/browser_browsertest.cc
+++ b/chrome/browser/ui/browser_browsertest.cc
@@ -868,19 +868,19 @@
content::PAGE_TRANSITION_TYPED);
WebContents* current_web_contents = chrome::GetActiveWebContents(browser());
- TabContents* current_tab_contents = chrome::GetActiveTabContents(browser());
- TranslateTabHelper* helper = current_tab_contents->translate_tab_helper();
+ TranslateTabHelper* translate_tab_helper =
+ TranslateTabHelper::FromWebContents(current_web_contents);
content::Source<WebContents> source(current_web_contents);
ui_test_utils::WindowedNotificationObserverWithDetails<std::string>
en_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
source);
- EXPECT_EQ("", helper->language_state().original_language());
+ EXPECT_EQ("", translate_tab_helper->language_state().original_language());
en_language_detected_signal.Wait();
EXPECT_TRUE(en_language_detected_signal.GetDetailsFor(
source.map_key(), &lang));
EXPECT_EQ("en", lang);
- EXPECT_EQ("en", helper->language_state().original_language());
+ EXPECT_EQ("en", translate_tab_helper->language_state().original_language());
// Now navigate to a page in French.
ui_test_utils::WindowedNotificationObserverWithDetails<std::string>
@@ -893,7 +893,7 @@
EXPECT_TRUE(fr_language_detected_signal.GetDetailsFor(
source.map_key(), &lang));
EXPECT_EQ("fr", lang);
- EXPECT_EQ("fr", helper->language_state().original_language());
+ EXPECT_EQ("fr", translate_tab_helper->language_state().original_language());
}
// Chromeos defaults to restoring the last session, so this test isn't
diff --git a/chrome/browser/ui/tab_contents/tab_contents.cc b/chrome/browser/ui/tab_contents/tab_contents.cc
index db4808f0..6dce846 100644
--- a/chrome/browser/ui/tab_contents/tab_contents.cc
+++ b/chrome/browser/ui/tab_contents/tab_contents.cc
@@ -154,7 +154,7 @@
SSLTabHelper::CreateForWebContents(contents);
synced_tab_delegate_.reset(new TabContentsSyncedTabDelegate(this));
TabSpecificContentSettings::CreateForWebContents(contents);
- translate_tab_helper_.reset(new TranslateTabHelper(contents));
+ TranslateTabHelper::CreateForWebContents(contents);
ZoomController::CreateForWebContents(contents);
#if defined(ENABLE_AUTOMATION)
diff --git a/chrome/browser/ui/tab_contents/tab_contents.h b/chrome/browser/ui/tab_contents/tab_contents.h
index 2ff516c..283e2dc1 100644
--- a/chrome/browser/ui/tab_contents/tab_contents.h
+++ b/chrome/browser/ui/tab_contents/tab_contents.h
@@ -45,7 +45,6 @@
class TabStripModel;
class TabStripModelContentsCreator;
class ThumbnailGenerator;
-class TranslateTabHelper;
class TranslationInfoBarTestContentsCreator;
class WebDialogGtk;
class WebDialogWindowControllerTabContentsCreator;
@@ -185,10 +184,6 @@
return thumbnail_generator_.get();
}
- TranslateTabHelper* translate_tab_helper() {
- return translate_tab_helper_.get();
- }
-
// Overrides -----------------------------------------------------------------
// content::WebContentsObserver overrides:
@@ -230,7 +225,6 @@
scoped_ptr<browser_sync::SyncedTabDelegate> synced_tab_delegate_;
scoped_ptr<ThumbnailGenerator> thumbnail_generator_;
- scoped_ptr<TranslateTabHelper> translate_tab_helper_;
// WebContents (MUST BE LAST) ------------------------------------------------