| OLD | NEW |
| 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 "content/browser/web_contents/render_view_host_manager.h" | 5 #include "content/browser/web_contents/render_view_host_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 global_request_id, is_transfer, transfer_url, referrer, frame_id)); | 417 global_request_id, is_transfer, transfer_url, referrer, frame_id)); |
| 418 | 418 |
| 419 // Run the unload handler of the current page. | 419 // Run the unload handler of the current page. |
| 420 SwapOutOldPage(); | 420 SwapOutOldPage(); |
| 421 } | 421 } |
| 422 | 422 |
| 423 void RenderViewHostManager::SwapOutOldPage() { | 423 void RenderViewHostManager::SwapOutOldPage() { |
| 424 // Should only see this while we have a pending renderer or transfer. | 424 // Should only see this while we have a pending renderer or transfer. |
| 425 CHECK(cross_navigation_pending_ || pending_nav_params_.get()); | 425 CHECK(cross_navigation_pending_ || pending_nav_params_.get()); |
| 426 | 426 |
| 427 // First close any modal dialogs that would prevent us from swapping out. | 427 // Tell the renderer to suppress any further modal dialogs so that we can swap |
| 428 // TODO(creis): This is not a guarantee. The renderer could immediately | 428 // it out. This must be done before canceling any current dialog, in case |
| 429 // create another dialog in a loop, potentially causing a renderer crash when | 429 // there is a loop creating additional dialogs. |
| 430 // we tell it to swap out with a nested message loop and PageGroupLoadDeferrer | 430 render_view_host_->SuppressDialogsUntilSwapOut(); |
| 431 // on the stack. We should prevent the renderer from showing more dialogs | 431 |
| 432 // until the SwapOut. See http://crbug.com/312490. | 432 // Now close any modal dialogs that would prevent us from swapping out. This |
| 433 // must be done separately from SwapOut, so that the PageGroupLoadDeferrer is |
| 434 // no longer on the stack when we send the SwapOut message. |
| 433 delegate_->CancelModalDialogsForRenderManager(); | 435 delegate_->CancelModalDialogsForRenderManager(); |
| 434 | 436 |
| 435 // Tell the old renderer it is being swapped out. This will fire the unload | 437 // Tell the old renderer it is being swapped out. This will fire the unload |
| 436 // handler (without firing the beforeunload handler a second time). When the | 438 // handler (without firing the beforeunload handler a second time). When the |
| 437 // unload handler finishes and the navigation completes, we will send a | 439 // unload handler finishes and the navigation completes, we will send a |
| 438 // message to the ResourceDispatcherHost, allowing the pending RVH's response | 440 // message to the ResourceDispatcherHost, allowing the pending RVH's response |
| 439 // to resume. | 441 // to resume. |
| 440 render_view_host_->SwapOut(); | 442 render_view_host_->SwapOut(); |
| 441 | 443 |
| 442 // ResourceDispatcherHost has told us to run the onunload handler, which | 444 // ResourceDispatcherHost has told us to run the onunload handler, which |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 opener_route_id); | 755 opener_route_id); |
| 754 } | 756 } |
| 755 | 757 |
| 756 void RenderViewHostManager::CommitPending() { | 758 void RenderViewHostManager::CommitPending() { |
| 757 // First check whether we're going to want to focus the location bar after | 759 // First check whether we're going to want to focus the location bar after |
| 758 // this commit. We do this now because the navigation hasn't formally | 760 // this commit. We do this now because the navigation hasn't formally |
| 759 // committed yet, so if we've already cleared |pending_web_ui_| the call chain | 761 // committed yet, so if we've already cleared |pending_web_ui_| the call chain |
| 760 // this triggers won't be able to figure out what's going on. | 762 // this triggers won't be able to figure out what's going on. |
| 761 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); | 763 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); |
| 762 | 764 |
| 763 // We currently can't guarantee that the renderer isn't showing a new modal | |
| 764 // dialog, even though we canceled them in SwapOutOldPage. (It may have | |
| 765 // created another in the mean time.) Make sure we run and reset the callback | |
| 766 // now before we delete its RVH below. | |
| 767 // TODO(creis): Remove this if we can guarantee that no new dialogs will be | |
| 768 // shown after SwapOutOldPage. See http://crbug.com/312490. | |
| 769 delegate_->CancelModalDialogsForRenderManager(); | |
| 770 | |
| 771 // Next commit the Web UI, if any. Either replace |web_ui_| with | 765 // Next commit the Web UI, if any. Either replace |web_ui_| with |
| 772 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or | 766 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or |
| 773 // leave |web_ui_| as is if reusing it. | 767 // leave |web_ui_| as is if reusing it. |
| 774 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get())); | 768 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get())); |
| 775 if (pending_web_ui_) | 769 if (pending_web_ui_) |
| 776 web_ui_.reset(pending_web_ui_.release()); | 770 web_ui_.reset(pending_web_ui_.release()); |
| 777 else if (!pending_and_current_web_ui_.get()) | 771 else if (!pending_and_current_web_ui_.get()) |
| 778 web_ui_.reset(); | 772 web_ui_.reset(); |
| 779 | 773 |
| 780 // It's possible for the pending_render_view_host_ to be NULL when we aren't | 774 // It's possible for the pending_render_view_host_ to be NULL when we aren't |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 RenderViewHostImpl* RenderViewHostManager::GetSwappedOutRenderViewHost( | 1091 RenderViewHostImpl* RenderViewHostManager::GetSwappedOutRenderViewHost( |
| 1098 SiteInstance* instance) { | 1092 SiteInstance* instance) { |
| 1099 RenderViewHostMap::iterator iter = swapped_out_hosts_.find(instance->GetId()); | 1093 RenderViewHostMap::iterator iter = swapped_out_hosts_.find(instance->GetId()); |
| 1100 if (iter != swapped_out_hosts_.end()) | 1094 if (iter != swapped_out_hosts_.end()) |
| 1101 return iter->second; | 1095 return iter->second; |
| 1102 | 1096 |
| 1103 return NULL; | 1097 return NULL; |
| 1104 } | 1098 } |
| 1105 | 1099 |
| 1106 } // namespace content | 1100 } // namespace content |
| OLD | NEW |