Index: chrome/browser/renderer_host/render_view_host_manager.cc |
diff --git a/chrome/browser/renderer_host/render_view_host_manager.cc b/chrome/browser/renderer_host/render_view_host_manager.cc |
index c0be053bf1f7055f0f57587104fdc85f8907a680..04fc9ce956a02d8458c55db3a096bfec129a8931 100644 |
--- a/chrome/browser/renderer_host/render_view_host_manager.cc |
+++ b/chrome/browser/renderer_host/render_view_host_manager.cc |
@@ -32,6 +32,7 @@ RenderViewHostManager::RenderViewHostManager( |
render_view_delegate_(render_view_delegate), |
render_view_host_(NULL), |
pending_render_view_host_(NULL), |
+ pending_renderer_aborted_(false), |
interstitial_page_(NULL) { |
registrar_.Add(this, NotificationType::RENDER_VIEW_HOST_DELETED, |
NotificationService::AllSources()); |
@@ -214,11 +215,21 @@ void RenderViewHostManager::RendererAbortedProvisionalLoad( |
// navigation events. (That's necessary to support onunload anyway.) Once |
// we've made that change, we won't create a pending renderer until we know |
// the response is not a download. |
+ |
+ // There is one instance where we must be able to pre-emptively clean up a |
+ // pending renderer: If a cross-site download is initiated from a chrome:// |
+ // url, and the browser then wants to close. |
+ if (pending_render_view_host_) { |
brettw
2009/07/01 15:25:22
Don't add {} here since you didn't below (and the
|
+ pending_renderer_aborted_ = true; |
+ } |
} |
void RenderViewHostManager::ShouldClosePage(bool proceed) { |
// Should only see this while we have a pending renderer. Otherwise, we |
// should ignore. |
+ if (pending_render_view_host_ && pending_renderer_aborted_) |
+ CancelPending(); |
+ |
if (!pending_render_view_host_) { |
bool proceed_to_fire_unload; |
delegate_->BeforeUnloadFiredFromRenderManager(proceed, |
@@ -580,7 +591,7 @@ void RenderViewHostManager::CancelPending() { |
RenderViewHost* pending_render_view_host = pending_render_view_host_; |
pending_render_view_host_ = NULL; |
pending_render_view_host->Shutdown(); |
- |
+ pending_renderer_aborted_ = false; |
pending_dom_ui_.reset(); |
} |