Index: content/browser/frame_host/navigation_request.cc |
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc |
index 1139604533b8c68a1d9239703294f9edc0664e5f..8f75d4a0ec46e5585ac335e3b309bcab4bf2df53 100644 |
--- a/content/browser/frame_host/navigation_request.cc |
+++ b/content/browser/frame_host/navigation_request.cc |
@@ -80,20 +80,23 @@ std::unique_ptr<NavigationRequest> NavigationRequest::CreateBrowserInitiated( |
headers.SetHeaderIfMissing(net::HttpRequestHeaders::kUserAgent, |
GetContentClient()->GetUserAgent()); |
- // Fill POST data from the browser in the request body. |
+ // Fill POST data in the request body. |
scoped_refptr<ResourceRequestBody> request_body; |
- if (entry.GetHasPostData()) { |
- request_body = new ResourceRequestBody(); |
- request_body->AppendBytes( |
- reinterpret_cast<const char *>( |
- entry.GetBrowserInitiatedPostData()->front()), |
- entry.GetBrowserInitiatedPostData()->size()); |
+ if (frame_entry.method() == "POST") { |
+ request_body = frame_entry.GetPostData(); |
+ if (!request_body && entry.GetBrowserInitiatedPostData()) { |
+ request_body = new ResourceRequestBody(); |
+ request_body->AppendBytes( |
+ reinterpret_cast<const char*>( |
+ entry.GetBrowserInitiatedPostData()->front()), |
+ entry.GetBrowserInitiatedPostData()->size()); |
+ } |
} |
std::unique_ptr<NavigationRequest> navigation_request(new NavigationRequest( |
frame_tree_node, entry.ConstructCommonNavigationParams( |
- dest_url, dest_referrer, navigation_type, lofi_state, |
- navigation_start), |
+ frame_entry, dest_url, dest_referrer, |
+ navigation_type, lofi_state, navigation_start), |
BeginNavigationParams(headers.ToString(), |
LoadFlagFromNavigationType(navigation_type), |
false, // has_user_gestures |
@@ -194,6 +197,9 @@ NavigationRequest::NavigationRequest( |
common_params, begin_params, first_party_for_cookies, |
frame_tree_node->current_origin(), frame_tree_node->IsMainFrame(), |
parent_is_main_frame, frame_tree_node->frame_tree_node_id(), body)); |
+ |
+ if (body) |
+ post_data_ = body->MakeCopy(); |
} |
NavigationRequest::~NavigationRequest() { |
@@ -226,7 +232,7 @@ void NavigationRequest::BeginNavigation() { |
// Select an appropriate RenderFrameHost. |
RenderFrameHostImpl* render_frame_host = |
- frame_tree_node_->render_manager()->GetFrameHostForNavigation(*this); |
+ frame_tree_node_->render_manager()->GetFrameHostForNavigation(this, true); |
NavigatorImpl::CheckWebUIRendererDoesNotDisplayNormalURL(render_frame_host, |
common_params_.url); |
@@ -251,6 +257,10 @@ void NavigationRequest::TransferNavigationHandleOwnership( |
render_frame_host->SetNavigationHandle(std::move(navigation_handle_)); |
} |
+void NavigationRequest::ResetPostData() { |
+ post_data_ = nullptr; |
+} |
+ |
void NavigationRequest::OnRequestRedirected( |
const net::RedirectInfo& redirect_info, |
const scoped_refptr<ResourceResponse>& response) { |
@@ -305,7 +315,7 @@ void NavigationRequest::OnResponseStarted( |
// Select an appropriate renderer to commit the navigation. |
RenderFrameHostImpl* render_frame_host = |
- frame_tree_node_->render_manager()->GetFrameHostForNavigation(*this); |
+ frame_tree_node_->render_manager()->GetFrameHostForNavigation(this, true); |
NavigatorImpl::CheckWebUIRendererDoesNotDisplayNormalURL(render_frame_host, |
common_params_.url); |
@@ -419,7 +429,7 @@ void NavigationRequest::CommitNavigation() { |
TransferNavigationHandleOwnership(render_frame_host); |
render_frame_host->CommitNavigation(response_.get(), std::move(body_), |
common_params_, request_params_, |
- is_view_source_); |
+ is_view_source_, post_data_); |
// When navigating to a Javascript url, the NavigationRequest is not stored |
// in the FrameTreeNode. Therefore do not reset it, as this could cancel an |