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

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

Issue 7210020: Added prerendering to omnibox. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase again Created 9 years, 6 months 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "chrome/browser/prerender/prerender_contents.h" 5 #include "chrome/browser/prerender/prerender_contents.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/process_util.h" 10 #include "base/process_util.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 } 53 }
54 GURL url_; 54 GURL url_;
55 }; 55 };
56 56
57 } // end namespace 57 } // end namespace
58 58
59 class PrerenderContentsFactoryImpl : public PrerenderContents::Factory { 59 class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
60 public: 60 public:
61 virtual PrerenderContents* CreatePrerenderContents( 61 virtual PrerenderContents* CreatePrerenderContents(
62 PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker, 62 PrerenderManager* prerender_manager, PrerenderTracker* prerender_tracker,
63 Profile* profile, const GURL& url, const GURL& referrer) OVERRIDE { 63 Profile* profile, const GURL& url, const GURL& referrer,
64 Origin origin) OVERRIDE {
64 return new PrerenderContents(prerender_manager, prerender_tracker, profile, 65 return new PrerenderContents(prerender_manager, prerender_tracker, profile,
65 url, referrer); 66 url, referrer, origin);
66 } 67 }
67 }; 68 };
68 69
69 // TabContentsDelegateImpl ----------------------------------------------------- 70 // TabContentsDelegateImpl -----------------------------------------------------
70 71
71 class PrerenderContents::TabContentsDelegateImpl 72 class PrerenderContents::TabContentsDelegateImpl
72 : public TabContentsDelegate { 73 : public TabContentsDelegate {
73 public: 74 public:
74 explicit TabContentsDelegateImpl(PrerenderContents* prerender_contents) : 75 explicit TabContentsDelegateImpl(PrerenderContents* prerender_contents) :
75 prerender_contents_(prerender_contents) { 76 prerender_contents_(prerender_contents) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 // Caches pages to be added to the history. 118 // Caches pages to be added to the history.
118 AddPageVector add_page_vector_; 119 AddPageVector add_page_vector_;
119 120
120 PrerenderContents* prerender_contents_; 121 PrerenderContents* prerender_contents_;
121 }; 122 };
122 123
123 PrerenderContents::PrerenderContents(PrerenderManager* prerender_manager, 124 PrerenderContents::PrerenderContents(PrerenderManager* prerender_manager,
124 PrerenderTracker* prerender_tracker, 125 PrerenderTracker* prerender_tracker,
125 Profile* profile, 126 Profile* profile,
126 const GURL& url, 127 const GURL& url,
127 const GURL& referrer) 128 const GURL& referrer,
129 Origin origin)
128 : prerender_manager_(prerender_manager), 130 : prerender_manager_(prerender_manager),
129 prerender_tracker_(prerender_tracker), 131 prerender_tracker_(prerender_tracker),
130 prerender_url_(url), 132 prerender_url_(url),
131 referrer_(referrer), 133 referrer_(referrer),
132 profile_(profile), 134 profile_(profile),
133 page_id_(0), 135 page_id_(0),
134 has_stopped_loading_(false), 136 has_stopped_loading_(false),
135 final_status_(FINAL_STATUS_MAX), 137 final_status_(FINAL_STATUS_MAX),
136 prerendering_has_started_(false), 138 prerendering_has_started_(false),
137 prerendering_has_been_cancelled_(false), 139 prerendering_has_been_cancelled_(false),
138 child_id_(-1), 140 child_id_(-1),
139 route_id_(-1), 141 route_id_(-1),
140 starting_page_id_(-1) { 142 starting_page_id_(-1),
143 origin_(origin) {
141 DCHECK(prerender_manager != NULL); 144 DCHECK(prerender_manager != NULL);
142 } 145 }
143 146
144 bool PrerenderContents::Init() { 147 bool PrerenderContents::Init() {
145 return AddAliasURL(prerender_url_); 148 return AddAliasURL(prerender_url_);
146 } 149 }
147 150
148 // static 151 // static
149 PrerenderContents::Factory* PrerenderContents::CreateFactory() { 152 PrerenderContents::Factory* PrerenderContents::CreateFactory() {
150 return new PrerenderContentsFactoryImpl(); 153 return new PrerenderContentsFactoryImpl();
151 } 154 }
152 155
153 void PrerenderContents::StartPrerendering( 156 void PrerenderContents::StartPrerendering(
154 const RenderViewHost* source_render_view_host) { 157 const RenderViewHost* source_render_view_host) {
155 DCHECK(profile_ != NULL); 158 DCHECK(profile_ != NULL);
156 DCHECK(!prerendering_has_started_); 159 DCHECK(!prerendering_has_started_);
157 DCHECK(prerender_contents_.get() == NULL); 160 DCHECK(prerender_contents_.get() == NULL);
158 DCHECK(source_render_view_host != NULL);
159 DCHECK(source_render_view_host->view() != NULL);
160 161
161 prerendering_has_started_ = true; 162 prerendering_has_started_ = true;
162 TabContents* new_contents = new TabContents(profile_, NULL, MSG_ROUTING_NONE, 163 TabContents* new_contents = new TabContents(profile_, NULL, MSG_ROUTING_NONE,
163 NULL, NULL); 164 NULL, NULL);
164 prerender_contents_.reset(new TabContentsWrapper(new_contents)); 165 prerender_contents_.reset(new TabContentsWrapper(new_contents));
165 TabContentsObserver::Observe(new_contents); 166 TabContentsObserver::Observe(new_contents);
166 prerender_contents_->download_tab_helper()->set_delegate(this); 167 prerender_contents_->download_tab_helper()->set_delegate(this);
167 168
168 TabContents* source_tc = 169 if (source_render_view_host) {
169 source_render_view_host->delegate()->GetAsTabContents(); 170 DCHECK(source_render_view_host->view() != NULL);
170 if (source_tc) { 171 TabContents* source_tc =
171 // So that history merging will work, get the max page ID 172 source_render_view_host->delegate()->GetAsTabContents();
172 // of the old page, and add a safety margin of 10 to it (for things 173 if (source_tc) {
173 // such as redirects). 174 // So that history merging will work, get the max page ID
174 starting_page_id_ = source_tc->GetMaxPageID(); 175 // of the old page, and add a safety margin of 10 to it (for things
175 if (starting_page_id_ < 0) 176 // such as redirects).
176 starting_page_id_ = 0; 177 starting_page_id_ = source_tc->GetMaxPageID();
177 starting_page_id_ += kPrerenderPageIdOffset; 178 if (starting_page_id_ < 0)
178 prerender_contents_->controller().set_max_restored_page_id( 179 starting_page_id_ = 0;
179 starting_page_id_); 180 starting_page_id_ += kPrerenderPageIdOffset;
181 prerender_contents_->controller().set_max_restored_page_id(
182 starting_page_id_);
180 183
181 tab_contents_delegate_.reset(new TabContentsDelegateImpl(this)); 184 tab_contents_delegate_.reset(new TabContentsDelegateImpl(this));
182 new_contents->set_delegate(tab_contents_delegate_.get()); 185 new_contents->set_delegate(tab_contents_delegate_.get());
183 186
184 // Set the size of the new TC to that of the old TC. 187 // Set the size of the new TC to that of the old TC.
185 gfx::Rect tab_bounds; 188 gfx::Rect tab_bounds;
186 source_tc->view()->GetContainerBounds(&tab_bounds); 189 source_tc->view()->GetContainerBounds(&tab_bounds);
187 prerender_contents_->view()->SizeContents(tab_bounds.size()); 190 prerender_contents_->view()->SizeContents(tab_bounds.size());
191 }
188 } 192 }
189 193
190 // Register as an observer of the RenderViewHost so we get messages. 194 // Register as an observer of the RenderViewHost so we get messages.
191 render_view_host_observer_.reset( 195 render_view_host_observer_.reset(
192 new PrerenderRenderViewHostObserver(this, render_view_host_mutable())); 196 new PrerenderRenderViewHostObserver(this, render_view_host_mutable()));
193 197
194 child_id_ = render_view_host()->process()->id(); 198 child_id_ = render_view_host()->process()->id();
195 route_id_ = render_view_host()->routing_id(); 199 route_id_ = render_view_host()->routing_id();
196 200
197 // Register this with the ResourceDispatcherHost as a prerender 201 // Register this with the ResourceDispatcherHost as a prerender
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 269
266 FinalStatus PrerenderContents::final_status() const { 270 FinalStatus PrerenderContents::final_status() const {
267 return final_status_; 271 return final_status_;
268 } 272 }
269 273
270 PrerenderContents::~PrerenderContents() { 274 PrerenderContents::~PrerenderContents() {
271 DCHECK(final_status_ != FINAL_STATUS_MAX); 275 DCHECK(final_status_ != FINAL_STATUS_MAX);
272 DCHECK(prerendering_has_been_cancelled_ || 276 DCHECK(prerendering_has_been_cancelled_ ||
273 final_status_ == FINAL_STATUS_USED || 277 final_status_ == FINAL_STATUS_USED ||
274 final_status_ == FINAL_STATUS_CONTROL_GROUP); 278 final_status_ == FINAL_STATUS_CONTROL_GROUP);
279 DCHECK(origin_ != ORIGIN_MAX);
275 280
276 // If we haven't even started prerendering, we were just in the control 281 // If we haven't even started prerendering, we were just in the control
277 // group, which means we do not want to record the status. 282 // group, which means we do not want to record the status.
278 if (prerendering_has_started()) 283 if (prerendering_has_started())
279 RecordFinalStatus(final_status_); 284 RecordFinalStatus(origin_, final_status_);
280 285
281 if (child_id_ != -1 && route_id_ != -1) 286 if (child_id_ != -1 && route_id_ != -1)
282 prerender_tracker_->OnPrerenderingFinished(child_id_, route_id_); 287 prerender_tracker_->OnPrerenderingFinished(child_id_, route_id_);
283 288
284 // If we still have a TabContents, clean up anything we need to and then 289 // If we still have a TabContents, clean up anything we need to and then
285 // destroy it. 290 // destroy it.
286 if (prerender_contents_.get()) 291 if (prerender_contents_.get())
287 delete ReleasePrerenderContents(); 292 delete ReleasePrerenderContents();
288 293
289 // The following URLs are no longer rendering. 294 // The following URLs are no longer rendering.
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 return NULL; 575 return NULL;
571 DictionaryValue* dict_value = new DictionaryValue(); 576 DictionaryValue* dict_value = new DictionaryValue();
572 dict_value->SetString("url", prerender_url_.spec()); 577 dict_value->SetString("url", prerender_url_.spec());
573 base::TimeTicks current_time = base::TimeTicks::Now(); 578 base::TimeTicks current_time = base::TimeTicks::Now();
574 base::TimeDelta duration = current_time - load_start_time_; 579 base::TimeDelta duration = current_time - load_start_time_;
575 dict_value->SetInteger("duration", duration.InSeconds()); 580 dict_value->SetInteger("duration", duration.InSeconds());
576 return dict_value; 581 return dict_value;
577 } 582 }
578 583
579 } // namespace prerender 584 } // namespace prerender
OLDNEW
« no previous file with comments | « chrome/browser/prerender/prerender_contents.h ('k') | chrome/browser/prerender/prerender_final_status.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698