diff --git web_contents_impl.cc web_contents_impl.cc
index 7754791..8aebfcd 100644
--- web_contents_impl.cc
+++ web_contents_impl.cc
@@ -1498,6 +1498,12 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
   std::string unique_name = params.main_frame_name;
   frame_tree_.root()->SetFrameName(params.main_frame_name, unique_name);
 
+  if (params.view && params.delegate_view) {
+    view_.reset(params.view);
+    render_view_host_delegate_view_ = params.delegate_view;
+  }
+
+  if (!view_) {
   WebContentsViewDelegate* delegate =
       GetContentClient()->browser()->GetWebContentsViewDelegate(this);
 
@@ -1530,6 +1536,7 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) {
                                          std::move(view_),
                                          &render_view_host_delegate_view_));
   }
+  }
   CHECK(render_view_host_delegate_view_);
   CHECK(view_.get());
 
@@ -1973,11 +1980,14 @@ void WebContentsImpl::CreateNewWindow(
       static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace);
   CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context));
 
+  content::WebContentsView* view = NULL;
+  content::RenderViewHostDelegateView* delegate_view = NULL;
+
   if (delegate_ &&
       !delegate_->ShouldCreateWebContents(
           this, route_id, main_frame_route_id, main_frame_widget_route_id,
           params.window_container_type, params.frame_name, params.target_url,
-          partition_id, session_storage_namespace)) {
+          partition_id, session_storage_namespace, &view, &delegate_view)) {
     if (route_id != MSG_ROUTING_NONE &&
         !RenderViewHost::FromID(render_process_id, route_id)) {
       // If the embedder didn't create a WebContents for this route, we need to
@@ -2001,6 +2011,8 @@ void WebContentsImpl::CreateNewWindow(
   create_params.opener_render_process_id = render_process_id;
   create_params.opener_render_frame_id = params.opener_render_frame_id;
   create_params.opener_suppressed = params.opener_suppressed;
+  create_params.view = view;
+  create_params.delegate_view = delegate_view;
   if (params.disposition == NEW_BACKGROUND_TAB)
     create_params.initially_hidden = true;
   create_params.renderer_initiated_creation =