diff options
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 4 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 19 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 12 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager_factory.cc | 54 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager_factory.h | 41 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager_unittest.cc | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_tab_helper.cc | 8 |
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, |