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

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

Issue 107893003: Make the renderer-side prerendering code use RenderFrames instead of RenderViews. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: creis review comments Created 7 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 #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 <functional> 8 #include <functional>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/chrome_notification_types.h" 12 #include "chrome/browser/chrome_notification_types.h"
13 #include "chrome/browser/favicon/favicon_tab_helper.h" 13 #include "chrome/browser/favicon/favicon_tab_helper.h"
14 #include "chrome/browser/history/history_tab_helper.h" 14 #include "chrome/browser/history/history_tab_helper.h"
15 #include "chrome/browser/history/history_types.h" 15 #include "chrome/browser/history/history_types.h"
16 #include "chrome/browser/prerender/prerender_field_trial.h" 16 #include "chrome/browser/prerender/prerender_field_trial.h"
17 #include "chrome/browser/prerender/prerender_final_status.h" 17 #include "chrome/browser/prerender/prerender_final_status.h"
18 #include "chrome/browser/prerender/prerender_handle.h" 18 #include "chrome/browser/prerender/prerender_handle.h"
19 #include "chrome/browser/prerender/prerender_manager.h" 19 #include "chrome/browser/prerender/prerender_manager.h"
20 #include "chrome/browser/prerender/prerender_tracker.h" 20 #include "chrome/browser/prerender/prerender_tracker.h"
21 #include "chrome/browser/profiles/profile.h" 21 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/ui/browser.h" 22 #include "chrome/browser/ui/browser.h"
23 #include "chrome/browser/ui/browser_tab_contents.h" 23 #include "chrome/browser/ui/browser_tab_contents.h"
24 #include "chrome/common/prerender_messages.h" 24 #include "chrome/common/prerender_messages.h"
25 #include "chrome/common/render_messages.h" 25 #include "chrome/common/render_messages.h"
26 #include "chrome/common/url_constants.h" 26 #include "chrome/common/url_constants.h"
27 #include "content/public/browser/browser_child_process_host.h" 27 #include "content/public/browser/browser_child_process_host.h"
28 #include "content/public/browser/notification_service.h" 28 #include "content/public/browser/notification_service.h"
29 #include "content/public/browser/render_frame_host.h"
29 #include "content/public/browser/render_process_host.h" 30 #include "content/public/browser/render_process_host.h"
30 #include "content/public/browser/render_view_host.h" 31 #include "content/public/browser/render_view_host.h"
31 #include "content/public/browser/resource_request_details.h" 32 #include "content/public/browser/resource_request_details.h"
32 #include "content/public/browser/session_storage_namespace.h" 33 #include "content/public/browser/session_storage_namespace.h"
33 #include "content/public/browser/web_contents.h" 34 #include "content/public/browser/web_contents.h"
34 #include "content/public/browser/web_contents_delegate.h" 35 #include "content/public/browser/web_contents_delegate.h"
35 #include "content/public/browser/web_contents_view.h" 36 #include "content/public/browser/web_contents_view.h"
36 #include "content/public/common/favicon_url.h" 37 #include "content/public/common/favicon_url.h"
37 #include "content/public/common/frame_navigate_params.h" 38 #include "content/public/common/frame_navigate_params.h"
38 #include "ui/gfx/rect.h" 39 #include "ui/gfx/rect.h"
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 load_url_params.transition_type = 321 load_url_params.transition_type =
321 ((origin_ == ORIGIN_OMNIBOX || origin_ == ORIGIN_INSTANT) ? 322 ((origin_ == ORIGIN_OMNIBOX || origin_ == ORIGIN_INSTANT) ?
322 content::PAGE_TRANSITION_TYPED : content::PAGE_TRANSITION_LINK); 323 content::PAGE_TRANSITION_TYPED : content::PAGE_TRANSITION_LINK);
323 load_url_params.override_user_agent = 324 load_url_params.override_user_agent =
324 prerender_manager_->config().is_overriding_user_agent ? 325 prerender_manager_->config().is_overriding_user_agent ?
325 content::NavigationController::UA_OVERRIDE_TRUE : 326 content::NavigationController::UA_OVERRIDE_TRUE :
326 content::NavigationController::UA_OVERRIDE_FALSE; 327 content::NavigationController::UA_OVERRIDE_FALSE;
327 prerender_contents_.get()->GetController().LoadURLWithParams(load_url_params); 328 prerender_contents_.get()->GetController().LoadURLWithParams(load_url_params);
328 } 329 }
329 330
331 void PrerenderContents::PrerenderingDone() {
332 for (std::set<content::RenderFrameHost*>::iterator i =
333 render_frame_hosts_.begin(); i != render_frame_hosts_.end(); ++i) {
334 (*i)->Send(new PrerenderMsg_SetIsPrerendering((*i)->GetRoutingID(), false));
335 }
336 render_frame_hosts_.clear();
337 }
338
330 bool PrerenderContents::GetChildId(int* child_id) const { 339 bool PrerenderContents::GetChildId(int* child_id) const {
331 CHECK(child_id); 340 CHECK(child_id);
332 DCHECK_GE(child_id_, -1); 341 DCHECK_GE(child_id_, -1);
333 *child_id = child_id_; 342 *child_id = child_id_;
334 return child_id_ != -1; 343 return child_id_ != -1;
335 } 344 }
336 345
337 bool PrerenderContents::GetRouteId(int* route_id) const { 346 bool PrerenderContents::GetRouteId(int* route_id) const {
338 CHECK(route_id); 347 CHECK(route_id);
339 DCHECK_GE(route_id_, -1); 348 DCHECK_GE(route_id_, -1);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 return; 403 return;
395 404
396 case content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED: { 405 case content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED: {
397 if (prerender_contents_.get()) { 406 if (prerender_contents_.get()) {
398 DCHECK_EQ(content::Source<WebContents>(source).ptr(), 407 DCHECK_EQ(content::Source<WebContents>(source).ptr(),
399 prerender_contents_.get()); 408 prerender_contents_.get());
400 409
401 content::Details<RenderViewHost> new_render_view_host(details); 410 content::Details<RenderViewHost> new_render_view_host(details);
402 OnRenderViewHostCreated(new_render_view_host.ptr()); 411 OnRenderViewHostCreated(new_render_view_host.ptr());
403 412
404 // When a new RenderView is created for a prerendering WebContents,
405 // tell the new RenderView it's being used for prerendering before any
406 // navigations occur. Note that this is always triggered before the
407 // first navigation, so there's no need to send the message just after
408 // the WebContents is created.
409 new_render_view_host->Send(
410 new PrerenderMsg_SetIsPrerendering(
411 new_render_view_host->GetRoutingID(),
412 true));
413
414 // Make sure the size of the RenderViewHost has been passed to the new 413 // Make sure the size of the RenderViewHost has been passed to the new
415 // RenderView. Otherwise, the size may not be sent until the 414 // RenderView. Otherwise, the size may not be sent until the
416 // RenderViewReady event makes it from the render process to the UI 415 // RenderViewReady event makes it from the render process to the UI
417 // thread of the browser process. When the RenderView receives its 416 // thread of the browser process. When the RenderView receives its
418 // size, is also sets itself to be visible, which would then break the 417 // size, is also sets itself to be visible, which would then break the
419 // visibility API. 418 // visibility API.
420 new_render_view_host->WasResized(); 419 new_render_view_host->WasResized();
421 prerender_contents_->WasHidden(); 420 prerender_contents_->WasHidden();
422 } 421 }
423 break; 422 break;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 return false; 540 return false;
542 } 541 }
543 return std::count_if(alias_urls_.begin(), alias_urls_.end(), 542 return std::count_if(alias_urls_.begin(), alias_urls_.end(),
544 std::bind2nd(std::equal_to<GURL>(), url)) != 0; 543 std::bind2nd(std::equal_to<GURL>(), url)) != 0;
545 } 544 }
546 545
547 void PrerenderContents::RenderProcessGone(base::TerminationStatus status) { 546 void PrerenderContents::RenderProcessGone(base::TerminationStatus status) {
548 Destroy(FINAL_STATUS_RENDERER_CRASHED); 547 Destroy(FINAL_STATUS_RENDERER_CRASHED);
549 } 548 }
550 549
550 void PrerenderContents::RenderFrameCreated(
551 content::RenderFrameHost* render_frame_host) {
552 render_frame_hosts_.insert(render_frame_host);
553 // When a new RenderFrame is created for a prerendering WebContents, tell the
554 // new RenderFrame it's being used for prerendering before any navigations
555 // occur. Note that this is always triggered before the first navigation, so
556 // there's no need to send the message just after the WebContents is created.
557 render_frame_host->Send(new PrerenderMsg_SetIsPrerendering(
558 render_frame_host->GetRoutingID(), true));
mmenke 2013/12/10 20:56:41 Are there any races here? I'm not familiar with f
jam 2013/12/10 21:14:17 no, this is called from the same place that NOTIFI
559 }
560
561 void PrerenderContents::RenderFrameDeleted(
562 content::RenderFrameHost* render_frame_host) {
563 render_frame_hosts_.erase(render_frame_host);
564 }
565
551 void PrerenderContents::DidStopLoading( 566 void PrerenderContents::DidStopLoading(
552 content::RenderViewHost* render_view_host) { 567 content::RenderViewHost* render_view_host) {
553 has_stopped_loading_ = true; 568 has_stopped_loading_ = true;
554 NotifyPrerenderStopLoading(); 569 NotifyPrerenderStopLoading();
555 } 570 }
556 571
557 void PrerenderContents::DidStartProvisionalLoadForFrame( 572 void PrerenderContents::DidStartProvisionalLoadForFrame(
558 int64 frame_id, 573 int64 frame_id,
559 int64 parent_frame_id, 574 int64 parent_frame_id,
560 bool is_main_frame, 575 bool is_main_frame,
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 return NULL; 763 return NULL;
749 return prerender_contents()->GetController(). 764 return prerender_contents()->GetController().
750 GetDefaultSessionStorageNamespace(); 765 GetDefaultSessionStorageNamespace();
751 } 766 }
752 767
753 void PrerenderContents::OnCancelPrerenderForPrinting() { 768 void PrerenderContents::OnCancelPrerenderForPrinting() {
754 Destroy(FINAL_STATUS_WINDOW_PRINT); 769 Destroy(FINAL_STATUS_WINDOW_PRINT);
755 } 770 }
756 771
757 } // namespace prerender 772 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698