| 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 f359f51712a3772edfc21be6dbb9d3d5bae08b68..8a599b199427ffc84e9990ea1897e95279082bc7 100644
|
| --- a/content/browser/frame_host/navigation_request.cc
|
| +++ b/content/browser/frame_host/navigation_request.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "content/browser/frame_host/navigation_request.h"
|
|
|
| +#include "content/browser/frame_host/frame_tree.h"
|
| #include "content/browser/frame_host/frame_tree_node.h"
|
| #include "content/browser/frame_host/navigation_request_info.h"
|
| #include "content/browser/frame_host/navigator.h"
|
| @@ -12,16 +13,69 @@
|
| #include "content/common/resource_request_body.h"
|
| #include "content/public/browser/navigation_controller.h"
|
| #include "content/public/browser/stream_handle.h"
|
| +#include "content/public/common/content_client.h"
|
| +#include "net/base/load_flags.h"
|
| +#include "net/http/http_request_headers.h"
|
| #include "net/url_request/redirect_info.h"
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| +// Returns the net load flags to use based on the navigation type.
|
| +// TODO(clamy): unify the code with what is happening on the renderer side.
|
| +int LoadFlagFromNavigationType(FrameMsg_Navigate_Type::Value navigation_type) {
|
| + int load_flags = net::LOAD_NORMAL;
|
| + switch (navigation_type) {
|
| + case FrameMsg_Navigate_Type::RELOAD:
|
| + case FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL:
|
| + load_flags |= net::LOAD_VALIDATE_CACHE;
|
| + break;
|
| + case FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE:
|
| + load_flags |= net::LOAD_BYPASS_CACHE;
|
| + break;
|
| + case FrameMsg_Navigate_Type::RESTORE:
|
| + load_flags |= net::LOAD_PREFERRING_CACHE;
|
| + break;
|
| + case FrameMsg_Navigate_Type::RESTORE_WITH_POST:
|
| + load_flags |= net::LOAD_ONLY_FROM_CACHE;
|
| + break;
|
| + case FrameMsg_Navigate_Type::NORMAL:
|
| + default:
|
| + break;
|
| + }
|
| + return load_flags;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| // static
|
| -scoped_ptr<NavigationRequest> NavigationRequest::Create(
|
| +scoped_ptr<NavigationRequest> NavigationRequest::CreateBrowserInitiated(
|
| FrameTreeNode* frame_tree_node,
|
| const NavigationEntryImpl& entry,
|
| FrameMsg_Navigate_Type::Value navigation_type,
|
| base::TimeTicks navigation_start) {
|
| + std::string method = entry.GetHasPostData() ? "POST" : "GET";
|
| +
|
| + // Copy existing headers and add necessary headers that may not be present
|
| + // in the RequestNavigationParams.
|
| + net::HttpRequestHeaders headers;
|
| + headers.AddHeadersFromString(entry.extra_headers());
|
| + headers.SetHeaderIfMissing(net::HttpRequestHeaders::kUserAgent,
|
| + GetContentClient()->GetUserAgent());
|
| + // TODO(clamy): match what blink is doing with accept headers.
|
| + headers.SetHeaderIfMissing("Accept", "*/*");
|
| +
|
| + // Fill POST data from the browser 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());
|
| + }
|
| +
|
| FrameMsg_UILoadMetricsReportType::Value report_type =
|
| FrameMsg_UILoadMetricsReportType::NO_REPORT;
|
| base::TimeTicks ui_timestamp = base::TimeTicks();
|
| @@ -37,21 +91,47 @@ scoped_ptr<NavigationRequest> NavigationRequest::Create(
|
| entry.GetTransitionType(), navigation_type,
|
| !entry.IsViewSourceMode(),ui_timestamp,
|
| report_type),
|
| + BeginNavigationParams(method, headers.ToString(),
|
| + LoadFlagFromNavigationType(navigation_type),
|
| + false),
|
| CommitNavigationParams(entry.GetPageState(),
|
| entry.GetIsOverridingUserAgent(),
|
| navigation_start),
|
| - &entry));
|
| + request_body, true, &entry));
|
| + return navigation_request.Pass();
|
| +}
|
| +
|
| +// static
|
| +scoped_ptr<NavigationRequest> NavigationRequest::CreateRendererInitiated(
|
| + FrameTreeNode* frame_tree_node,
|
| + const CommonNavigationParams& common_params,
|
| + const BeginNavigationParams& begin_params,
|
| + scoped_refptr<ResourceRequestBody> body) {
|
| + // TODO(clamy): Check if some PageState should be provided here.
|
| + // TODO(clamy): See how we should handle override of the user agent when the
|
| + // navigation may start in a renderer and commit in another one.
|
| + // TODO(clamy): See if the navigation start time should be measured in the
|
| + // renderer and sent to the browser instead of being measured here.
|
| + scoped_ptr<NavigationRequest> navigation_request(new NavigationRequest(
|
| + frame_tree_node, common_params, begin_params,
|
| + CommitNavigationParams(PageState(), false, base::TimeTicks::Now()),
|
| + body, false, nullptr));
|
| return navigation_request.Pass();
|
| }
|
|
|
| NavigationRequest::NavigationRequest(
|
| FrameTreeNode* frame_tree_node,
|
| const CommonNavigationParams& common_params,
|
| + const BeginNavigationParams& begin_params,
|
| const CommitNavigationParams& commit_params,
|
| + scoped_refptr<ResourceRequestBody> body,
|
| + bool browser_initiated,
|
| const NavigationEntryImpl* entry)
|
| : frame_tree_node_(frame_tree_node),
|
| common_params_(common_params),
|
| + begin_params_(begin_params),
|
| commit_params_(commit_params),
|
| + browser_initiated_(browser_initiated),
|
| state_(NOT_STARTED),
|
| restore_type_(NavigationEntryImpl::RESTORE_NONE),
|
| is_view_source_(false),
|
| @@ -63,21 +143,28 @@ NavigationRequest::NavigationRequest(
|
| is_view_source_ = entry->IsViewSourceMode();
|
| bindings_ = entry->bindings();
|
| }
|
| +
|
| + const GURL& first_party_for_cookies =
|
| + frame_tree_node->IsMainFrame()
|
| + ? common_params.url
|
| + : frame_tree_node->frame_tree()->root()->current_url();
|
| + bool parent_is_main_frame = !frame_tree_node->parent() ?
|
| + false : frame_tree_node->parent()->IsMainFrame();
|
| + info_.reset(new NavigationRequestInfo(
|
| + common_params, begin_params, first_party_for_cookies,
|
| + frame_tree_node->IsMainFrame(), parent_is_main_frame, body));
|
| }
|
|
|
| NavigationRequest::~NavigationRequest() {
|
| }
|
|
|
| -void NavigationRequest::BeginNavigation(
|
| - scoped_ptr<NavigationRequestInfo> info,
|
| - scoped_refptr<ResourceRequestBody> request_body) {
|
| +void NavigationRequest::BeginNavigation() {
|
| DCHECK(!loader_);
|
| DCHECK(state_ == NOT_STARTED || state_ == WAITING_FOR_RENDERER_RESPONSE);
|
| state_ = STARTED;
|
| loader_ = NavigationURLLoader::Create(
|
| frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
|
| - frame_tree_node_->frame_tree_node_id(), common_params_, info.Pass(),
|
| - request_body.get(), this);
|
| + frame_tree_node_->frame_tree_node_id(), info_.Pass(), this);
|
|
|
| // TODO(davidben): Fire (and add as necessary) observer methods such as
|
| // DidStartProvisionalLoadForFrame for the navigation.
|
|
|