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

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

Issue 1150793002: Add ref-count on RenderViewHost for each new RenderFrameProxyHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_proxy_host.h" 5 #include "content/browser/frame_host/render_frame_proxy_host.h"
6 6
7 #include "base/lazy_instance.h" 7 #include "base/lazy_instance.h"
8 #include "content/browser/bad_message.h" 8 #include "content/browser/bad_message.h"
9 #include "content/browser/frame_host/cross_process_frame_connector.h" 9 #include "content/browser/frame_host/cross_process_frame_connector.h"
10 #include "content/browser/frame_host/frame_tree.h" 10 #include "content/browser/frame_host/frame_tree.h"
(...skipping 26 matching lines...) Expand all
37 RenderFrameProxyHost* RenderFrameProxyHost::FromID(int process_id, 37 RenderFrameProxyHost* RenderFrameProxyHost::FromID(int process_id,
38 int routing_id) { 38 int routing_id) {
39 DCHECK_CURRENTLY_ON(BrowserThread::UI); 39 DCHECK_CURRENTLY_ON(BrowserThread::UI);
40 RoutingIDFrameProxyMap* frames = g_routing_id_frame_proxy_map.Pointer(); 40 RoutingIDFrameProxyMap* frames = g_routing_id_frame_proxy_map.Pointer();
41 RoutingIDFrameProxyMap::iterator it = frames->find( 41 RoutingIDFrameProxyMap::iterator it = frames->find(
42 RenderFrameProxyHostID(process_id, routing_id)); 42 RenderFrameProxyHostID(process_id, routing_id));
43 return it == frames->end() ? NULL : it->second; 43 return it == frames->end() ? NULL : it->second;
44 } 44 }
45 45
46 RenderFrameProxyHost::RenderFrameProxyHost(SiteInstance* site_instance, 46 RenderFrameProxyHost::RenderFrameProxyHost(SiteInstance* site_instance,
47 RenderViewHostImpl* render_view_host,
47 FrameTreeNode* frame_tree_node) 48 FrameTreeNode* frame_tree_node)
48 : routing_id_(site_instance->GetProcess()->GetNextRoutingID()), 49 : routing_id_(site_instance->GetProcess()->GetNextRoutingID()),
49 site_instance_(site_instance), 50 site_instance_(site_instance),
50 process_(site_instance->GetProcess()), 51 process_(site_instance->GetProcess()),
51 frame_tree_node_(frame_tree_node), 52 frame_tree_node_(frame_tree_node),
52 render_frame_proxy_created_(false) { 53 render_frame_proxy_created_(false),
54 render_view_host_(render_view_host) {
53 GetProcess()->AddRoute(routing_id_, this); 55 GetProcess()->AddRoute(routing_id_, this);
54 CHECK(g_routing_id_frame_proxy_map.Get().insert( 56 CHECK(g_routing_id_frame_proxy_map.Get().insert(
55 std::make_pair( 57 std::make_pair(
56 RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_), 58 RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_),
57 this)).second); 59 this)).second);
60 frame_tree_node_->frame_tree()->RegisterRenderViewHost(render_view_host_);
Charlie Reis 2015/05/20 23:05:00 Should we check that render_view_host is non-null,
nasko 2015/05/21 16:22:12 I can add a CHECK if you'd prefer, but we shouldn'
Charlie Reis 2015/05/21 18:48:16 Yeah, let's put a CHECK here. I'd like to know if
nasko 2015/05/21 21:37:07 Done.
58 61
59 if (!frame_tree_node_->IsMainFrame() && 62 if (!frame_tree_node_->IsMainFrame() &&
60 frame_tree_node_->parent() 63 frame_tree_node_->parent()
61 ->render_manager() 64 ->render_manager()
62 ->current_frame_host() 65 ->current_frame_host()
63 ->GetSiteInstance() == site_instance) { 66 ->GetSiteInstance() == site_instance) {
64 // The RenderFrameHost navigating cross-process is destroyed and a proxy for 67 // The RenderFrameHost navigating cross-process is destroyed and a proxy for
65 // it is created in the parent's process. CrossProcessFrameConnector 68 // it is created in the parent's process. CrossProcessFrameConnector
66 // initialization only needs to happen on an initial cross-process 69 // initialization only needs to happen on an initial cross-process
67 // navigation, when the RenderFrameHost leaves the same process as its 70 // navigation, when the RenderFrameHost leaves the same process as its
68 // parent. The same CrossProcessFrameConnector is used for subsequent cross- 71 // parent. The same CrossProcessFrameConnector is used for subsequent cross-
69 // process navigations, but it will be destroyed if the frame is 72 // process navigations, but it will be destroyed if the frame is
70 // navigated back to the same SiteInstance as its parent. 73 // navigated back to the same SiteInstance as its parent.
71 cross_process_frame_connector_.reset(new CrossProcessFrameConnector(this)); 74 cross_process_frame_connector_.reset(new CrossProcessFrameConnector(this));
72 } 75 }
73 } 76 }
74 77
75 RenderFrameProxyHost::~RenderFrameProxyHost() { 78 RenderFrameProxyHost::~RenderFrameProxyHost() {
76 if (GetProcess()->HasConnection()) { 79 if (GetProcess()->HasConnection()) {
77 // TODO(nasko): For now, don't send this IPC for top-level frames, as 80 // TODO(nasko): For now, don't send this IPC for top-level frames, as
78 // the top-level RenderFrame will delete the RenderFrameProxy. 81 // the top-level RenderFrame will delete the RenderFrameProxy.
79 // This can be removed once we don't have a swapped out state on 82 // This can be removed once we don't have a swapped out state on
80 // RenderFrame. See https://crbug.com/357747 83 // RenderFrame. See https://crbug.com/357747
81 if (!frame_tree_node_->IsMainFrame()) 84 if (!frame_tree_node_->IsMainFrame())
82 Send(new FrameMsg_DeleteProxy(routing_id_)); 85 Send(new FrameMsg_DeleteProxy(routing_id_));
83 } 86 }
84 87
88 frame_tree_node_->frame_tree()->UnregisterRenderViewHost(render_view_host_);
85 GetProcess()->RemoveRoute(routing_id_); 89 GetProcess()->RemoveRoute(routing_id_);
86 g_routing_id_frame_proxy_map.Get().erase( 90 g_routing_id_frame_proxy_map.Get().erase(
87 RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_)); 91 RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_));
88 } 92 }
89 93
90 void RenderFrameProxyHost::SetChildRWHView(RenderWidgetHostView* view) { 94 void RenderFrameProxyHost::SetChildRWHView(RenderWidgetHostView* view) {
91 cross_process_frame_connector_->set_view( 95 cross_process_frame_connector_->set_view(
92 static_cast<RenderWidgetHostViewChildFrame*>(view)); 96 static_cast<RenderWidgetHostViewChildFrame*>(view));
93 } 97 }
94 98
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 base::Bind(&MessagePortMessageFilter::RouteMessageEventWithMessagePorts, 272 base::Bind(&MessagePortMessageFilter::RouteMessageEventWithMessagePorts,
269 message_port_message_filter, target_rfh->GetRoutingID(), 273 message_port_message_filter, target_rfh->GetRoutingID(),
270 new_params)); 274 new_params));
271 } else { 275 } else {
272 target_rfh->Send( 276 target_rfh->Send(
273 new FrameMsg_PostMessageEvent(target_rfh->GetRoutingID(), new_params)); 277 new FrameMsg_PostMessageEvent(target_rfh->GetRoutingID(), new_params));
274 } 278 }
275 } 279 }
276 280
277 } // namespace content 281 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698