| Index: chrome/browser/prerender/prerender_contents.h
|
| diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h
|
| index 50bc771f86396dff7527820ace660f3daf61c74f..7b0a9145722b8bdaeaa621c9a48d4fa416868d5c 100644
|
| --- a/chrome/browser/prerender/prerender_contents.h
|
| +++ b/chrome/browser/prerender/prerender_contents.h
|
| @@ -5,12 +5,12 @@
|
| #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_
|
| #define CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_
|
|
|
| -#include <list>
|
| #include <string>
|
| #include <utility>
|
| #include <vector>
|
|
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/memory/weak_ptr.h"
|
| #include "base/time.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/prerender/prerender_final_status.h"
|
| @@ -36,6 +36,7 @@ class WebContents;
|
|
|
| namespace prerender {
|
|
|
| +class PrerenderHandle;
|
| class PrerenderManager;
|
| class PrerenderRenderViewHostObserver;
|
| class PrerenderTracker;
|
| @@ -65,10 +66,6 @@ class PrerenderContents : public content::NotificationObserver,
|
| DISALLOW_COPY_AND_ASSIGN(Factory);
|
| };
|
|
|
| - // Information on pages that the prerendered page has tried to prerender.
|
| - struct PendingPrerenderInfo;
|
| - typedef std::list<PendingPrerenderInfo> PendingPrerenderList;
|
| -
|
| // Indicates how this PrerenderContents relates to MatchComplete. This is to
|
| // figure out which histograms to use to record the FinalStatus, Match (record
|
| // all prerenders and control group prerenders) or MatchComplete (record
|
| @@ -79,7 +76,7 @@ class PrerenderContents : public content::NotificationObserver,
|
| // MatchComplete.
|
| MATCH_COMPLETE_DEFAULT,
|
| // A prerender that used to be a regular prerender, but has since been
|
| - // replaced by a MatchComplete dummy. Therefore, we will record this only
|
| + // replaced by a MatchComplete dummy. Therefore, we will record this only
|
| // for Match, but not for MatchComplete.
|
| MATCH_COMPLETE_REPLACED,
|
| // A prerender that is a MatchComplete dummy replacing a regular prerender.
|
| @@ -94,6 +91,12 @@ class PrerenderContents : public content::NotificationObserver,
|
|
|
| virtual ~PrerenderContents();
|
|
|
| + // For MatchComplete correctness, create a dummy replacement prerender
|
| + // contents to stand in for this prerender contents that (which we are about
|
| + // to destroy).
|
| + void MakeIntoDummyReplacementOf(
|
| + const PrerenderContents* original_prerender_contents);
|
| +
|
| bool Init();
|
|
|
| static Factory* CreateFactory();
|
| @@ -155,11 +158,10 @@ class PrerenderContents : public content::NotificationObserver,
|
| base::TimeTicks load_start_time() const { return load_start_time_; }
|
|
|
| // Indicates whether this prerendered page can be used for the provided
|
| - // URL, i.e. whether there is a match. |matching_url| is optional and will be
|
| - // set to the URL that is found as a match if it is provided.
|
| - // TODO(gavinp,mmenke): Rework matching to be based on both the URL
|
| - // and the session WebStorage.
|
| - bool MatchesURL(const GURL& url, GURL* matching_url) const;
|
| + // |url| and |session_storage_namespace|.
|
| + bool Matches(
|
| + const GURL& url,
|
| + const content::SessionStorageNamespace* session_storage_namespace) const;
|
|
|
| // content::WebContentsObserver implementation.
|
| virtual void DidStopLoading() OVERRIDE;
|
| @@ -211,19 +213,37 @@ class PrerenderContents : public content::NotificationObserver,
|
| // MouseEvent being dispatched by a link to a website installed as an app.
|
| bool IsCrossSiteNavigationPending() const;
|
|
|
| - // Adds a pending prerender to the list.
|
| - virtual void AddPendingPrerender(const GURL& url,
|
| - const content::Referrer& referrer,
|
| - const gfx::Size& size);
|
| + // Adds a pending prerender to the list. If |weak_prerender_handle| still
|
| + // exists when this page is made visible, it will be launched.
|
| + virtual void AddPendingPrerender(
|
| + base::WeakPtr<PrerenderHandle> weak_prerender_handle,
|
| + const GURL& url,
|
| + const content::Referrer& referrer,
|
| + const gfx::Size& size);
|
|
|
| // Returns true if |url| corresponds to a pending prerender.
|
| - bool IsPendingEntry(const GURL& url) const;
|
| + bool IsPendingEntry(const PrerenderHandle& prerender_handle) const;
|
|
|
| // Reissues any pending prerender requests from the prerendered page. Also
|
| // clears the list of pending requests.
|
| void StartPendingPrerenders();
|
|
|
| protected:
|
| + // Information on pages that the prerendered page has tried to prerender.
|
| + struct PendingPrerenderInfo {
|
| + PendingPrerenderInfo(
|
| + base::WeakPtr<PrerenderHandle> weak_prerender_handle,
|
| + const GURL& url,
|
| + const content::Referrer& referrer,
|
| + const gfx::Size& size);
|
| + ~PendingPrerenderInfo();
|
| +
|
| + base::WeakPtr<PrerenderHandle> weak_prerender_handle;
|
| + GURL url;
|
| + content::Referrer referrer;
|
| + gfx::Size size;
|
| + };
|
| +
|
| PrerenderContents(PrerenderManager* prerender_manager,
|
| PrerenderTracker* prerender_tracker,
|
| Profile* profile,
|
| @@ -241,8 +261,8 @@ class PrerenderContents : public content::NotificationObserver,
|
| return notification_registrar_;
|
| }
|
|
|
| - const PendingPrerenderList* pending_prerender_list() const {
|
| - return &pending_prerender_list_;
|
| + const std::vector<PendingPrerenderInfo>& pending_prerenders() const {
|
| + return pending_prerenders_;
|
| }
|
|
|
| bool prerendering_has_been_cancelled() const {
|
| @@ -254,6 +274,11 @@ class PrerenderContents : public content::NotificationObserver,
|
|
|
| bool prerendering_has_started_;
|
|
|
| + // Time at which we started to load the URL. This is used to compute
|
| + // the time elapsed from initiating a prerender until the time the
|
| + // (potentially only partially) prerendered page is shown to the user.
|
| + base::TimeTicks load_start_time_;
|
| +
|
| private:
|
| class TabContentsDelegateImpl;
|
|
|
| @@ -302,6 +327,11 @@ class PrerenderContents : public content::NotificationObserver,
|
| // such as HTTP redirects or javascript redirects.
|
| std::vector<GURL> alias_urls_;
|
|
|
| + // The session storage namespace id for use in matching. We must save it
|
| + // rather than get it from the RenderViewHost since in the control group
|
| + // we won't have a RenderViewHost.
|
| + int64 session_storage_namespace_id_;
|
| +
|
| bool has_stopped_loading_;
|
|
|
| // True when the main frame has finished loading.
|
| @@ -320,11 +350,6 @@ class PrerenderContents : public content::NotificationObserver,
|
| // Used solely to prevent double deletion.
|
| bool prerendering_has_been_cancelled_;
|
|
|
| - // Time at which we started to load the URL. This is used to compute
|
| - // the time elapsed from initiating a prerender until the time the
|
| - // (potentially only partially) prerendered page is shown to the user.
|
| - base::TimeTicks load_start_time_;
|
| -
|
| // Process Metrics of the render process associated with the
|
| // RenderViewHost for this object.
|
| scoped_ptr<base::ProcessMetrics> process_metrics_;
|
| @@ -347,7 +372,7 @@ class PrerenderContents : public content::NotificationObserver,
|
| uint8 experiment_id_;
|
|
|
| // List of all pages the prerendered page has tried to prerender.
|
| - PendingPrerenderList pending_prerender_list_;
|
| + std::vector<PendingPrerenderInfo> pending_prerenders_;
|
|
|
| // The process that created the child id.
|
| int creator_child_id_;
|
|
|