Home | History | Annotate | Download | only in prerender
      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 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