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 stopped running. 42 virtual void OnPrerenderStop(PrerenderHandle* handle) = 0; 43 44 protected: 45 Observer(); 46 virtual ~Observer(); 47 }; 48 49 // Before calling the destructor, the caller must invalidate the handle by 50 // calling either OnNavigateAway or OnCancel. 51 virtual ~PrerenderHandle(); 52 53 void SetObserver(Observer* observer); 54 55 // The launcher is navigating away from the context that launched this 56 // prerender. The prerender will likely stay alive briefly though, in case we 57 // are going through a redirect chain that will target it. 58 void OnNavigateAway(); 59 60 // The launcher has taken explicit action to remove this prerender (for 61 // instance, removing a link element from a document). This call invalidates 62 // the handle. If the prerender handle is already invalid, this call does 63 // nothing. 64 void OnCancel(); 65 66 // True if this prerender is currently active. 67 bool IsPrerendering() const; 68 69 // True if we started a prerender, and it has finished loading. 70 bool IsFinishedLoading() const; 71 72 // Returns whether the prerender matches the URL provided. 73 bool Matches( 74 const GURL& url, 75 const content::SessionStorageNamespace* session_storage_namespace) const; 76 77 // Returns whether this PrerenderHandle represents the same prerender as 78 // the other PrerenderHandle object specified. 79 bool RepresentingSamePrerenderAs(PrerenderHandle* other) const; 80 81 private: 82 friend class PrerenderManager; 83 84 explicit PrerenderHandle(PrerenderManager::PrerenderData* prerender_data); 85 86 void AdoptPrerenderDataFrom(PrerenderHandle* other_handle); 87 88 // From PrerenderContents::Observer: 89 virtual void OnPrerenderStart(PrerenderContents* prerender_contents) OVERRIDE; 90 virtual void OnPrerenderStopLoading(PrerenderContents* prerender_contents) 91 OVERRIDE; 92 virtual void OnPrerenderStop(PrerenderContents* prerender_contents) OVERRIDE; 93 virtual void OnPrerenderCreatedMatchCompleteReplacement( 94 PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE; 95 96 Observer* observer_; 97 98 base::WeakPtr<PrerenderManager::PrerenderData> prerender_data_; 99 base::WeakPtrFactory<PrerenderHandle> weak_ptr_factory_; 100 101 DISALLOW_COPY_AND_ASSIGN(PrerenderHandle); 102 }; 103 104 } // namespace prerender 105 106 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_ 107