| OLD | NEW |
| 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" |
| 11 #include "base/task.h" | 11 #include "base/task.h" |
| 12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
| 13 #include "chrome/browser/background_contents_service.h" | 13 #include "chrome/browser/background_contents_service.h" |
| 14 #include "chrome/browser/browser_process.h" | 14 #include "chrome/browser/browser_process.h" |
| 15 #include "chrome/browser/history/history_marshaling.h" | 15 #include "chrome/browser/history/history_marshaling.h" |
| 16 #include "chrome/browser/prerender/prerender_final_status.h" | 16 #include "chrome/browser/prerender/prerender_final_status.h" |
| 17 #include "chrome/browser/prerender/prerender_manager.h" | 17 #include "chrome/browser/prerender/prerender_manager.h" |
| 18 #include "chrome/browser/prerender/prerender_render_widget_host_view.h" | 18 #include "chrome/browser/prerender/prerender_render_widget_host_view.h" |
| 19 #include "chrome/browser/prerender/prerender_tracker.h" | 19 #include "chrome/browser/prerender/prerender_tracker.h" |
| 20 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
| 21 #include "chrome/browser/renderer_preferences_util.h" | 21 #include "chrome/browser/renderer_preferences_util.h" |
| 22 #include "chrome/browser/ui/download/download_tab_helper.h" |
| 22 #include "chrome/browser/ui/login/login_prompt.h" | 23 #include "chrome/browser/ui/login/login_prompt.h" |
| 23 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 24 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 24 #include "chrome/common/extensions/extension_constants.h" | 25 #include "chrome/common/extensions/extension_constants.h" |
| 25 #include "chrome/common/extensions/extension_messages.h" | 26 #include "chrome/common/extensions/extension_messages.h" |
| 26 #include "chrome/common/icon_messages.h" | 27 #include "chrome/common/icon_messages.h" |
| 27 #include "chrome/common/render_messages.h" | 28 #include "chrome/common/render_messages.h" |
| 28 #include "chrome/common/url_constants.h" | 29 #include "chrome/common/url_constants.h" |
| 29 #include "content/browser/browsing_instance.h" | 30 #include "content/browser/browsing_instance.h" |
| 30 #include "content/browser/renderer_host/render_view_host.h" | 31 #include "content/browser/renderer_host/render_view_host.h" |
| 31 #include "content/browser/renderer_host/resource_dispatcher_host.h" | 32 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 DCHECK(!prerendering_has_started_); | 247 DCHECK(!prerendering_has_started_); |
| 247 DCHECK(prerender_contents_.get() == NULL); | 248 DCHECK(prerender_contents_.get() == NULL); |
| 248 DCHECK(source_render_view_host != NULL); | 249 DCHECK(source_render_view_host != NULL); |
| 249 DCHECK(source_render_view_host->view() != NULL); | 250 DCHECK(source_render_view_host->view() != NULL); |
| 250 | 251 |
| 251 prerendering_has_started_ = true; | 252 prerendering_has_started_ = true; |
| 252 TabContents* new_contents = new TabContents(profile_, NULL, MSG_ROUTING_NONE, | 253 TabContents* new_contents = new TabContents(profile_, NULL, MSG_ROUTING_NONE, |
| 253 NULL, NULL); | 254 NULL, NULL); |
| 254 prerender_contents_.reset(new TabContentsWrapper(new_contents)); | 255 prerender_contents_.reset(new TabContentsWrapper(new_contents)); |
| 255 tab_contents_observer_registrar_.Observe(new_contents); | 256 tab_contents_observer_registrar_.Observe(new_contents); |
| 257 prerender_contents_->download_tab_helper()->set_delegate(this); |
| 256 | 258 |
| 257 TabContents* source_tc = | 259 TabContents* source_tc = |
| 258 source_render_view_host->delegate()->GetAsTabContents(); | 260 source_render_view_host->delegate()->GetAsTabContents(); |
| 259 if (source_tc) { | 261 if (source_tc) { |
| 260 // So that history merging will work, get the max page ID | 262 // So that history merging will work, get the max page ID |
| 261 // of the old page, and add a safety margin of 10 to it (for things | 263 // of the old page, and add a safety margin of 10 to it (for things |
| 262 // such as redirects). | 264 // such as redirects). |
| 263 int32 max_page_id = source_tc->GetMaxPageID(); | 265 int32 max_page_id = source_tc->GetMaxPageID(); |
| 264 if (max_page_id != -1) { | 266 if (max_page_id != -1) { |
| 265 prerender_contents_->controller().set_max_restored_page_id( | 267 prerender_contents_->controller().set_max_restored_page_id( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED, | 302 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED, |
| 301 Source<Profile>(profile_)); | 303 Source<Profile>(profile_)); |
| 302 | 304 |
| 303 // Register to cancel if Authentication is required. | 305 // Register to cancel if Authentication is required. |
| 304 notification_registrar_.Add(this, NotificationType::AUTH_NEEDED, | 306 notification_registrar_.Add(this, NotificationType::AUTH_NEEDED, |
| 305 NotificationService::AllSources()); | 307 NotificationService::AllSources()); |
| 306 | 308 |
| 307 notification_registrar_.Add(this, NotificationType::AUTH_CANCELLED, | 309 notification_registrar_.Add(this, NotificationType::AUTH_CANCELLED, |
| 308 NotificationService::AllSources()); | 310 NotificationService::AllSources()); |
| 309 | 311 |
| 310 // Register all responses to see if we should cancel. | |
| 311 notification_registrar_.Add(this, NotificationType::DOWNLOAD_INITIATED, | |
| 312 NotificationService::AllSources()); | |
| 313 | |
| 314 // Register to inform new RenderViews that we're prerendering. | 312 // Register to inform new RenderViews that we're prerendering. |
| 315 notification_registrar_.Add( | 313 notification_registrar_.Add( |
| 316 this, NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB, | 314 this, NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB, |
| 317 Source<TabContents>(new_contents)); | 315 Source<TabContents>(new_contents)); |
| 318 | 316 |
| 319 // Register for redirect notifications sourced from |this|. | 317 // Register for redirect notifications sourced from |this|. |
| 320 notification_registrar_.Add( | 318 notification_registrar_.Add( |
| 321 this, NotificationType::RESOURCE_RECEIVED_REDIRECT, | 319 this, NotificationType::RESOURCE_RECEIVED_REDIRECT, |
| 322 Source<RenderViewHostDelegate>(GetRenderViewHostDelegate())); | 320 Source<RenderViewHostDelegate>(GetRenderViewHostDelegate())); |
| 323 | 321 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 RecordFinalStatus(final_status_); | 371 RecordFinalStatus(final_status_); |
| 374 | 372 |
| 375 // Only delete the RenderViewHost if we own it. | 373 // Only delete the RenderViewHost if we own it. |
| 376 if (render_view_host_) | 374 if (render_view_host_) |
| 377 render_view_host_->Shutdown(); | 375 render_view_host_->Shutdown(); |
| 378 | 376 |
| 379 if (child_id_ != -1 && route_id_ != -1) { | 377 if (child_id_ != -1 && route_id_ != -1) { |
| 380 PrerenderTracker::GetInstance()->OnPrerenderingFinished( | 378 PrerenderTracker::GetInstance()->OnPrerenderingFinished( |
| 381 child_id_, route_id_); | 379 child_id_, route_id_); |
| 382 } | 380 } |
| 381 |
| 382 // If we still have a TabContents, clean up anything we need to and then |
| 383 // destroy it. |
| 384 if (prerender_contents_.get()) |
| 385 delete ReleasePrerenderContents(); |
| 383 } | 386 } |
| 384 | 387 |
| 385 RenderViewHostDelegate::View* PrerenderContents::GetViewDelegate() { | 388 RenderViewHostDelegate::View* PrerenderContents::GetViewDelegate() { |
| 386 return this; | 389 return this; |
| 387 } | 390 } |
| 388 | 391 |
| 389 const GURL& PrerenderContents::GetURL() const { | 392 const GURL& PrerenderContents::GetURL() const { |
| 390 return url_; | 393 return url_; |
| 391 } | 394 } |
| 392 | 395 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 LoginHandler* handler = details_ptr->handler(); | 458 LoginHandler* handler = details_ptr->handler(); |
| 456 DCHECK(handler != NULL); | 459 DCHECK(handler != NULL); |
| 457 RenderViewHostDelegate* delegate = handler->GetRenderViewHostDelegate(); | 460 RenderViewHostDelegate* delegate = handler->GetRenderViewHostDelegate(); |
| 458 if (delegate == GetRenderViewHostDelegate()) { | 461 if (delegate == GetRenderViewHostDelegate()) { |
| 459 Destroy(FINAL_STATUS_AUTH_NEEDED); | 462 Destroy(FINAL_STATUS_AUTH_NEEDED); |
| 460 return; | 463 return; |
| 461 } | 464 } |
| 462 break; | 465 break; |
| 463 } | 466 } |
| 464 | 467 |
| 468 // TODO(mmenke): Once we get rid of the old RenderViewHost code, remove |
| 469 // this. |
| 465 case NotificationType::DOWNLOAD_INITIATED: { | 470 case NotificationType::DOWNLOAD_INITIATED: { |
| 466 // If the download is started from a RenderViewHost that we are | 471 // If the download is started from a RenderViewHost that we are |
| 467 // delegating, kill the prerender. This cancels any pending requests | 472 // delegating, kill the prerender. This cancels any pending requests |
| 468 // though the download never actually started thanks to the | 473 // though the download never actually started thanks to the |
| 469 // DownloadRequestLimiter. | 474 // DownloadRequestLimiter. |
| 470 DCHECK(NotificationService::NoDetails() == details); | 475 DCHECK(NotificationService::NoDetails() == details); |
| 471 RenderViewHost* render_view_host = Source<RenderViewHost>(source).ptr(); | 476 RenderViewHost* render_view_host = Source<RenderViewHost>(source).ptr(); |
| 472 CHECK(render_view_host != NULL); | 477 CHECK(render_view_host != NULL); |
| 473 if (render_view_host->delegate() == GetRenderViewHostDelegate()) { | 478 if (render_view_host->delegate() == GetRenderViewHostDelegate()) { |
| 474 Destroy(FINAL_STATUS_DOWNLOAD); | 479 Destroy(FINAL_STATUS_DOWNLOAD); |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 733 if (render_view_host_observer_.get()) | 738 if (render_view_host_observer_.get()) |
| 734 render_view_host_observer_->set_prerender_contents(NULL); | 739 render_view_host_observer_->set_prerender_contents(NULL); |
| 735 } | 740 } |
| 736 | 741 |
| 737 void PrerenderContents::RendererUnresponsive(RenderViewHost* render_view_host, | 742 void PrerenderContents::RendererUnresponsive(RenderViewHost* render_view_host, |
| 738 bool is_during_unload) { | 743 bool is_during_unload) { |
| 739 DCHECK_EQ(render_view_host_, render_view_host); | 744 DCHECK_EQ(render_view_host_, render_view_host); |
| 740 Destroy(FINAL_STATUS_RENDERER_UNRESPONSIVE); | 745 Destroy(FINAL_STATUS_RENDERER_UNRESPONSIVE); |
| 741 } | 746 } |
| 742 | 747 |
| 748 bool PrerenderContents::CanDownload(int request_id) { |
| 749 Destroy(FINAL_STATUS_DOWNLOAD); |
| 750 // Cancel the download. |
| 751 return false; |
| 752 } |
| 753 |
| 754 void PrerenderContents::OnStartDownload(DownloadItem* download, |
| 755 TabContentsWrapper* tab) { |
| 756 // Prerendered pages should never be able to download files. |
| 757 NOTREACHED(); |
| 758 } |
| 759 |
| 743 base::ProcessMetrics* PrerenderContents::MaybeGetProcessMetrics() { | 760 base::ProcessMetrics* PrerenderContents::MaybeGetProcessMetrics() { |
| 744 if (process_metrics_.get() == NULL) { | 761 if (process_metrics_.get() == NULL) { |
| 745 // If a PrenderContents hasn't started prerending, don't be fully formed. | 762 // If a PrenderContents hasn't started prerending, don't be fully formed. |
| 746 if (!render_view_host() || !render_view_host()->process()) | 763 if (!render_view_host() || !render_view_host()->process()) |
| 747 return NULL; | 764 return NULL; |
| 748 base::ProcessHandle handle = render_view_host()->process()->GetHandle(); | 765 base::ProcessHandle handle = render_view_host()->process()->GetHandle(); |
| 749 if (handle == base::kNullProcessHandle) | 766 if (handle == base::kNullProcessHandle) |
| 750 return NULL; | 767 return NULL; |
| 751 #if !defined(OS_MACOSX) | 768 #if !defined(OS_MACOSX) |
| 752 process_metrics_.reset(base::ProcessMetrics::CreateProcessMetrics(handle)); | 769 process_metrics_.reset(base::ProcessMetrics::CreateProcessMetrics(handle)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 769 if (metrics->GetMemoryBytes(&private_bytes, &shared_bytes)) { | 786 if (metrics->GetMemoryBytes(&private_bytes, &shared_bytes)) { |
| 770 if (private_bytes > | 787 if (private_bytes > |
| 771 prerender_manager_->max_prerender_memory_mb() * 1024 * 1024) { | 788 prerender_manager_->max_prerender_memory_mb() * 1024 * 1024) { |
| 772 Destroy(FINAL_STATUS_MEMORY_LIMIT_EXCEEDED); | 789 Destroy(FINAL_STATUS_MEMORY_LIMIT_EXCEEDED); |
| 773 } | 790 } |
| 774 } | 791 } |
| 775 } | 792 } |
| 776 | 793 |
| 777 TabContentsWrapper* PrerenderContents::ReleasePrerenderContents() { | 794 TabContentsWrapper* PrerenderContents::ReleasePrerenderContents() { |
| 778 render_view_host_observer_.reset(); | 795 render_view_host_observer_.reset(); |
| 796 prerender_contents_->download_tab_helper()->set_delegate(NULL); |
| 779 return prerender_contents_.release(); | 797 return prerender_contents_.release(); |
| 780 } | 798 } |
| 781 | 799 |
| 782 RenderViewHostDelegate* PrerenderContents::GetRenderViewHostDelegate() { | 800 RenderViewHostDelegate* PrerenderContents::GetRenderViewHostDelegate() { |
| 783 if (UseTabContents()) { | 801 if (UseTabContents()) { |
| 784 if (!prerender_contents_.get()) | 802 if (!prerender_contents_.get()) |
| 785 return NULL; | 803 return NULL; |
| 786 return prerender_contents_->tab_contents(); | 804 return prerender_contents_->tab_contents(); |
| 787 } else { | 805 } else { |
| 788 return this; | 806 return this; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 803 } | 821 } |
| 804 return render_view_host_; | 822 return render_view_host_; |
| 805 } | 823 } |
| 806 | 824 |
| 807 void PrerenderContents::CommitHistory(TabContents* tc) { | 825 void PrerenderContents::CommitHistory(TabContents* tc) { |
| 808 if (tab_contents_delegate_.get()) | 826 if (tab_contents_delegate_.get()) |
| 809 tab_contents_delegate_->CommitHistory(tc); | 827 tab_contents_delegate_->CommitHistory(tc); |
| 810 } | 828 } |
| 811 | 829 |
| 812 } // namespace prerender | 830 } // namespace prerender |
| OLD | NEW |