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