 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));
 +    }

+  ResourceRequestBody body;
 };
 
 struct CreateNewWindowReply {
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 5c2ab72ff537..3e7c25009c6a 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -298,6 +298,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<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 61c108c53b92..d475ea55b085 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -134,6 +134,7 @@ class RenderFrameHost;
 class RenderProcessHost;
 class RenderViewHost;
 class ResourceContext;
+class ResourceRequestBody;
 class SiteInstance;
 class SpeechRecognitionManagerDelegate;
 class StoragePartition;
@@ -577,6 +578,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<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 22bd13a28fb7..f7e688d9fda6 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -45,6 +45,7 @@
 #include "content/child/appcache/web_application_cache_host_impl.h"
 #include "content/child/request_extra_data.h"
 #include "content/child/v8_value_converter_impl.h"
+#include "content/child/web_url_request_util.h"
 #include "content/common/content_constants_internal.h"
 #include "content/common/content_switches_internal.h"
 #include "content/common/dom_storage/dom_storage_types.h"
@@ -1439,6 +1440,59 @@ WebView* RenderViewImpl::CreateView(WebLocalFrame* creator,
   }
   params->features = ConvertWebWindowFeaturesToMojoWindowFeatures(features);
 

 struct CreateNewWindowParams {
   // True if this open request came in the context of a user gesture.
   bool user_gesture;
@@ -182,6 +202,10 @@ struct CreateNewWindowParams {
 
   // The window features to use for the new window.
   blink.mojom.WindowFeatures features;
