 diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
-index 1bf37e107a90..82ab04e1019d 100644
+index 25841d376bcd..df41213f4c49 100644
 --- a/content/browser/frame_host/render_frame_host_impl.cc
 +++ b/content/browser/frame_host/render_frame_host_impl.cc
-@@ -2716,6 +2719,48 @@ void RenderFrameHostImpl::CreateNewWindow(
+@@ -2874,6 +2874,38 @@ void RenderFrameHostImpl::CreateNewWindow(
                 "frame_tree_node", frame_tree_node_->frame_tree_node_id(), "url",
                 params->target_url.possibly_invalid_spec());
  
-+  scoped_refptr<ResourceRequestBody> body;
++  scoped_refptr<network::ResourceRequestBody> body;
 +  if (params->body->has_object) {
-+    body = new ResourceRequestBody;
-+    std::vector<storage::DataElement> elements;
++    body = new network::ResourceRequestBody;
++    std::vector<network::DataElement> elements;
 +    for (const auto& iter : params->body->elements) {
-+      storage::DataElement element;
++      network::DataElement element;
 +      switch (iter->type) {
-+        case storage::DataElement::TYPE_BYTES: {
++        case network::DataElement::TYPE_BYTES: {
 +          element.SetToBytes(iter->bytes.data(), iter->bytes.length());
 +          break;
 +        }
-+        case storage::DataElement::TYPE_BYTES_DESCRIPTION: {
-+          element.SetToBytesDescription(iter->length);
-+          break;
-+        }
-+        case storage::DataElement::TYPE_FILE: {
++        case network::DataElement::TYPE_FILE: {
 +          element.SetToFilePathRange(iter->path, iter->offset, iter->length,
 +                                     iter->expected_modification_time);
 +          break;
 +        }
-+        case storage::DataElement::TYPE_FILE_FILESYSTEM: {
-+          element.SetToFileSystemUrlRange(iter->filesystem_url,
-+                                          iter->offset, iter->length,
-+                                          iter->expected_modification_time);
-+          break;
-+        }
-+        case storage::DataElement::TYPE_BLOB: {
++        case network::DataElement::TYPE_BLOB: {
 +          element.SetToBlobRange(iter->blob_uuid, iter->offset, iter->length);
 +          break;
 +        }
-+        default: {
++        case network::DataElement::TYPE_DATA_PIPE:
++        default:
 +          NOTREACHED();
 +          break;
-+        }
 +      }
 +      elements.push_back(std::move(element));
 +    }

+          body, params->user_gesture, params->opener_suppressed,
+          &no_javascript_access);
 
   mojom::CreateNewWindowReplyPtr reply = mojom::CreateNewWindowReply::New();
   if (!can_create_window) {
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index 613037782fd5..e2ec468a8e36 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -5,6 +5,8 @@
 module content.mojom;
 
 import "content/public/common/window_container_type.mojom";
+import "mojo/common/file_path.mojom";
+import "mojo/common/time.mojom";
 import "services/service_manager/public/interfaces/interface_provider.mojom";
 import "third_party/WebKit/public/platform/referrer.mojom";
 import "third_party/WebKit/public/web/window_features.mojom";
@@ -41,6 +43,24 @@ interface FrameFactory {
   CreateFrame(int32 frame_routing_id, Frame& frame, FrameHostInterfaceBroker host);
 };
 
+struct DataElement {

+  ResourceRequestBody body;
 };
 
 // Operation result when the renderer asks the browser to create a new window.
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 37e2d88e28e9..6c366435ddd8 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -382,6 +382,8 @@ bool ContentBrowserClient::CanCreateWindow(
     const std::string& frame_name,
     WindowOpenDisposition disposition,
     const blink::mojom::WindowFeatures& features,
+    const std::vector<std::string>& additional_features,
+    const scoped_refptr<network::ResourceRequestBody>& body,
     bool user_gesture,
     bool opener_suppressed,
     bool* no_javascript_access) {
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 5373ee07b5cd..746760e8596c 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -150,6 +150,7 @@ class RenderProcessHost;
 class RenderViewHost;
 class ResourceContext;
 class ResourceDispatcherHostLoginDelegate;
+class ResourceRequestBody;
 class SiteInstance;
 class SpeechRecognitionManagerDelegate;
 class StoragePartition;
@@ -625,6 +626,8 @@ class CONTENT_EXPORT ContentBrowserClient {
       const std::string& frame_name,
       WindowOpenDisposition disposition,
       const blink::mojom::WindowFeatures& features,
+      const std::vector<std::string>& additional_features,
+      const scoped_refptr<network::ResourceRequestBody>& body,
       bool user_gesture,
       bool opener_suppressed,
       bool* no_javascript_access);
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index a9b91cdcc86d..4168990971e4 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -80,6 +80,7 @@
 #include "content/renderer/input/input_handler_manager.h"
 #include "content/renderer/internal_document_state_data.h"
 #include "content/renderer/loader/request_extra_data.h"
+#include "content/renderer/loader/web_url_request_util.h"
 #include "content/renderer/media/audio_device_factory.h"
 #include "content/renderer/media/stream/media_stream_device_observer.h"
 #include "content/renderer/media/video_capture_impl_manager.h"
@@ -1285,6 +1286,45 @@ WebView* RenderViewImpl::CreateView(WebLocalFrame* creator,
   }
   params->features = ConvertWebWindowFeaturesToMojoWindowFeatures(features);
 
