Moved PrerenderManager to ProfileKeyedService system.

As per https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/554b5b0ca05e001d# it is recommended that weak references to services be removed from Profiles and constructed as ProfileKeyedServices instead. This does this for the PrerenderManager.

(Continuation of http://codereview.chromium.org/7795009/)

BUG=94643
TEST=Prerender*


Review URL: http://codereview.chromium.org/7846001

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104130 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/autocomplete/autocomplete_edit.cc b/chrome/browser/autocomplete/autocomplete_edit.cc
index 6b31345..6dea848 100644
--- a/chrome/browser/autocomplete/autocomplete_edit.cc
+++ b/chrome/browser/autocomplete/autocomplete_edit.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/net/url_fixer_upper.h"
 #include "chrome/browser/prerender/prerender_field_trial.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url.h"
 #include "chrome/browser/search_engines/template_url_service.h"
@@ -1022,7 +1023,7 @@
   if (user_input_in_progress() && popup_->IsOpen()) {
     TabContentsWrapper* tab = controller_->GetTabContentsWrapper();
     prerender::PrerenderManager* prerender_manager =
-        tab->profile()->GetPrerenderManager();
+        prerender::PrerenderManagerFactory::GetForProfile(tab->profile());
     if (prerender_manager)
       prerender_manager->AddPrerenderFromOmnibox(match.destination_url);
   }
diff --git a/chrome/browser/browsing_data_remover.cc b/chrome/browser/browsing_data_remover.cc
index 3a6f91d..0d7f021 100644
--- a/chrome/browser/browsing_data_remover.cc
+++ b/chrome/browser/browsing_data_remover.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/plugin_data_remover.h"
 #include "chrome/browser/prefs/pref_member.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/renderer_host/web_cache_manager.h"
 #include "chrome/browser/search_engines/template_url_service.h"
@@ -180,7 +181,7 @@
     // It also may have a prerendered page. If so, the page could be considered
     // to have a small amount of historical information, so delete it, too.
     prerender::PrerenderManager* prerender_manager =
-        profile_->GetPrerenderManager();
+        prerender::PrerenderManagerFactory::GetForProfile(profile_);
     if (prerender_manager) {
       prerender_manager->ClearData(
           prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS |
@@ -286,7 +287,7 @@
     // The PrerenderManager may have a page actively being prerendered, which
     // is essentially a preemptively cached page.
     prerender::PrerenderManager* prerender_manager =
-        profile_->GetPrerenderManager();
+        prerender::PrerenderManagerFactory::GetForProfile(profile_);
     if (prerender_manager) {
       prerender_manager->ClearData(
           prerender::PrerenderManager::CLEAR_PRERENDER_CONTENTS);
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 4709e327..7ab8355 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_tracker.h"
 #include "chrome/browser/printing/printing_message_filter.h"
 #include "chrome/browser/profiles/profile.h"
@@ -542,8 +543,8 @@
     return;
   }
   prerender::PrerenderManager* prerender_manager =
-      Profile::FromBrowserContext(tab->browser_context())->
-          GetPrerenderManager();
+      prerender::PrerenderManagerFactory::GetForProfile(
+          Profile::FromBrowserContext(tab->browser_context()));
   if (prerender_manager && prerender_manager->IsTabContentsPrerendering(tab)) {
     if (prerender_manager->prerender_tracker()->TryCancel(
             handler->render_process_host_id(),
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 96c9f777..8fd20dc 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/task_manager/task_manager.h"
@@ -586,7 +587,8 @@
 
   PrerenderManager* prerender_manager() const {
     Profile* profile = browser()->GetSelectedTabContentsWrapper()->profile();
-    PrerenderManager* prerender_manager = profile->GetPrerenderManager();
+    PrerenderManager* prerender_manager =
+        PrerenderManagerFactory::GetForProfile(profile);
     return prerender_manager;
   }
 
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index ba2795e2..7cf72fc 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/prerender/prerender_histograms.h"
 #include "chrome/browser/prerender/prerender_history.h"
 #include "chrome/browser/prerender/prerender_tab_helper.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_tracker.h"
 #include "chrome/browser/prerender/prerender_util.h"
 #include "chrome/browser/profiles/profile.h"
@@ -249,8 +250,10 @@
 }
 
 PrerenderManager::~PrerenderManager() {
-  DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN);
-  STLDeleteElements(&prerender_conditions_);
+}
+
+void PrerenderManager::Shutdown() {
+  DoShutdown();
 }
 
 void PrerenderManager::SetPrerenderContentsFactory(
@@ -677,9 +680,9 @@
     TabContents* tab_contents,
     const GURL& url) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  Profile* profile =
-      Profile::FromBrowserContext(tab_contents->browser_context());
-  PrerenderManager* prerender_manager = profile->GetPrerenderManager();
+  PrerenderManager* prerender_manager =
+      PrerenderManagerFactory::GetForProfile(
+          Profile::FromBrowserContext(tab_contents->browser_context()));
   if (!prerender_manager)
     return;
   if (!prerender_manager->is_enabled())
@@ -729,6 +732,12 @@
   return NULL;
 }
 
+void PrerenderManager::DoShutdown() {
+  DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN);
+  STLDeleteElements(&prerender_conditions_);
+  profile_ = NULL;
+}
+
 bool PrerenderManager::DoesRateLimitAllowPrerender() const {
   DCHECK(CalledOnValidThread());
   base::TimeDelta elapsed_time =
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index 4d12020..dd238c2e 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -21,6 +21,7 @@
 #include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/prerender/prerender_final_status.h"
 #include "chrome/browser/prerender/prerender_origin.h"
+#include "chrome/browser/profiles/profile_keyed_service.h"
 #include "googleurl/src/gurl.h"
 
 class Profile;
@@ -54,7 +55,8 @@
 // views of webpages. All methods must be called on the UI thread unless
 // indicated otherwise.
 class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
-                         public base::NonThreadSafe {
+                         public base::NonThreadSafe,
+                         public ProfileKeyedService {
  public:
   // PrerenderManagerMode is used in a UMA_HISTOGRAM, so please do not
   // add in the middle.
@@ -82,6 +84,9 @@
 
   virtual ~PrerenderManager();
 
+  // ProfileKeyedService implementation.
+  virtual void Shutdown() OVERRIDE;
+
   // Entry points for adding prerenders.
 
   // Adds a prerender for |url| if valid. |process_id| and |route_id| identify
@@ -219,6 +224,11 @@
   void SetPrerenderContentsFactory(
       PrerenderContents::Factory* prerender_contents_factory);
 
+  // Utility method that is called from the virtual Shutdown method on this
+  // class but is called directly from the TestPrerenderManager in the unit
+  // tests.
+  void DoShutdown();
+
  private:
   // Needs access to AddPrerender.
   friend class PrerenderContents;
diff --git a/chrome/browser/prerender/prerender_manager_factory.cc b/chrome/browser/prerender/prerender_manager_factory.cc
new file mode 100644
index 0000000..d759df4
--- /dev/null
+++ b/chrome/browser/prerender/prerender_manager_factory.cc
@@ -0,0 +1,54 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/prerender/prerender_manager_factory.h"
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_dependency_manager.h"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/prerender_condition_network.h"
+#endif
+
+namespace prerender {
+
+// static
+PrerenderManager* PrerenderManagerFactory::GetForProfile(
+    Profile* profile) {
+  if (!PrerenderManager::IsPrerenderingPossible())
+    return NULL;
+  return static_cast<PrerenderManager*>(
+      GetInstance()->GetServiceForProfile(profile, true));
+}
+
+PrerenderManagerFactory* PrerenderManagerFactory::GetInstance() {
+  return Singleton<PrerenderManagerFactory>::get();
+}
+
+PrerenderManagerFactory::PrerenderManagerFactory()
+    : ProfileKeyedServiceFactory(ProfileDependencyManager::GetInstance()) {
+}
+
+PrerenderManagerFactory::~PrerenderManagerFactory() {
+}
+
+ProfileKeyedService* PrerenderManagerFactory::BuildServiceInstanceFor(
+    Profile* profile) const {
+  CHECK(g_browser_process->prerender_tracker());
+  PrerenderManager* prerender_manager = new prerender::PrerenderManager(
+      profile, g_browser_process->prerender_tracker());
+#if defined(OS_CHROMEOS)
+  if (chromeos::CrosLibrary::Get()) {
+    prerender_manager->AddCondition(
+        new chromeos::PrerenderConditionNetwork(
+            chromeos::CrosLibrary::Get()->GetNetworkLibrary()));
+  }
+#endif
+  return prerender_manager;
+}
+
+}  // end namespace prerender
diff --git a/chrome/browser/prerender/prerender_manager_factory.h b/chrome/browser/prerender/prerender_manager_factory.h
new file mode 100644
index 0000000..7a61d89
--- /dev/null
+++ b/chrome/browser/prerender/prerender_manager_factory.h
@@ -0,0 +1,41 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_FACTORY_H_
+#define CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_FACTORY_H_
+
+#include "base/compiler_specific.h"
+#include "base/memory/singleton.h"
+#include "chrome/browser/profiles/profile_keyed_service_factory.h"
+
+class Profile;
+
+namespace prerender {
+
+class PrerenderManager;
+
+// Singleton that owns all PrerenderManagers and associates them with Profiles.
+// Listens for the Profile's destruction notification and cleans up the
+// associated PrerenderManager.
+class PrerenderManagerFactory : public ProfileKeyedServiceFactory {
+ public:
+  // Returns the PrerenderManager for |profile|.
+  static PrerenderManager* GetForProfile(Profile* profile);
+
+  static PrerenderManagerFactory* GetInstance();
+
+ private:
+  friend struct DefaultSingletonTraits<PrerenderManagerFactory>;
+
+  PrerenderManagerFactory();
+  virtual ~PrerenderManagerFactory();
+
+  // ProfileKeyedServiceFactory:
+  virtual ProfileKeyedService* BuildServiceInstanceFor(
+      Profile* profile) const OVERRIDE;
+};
+
+}  // end namespace prerender
+
+#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_FACTORY_H_
diff --git a/chrome/browser/prerender/prerender_manager_unittest.cc b/chrome/browser/prerender/prerender_manager_unittest.cc
index 9389d2d..105c7b8 100644
--- a/chrome/browser/prerender/prerender_manager_unittest.cc
+++ b/chrome/browser/prerender/prerender_manager_unittest.cc
@@ -84,6 +84,7 @@
          it != used_prerender_contents_.end(); ++it) {
       (*it)->set_final_status(FINAL_STATUS_USED);
     }
+    DoShutdown();
   }
 
   void AdvanceTime(base::TimeDelta delta) {
diff --git a/chrome/browser/prerender/prerender_tab_helper.cc b/chrome/browser/prerender/prerender_tab_helper.cc
index 6f10593c..592d4846 100644
--- a/chrome/browser/prerender/prerender_tab_helper.cc
+++ b/chrome/browser/prerender/prerender_tab_helper.cc
@@ -8,6 +8,7 @@
 #include "base/string_number_conversions.h"
 #include "base/time.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
 #include "content/browser/tab_contents/tab_contents.h"
@@ -241,11 +242,8 @@
 }
 
 PrerenderManager* PrerenderTabHelper::MaybeGetPrerenderManager() const {
-  Profile* profile =
-      Profile::FromBrowserContext(tab_contents()->browser_context());
-  if (!profile)
-    return NULL;
-  return profile->GetPrerenderManager();
+  return PrerenderManagerFactory::GetForProfile(
+      Profile::FromBrowserContext(tab_contents()->browser_context()));
 }
 
 bool PrerenderTabHelper::MaybeUsePrerenderedPage(const GURL& url,
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc
index 6edfeb6..20d1c110 100644
--- a/chrome/browser/profiles/off_the_record_profile_impl.cc
+++ b/chrome/browser/profiles/off_the_record_profile_impl.cc
@@ -578,13 +578,6 @@
   return pref_proxy_config_tracker_;
 }
 
-prerender::PrerenderManager* OffTheRecordProfileImpl::GetPrerenderManager() {
-  // We do not allow prerendering in OTR profiles at this point.
-  // TODO(tburkard): Figure out if we want to support this, and how, at some
-  // point in the future.
-  return NULL;
-}
-
 chrome_browser_net::Predictor* OffTheRecordProfileImpl::GetNetworkPredictor() {
   // We do not store information about websites visited in OTR profiles which
   // is necessary for a Predictor, so we do not have a Predictor at all.
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.h b/chrome/browser/profiles/off_the_record_profile_impl.h
index 9f7dea41..032d451 100644
--- a/chrome/browser/profiles/off_the_record_profile_impl.h
+++ b/chrome/browser/profiles/off_the_record_profile_impl.h
@@ -127,7 +127,6 @@
 #endif  // defined(OS_CHROMEOS)
 
   virtual PrefProxyConfigTracker* GetProxyConfigTracker() OVERRIDE;
-  virtual prerender::PrerenderManager* GetPrerenderManager() OVERRIDE;
   virtual chrome_browser_net::Predictor* GetNetworkPredictor() OVERRIDE;
   virtual void DeleteTransportSecurityStateSince(base::Time time) OVERRIDE;
 
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h
index 8c3b742..ee1c908 100644
--- a/chrome/browser/profiles/profile.h
+++ b/chrome/browser/profiles/profile.h
@@ -39,10 +39,6 @@
 class SSLConfigService;
 }
 
-namespace prerender {
-class PrerenderManager;
-}
-
 namespace speech_input {
 class SpeechRecognizer;
 }
@@ -483,10 +479,6 @@
   // access to the the proxy configuration possibly defined by preferences.
   virtual PrefProxyConfigTracker* GetProxyConfigTracker() = 0;
 
-  // Returns the PrerenderManager used to prerender entire webpages for this
-  // profile.
-  virtual prerender::PrerenderManager* GetPrerenderManager() = 0;
-
   // Returns the Predictor object used for dns prefetch.
   virtual chrome_browser_net::Predictor* GetNetworkPredictor() = 0;
 
diff --git a/chrome/browser/profiles/profile_dependency_manager.cc b/chrome/browser/profiles/profile_dependency_manager.cc
index 93f37a9a..d9c720e7 100644
--- a/chrome/browser/profiles/profile_dependency_manager.cc
+++ b/chrome/browser/profiles/profile_dependency_manager.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/background/background_contents_service_factory.h"
 #include "chrome/browser/extensions/extension_speech_input_manager.h"
 #include "chrome/browser/plugin_prefs.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.h"
 #include "chrome/browser/profiles/profile_keyed_service.h"
 #include "chrome/browser/profiles/profile_keyed_service_factory.h"
@@ -41,6 +42,7 @@
     CloudPrintProxyServiceFactory::GetInstance();
     PersonalDataManagerFactory::GetInstance();
     PluginPrefs::Initialize();
+    prerender::PrerenderManagerFactory::GetInstance();
     SessionServiceFactory::GetInstance();
     TabRestoreServiceFactory::GetInstance();
     TemplateURLServiceFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 9227a3c..b76b3df 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -58,7 +58,7 @@
 #include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/browser/prefs/pref_value_store.h"
 #include "chrome/browser/prefs/scoped_user_pref_update.h"
-#include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile_dependency_manager.h"
 #include "chrome/browser/profiles/profile_info_cache.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -130,11 +130,9 @@
 #endif
 
 #if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/cros/cros_library.h"
 #include "chrome/browser/chromeos/locale_change_guard.h"
 #include "chrome/browser/chromeos/login/user_manager.h"
 #include "chrome/browser/chromeos/preferences.h"
-#include "chrome/browser/chromeos/prerender_condition_network.h"
 #endif
 
 using base::Time;
@@ -943,8 +941,10 @@
   ProfileDependencyManager::GetInstance()->CreateProfileServices(this, false);
 
   DCHECK(!net_pref_observer_.get());
-  net_pref_observer_.reset(
-      new NetPrefObserver(prefs_.get(), GetPrerenderManager(), predictor_));
+  net_pref_observer_.reset(new NetPrefObserver(
+      prefs_.get(),
+      prerender::PrerenderManagerFactory::GetForProfile(this),
+      predictor_));
 
   DoFinalInit();
 }
@@ -1748,23 +1748,6 @@
   return pref_proxy_config_tracker_;
 }
 
-prerender::PrerenderManager* ProfileImpl::GetPrerenderManager() {
-  if (!prerender::PrerenderManager::IsPrerenderingPossible())
-    return NULL;
-  if (!prerender_manager_.get()) {
-    CHECK(g_browser_process->prerender_tracker());
-    prerender_manager_.reset(
-        new prerender::PrerenderManager(
-            this, g_browser_process->prerender_tracker()));
-#if defined(OS_CHROMEOS)
-    prerender_manager_->AddCondition(
-        new chromeos::PrerenderConditionNetwork(
-            chromeos::CrosLibrary::Get()->GetNetworkLibrary()));
-#endif
-  }
-  return prerender_manager_.get();
-}
-
 chrome_browser_net::Predictor* ProfileImpl::GetNetworkPredictor() {
   return predictor_;
 }
diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h
index c538eac..c4cfebf 100644
--- a/chrome/browser/profiles/profile_impl.h
+++ b/chrome/browser/profiles/profile_impl.h
@@ -141,7 +141,6 @@
 #endif  // defined(OS_CHROMEOS)
 
   virtual PrefProxyConfigTracker* GetProxyConfigTracker() OVERRIDE;
-  virtual prerender::PrerenderManager* GetPrerenderManager() OVERRIDE;
 
   // NotificationObserver implementation.
   virtual void Observe(int type,
@@ -214,7 +213,6 @@
   scoped_refptr<ExtensionSpecialStoragePolicy>
       extension_special_storage_policy_;
   scoped_ptr<SSLHostState> ssl_host_state_;
-  scoped_ptr<prerender::PrerenderManager> prerender_manager_;
   scoped_ptr<NetPrefObserver> net_pref_observer_;
   scoped_ptr<TemplateURLFetcher> template_url_fetcher_;
   scoped_ptr<BookmarkModel> bookmark_bar_model_;
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index 4b3843a5..58516db 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -31,6 +31,7 @@
 #include "chrome/browser/policy/url_blacklist_manager.h"
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/transport_security_persister.h"
@@ -185,7 +186,7 @@
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
   Profile* profile = profile_getter.Run();
   if (profile)
-    return profile->GetPrerenderManager();
+    return prerender::PrerenderManagerFactory::GetForProfile(profile);
   return NULL;
 }
 
diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
index 4f1afa9..8f073fe4 100644
--- a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
+++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/prefs/scoped_user_pref_update.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tab_contents/background_contents.h"
 #include "chrome/browser/user_style_sheet_watcher.h"
@@ -151,7 +152,7 @@
 
   // Do not create the new TabContents if the opener is a prerender TabContents.
   prerender::PrerenderManager* prerender_manager =
-      profile->GetPrerenderManager();
+      prerender::PrerenderManagerFactory::GetForProfile(profile);
   if (prerender_manager &&
       prerender_manager->IsTabContentsPrerendering(base_tab_contents)) {
     return NULL;
diff --git a/chrome/browser/task_manager/task_manager_resource_providers.cc b/chrome/browser/task_manager/task_manager_resource_providers.cc
index 1dd1d44..9118f61 100644
--- a/chrome/browser/task_manager/task_manager_resource_providers.cc
+++ b/chrome/browser/task_manager/task_manager_resource_providers.cc
@@ -24,6 +24,7 @@
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/favicon/favicon_tab_helper.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_info_cache.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -213,7 +214,8 @@
 
 bool TaskManagerTabContentsResource::IsPrerendering() const {
   prerender::PrerenderManager* prerender_manager =
-      tab_contents_->profile()->GetPrerenderManager();
+      prerender::PrerenderManagerFactory::GetForProfile(
+          tab_contents_->profile());
   return prerender_manager &&
          prerender_manager->IsTabContentsPrerendering(
              tab_contents_->tab_contents());
diff --git a/chrome/browser/ui/webui/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals_ui.cc
index d7e53b4..6b358bf 100644
--- a/chrome/browser/ui/webui/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals_ui.cc
@@ -31,6 +31,7 @@
 #include "chrome/browser/net/url_fixer_upper.h"
 #include "chrome/browser/prefs/pref_member.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
 #include "chrome/browser/ui/webui/chrome_web_ui_data_source.h"
@@ -482,7 +483,7 @@
       proxy_->CreateCallback(&IOThreadImpl::OnRendererReady));
 
   prerender::PrerenderManager* prerender_manager =
-      profile->GetPrerenderManager();
+      prerender::PrerenderManagerFactory::GetForProfile(profile);
   if (prerender_manager) {
     prerender_manager_ = prerender_manager->AsWeakPtr();
   } else {
diff --git a/chrome/browser/ui/webui/net_internals_ui_browsertest.cc b/chrome/browser/ui/webui/net_internals_ui_browsertest.cc
index 5c06499..c2d9513 100644
--- a/chrome/browser/ui/webui/net_internals_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/net_internals_ui_browsertest.cc
@@ -7,6 +7,7 @@
 #include "base/utf_string_conversions.h"
 #include "chrome/browser/prerender/prerender_final_status.h"
 #include "chrome/browser/prerender/prerender_manager.h"
+#include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
@@ -121,7 +122,7 @@
   // as debug builds use more memory and often go over the usual limit.
   Profile* profile = browser()->GetSelectedTabContentsWrapper()->profile();
   prerender::PrerenderManager* prerender_manager =
-      profile->GetPrerenderManager();
+      prerender::PrerenderManagerFactory::GetForProfile(profile);
   prerender_manager->mutable_config().max_bytes = 1000 * 1024 * 1024;
 }
 
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 779ba40..f720acb9 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1828,6 +1828,8 @@
         'browser/prerender/prerender_history.h',
         'browser/prerender/prerender_manager.cc',
         'browser/prerender/prerender_manager.h',
+        'browser/prerender/prerender_manager_factory.cc',
+        'browser/prerender/prerender_manager_factory.h',
         'browser/prerender/prerender_origin.cc',
         'browser/prerender/prerender_origin.h',
         'browser/prerender/prerender_render_view_host_observer.cc',
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc
index bf737f7..4d65247 100644
--- a/chrome/test/base/testing_profile.cc
+++ b/chrome/test/base/testing_profile.cc
@@ -777,16 +777,6 @@
   return chrome_url_data_manager_.get();
 }
 
-prerender::PrerenderManager* TestingProfile::GetPrerenderManager() {
-  if (!prerender::PrerenderManager::IsPrerenderingPossible())
-    return NULL;
-  if (!prerender_manager_.get()) {
-    prerender_manager_.reset(new prerender::PrerenderManager(
-        this, g_browser_process->prerender_tracker()));
-  }
-  return prerender_manager_.get();
-}
-
 void TestingProfile::SetDownloadManagerDelegate(
     ChromeDownloadManagerDelegate* delegate) {
   // Specially marked so errors from use will occur near to the site
diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h
index 925cc448..e13436d 100644
--- a/chrome/test/base/testing_profile.h
+++ b/chrome/test/base/testing_profile.h
@@ -278,7 +278,6 @@
   virtual ExtensionInfoMap* GetExtensionInfoMap();
   virtual PromoCounter* GetInstantPromoCounter();
   virtual ChromeURLDataManager* GetChromeURLDataManager();
-  virtual prerender::PrerenderManager* GetPrerenderManager();
   virtual chrome_browser_net::Predictor* GetNetworkPredictor();
   virtual void DeleteTransportSecurityStateSince(base::Time time);
   virtual PrefService* GetOffTheRecordPrefs();
@@ -399,8 +398,6 @@
 
   scoped_ptr<ChromeURLDataManager> chrome_url_data_manager_;
 
-  scoped_ptr<prerender::PrerenderManager> prerender_manager_;
-
   // We keep a weak pointer to the dependency manager we want to notify on our
   // death. Defaults to the Singleton implementation but overridable for
   // testing.