Index: chrome/browser/prerender/prerender_contents.cc |
=================================================================== |
--- chrome/browser/prerender/prerender_contents.cc (revision 74377) |
+++ chrome/browser/prerender/prerender_contents.cc (working copy) |
@@ -82,6 +82,10 @@ |
registrar_.Add(this, NotificationType::AUTH_CANCELLED, |
NotificationService::AllSources()); |
+ // Register all responses to see if we should cancel. |
+ registrar_.Add(this, NotificationType::DOWNLOAD_INITIATED, |
+ NotificationService::AllSources()); |
+ |
DCHECK(load_start_time_.is_null()); |
load_start_time_ = base::TimeTicks::Now(); |
@@ -95,6 +99,7 @@ |
void PrerenderContents::set_final_status(FinalStatus final_status) { |
DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX); |
DCHECK_EQ(FINAL_STATUS_MAX, final_status_); |
+ |
final_status_ = final_status; |
} |
@@ -186,6 +191,7 @@ |
case NotificationType::PROFILE_DESTROYED: |
Destroy(FINAL_STATUS_PROFILE_DESTROYED); |
return; |
+ |
case NotificationType::APP_TERMINATING: |
Destroy(FINAL_STATUS_APP_TERMINATING); |
return; |
@@ -201,11 +207,26 @@ |
LoginHandler* handler = details_ptr->handler(); |
DCHECK(handler != NULL); |
RenderViewHostDelegate* delegate = handler->GetRenderViewHostDelegate(); |
- if (controller == NULL && delegate == this) |
+ if (controller == NULL && delegate == this) { |
Destroy(FINAL_STATUS_AUTH_NEEDED); |
+ return; |
+ } |
break; |
} |
+ case NotificationType::DOWNLOAD_INITIATED: { |
+ // If the download is started from a RenderViewHost that we are |
+ // delegating, kill the prerender. This cancels any pending requests |
+ // though the download never actually started thanks to the |
+ // DownloadRequestLimiter. |
+ DCHECK(details == NotificationService::NoDetails()); |
+ RenderViewHost* rvh = Source<RenderViewHost>(source).ptr(); |
+ if (rvh->delegate() == this) { |
cbentzel
2011/02/10 19:32:18
May not hurt to be defensive and check that rvh is
dominich
2011/02/10 20:02:17
Done.
|
+ Destroy(FINAL_STATUS_DOWNLOAD); |
+ } |
+ return; |
cbentzel
2011/02/10 19:32:18
move return next to Destroy and make this break, t
dominich
2011/02/10 20:02:17
Done.
|
+ } |
+ |
default: |
NOTREACHED() << "Unexpected notification sent."; |
break; |