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