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) ------------------------------------------------