OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ | 5 #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ |
6 #define CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ | 6 #define CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/memory/scoped_vector.h" | 13 #include "base/memory/scoped_vector.h" |
14 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
| 15 #include "base/observer_list.h" |
15 #include "base/time.h" | 16 #include "base/time.h" |
16 #include "base/values.h" | 17 #include "base/values.h" |
17 #include "chrome/browser/prerender/prerender_final_status.h" | 18 #include "chrome/browser/prerender/prerender_final_status.h" |
18 #include "chrome/browser/prerender/prerender_origin.h" | 19 #include "chrome/browser/prerender/prerender_origin.h" |
19 #include "content/public/browser/notification_observer.h" | 20 #include "content/public/browser/notification_observer.h" |
20 #include "content/public/browser/notification_registrar.h" | 21 #include "content/public/browser/notification_registrar.h" |
21 #include "content/public/browser/web_contents_observer.h" | 22 #include "content/public/browser/web_contents_observer.h" |
22 #include "content/public/common/referrer.h" | 23 #include "content/public/common/referrer.h" |
23 #include "ui/gfx/size.h" | 24 #include "ui/gfx/size.h" |
24 | 25 |
(...skipping 13 matching lines...) Expand all Loading... |
38 | 39 |
39 namespace history { | 40 namespace history { |
40 struct HistoryAddPageArgs; | 41 struct HistoryAddPageArgs; |
41 } | 42 } |
42 | 43 |
43 namespace prerender { | 44 namespace prerender { |
44 | 45 |
45 class PrerenderHandle; | 46 class PrerenderHandle; |
46 class PrerenderManager; | 47 class PrerenderManager; |
47 class PrerenderRenderViewHostObserver; | 48 class PrerenderRenderViewHostObserver; |
48 class PrerenderTracker; | |
49 | 49 |
50 class PrerenderContents : public content::NotificationObserver, | 50 class PrerenderContents : public content::NotificationObserver, |
51 public content::WebContentsObserver { | 51 public content::WebContentsObserver { |
52 public: | 52 public: |
53 // PrerenderContents::Create uses the currently registered Factory to create | 53 // PrerenderContents::Create uses the currently registered Factory to create |
54 // the PrerenderContents. Factory is intended for testing. | 54 // the PrerenderContents. Factory is intended for testing. |
55 class Factory { | 55 class Factory { |
56 public: | 56 public: |
57 Factory() {} | 57 Factory() {} |
58 virtual ~Factory() {} | 58 virtual ~Factory() {} |
59 | 59 |
60 // Ownership is not transfered through this interface as prerender_manager, | 60 // Ownership is not transfered through this interface as prerender_manager, |
61 // prerender_tracker, and profile are stored as weak pointers. | 61 // prerender_tracker, and profile are stored as weak pointers. |
62 virtual PrerenderContents* CreatePrerenderContents( | 62 virtual PrerenderContents* CreatePrerenderContents( |
63 PrerenderManager* prerender_manager, | 63 PrerenderManager* prerender_manager, |
64 PrerenderTracker* prerender_tracker, | |
65 Profile* profile, | 64 Profile* profile, |
66 const GURL& url, | 65 const GURL& url, |
67 const content::Referrer& referrer, | 66 const content::Referrer& referrer, |
68 Origin origin, | 67 Origin origin, |
69 uint8 experiment_id) = 0; | 68 uint8 experiment_id) = 0; |
70 | 69 |
71 private: | 70 private: |
72 DISALLOW_COPY_AND_ASSIGN(Factory); | 71 DISALLOW_COPY_AND_ASSIGN(Factory); |
73 }; | 72 }; |
74 | 73 |
| 74 class Observer { |
| 75 public: |
| 76 // Signals that the prerender has started running. |
| 77 virtual void OnPrerenderStart(PrerenderContents* contents) = 0; |
| 78 |
| 79 // Signals that the prerender has stopped running. |
| 80 virtual void OnPrerenderStop(PrerenderContents* contents) = 0; |
| 81 |
| 82 protected: |
| 83 Observer(); |
| 84 virtual ~Observer() = 0; |
| 85 }; |
| 86 |
75 // A container for extra data on pending prerenders. | 87 // A container for extra data on pending prerenders. |
76 struct PendingPrerenderInfo { | 88 struct PendingPrerenderInfo { |
77 public: | 89 public: |
78 PendingPrerenderInfo( | 90 PendingPrerenderInfo( |
79 base::WeakPtr<PrerenderHandle> weak_prerender_handle, | 91 base::WeakPtr<PrerenderHandle> weak_prerender_handle, |
80 Origin origin, | 92 Origin origin, |
81 const GURL& url, | 93 const GURL& url, |
82 const content::Referrer& referrer, | 94 const content::Referrer& referrer, |
83 const gfx::Size& size); | 95 const gfx::Size& size); |
84 | 96 |
(...skipping 24 matching lines...) Expand all Loading... |
109 // we record in MatchComplete but not Match. | 121 // we record in MatchComplete but not Match. |
110 MATCH_COMPLETE_REPLACEMENT, | 122 MATCH_COMPLETE_REPLACEMENT, |
111 // A prerender that is a MatchComplete dummy, early in the process of being | 123 // A prerender that is a MatchComplete dummy, early in the process of being |
112 // created. This prerender should not fail. Record for MatchComplete, but | 124 // created. This prerender should not fail. Record for MatchComplete, but |
113 // not Match. | 125 // not Match. |
114 MATCH_COMPLETE_REPLACEMENT_PENDING, | 126 MATCH_COMPLETE_REPLACEMENT_PENDING, |
115 }; | 127 }; |
116 | 128 |
117 virtual ~PrerenderContents(); | 129 virtual ~PrerenderContents(); |
118 | 130 |
| 131 // All observers of a PrerenderContents are removed after the OnPrerenderStop |
| 132 // event is sent, so there is no need for a RemoveObserver() method. |
| 133 void AddObserver(Observer* observer); |
| 134 |
119 // For MatchComplete correctness, create a dummy replacement prerender | 135 // For MatchComplete correctness, create a dummy replacement prerender |
120 // contents to stand in for this prerender contents that (which we are about | 136 // contents to stand in for this prerender contents that (which we are about |
121 // to destroy). | 137 // to destroy). |
122 PrerenderContents* CreateMatchCompleteReplacement() const; | 138 PrerenderContents* CreateMatchCompleteReplacement() const; |
123 | 139 |
124 bool Init(); | 140 bool Init(); |
125 | 141 |
126 static Factory* CreateFactory(); | 142 static Factory* CreateFactory(); |
127 | 143 |
128 // Start rendering the contents in the prerendered state. If | 144 // Start rendering the contents in the prerendered state. If |
129 // |is_control_group| is true, this will go through some of the mechanics of | 145 // |is_control_group| is true, this will go through some of the mechanics of |
130 // starting a prerender, without actually creating the RenderView. | 146 // starting a prerender, without actually creating the RenderView. |
131 // |creator_child_id| is the id of the child process that caused the prerender | 147 // |creator_child_id| is the id of the child process that caused the prerender |
132 // to be created, and is needed so that the prerendered URLs can be sent to it | 148 // to be created, and is needed so that the prerendered URLs can be sent to it |
133 // so render-initiated navigations will swap in the prerendered page. |size| | 149 // so render-initiated navigations will swap in the prerendered page. |size| |
134 // indicates the rectangular dimensions that the prerendered page should be. | 150 // indicates the rectangular dimensions that the prerendered page should be. |
135 // |session_storage_namespace| indicates the namespace that the prerendered | 151 // |session_storage_namespace| indicates the namespace that the prerendered |
136 // page should be part of. | 152 // page should be part of. |
137 virtual void StartPrerendering( | 153 virtual void StartPrerendering( |
138 int creator_child_id, | 154 int creator_child_id, |
139 const gfx::Size& size, | 155 const gfx::Size& size, |
140 content::SessionStorageNamespace* session_storage_namespace, | 156 content::SessionStorageNamespace* session_storage_namespace); |
141 bool is_control_group); | |
142 | 157 |
143 // Verifies that the prerendering is not using too many resources, and kills | 158 // Verifies that the prerendering is not using too many resources, and kills |
144 // it if not. | 159 // it if not. |
145 void DestroyWhenUsingTooManyResources(); | 160 void DestroyWhenUsingTooManyResources(); |
146 | 161 |
147 content::RenderViewHost* GetRenderViewHostMutable(); | 162 content::RenderViewHost* GetRenderViewHostMutable(); |
148 const content::RenderViewHost* GetRenderViewHost() const; | 163 const content::RenderViewHost* GetRenderViewHost() const; |
149 | 164 |
| 165 PrerenderManager* prerender_manager() { return prerender_manager_; } |
| 166 |
150 string16 title() const { return title_; } | 167 string16 title() const { return title_; } |
151 int32 page_id() const { return page_id_; } | 168 int32 page_id() const { return page_id_; } |
152 GURL icon_url() const { return icon_url_; } | 169 GURL icon_url() const { return icon_url_; } |
153 const GURL& prerender_url() const { return prerender_url_; } | 170 const GURL& prerender_url() const { return prerender_url_; } |
154 const content::Referrer& referrer() const { return referrer_; } | 171 const content::Referrer& referrer() const { return referrer_; } |
155 bool has_stopped_loading() const { return has_stopped_loading_; } | 172 bool has_stopped_loading() const { return has_stopped_loading_; } |
156 bool has_finished_loading() const { return has_finished_loading_; } | 173 bool has_finished_loading() const { return has_finished_loading_; } |
157 bool prerendering_has_started() const { return prerendering_has_started_; } | 174 bool prerendering_has_started() const { return prerendering_has_started_; } |
158 MatchCompleteStatus match_complete_status() const { | 175 MatchCompleteStatus match_complete_status() const { |
159 return match_complete_status_; | 176 return match_complete_status_; |
160 } | 177 } |
161 void set_match_complete_status(MatchCompleteStatus status) { | 178 void set_match_complete_status(MatchCompleteStatus status) { |
162 match_complete_status_ = status; | 179 match_complete_status_ = status; |
163 } | 180 } |
164 | 181 |
165 // Sets the parameter to the value of the associated RenderViewHost's child id | 182 // Sets the parameter to the value of the associated RenderViewHost's child id |
166 // and returns a boolean indicating the validity of that id. | 183 // and returns a boolean indicating the validity of that id. |
167 virtual bool GetChildId(int* child_id) const; | 184 virtual bool GetChildId(int* child_id) const; |
168 | 185 |
169 // Sets the parameter to the value of the associated RenderViewHost's route id | 186 // Sets the parameter to the value of the associated RenderViewHost's route id |
170 // and returns a boolean indicating the validity of that id. | 187 // and returns a boolean indicating the validity of that id. |
171 virtual bool GetRouteId(int* route_id) const; | 188 virtual bool GetRouteId(int* route_id) const; |
172 | 189 |
173 // Set the final status for how the PrerenderContents was used. This | 190 // Set the final status for how the PrerenderContents was used. This |
174 // should only be called once, and should be called before the prerender | 191 // should only be called once, and should be called before the prerender |
175 // contents are destroyed. | 192 // contents are destroyed. |
176 void set_final_status(FinalStatus final_status); | 193 void SetFinalStatus(FinalStatus final_status); |
177 FinalStatus final_status() const { return final_status_; } | 194 FinalStatus final_status() const { return final_status_; } |
178 | 195 |
179 Origin origin() const { return origin_; } | 196 Origin origin() const { return origin_; } |
180 uint8 experiment_id() const { return experiment_id_; } | 197 uint8 experiment_id() const { return experiment_id_; } |
181 | 198 |
182 base::TimeTicks load_start_time() const { return load_start_time_; } | 199 base::TimeTicks load_start_time() const { return load_start_time_; } |
183 | 200 |
184 // Indicates whether this prerendered page can be used for the provided | 201 // Indicates whether this prerendered page can be used for the provided |
185 // |url| and |session_storage_namespace|. | 202 // |url| and |session_storage_namespace|. |
186 bool Matches( | 203 bool Matches( |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 // exists when this page is made visible, it will be launched. | 266 // exists when this page is made visible, it will be launched. |
250 virtual void AddPendingPrerender( | 267 virtual void AddPendingPrerender( |
251 scoped_ptr<PendingPrerenderInfo> pending_prerender_info); | 268 scoped_ptr<PendingPrerenderInfo> pending_prerender_info); |
252 | 269 |
253 // Reissues any pending prerender requests from the prerendered page. Also | 270 // Reissues any pending prerender requests from the prerendered page. Also |
254 // clears the list of pending requests. | 271 // clears the list of pending requests. |
255 void StartPendingPrerenders(); | 272 void StartPendingPrerenders(); |
256 | 273 |
257 protected: | 274 protected: |
258 PrerenderContents(PrerenderManager* prerender_manager, | 275 PrerenderContents(PrerenderManager* prerender_manager, |
259 PrerenderTracker* prerender_tracker, | |
260 Profile* profile, | 276 Profile* profile, |
261 const GURL& url, | 277 const GURL& url, |
262 const content::Referrer& referrer, | 278 const content::Referrer& referrer, |
263 Origin origin, | 279 Origin origin, |
264 uint8 experiment_id); | 280 uint8 experiment_id); |
265 | 281 |
| 282 // These call out to methods on our Observers, using our observer_list_. Note |
| 283 // that NotifyPrerenderStop() also clears the observer list. |
| 284 void NotifyPrerenderStart(); |
| 285 void NotifyPrerenderStop(); |
| 286 |
266 // Called whenever a RenderViewHost is created for prerendering. Only called | 287 // Called whenever a RenderViewHost is created for prerendering. Only called |
267 // once the RenderViewHost has a RenderView and RenderWidgetHostView. | 288 // once the RenderViewHost has a RenderView and RenderWidgetHostView. |
268 virtual void OnRenderViewHostCreated( | 289 virtual void OnRenderViewHostCreated( |
269 content::RenderViewHost* new_render_view_host); | 290 content::RenderViewHost* new_render_view_host); |
270 | 291 |
271 content::NotificationRegistrar& notification_registrar() { | 292 content::NotificationRegistrar& notification_registrar() { |
272 return notification_registrar_; | 293 return notification_registrar_; |
273 } | 294 } |
274 | 295 |
275 size_t pending_prerender_count() const; | 296 size_t pending_prerender_count() const; |
(...skipping 19 matching lines...) Expand all Loading... |
295 friend class PrerenderContentsFactoryImpl; | 316 friend class PrerenderContentsFactoryImpl; |
296 | 317 |
297 friend class PrerenderRenderViewHostObserver; | 318 friend class PrerenderRenderViewHostObserver; |
298 | 319 |
299 // Returns the RenderViewHost Delegate for this prerender. | 320 // Returns the RenderViewHost Delegate for this prerender. |
300 content::WebContents* GetWebContents(); | 321 content::WebContents* GetWebContents(); |
301 | 322 |
302 // Returns the ProcessMetrics for the render process, if it exists. | 323 // Returns the ProcessMetrics for the render process, if it exists. |
303 base::ProcessMetrics* MaybeGetProcessMetrics(); | 324 base::ProcessMetrics* MaybeGetProcessMetrics(); |
304 | 325 |
| 326 ObserverList<Observer> observer_list_; |
| 327 |
305 // The prerender manager owning this object. | 328 // The prerender manager owning this object. |
306 PrerenderManager* prerender_manager_; | 329 PrerenderManager* prerender_manager_; |
307 | 330 |
308 // The prerender tracker tracking prerenders. | |
309 PrerenderTracker* prerender_tracker_; | |
310 | |
311 // The URL being prerendered. | 331 // The URL being prerendered. |
312 GURL prerender_url_; | 332 GURL prerender_url_; |
313 | 333 |
314 // The referrer. | 334 // The referrer. |
315 content::Referrer referrer_; | 335 content::Referrer referrer_; |
316 | 336 |
317 // The profile being used | 337 // The profile being used |
318 Profile* profile_; | 338 Profile* profile_; |
319 | 339 |
320 // Information about the title and URL of the page that this class as a | 340 // Information about the title and URL of the page that this class as a |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 | 411 |
392 // Caches pages to be added to the history. | 412 // Caches pages to be added to the history. |
393 AddPageVector add_page_vector_; | 413 AddPageVector add_page_vector_; |
394 | 414 |
395 DISALLOW_COPY_AND_ASSIGN(PrerenderContents); | 415 DISALLOW_COPY_AND_ASSIGN(PrerenderContents); |
396 }; | 416 }; |
397 | 417 |
398 } // namespace prerender | 418 } // namespace prerender |
399 | 419 |
400 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ | 420 #endif // CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_ |
OLD | NEW |