Chromium Code Reviews| 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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 // First close any modal dialogs that would prevent us from swapping out. |
| 428 // TODO(creis): This is not a guarantee. The renderer could immediately | |
| 429 // create another dialog in a loop, potentially causing a renderer crash when | |
| 430 // we tell it to swap out with a nested message loop and PageGroupLoadDeferrer | |
| 431 // on the stack. We should prevent the renderer from showing more dialogs | |
| 432 // until the SwapOut. See http://crbug.com/312490. | |
| 428 delegate_->CancelModalDialogsForRenderManager(); | 433 delegate_->CancelModalDialogsForRenderManager(); |
| 429 | 434 |
| 430 // Tell the old renderer it is being swapped out. This will fire the unload | 435 // Tell the old renderer it is being swapped out. This will fire the unload |
| 431 // handler (without firing the beforeunload handler a second time). When the | 436 // handler (without firing the beforeunload handler a second time). When the |
| 432 // unload handler finishes and the navigation completes, we will send a | 437 // unload handler finishes and the navigation completes, we will send a |
| 433 // message to the ResourceDispatcherHost, allowing the pending RVH's response | 438 // message to the ResourceDispatcherHost, allowing the pending RVH's response |
| 434 // to resume. | 439 // to resume. |
| 435 render_view_host_->SwapOut(); | 440 render_view_host_->SwapOut(); |
| 436 | 441 |
| 437 // ResourceDispatcherHost has told us to run the onunload handler, which | 442 // ResourceDispatcherHost has told us to run the onunload handler, which |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 748 opener_route_id); | 753 opener_route_id); |
| 749 } | 754 } |
| 750 | 755 |
| 751 void RenderViewHostManager::CommitPending() { | 756 void RenderViewHostManager::CommitPending() { |
| 752 // First check whether we're going to want to focus the location bar after | 757 // First check whether we're going to want to focus the location bar after |
| 753 // this commit. We do this now because the navigation hasn't formally | 758 // this commit. We do this now because the navigation hasn't formally |
| 754 // committed yet, so if we've already cleared |pending_web_ui_| the call chain | 759 // committed yet, so if we've already cleared |pending_web_ui_| the call chain |
| 755 // this triggers won't be able to figure out what's going on. | 760 // this triggers won't be able to figure out what's going on. |
| 756 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); | 761 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); |
| 757 | 762 |
| 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 | |
|
darin (slow to review)
2013/10/29 16:57:23
nit: "mean time" -> "meantime"
Charlie Reis
2013/10/29 17:13:17
Done.
| |
| 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 | |
| 758 // Next commit the Web UI, if any. Either replace |web_ui_| with | 771 // Next commit the Web UI, if any. Either replace |web_ui_| with |
| 759 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or | 772 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or |
| 760 // leave |web_ui_| as is if reusing it. | 773 // leave |web_ui_| as is if reusing it. |
| 761 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get())); | 774 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get())); |
| 762 if (pending_web_ui_) | 775 if (pending_web_ui_) |
| 763 web_ui_.reset(pending_web_ui_.release()); | 776 web_ui_.reset(pending_web_ui_.release()); |
| 764 else if (!pending_and_current_web_ui_.get()) | 777 else if (!pending_and_current_web_ui_.get()) |
| 765 web_ui_.reset(); | 778 web_ui_.reset(); |
| 766 | 779 |
| 767 // It's possible for the pending_render_view_host_ to be NULL when we aren't | 780 // 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... | |
| 1084 RenderViewHostImpl* RenderViewHostManager::GetSwappedOutRenderViewHost( | 1097 RenderViewHostImpl* RenderViewHostManager::GetSwappedOutRenderViewHost( |
| 1085 SiteInstance* instance) { | 1098 SiteInstance* instance) { |
| 1086 RenderViewHostMap::iterator iter = swapped_out_hosts_.find(instance->GetId()); | 1099 RenderViewHostMap::iterator iter = swapped_out_hosts_.find(instance->GetId()); |
| 1087 if (iter != swapped_out_hosts_.end()) | 1100 if (iter != swapped_out_hosts_.end()) |
| 1088 return iter->second; | 1101 return iter->second; |
| 1089 | 1102 |
| 1090 return NULL; | 1103 return NULL; |
| 1091 } | 1104 } |
| 1092 | 1105 |
| 1093 } // namespace content | 1106 } // namespace content |
| OLD | NEW |