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 13class GURL; 14 15namespace content { 16class SessionStorageNamespace; 17} 18 19namespace prerender { 20 21class 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. 30class 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