Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: chrome/browser/prerender/prerender_contents.h

Issue 11348357: Add observer interface to PrerenderContents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: final review remediation, clear to land version Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_browsertest.cc ('k') | chrome/browser/prerender/prerender_contents.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698