15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionStorageNamespace; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace prerender { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrerenderContents; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class representing a running prerender to a client of the PrerenderManager. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Methods on PrerenderManager which start prerenders return a caller-owned 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrerenderHandle* to the client (or NULL if they are unable to start a 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// prerender). Calls on the handle of a prerender that is not running at no-ops. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Destroying a handle before a prerender starts will prevent it from ever 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// starting. Destroying a handle while a prerendering is running will stop the 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// prerender, without making any calls to the observer. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrerenderHandle : public base::NonThreadSafe, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public PrerenderContents::Observer { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Observer { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals that the prerender has started running. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStart(PrerenderHandle* handle) = 0; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals that the prerender has had its load event. 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStopLoading(PrerenderHandle* handle) = 0; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Signals that the prerender has stopped running. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStop(PrerenderHandle* handle) = 0; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Signals that this prerender has just become a MatchComplete replacement. 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnPrerenderCreatedMatchCompleteReplacement( 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrerenderHandle* handle) = 0; 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Observer(); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Observer(); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before calling the destructor, the caller must invalidate the handle by 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calling either OnNavigateAway or OnCancel. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PrerenderHandle(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetObserver(Observer* observer); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The launcher is navigating away from the context that launched this 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prerender. The prerender will likely stay alive briefly though, in case we 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are going through a redirect chain that will target it. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnNavigateAway(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The launcher has taken explicit action to remove this prerender (for 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instance, removing a link element from a document). This call invalidates 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the handle. If the prerender handle is already invalid, this call does 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCancel(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if this prerender is currently active. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsPrerendering() const; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if we started a prerender, and it has finished loading. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsFinishedLoading() const; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PrerenderContents* contents() const; 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 78a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Returns whether the prerender matches the URL provided. 79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool Matches( 80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const GURL& url, 81a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const content::SessionStorageNamespace* session_storage_namespace) const; 82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns whether this PrerenderHandle represents the same prerender as 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the other PrerenderHandle object specified. 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool RepresentingSamePrerenderAs(PrerenderHandle* other) const; 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Retrieves the SessionStorageNamespace of the underlying prerender, if 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // available. 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::SessionStorageNamespace* GetSessionStorageNamespace() const; 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns the child id of the prerender. 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int GetChildId() const; 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class PrerenderManager; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit PrerenderHandle(PrerenderManager::PrerenderData* prerender_data); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AdoptPrerenderDataFrom(PrerenderHandle* other_handle); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // From PrerenderContents::Observer: 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStart(PrerenderContents* prerender_contents) OVERRIDE; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStopLoading(PrerenderContents* prerender_contents) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderStop(PrerenderContents* prerender_contents) OVERRIDE; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPrerenderCreatedMatchCompleteReplacement( 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrerenderContents* contents, PrerenderContents* replacement) OVERRIDE; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Observer* observer_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<PrerenderManager::PrerenderData> prerender_data_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<PrerenderHandle> weak_ptr_factory_; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrerenderHandle); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace prerender 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_ 120