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_