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.
5 #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
6 #define CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
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"
16 class SessionStorageNamespace
;
21 class PrerenderContents
;
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
{
35 // Signals that the prerender has started running.
36 virtual void OnPrerenderStart(PrerenderHandle
* handle
) = 0;
38 // Signals that the prerender has had its load event.
39 virtual void OnPrerenderStopLoading(PrerenderHandle
* handle
) = 0;
41 // Signals that the prerender has had its 'DOMContentLoaded' event.
42 virtual void OnPrerenderDomContentLoaded(PrerenderHandle
* handle
) = 0;
44 // Signals that the prerender has stopped running.
45 virtual void OnPrerenderStop(PrerenderHandle
* handle
) = 0;
47 // Signals that this prerender has just become a MatchComplete replacement.
48 virtual void OnPrerenderCreatedMatchCompleteReplacement(
49 PrerenderHandle
* handle
) = 0;
56 // Before calling the destructor, the caller must invalidate the handle by
57 // calling either OnNavigateAway or OnCancel.
58 virtual ~PrerenderHandle();
60 void SetObserver(Observer
* observer
);
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();
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
73 // True if this prerender is currently active.
74 bool IsPrerendering() const;
76 // True if we started a prerender, and it has finished loading.
77 bool IsFinishedLoading() const;
79 PrerenderContents
* contents() const;
81 // Returns whether the prerender matches the URL provided.
84 const content::SessionStorageNamespace
* session_storage_namespace
) const;
86 // Returns whether this PrerenderHandle represents the same prerender as
87 // the other PrerenderHandle object specified.
88 bool RepresentingSamePrerenderAs(PrerenderHandle
* other
) const;
90 // Retrieves the SessionStorageNamespace of the underlying prerender, if
92 content::SessionStorageNamespace
* GetSessionStorageNamespace() const;
94 // Returns the child id of the prerender.
95 int GetChildId() const;
98 friend class PrerenderManager
;
100 explicit PrerenderHandle(PrerenderManager::PrerenderData
* prerender_data
);
102 // From PrerenderContents::Observer:
103 virtual void OnPrerenderStart(PrerenderContents
* prerender_contents
) OVERRIDE
;
104 virtual void OnPrerenderStopLoading(PrerenderContents
* prerender_contents
)
106 virtual void OnPrerenderDomContentLoaded(
107 PrerenderContents
* prerender_contents
) OVERRIDE
;
108 virtual void OnPrerenderStop(PrerenderContents
* prerender_contents
) OVERRIDE
;
109 virtual void OnPrerenderCreatedMatchCompleteReplacement(
110 PrerenderContents
* contents
, PrerenderContents
* replacement
) OVERRIDE
;
114 base::WeakPtr
<PrerenderManager::PrerenderData
> prerender_data_
;
115 base::WeakPtrFactory
<PrerenderHandle
> weak_ptr_factory_
;
117 DISALLOW_COPY_AND_ASSIGN(PrerenderHandle
);
120 } // namespace prerender
122 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_