summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc4
-rw-r--r--chrome/browser/prerender/prerender_manager.cc19
-rw-r--r--chrome/browser/prerender/prerender_manager.h12
-rw-r--r--chrome/browser/prerender/prerender_manager_factory.cc54
-rw-r--r--chrome/browser/prerender/prerender_manager_factory.h41
-rw-r--r--chrome/browser/prerender/prerender_manager_unittest.cc1
-rw-r--r--chrome/browser/prerender/prerender_tab_helper.cc8
7 files changed, 127 insertions, 12 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 96c9f77..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 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
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 ba2795e..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(Profile* profile,
}
PrerenderManager::~PrerenderManager() {
- DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN);
- STLDeleteElements(&prerender_conditions_);
+}
+
+void PrerenderManager::Shutdown() {
+ DoShutdown();
}
void PrerenderManager::SetPrerenderContentsFactory(
@@ -677,9 +680,9 @@ void PrerenderManager::RecordPerceivedPageLoadTime(
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 @@ PrerenderContents* PrerenderManager::FindEntry(const GURL& url) {
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..dd238c2 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 @@ class PrerenderTracker;
// 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 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
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 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
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 @@ class TestPrerenderManager : public PrerenderManager {
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 6f10593..592d484 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 @@ void PrerenderTabHelper::DidStartProvisionalLoadForFrame(
}
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,