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 72dcc54196c110723416dacfaa8dc14141c6723a..6dc0975551ca02479dd2347fd38c778161224777 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -143,8 +143,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( |
@@ -152,13 +152,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), |
@@ -167,6 +166,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); |
@@ -274,7 +275,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); |
} |
@@ -428,6 +432,29 @@ void RenderFrameHostImpl::AccessibilityFatalError() { |
browser_accessibility_manager_.reset(NULL); |
} |
+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()); |
+ |
+ 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_); |
} |
@@ -639,8 +666,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); |
@@ -707,6 +736,7 @@ void RenderFrameHostImpl::OnBeforeUnloadACK( |
} |
void RenderFrameHostImpl::OnSwapOutACK() { |
+ has_received_swap_out_ack_ = true; |
OnSwappedOut(false); |
} |
@@ -849,7 +879,6 @@ void RenderFrameHostImpl::OnUpdateEncoding(const std::string& encoding_name) { |
delegate_->UpdateEncoding(this, encoding_name); |
} |
- |
void RenderFrameHostImpl::OnBeginNavigation( |
const FrameHostMsg_BeginNavigation_Params& params) { |
#if defined(USE_BROWSER_SIDE_NAVIGATION) |