• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
6 #define CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
7 
8 #include "base/basictypes.h"
9 #include "base/memory/weak_ptr.h"
10 #include "base/threading/non_thread_safe.h"
11 #include "chrome/browser/prerender/prerender_manager.h"
12 
13 class GURL;
14 
15 namespace content {
16 class SessionStorageNamespace;
17 }
18 
19 namespace prerender {
20 
21 class PrerenderContents;
22 
23 // A class representing a running prerender to a client of the PrerenderManager.
24 // Methods on PrerenderManager which start prerenders return a caller-owned
25 // PrerenderHandle* to the client (or NULL if they are unable to start a
26 // prerender). Calls on the handle of a prerender that is not running at no-ops.
27 // Destroying a handle before a prerender starts will prevent it from ever
28 // starting. Destroying a handle while a prerendering is running will stop the
29 // prerender, without making any calls to the observer.
30 class PrerenderHandle : public base::NonThreadSafe,
31                         public PrerenderContents::Observer {
32  public:
33   class Observer {
34    public:
35     // Signals that the prerender has started running.
36     virtual void OnPrerenderStart(PrerenderHandle* handle) = 0;
37 
38     // Signals that the prerender has had its load event.
39     virtual void OnPrerenderStopLoading(PrerenderHandle* handle) = 0;
40 
41     // Signals that the prerender has had its 'DOMContentLoaded' event.
42     virtual void OnPrerenderDomContentLoaded(PrerenderHandle* handle) = 0;
43 
44     // Signals that the prerender has stopped running.
45     virtual void OnPrerenderStop(PrerenderHandle* handle) = 0;
46 
47     // Signals that this prerender has just become a MatchComplete replacement.
48     virtual void OnPrerenderCreatedMatchCompleteReplacement(
49         PrerenderHandle* handle) = 0;
50 
51    protected:
52     Observer();
53     virtual ~Observer();
54   };
55 
56   // Before calling the destructor, the caller must invalidate the handle by
57   // calling either OnNavigateAway or OnCancel.
58   virtual ~PrerenderHandle();
59 
60   void SetObserver(Observer* observer);
61 
62   // The launcher is navigating away from the context that launched this
63   // prerender. The prerender will likely stay alive briefly though, in case we
64   // are going through a redirect chain that will target it.
65   void OnNavigateAway();
66 
67   // The launcher has taken explicit action to remove this prerender (for
68   // instance, removing a link element from a document). This call invalidates
69   // the handle. If the prerender handle is already invalid, this call does
70   // nothing.
71   void OnCancel();
72 
73   // True if this prerender is currently active.
74   bool IsPrerendering() const;
75 
76   // True if we started a prerender, and it has finished loading.
77   bool IsFinishedLoading() const;
78 
79   // True if the prerender is currently active, but is abandoned.
80   bool IsAbandoned() const;
81 
82   PrerenderContents* contents() const;
83 
84   // Returns whether the prerender matches the URL provided.
85   bool Matches(
86       const GURL& url,
87       const content::SessionStorageNamespace* session_storage_namespace) const;
88 
89   // Returns whether this PrerenderHandle represents the same prerender as
90   // the other PrerenderHandle object specified.
91   bool RepresentingSamePrerenderAs(PrerenderHandle* other) const;
92 
93   // Retrieves the SessionStorageNamespace of the underlying prerender, if
94   // available.
95   content::SessionStorageNamespace* GetSessionStorageNamespace() const;
96 
97   // Returns the child id of the prerender.
98   int GetChildId() const;
99 
100  private:
101   friend class PrerenderManager;
102 
103   explicit PrerenderHandle(PrerenderManager::PrerenderData* prerender_data);
104 
105   // From PrerenderContents::Observer:
106   virtual void OnPrerenderStart(PrerenderContents* prerender_contents) OVERRIDE;
107   virtual void OnPrerenderStopLoading(PrerenderContents* prerender_contents)
108       OVERRIDE;
109   virtual void OnPrerenderDomContentLoaded(
110       PrerenderContents* prerender_contents) OVERRIDE;
111   virtual void OnPrerenderStop(PrerenderContents* prerender_contents) OVERRIDE;
112   virtual void OnPrerenderCreatedMatchCompleteReplacement(
113       PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE;
114 
115   Observer* observer_;
116 
117   base::WeakPtr<PrerenderManager::PrerenderData> prerender_data_;
118   base::WeakPtrFactory<PrerenderHandle> weak_ptr_factory_;
119 
120   DISALLOW_COPY_AND_ASSIGN(PrerenderHandle);
121 };
122 
123 }  // namespace prerender
124 
125 #endif  // CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
126