| 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)
|
|
|