| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/frame_host/render_frame_host_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 // Now close any modal dialogs that would prevent us from swapping out. This | 638 // Now close any modal dialogs that would prevent us from swapping out. This |
| 639 // must be done separately from SwapOut, so that the ScopedPageLoadDeferrer is | 639 // must be done separately from SwapOut, so that the ScopedPageLoadDeferrer is |
| 640 // no longer on the stack when we send the SwapOut message. | 640 // no longer on the stack when we send the SwapOut message. |
| 641 delegate_->CancelModalDialogsForRenderManager(); | 641 delegate_->CancelModalDialogsForRenderManager(); |
| 642 | 642 |
| 643 // If the old RFH is not live, just return as there is no further work to do. | 643 // If the old RFH is not live, just return as there is no further work to do. |
| 644 // It will be deleted and there will be no proxy created. | 644 // It will be deleted and there will be no proxy created. |
| 645 if (!old_render_frame_host->IsRenderFrameLive()) | 645 if (!old_render_frame_host->IsRenderFrameLive()) |
| 646 return; | 646 return; |
| 647 | 647 |
| 648 // If there are no active frames besides this one, we can delete the old | 648 // Create a replacement proxy for the old RenderFrameHost. (There should not |
| 649 // RenderFrameHost once it runs its unload handler, without replacing it with | 649 // be one yet.) This is done even if there are no active frames besides this |
| 650 // a proxy. | 650 // one to simplify cleanup logic on the renderer side (see |
| 651 if (old_render_frame_host->GetSiteInstance()->active_frame_count() <= 1) { | 651 // https://crbug.com/568836 for motivation). |
| 652 // Tell the old RenderFrameHost to swap out, with no proxy to replace it. | 652 RenderFrameProxyHost* proxy = |
| 653 old_render_frame_host->SwapOut(nullptr, true); | 653 CreateRenderFrameProxyHost(old_render_frame_host->GetSiteInstance(), |
| 654 } else { | 654 old_render_frame_host->render_view_host()); |
| 655 // Otherwise there are active views and we need a proxy for the old RFH. | |
| 656 // (There should not be one yet.) | |
| 657 RenderFrameProxyHost* proxy = | |
| 658 CreateRenderFrameProxyHost(old_render_frame_host->GetSiteInstance(), | |
| 659 old_render_frame_host->render_view_host()); | |
| 660 | 655 |
| 661 // Tell the old RenderFrameHost to swap out and be replaced by the proxy. | 656 // Tell the old RenderFrameHost to swap out and be replaced by the proxy. |
| 662 old_render_frame_host->SwapOut(proxy, true); | 657 old_render_frame_host->SwapOut(proxy, true); |
| 663 | 658 |
| 664 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. | 659 // SwapOut creates a RenderFrameProxy, so set the proxy to be initialized. |
| 665 proxy->set_render_frame_proxy_created(true); | 660 proxy->set_render_frame_proxy_created(true); |
| 666 } | |
| 667 | 661 |
| 668 // |old_render_frame_host| will be deleted when its SwapOut ACK is received, | 662 // |old_render_frame_host| will be deleted when its SwapOut ACK is received, |
| 669 // or when the timer times out, or when the RFHM itself is deleted (whichever | 663 // or when the timer times out, or when the RFHM itself is deleted (whichever |
| 670 // comes first). | 664 // comes first). |
| 671 pending_delete_hosts_.push_back(std::move(old_render_frame_host)); | 665 pending_delete_hosts_.push_back(std::move(old_render_frame_host)); |
| 672 } | 666 } |
| 673 | 667 |
| 674 void RenderFrameHostManager::DiscardUnusedFrame( | 668 void RenderFrameHostManager::DiscardUnusedFrame( |
| 675 std::unique_ptr<RenderFrameHostImpl> render_frame_host) { | 669 std::unique_ptr<RenderFrameHostImpl> render_frame_host) { |
| 676 // TODO(carlosk): this code is very similar to what can be found in | 670 // TODO(carlosk): this code is very similar to what can be found in |
| (...skipping 16 matching lines...) Expand all Loading... |
| 693 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); | 687 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); |
| 694 if (!proxy) { | 688 if (!proxy) { |
| 695 proxy = CreateRenderFrameProxyHost(site_instance, | 689 proxy = CreateRenderFrameProxyHost(site_instance, |
| 696 render_frame_host->render_view_host()); | 690 render_frame_host->render_view_host()); |
| 697 } | 691 } |
| 698 } | 692 } |
| 699 | 693 |
| 700 render_frame_host.reset(); | 694 render_frame_host.reset(); |
| 701 } | 695 } |
| 702 | 696 |
| 703 bool RenderFrameHostManager::IsViewPendingDeletion( | |
| 704 RenderViewHostImpl* render_view_host) { | |
| 705 // Only safe to call this on the main frame. | |
| 706 CHECK(frame_tree_node_->IsMainFrame()); | |
| 707 | |
| 708 // The view is not pending deletion if more than one frame or proxy references | |
| 709 // it. | |
| 710 if (render_view_host->ref_count() > 1) | |
| 711 return false; | |
| 712 | |
| 713 // If the only thing referencing it is a frame on the pending deletion list, | |
| 714 // then this view will go away when the frame goes away. | |
| 715 for (const auto& rfh : pending_delete_hosts_) { | |
| 716 if (rfh->GetRenderViewHost() == render_view_host) | |
| 717 return true; | |
| 718 } | |
| 719 return false; | |
| 720 } | |
| 721 | |
| 722 bool RenderFrameHostManager::DeleteFromPendingList( | 697 bool RenderFrameHostManager::DeleteFromPendingList( |
| 723 RenderFrameHostImpl* render_frame_host) { | 698 RenderFrameHostImpl* render_frame_host) { |
| 724 for (RFHPendingDeleteList::iterator iter = pending_delete_hosts_.begin(); | 699 for (RFHPendingDeleteList::iterator iter = pending_delete_hosts_.begin(); |
| 725 iter != pending_delete_hosts_.end(); | 700 iter != pending_delete_hosts_.end(); |
| 726 iter++) { | 701 iter++) { |
| 727 if (iter->get() == render_frame_host) { | 702 if (iter->get() == render_frame_host) { |
| 728 pending_delete_hosts_.erase(iter); | 703 pending_delete_hosts_.erase(iter); |
| 729 return true; | 704 return true; |
| 730 } | 705 } |
| 731 } | 706 } |
| (...skipping 1840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2572 resolved_url)) { | 2547 resolved_url)) { |
| 2573 DCHECK(!dest_instance || | 2548 DCHECK(!dest_instance || |
| 2574 dest_instance == render_frame_host_->GetSiteInstance()); | 2549 dest_instance == render_frame_host_->GetSiteInstance()); |
| 2575 return false; | 2550 return false; |
| 2576 } | 2551 } |
| 2577 | 2552 |
| 2578 return true; | 2553 return true; |
| 2579 } | 2554 } |
| 2580 | 2555 |
| 2581 } // namespace content | 2556 } // namespace content |
| OLD | NEW |