 +          body, params->user_gesture, params->opener_suppressed,
 +          &no_javascript_access);
  
-   mojom::CreateNewWindowReplyPtr reply = mojom::CreateNewWindowReply::New();
    if (!can_create_window) {
+     std::move(callback).Run(mojom::CreateNewWindowStatus::kIgnore, nullptr);
 diff --git a/content/common/frame.mojom b/content/common/frame.mojom
-index 613037782fd5..e2ec468a8e36 100644
+index e5fbf20747e0..f0d8af2f119b 100644
 --- a/content/common/frame.mojom
 +++ b/content/common/frame.mojom
-@@ -5,6 +5,8 @@
- module content.mojom;
- 
+@@ -9,6 +9,8 @@ import "content/common/service_worker/controller_service_worker.mojom";
+ import "content/common/url_loader_factory_bundle.mojom";
+ import "content/public/common/resource_type.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);
+ import "mojo/common/unguessable_token.mojom";
+ import "mojo/public/mojom/base/string16.mojom";
+ import "services/network/public/mojom/url_loader.mojom";
+@@ -146,6 +148,24 @@ interface FrameFactory {
+   CreateFrame(int32 frame_routing_id, Frame& frame);
  };
  
 +struct DataElement {

+      content::mojom::DataElementPtr ptr = content::mojom::DataElement::New();
+      ptr->type = element.type();
+      switch (element.type()) {
+        case storage::DataElement::TYPE_BYTES: {
+          ptr->bytes = std::string(element.bytes(), element.length());
+          break;
+        }
+        case storage::DataElement::TYPE_BYTES_DESCRIPTION: {
+          ptr->length = element.length();
+          break;
+        }
+        case storage::DataElement::TYPE_FILE: {
+          ptr->path = element.path();
+          ptr->offset = element.offset();
+          ptr->length = element.length();
+          ptr->expected_modification_time = element.expected_modification_time();
+          break;
+        }
+        case storage::DataElement::TYPE_FILE_FILESYSTEM: {
+          ptr->filesystem_url = element.filesystem_url();
+          ptr->offset = element.offset();
+          ptr->length = element.length();
+          ptr->expected_modification_time = element.expected_modification_time();
+          break;
+        }
+        case storage::DataElement::TYPE_BLOB: {
+          ptr->blob_uuid = element.blob_uuid();
+          ptr->offset = element.offset();
+          ptr->length = element.length();
+          break;
+        }
+        case storage::DataElement::TYPE_DISK_CACHE_ENTRY: {
+          NOTREACHED() << "Can't be sent by IPC.";
+          break;
+        }
+        case storage::DataElement::TYPE_UNKNOWN: {
+          NOTREACHED();
+          break;
+        }
+      }
+      params->body->elements.push_back(std::move(ptr));
+    }

diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 25841d376bcd..df41213f4c49 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -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<network::ResourceRequestBody> body;
+  if (params->body->has_object) {
+    body = new network::ResourceRequestBody;
+    std::vector<network::DataElement> elements;
+    for (const auto& iter : params->body->elements) {
+      network::DataElement element;
+      switch (iter->type) {
+        case network::DataElement::TYPE_BYTES: {
+          element.SetToBytes(iter->bytes.data(), iter->bytes.length());
+          break;
+        }
+        case network::DataElement::TYPE_FILE: {
+          element.SetToFilePathRange(iter->path, iter->offset, iter->length,
+                                     iter->expected_modification_time);
+          break;
+        }
+        case network::DataElement::TYPE_BLOB: {
+          element.SetToBlobRange(iter->blob_uuid, iter->offset, iter->length);
+          break;
+        }
+        case network::DataElement::TYPE_DATA_PIPE:
+        default:
+          NOTREACHED();
+          break;
+      }
+      elements.push_back(std::move(element));
+    }
