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

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

Issue 799593004: Don't crash while detaching a pending child frame under --site-per-process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: size_t unsigned compile fix Created 6 years 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 <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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 render_frame_delegate_(render_frame_delegate), 60 render_frame_delegate_(render_frame_delegate),
61 render_view_delegate_(render_view_delegate), 61 render_view_delegate_(render_view_delegate),
62 render_widget_delegate_(render_widget_delegate), 62 render_widget_delegate_(render_widget_delegate),
63 interstitial_page_(NULL), 63 interstitial_page_(NULL),
64 weak_factory_(this) { 64 weak_factory_(this) {
65 DCHECK(frame_tree_node_); 65 DCHECK(frame_tree_node_);
66 } 66 }
67 67
68 RenderFrameHostManager::~RenderFrameHostManager() { 68 RenderFrameHostManager::~RenderFrameHostManager() {
69 if (pending_render_frame_host_) 69 if (pending_render_frame_host_)
70 CancelPending(); 70 UnsetPendingRenderFrameHost();
71 71
72 // We should always have a current RenderFrameHost except in some tests. 72 // We should always have a current RenderFrameHost except in some tests.
73 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); 73 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>());
74 74
75 // Delete any swapped out RenderFrameHosts. 75 // Delete any swapped out RenderFrameHosts.
76 STLDeleteValues(&proxy_hosts_); 76 STLDeleteValues(&proxy_hosts_);
77 } 77 }
78 78
79 void RenderFrameHostManager::Init(BrowserContext* browser_context, 79 void RenderFrameHostManager::Init(BrowserContext* browser_context,
80 SiteInstance* site_instance, 80 SiteInstance* site_instance,
(...skipping 1503 matching lines...) Expand 10 before | Expand all | Expand 10 after
1584 new ViewMsg_EnableViewSourceMode( 1584 new ViewMsg_EnableViewSourceMode(
1585 render_frame_host_->render_view_host()->GetRoutingID())); 1585 render_frame_host_->render_view_host()->GetRoutingID()));
1586 } 1586 }
1587 1587
1588 return render_frame_host_.get(); 1588 return render_frame_host_.get();
1589 } 1589 }
1590 1590
1591 void RenderFrameHostManager::CancelPending() { 1591 void RenderFrameHostManager::CancelPending() {
1592 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending", 1592 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending",
1593 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); 1593 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
1594 DiscardUnusedFrame(UnsetPendingRenderFrameHost());
1595 }
1596
1597 scoped_ptr<RenderFrameHostImpl>
1598 RenderFrameHostManager::UnsetPendingRenderFrameHost() {
1594 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = 1599 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host =
1595 pending_render_frame_host_.Pass(); 1600 pending_render_frame_host_.Pass();
1596 1601
1597 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( 1602 RenderViewDevToolsAgentHost::OnCancelPendingNavigation(
1598 pending_render_frame_host->render_view_host(), 1603 pending_render_frame_host->render_view_host(),
1599 render_frame_host_->render_view_host()); 1604 render_frame_host_->render_view_host());
1600 1605
1601 // We no longer need to prevent the process from exiting. 1606 // We no longer need to prevent the process from exiting.
1602 pending_render_frame_host->GetProcess()->RemovePendingView(); 1607 pending_render_frame_host->GetProcess()->RemovePendingView();
1603 1608
1604 DiscardUnusedFrame(pending_render_frame_host.Pass());
1605
1606 pending_web_ui_.reset(); 1609 pending_web_ui_.reset();
1607 pending_and_current_web_ui_.reset(); 1610 pending_and_current_web_ui_.reset();
1611
1612 return pending_render_frame_host.Pass();
1608 } 1613 }
1609 1614
1610 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( 1615 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost(
1611 scoped_ptr<RenderFrameHostImpl> render_frame_host) { 1616 scoped_ptr<RenderFrameHostImpl> render_frame_host) {
1612 // Swap the two. 1617 // Swap the two.
1613 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = 1618 scoped_ptr<RenderFrameHostImpl> old_render_frame_host =
1614 render_frame_host_.Pass(); 1619 render_frame_host_.Pass();
1615 render_frame_host_ = render_frame_host.Pass(); 1620 render_frame_host_ = render_frame_host.Pass();
1616 1621
1617 if (frame_tree_node_->IsMainFrame()) { 1622 if (frame_tree_node_->IsMainFrame()) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1679 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 1684 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
1680 SiteInstance* instance) { 1685 SiteInstance* instance) {
1681 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 1686 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
1682 if (iter != proxy_hosts_.end()) { 1687 if (iter != proxy_hosts_.end()) {
1683 delete iter->second; 1688 delete iter->second;
1684 proxy_hosts_.erase(iter); 1689 proxy_hosts_.erase(iter);
1685 } 1690 }
1686 } 1691 }
1687 1692
1688 } // namespace content 1693 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698