Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 2410153005: Fix RenderView reuse issues when canceling a pending RenderFrameHost. (Closed)
Patch Set: Rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 // or when the timer times out, or when the RFHM itself is deleted (whichever 654 // or when the timer times out, or when the RFHM itself is deleted (whichever
655 // comes first). 655 // comes first).
656 pending_delete_hosts_.push_back(std::move(old_render_frame_host)); 656 pending_delete_hosts_.push_back(std::move(old_render_frame_host));
657 } 657 }
658 658
659 void RenderFrameHostManager::DiscardUnusedFrame( 659 void RenderFrameHostManager::DiscardUnusedFrame(
660 std::unique_ptr<RenderFrameHostImpl> render_frame_host) { 660 std::unique_ptr<RenderFrameHostImpl> render_frame_host) {
661 // TODO(carlosk): this code is very similar to what can be found in 661 // TODO(carlosk): this code is very similar to what can be found in
662 // SwapOutOldFrame and we should see that these are unified at some point. 662 // SwapOutOldFrame and we should see that these are unified at some point.
663 663
664 // If the SiteInstance for the pending RFH is being used by others don't 664 // If the SiteInstance for the pending RFH is being used by others, ensure
665 // delete the RFH. Just swap it out and it can be reused at a later point. 665 // that it is replaced by a RenderFrameProxyHost to allow other frames to
666 // In --site-per-process, RenderFrameHosts are not kept around and are 666 // communicate to this frame.
667 // deleted when not used, replaced by RenderFrameProxyHosts.
668 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance(); 667 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance();
668 RenderViewHostImpl* rvh = render_frame_host->render_view_host();
669 RenderFrameProxyHost* proxy = nullptr;
669 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) { 670 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) {
670 // Any currently suspended navigations are no longer needed. 671 // Any currently suspended navigations are no longer needed.
671 render_frame_host->CancelSuspendedNavigations(); 672 render_frame_host->CancelSuspendedNavigations();
672 673
673 // If a proxy already exists for the |site_instance|, just reuse it instead 674 // If a proxy already exists for the |site_instance|, just reuse it instead
674 // of creating a new one. There is no need to call SwapOut on the 675 // of creating a new one. There is no need to call SwapOut on the
675 // |render_frame_host|, as this method is only called to discard a pending 676 // |render_frame_host|, as this method is only called to discard a pending
676 // or speculative RenderFrameHost, i.e. one that has never hosted an actual 677 // or speculative RenderFrameHost, i.e. one that has never hosted an actual
677 // document. 678 // document.
678 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(site_instance); 679 proxy = GetRenderFrameProxyHost(site_instance);
679 if (!proxy) { 680 if (!proxy)
680 proxy = CreateRenderFrameProxyHost(site_instance, 681 proxy = CreateRenderFrameProxyHost(site_instance, rvh);
681 render_frame_host->render_view_host()); 682 }
682 } 683
684 // Doing this is important in the case where the replacement proxy is created
685 // above, as the RenderViewHost will continue to exist and should be
686 // considered swapped out if it is ever reused. When there's no replacement
687 // proxy, this doesn't really matter, as the RenderViewHost will be destroyed
688 // shortly, since |render_frame_host| is its last active frame and will be
689 // deleted below. See https://crbug.com/627400.
690 if (frame_tree_node_->IsMainFrame()) {
691 rvh->set_main_frame_routing_id(MSG_ROUTING_NONE);
692 rvh->set_is_active(false);
693 rvh->set_is_swapped_out(true);
683 } 694 }
684 695
685 render_frame_host.reset(); 696 render_frame_host.reset();
697
698 // If a new RenderFrameProxyHost was created above, or if the old proxy isn't
699 // live, create the RenderFrameProxy in the renderer, so that other frames
700 // can still communicate with this frame. See https://crbug.com/653746.
701 if (proxy && !proxy->is_render_frame_proxy_live())
702 proxy->InitRenderFrameProxy();
686 } 703 }
687 704
688 bool RenderFrameHostManager::DeleteFromPendingList( 705 bool RenderFrameHostManager::DeleteFromPendingList(
689 RenderFrameHostImpl* render_frame_host) { 706 RenderFrameHostImpl* render_frame_host) {
690 for (RFHPendingDeleteList::iterator iter = pending_delete_hosts_.begin(); 707 for (RFHPendingDeleteList::iterator iter = pending_delete_hosts_.begin();
691 iter != pending_delete_hosts_.end(); 708 iter != pending_delete_hosts_.end();
692 iter++) { 709 iter++) {
693 if (iter->get() == render_frame_host) { 710 if (iter->get() == render_frame_host) {
694 pending_delete_hosts_.erase(iter); 711 pending_delete_hosts_.erase(iter);
695 return true; 712 return true;
(...skipping 2003 matching lines...) Expand 10 before | Expand all | Expand 10 after
2699 resolved_url)) { 2716 resolved_url)) {
2700 DCHECK(!dest_instance || 2717 DCHECK(!dest_instance ||
2701 dest_instance == render_frame_host_->GetSiteInstance()); 2718 dest_instance == render_frame_host_->GetSiteInstance());
2702 return false; 2719 return false;
2703 } 2720 }
2704 2721
2705 return true; 2722 return true;
2706 } 2723 }
2707 2724
2708 } // namespace content 2725 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_impl.cc ('k') | content/browser/site_per_process_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698