| Index: content/renderer/render_view_impl.cc | 
| diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc | 
| index 53ba225f7281ccaee4461a09ec72ed48764a1fe4..1c4f80986a415dd37d513d931e8b88a2641d3019 100644 | 
| --- a/content/renderer/render_view_impl.cc | 
| +++ b/content/renderer/render_view_impl.cc | 
| @@ -638,6 +638,7 @@ RenderViewImpl::RenderViewImpl(const ViewMsg_New_Params& params) | 
| top_controls_constraints_(TOP_CONTROLS_STATE_BOTH), | 
| #endif | 
| has_scrolled_focused_editable_node_into_rect_(false), | 
| +      main_render_frame_(nullptr), | 
| speech_recognition_dispatcher_(NULL), | 
| mouse_lock_dispatcher_(NULL), | 
| #if defined(OS_ANDROID) | 
| @@ -668,24 +669,58 @@ void RenderViewImpl::Initialize(const ViewMsg_New_Params& params, | 
| // Ensure we start with a valid next_page_id_ from the browser. | 
| DCHECK_GE(next_page_id_, 0); | 
|  | 
| -  main_render_frame_ = RenderFrameImpl::Create( | 
| -      this, params.main_frame_routing_id); | 
| -  // The main frame WebLocalFrame object is closed by | 
| -  // RenderFrameImpl::frameDetached(). | 
| -  WebLocalFrame* web_frame = WebLocalFrame::create( | 
| -      blink::WebTreeScopeType::Document, main_render_frame_); | 
| -  main_render_frame_->SetWebFrame(web_frame); | 
| +  if (params.main_frame_routing_id != MSG_ROUTING_NONE) { | 
| +    main_render_frame_ = RenderFrameImpl::Create( | 
| +        this, params.main_frame_routing_id); | 
| +    // The main frame WebLocalFrame object is closed by | 
| +    // RenderFrameImpl::frameDetached(). | 
| +    WebLocalFrame* web_frame = WebLocalFrame::create( | 
| +        blink::WebTreeScopeType::Document, main_render_frame_); | 
| +    main_render_frame_->SetWebFrame(web_frame); | 
| +  } | 
|  | 
| compositor_deps_ = compositor_deps; | 
| webwidget_ = WebView::create(this); | 
| webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_)); | 
|  | 
| +  g_view_map.Get().insert(std::make_pair(webview(), this)); | 
| +  g_routing_id_view_map.Get().insert(std::make_pair(routing_id_, this)); | 
| + | 
| const base::CommandLine& command_line = | 
| *base::CommandLine::ForCurrentProcess(); | 
|  | 
| if (command_line.HasSwitch(switches::kStatsCollectionController)) | 
| stats_collection_observer_.reset(new StatsCollectionObserver(this)); | 
|  | 
| +  RenderFrameProxy* proxy = NULL; | 
| +  if (params.proxy_routing_id != MSG_ROUTING_NONE) { | 
| +    CHECK(params.swapped_out); | 
| +    if (main_render_frame_) { | 
| +      proxy = RenderFrameProxy::CreateProxyToReplaceFrame( | 
| +          main_render_frame_, params.proxy_routing_id, | 
| +          blink::WebTreeScopeType::Document); | 
| +      main_render_frame_->set_render_frame_proxy(proxy); | 
| +    } else { | 
| +      proxy = RenderFrameProxy::CreateFrameProxy( | 
| +          params.proxy_routing_id, | 
| +          MSG_ROUTING_NONE, | 
| +          routing_id_, | 
| +          params.replicated_frame_state); | 
| +    } | 
| +  } | 
| + | 
| +  // In --site-per-process, just use the WebRemoteFrame as the main frame. | 
| +  if (command_line.HasSwitch(switches::kSitePerProcess) && proxy) { | 
| +    webview()->setMainFrame(proxy->web_frame()); | 
| +    // Initialize the WebRemoteFrame with information replicated from the | 
| +    // browser process. | 
| +    proxy->SetReplicatedState(params.replicated_frame_state); | 
| +  } else { | 
| +    webview()->setMainFrame(main_render_frame_->GetWebFrame()); | 
| +  } | 
| +  if (main_render_frame_) | 
| +    main_render_frame_->Initialize(); | 
| + | 
| #if defined(OS_ANDROID) | 
| content_detectors_.push_back(linked_ptr<ContentDetector>( | 
| new AddressDetector())); | 
| @@ -717,8 +752,6 @@ void RenderViewImpl::Initialize(const ViewMsg_New_Params& params, | 
| CompleteInit(); | 
| } | 
|  | 
| -  g_view_map.Get().insert(std::make_pair(webview(), this)); | 
| -  g_routing_id_view_map.Get().insert(std::make_pair(routing_id_, this)); | 
| webview()->setDeviceScaleFactor(device_scale_factor_); | 
| webview()->setDisplayMode(display_mode_); | 
| webview()->settings()->setPreferCompositingToLCDTextEnabled( | 
| @@ -730,26 +763,6 @@ void RenderViewImpl::Initialize(const ViewMsg_New_Params& params, | 
|  | 
| ApplyWebPreferences(webkit_preferences_, webview()); | 
|  | 
| -  RenderFrameProxy* proxy = NULL; | 
| -  if (params.proxy_routing_id != MSG_ROUTING_NONE) { | 
| -    CHECK(params.swapped_out); | 
| -    proxy = RenderFrameProxy::CreateProxyToReplaceFrame( | 
| -        main_render_frame_, params.proxy_routing_id, | 
| -        blink::WebTreeScopeType::Document); | 
| -    main_render_frame_->set_render_frame_proxy(proxy); | 
| -  } | 
| - | 
| -  // In --site-per-process, just use the WebRemoteFrame as the main frame. | 
| -  if (command_line.HasSwitch(switches::kSitePerProcess) && proxy) { | 
| -    webview()->setMainFrame(proxy->web_frame()); | 
| -    // Initialize the WebRemoteFrame with information replicated from the | 
| -    // browser process. | 
| -    proxy->SetReplicatedState(params.replicated_frame_state); | 
| -  } else { | 
| -    webview()->setMainFrame(main_render_frame_->GetWebFrame()); | 
| -  } | 
| -  main_render_frame_->Initialize(); | 
| - | 
| if (switches::IsTouchDragDropEnabled()) | 
| webview()->settings()->setTouchDragDropEnabled(true); | 
|  | 
|  |