Chromium Code Reviews| Index: content/browser/frame_host/render_frame_host_impl.cc |
| diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
| index 7e017ee531a34972b3d66a9fe2a053cabe0c95a1..46c248b3959921692f65525390e4f3f3baa17ce7 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -135,8 +135,8 @@ RenderFrameHost* RenderFrameHost::FromID(int render_process_id, |
| } |
| // static |
| -RenderFrameHostImpl* RenderFrameHostImpl::FromID( |
| - int process_id, int routing_id) { |
| +RenderFrameHostImpl* RenderFrameHostImpl::FromID(int process_id, |
| + int routing_id) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer(); |
| RoutingIDFrameMap::iterator it = frames->find( |
| @@ -144,13 +144,12 @@ RenderFrameHostImpl* RenderFrameHostImpl::FromID( |
| return it == frames->end() ? NULL : it->second; |
| } |
| -RenderFrameHostImpl::RenderFrameHostImpl( |
| - RenderViewHostImpl* render_view_host, |
| - RenderFrameHostDelegate* delegate, |
| - FrameTree* frame_tree, |
| - FrameTreeNode* frame_tree_node, |
| - int routing_id, |
| - bool is_swapped_out) |
| +RenderFrameHostImpl::RenderFrameHostImpl(RenderViewHostImpl* render_view_host, |
| + RenderFrameHostDelegate* delegate, |
| + FrameTree* frame_tree, |
| + FrameTreeNode* frame_tree_node, |
| + int routing_id, |
| + bool is_swapped_out) |
| : render_view_host_(render_view_host), |
| delegate_(delegate), |
| cross_process_frame_connector_(NULL), |
| @@ -159,6 +158,8 @@ RenderFrameHostImpl::RenderFrameHostImpl( |
| frame_tree_node_(frame_tree_node), |
| routing_id_(routing_id), |
| is_swapped_out_(is_swapped_out), |
| + renderer_initialized_(false), |
| + has_received_swap_out_ack_(false), |
| weak_ptr_factory_(this) { |
| frame_tree_->RegisterRenderFrameHost(this); |
| GetProcess()->AddRoute(routing_id_, this); |
| @@ -266,7 +267,10 @@ bool RenderFrameHostImpl::Send(IPC::Message* message) { |
| make_scoped_ptr(message)); |
| } |
| - if (render_view_host_->IsSwappedOut()) { |
| + // Route IPCs through the RenderFrameProxyHost when in swapped out state. |
| + // Note: For subframes in --site-per-process mode, we don't use swapped out |
| + // RenderFrameHosts. |
| + if (frame_tree_node_->IsMainFrame() && render_view_host_->IsSwappedOut()) { |
| DCHECK(render_frame_proxy_host_); |
| return render_frame_proxy_host_->Send(message); |
| } |
| @@ -351,6 +355,30 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { |
| return handled; |
| } |
| +bool RenderFrameHostImpl::CreateRenderFrame(int parent_routing_id) { |
| + TRACE_EVENT0("frame_host", "RenderFrameHostImpl::CreateRenderFrame"); |
| + DCHECK(!IsRenderFrameLive()) << "Creating frame twice"; |
| + |
| + // The process may (if we're sharing a process with another host that already |
| + // initialized it) or may not (we have our own process or the old process |
| + // crashed) have been initialized. Calling Init multiple times will be |
| + // ignored, so this is safe. |
| + if (!GetProcess()->Init()) |
| + return false; |
| + |
| + DCHECK(GetProcess()->HasConnection()); |
| + DCHECK(GetProcess()->GetBrowserContext()); |
|
ncarter (slow)
2014/07/21 20:31:56
This doesn't look like a particularly useful DCHEC
kenrb
2014/07/24 17:53:53
Removed.
|
| + |
| + renderer_initialized_ = true; |
| + Send(new FrameMsg_NewFrame(routing_id_, parent_routing_id)); |
| + |
| + return true; |
| +} |
| + |
| +bool RenderFrameHostImpl::IsRenderFrameLive() { |
| + return GetProcess()->HasConnection() && renderer_initialized_; |
| +} |
| + |
| void RenderFrameHostImpl::Init() { |
| GetProcess()->ResumeRequestsForView(routing_id_); |
| } |
| @@ -562,8 +590,10 @@ void RenderFrameHostImpl::SwapOut(RenderFrameProxyHost* proxy) { |
| set_render_frame_proxy_host(proxy); |
| - if (render_view_host_->IsRenderViewLive()) |
| + if (render_view_host_->IsRenderViewLive()) { |
| + has_received_swap_out_ack_ = false; |
| Send(new FrameMsg_SwapOut(routing_id_, proxy->GetRoutingID())); |
| + } |
| if (!GetParent()) |
| delegate_->SwappedOut(this); |
| @@ -630,6 +660,7 @@ void RenderFrameHostImpl::OnBeforeUnloadACK( |
| } |
| void RenderFrameHostImpl::OnSwapOutACK() { |
| + has_received_swap_out_ack_ = true; |
| OnSwappedOut(false); |
| } |