Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6431)

Unified Diff: chrome/browser/prerender/prerender_manager.h

Issue 10553029: Handle interface to prerenders. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: some remediation, and deflaking browser tests. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/prerender/prerender_manager.h
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index 5d357ac99087d7b15bbeea0f3e6594a3362747e4..06039fb20e07d559c11a2cae0e9fddc2b5ba1f3c 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -7,6 +7,7 @@
#pragma once
#include <list>
+#include <map>
#include <string>
#include <utility>
@@ -21,6 +22,7 @@
#include "chrome/browser/prerender/prerender_config.h"
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_final_status.h"
+#include "chrome/browser/prerender/prerender_handle.h"
#include "chrome/browser/prerender/prerender_origin.h"
#include "chrome/browser/profiles/profile_keyed_service.h"
#include "googleurl/src/gurl.h"
@@ -104,10 +106,10 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// the RenderView that the prerender request came from. The |size| may be
// empty, and the current tab size will be used if it is. If the current
// active tab size cannot be found, we use a default from PrerenderConfig.
- // Returns true if the URL was added, false if it was not.
- // If the launching RenderView is itself prerendering, the prerender is added
- // as a pending prerender.
- bool AddPrerenderFromLinkRelPrerender(
+ // Returns a caller owned PrerenderHandle* if the URL was added, NULL if it
mmenke 2012/07/09 18:06:57 nit: believe this should be caller-owned here and
gavinp 2012/07/11 17:04:00 Done.
+ // was not. If the launching RenderView is itself prerendering, the prerender
+ // is added as a pending prerender.
+ PrerenderHandle* AddPrerenderFromLinkRelPrerender(
int process_id,
int route_id,
const GURL& url,
@@ -118,17 +120,13 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// from a source without a RenderViewHost (i.e., the omnibox) we don't have a
// child or route id, or a referrer. This method uses sensible values for
// those. The |session_storage_namespace| matches the namespace of the active
- // tab at the time the prerender is generated from the omnibox.
- bool AddPrerenderFromOmnibox(
+ // tab at the time the prerender is generated from the omnibox. Returns a
+ // caller owned PrerenderHandle*.
mmenke 2012/07/09 18:06:57 nit: or NULL.
gavinp 2012/07/11 17:04:00 Done.
+ PrerenderHandle* AddPrerenderFromOmnibox(
const GURL& url,
content::SessionStorageNamespace* session_storage_namespace,
gfx::Size size);
- // Request cancelation of a previously added prerender. If the |active_count_|
- // of the prerender is one, it will be canceled. Otherwise, |active_count_|
- // will be decremented by one.
- void MaybeCancelPrerender(const GURL& url);
-
// Destroy all prerenders for the given child route id pair and assign a final
// status to them.
mmenke 2012/07/10 18:01:13 This comment looks wrong to me. From both the old
gavinp 2012/07/11 17:04:00 Done.
virtual void DestroyPrerenderForRenderView(int process_id,
@@ -184,10 +182,6 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// is prerendering a page.
bool IsWebContentsPrerendering(content::WebContents* web_contents) const;
- // Returns true if there is a prerendered page for the given URL and it has
- // finished loading. Only valid if called before MaybeUsePrerenderedPage.
- bool DidPrerenderFinishLoading(const GURL& url) const;
-
// Maintaining and querying the set of WebContents belonging to this
// PrerenderManager that are currently showing prerendered pages.
void MarkWebContentsAsPrerendered(content::WebContents* web_contents);
@@ -237,11 +231,6 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// Adds a condition. This is owned by the PrerenderManager.
void AddCondition(const PrerenderCondition* condition);
- bool IsPendingEntry(const GURL& url) const;
-
- // Returns true if |url| matches any URLs being prerendered.
- bool IsPrerendering(const GURL& url) const;
-
// Records that some visible tab navigated (or was redirected) to the
// provided URL.
void RecordNavigation(const GURL& url);
@@ -251,70 +240,55 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
PrerenderHistograms* histograms() const { return histograms_.get(); }
protected:
+ friend class PrerenderContents;
+ friend class PrerenderHandle;
mmenke 2012/07/09 18:06:57 All friends should be together, in the private sec
gavinp 2012/07/11 17:04:00 Done.
+
void SetPrerenderContentsFactory(
PrerenderContents::Factory* prerender_contents_factory);
+ // Adds a prerender from a pending Prerender, called by
+ // PrerenderContents::StartPendingPrerenders.
+ void StartPendingPrerender(
+ PrerenderHandle* existing_prerender_handle,
+ Origin origin,
+ int process_id,
+ const GURL& url,
+ const content::Referrer& referrer,
+ const gfx::Size& size,
+ content::SessionStorageNamespace* session_storage_namespace);
mmenke 2012/07/09 18:06:57 The other functions take Sizes by value rather tha
gavinp 2012/07/11 17:04:00 Done.
+
+ void DestroyPendingPrerenderData(
+ PrerenderHandle::PrerenderData* pending_prerender_data);
+
// 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:
- // Test that needs needs access to internal functions.
friend class PrerenderBrowserTest;
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, AliasURLTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, CancelAllTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest,
- CancelOmniboxRemovesOmniboxTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest,
- CancelOmniboxDoesNotRemoveLinkTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, ClearTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, ControlGroup);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, DropOldestRequestTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, DropSecondRequestTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, ExpireTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, FoundTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, FragmentMatchesFragmentTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, FragmentMatchesPageTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerAbandon);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerAddTwiceAbandonTwice);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerAddTwiceCancelTwice);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest,
- LinkManagerAddTwiceCancelTwiceThenAbandonTwice);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerCancel);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerCancelThenAbandon);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerCancelThenAddAgain);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerCancelTwice);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerExpireThenAddAgain);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, LinkManagerExpireThenCancel);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, NotSoRecentlyVisited);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, PageMatchesFragmentTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, PendingPrerenderTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, PPLTDummy);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, RateLimitInWindowTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, RateLimitOutsideWindowTest);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, RecentlyVisitedPPLTDummy);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, SourceRenderViewClosed);
- FRIEND_TEST_ALL_PREFIXES(PrerenderTest, TwoElementPrerenderTest);
-
- struct PrerenderContentsData;
- struct NavigationRecord;
+ friend class UnitTestPrerenderManager;
class OnCloseTabContentsDeleter;
+ struct NavigationRecord;
+
+ typedef PrerenderHandle::PrerenderData PrerenderData;
+ typedef std::map<const PrerenderHandle::PrerenderData*,
+ base::WeakPtrFactory<PrerenderHandle::PrerenderData>*>
mmenke 2012/07/09 18:06:57 nit: You typedefed PrerenderHandle::PrerenderData
dominich 2012/07/09 18:25:43 i asked for the typedef to be removed to make it c
gavinp 2012/07/11 17:04:00 Yeah, sorry. My new upload gets rid of not only th
+ PrerenderWeakPtrFactoryMap;
- typedef std::list<PrerenderContentsData> PrerenderContentsDataList;
typedef base::hash_map<content::WebContents*, bool> WouldBePrerenderedMap;
// Time window for which we record old navigations, in milliseconds.
static const int kNavigationRecordWindowMs = 5000;
- // Adds a prerender for |url| from referrer |referrer| initiated from the
- // child process specified by |child_id|. The |origin| specifies how the
- // prerender was added. If the |size| is empty, then
- // PrerenderContents::StartPrerendering will instead use the size of the
- // currently active tab. If the current active tab size cannot be found, it
- // then uses a default from PrerenderConfig.
- bool AddPrerender(
+ // Adds a prerender for |url| from |referrer| initiated from the process
+ // |child_id|. The |origin| specifies how the prerender was added. If |size|
+ // is empty, then PrerenderContents::StartPrerendering will instead use the
+ // size of the currently active tab. If the current active tab size cannot be
+ // found, it then uses a default from PrerenderConfig. Returns a
+ // PrerenderHandle*, owned by the caller.
mmenke 2012/07/09 18:06:57 Or NULL
gavinp 2012/07/11 17:04:00 Done.
+ PrerenderHandle* AddPrerender(
Origin origin,
int child_id,
const GURL& url,
@@ -322,23 +296,10 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
gfx::Size size,
content::SessionStorageNamespace* session_storage_namespace);
- // Retrieves the PrerenderContents object for the specified URL, if it
- // has been prerendered. The caller will then have ownership of the
- // PrerenderContents object and is responsible for freeing it.
- // Returns NULL if the specified URL has not been prerendered.
- PrerenderContents* GetEntry(const GURL& url);
-
- // Identical to GetEntry, with one exception:
- // The WebContents specified indicates the WC in which to swap the
- // prerendering into. If the WebContents specified is the one
- // to doing the prerendered itself, will return NULL.
- PrerenderContents* GetEntryButNotSpecifiedWC(const GURL& url,
- content::WebContents* wc);
-
- // Starts scheduling periodic cleanups.
void StartSchedulingPeriodicCleanups();
- // Stops scheduling periodic cleanups if they're no longer needed.
- void MaybeStopSchedulingPeriodicCleanups();
+ void StopSchedulingPeriodicCleanups();
+
+ void EvictOldestPrerendersIfNecessary();
// Deletes stale and cancelled prerendered PrerenderContents, as well as
// WebContents that have been replaced by prerendered WebContents.
@@ -352,7 +313,7 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
void PostCleanupTask();
base::TimeDelta GetMaxAge() const;
- bool IsPrerenderElementFresh(const base::Time start) const;
+ bool IsPrerenderFresh(base::TimeTicks start) const;
void DeleteOldEntries();
virtual base::Time GetCurrentTime() const;
virtual base::TimeTicks GetCurrentTimeTicks() const;
@@ -366,20 +327,28 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
// list.
void DeletePendingDeleteEntries();
- // Finds the specified PrerenderContentsData/PrerenderContents and returns it,
- // if it exists. Returns NULL otherwise. Unlike GetEntry, the
- // PrerenderManager maintains ownership of the PrerenderContents.
- PrerenderContentsData* FindEntryData(const GURL& url);
- PrerenderContents* FindEntry(const GURL& url) const;
+ PrerenderHandle* CreatePrerenderHandleForPrerenderData(
+ PrerenderHandle::PrerenderData* prerender_data);
mmenke 2012/07/09 18:06:57 nit: All of these should just be PrerenderData, u
gavinp 2012/07/11 17:04:00 Done.
+
+ void InvalidatePrerenderHandlesForPrerenderData(
+ const PrerenderHandle::PrerenderData& prerender_data);
- // Returns the iterator to the PrerenderContentsData entry that is being
- // prerendered from the given child route id pair.
- PrerenderContentsDataList::iterator
- FindPrerenderContentsForChildRouteIdPair(
- const std::pair<int, int>& child_route_id_pair);
+ // Finds the active PrerenderData object for a running prerender matching
+ // |url| and |session_storage_namespace|.
+ PrerenderHandle::PrerenderData* FindPrerenderData(
+ const GURL& url,
+ const content::SessionStorageNamespace* session_storage_namespace);
+
+ // Finds the active PrerenderData object for a running prerender corresponding
+ // to the renderer process |child_id| and the render view in |route_id|.
mmenke 2012/07/09 18:06:57 This comment could just as easily mean a prerender
gavinp 2012/07/11 17:04:00 Done.
+ PrerenderHandle::PrerenderData* FindPrerenderDataForChildAndRoute(
+ int child_id,
+ int route_id);
- PrerenderContentsDataList::iterator
- FindPrerenderContentsForURL(const GURL& url);
+ // Given the |prerender_contents|, find the iterator in active_prerender_list_
+ // correponding to that running prerender.
mmenke 2012/07/09 18:06:57 nit: "that running" -> "the given active"
gavinp 2012/07/11 17:04:00 Done.
+ std::list<PrerenderHandle::PrerenderData>::iterator
+ FindIteratorForPrerenderContents(PrerenderContents* prerender_contents);
bool DoesRateLimitAllowPrerender() const;
@@ -440,8 +409,23 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
PrerenderTracker* prerender_tracker_;
- // List of prerendered elements.
- PrerenderContentsDataList prerender_list_;
+ // List of all running prerenders.
+ // It is kept sorted, in increasing order by expiry time. The STL list was
+ // chosen because it does not move items in memory (this lets handles continue
+ // to point to their PrerenderData).
+ std::list<PrerenderHandle::PrerenderData> active_prerender_list_;
+
+ // List of all pending prerenders.
+ std::list<PrerenderHandle::PrerenderData> pending_prerender_list_;
+
+ // The prerenders in the above lists need WeakPtrs to instantiate handles. We
+ // keep the factories for those WeakPtrs here for the lifetime of each element
+ // in either list. In a perfect world, these factories would be a part of
+ // PrerenderHandle::PrerenderData, but that would then make the copy semantics
+ // of PrerenderHandle::PrerenderData quite confusing (copy everything except
+ // for the WeakPtrFactory). Storing this map externally is a least bad
+ // compromise.
+ PrerenderWeakPtrFactoryMap prerender_weak_ptr_factory_map_;
// List of recent navigations in this profile, sorted by ascending
// navigate_time_.

Powered by Google App Engine
This is Rietveld 408576698