| Index: content/renderer/render_frame_impl.cc
|
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
|
| index 2b8bcf0f6e9019f91f36b77e5f9a36f3ce3f46a3..b880a98e34aa90041b188925dae355f374faed85 100644
|
| --- a/content/renderer/render_frame_impl.cc
|
| +++ b/content/renderer/render_frame_impl.cc
|
| @@ -364,20 +364,47 @@ static bool IsNonLocalTopLevelNavigation(const GURL& url,
|
| }
|
|
|
| WebURLRequest CreateURLRequestForNavigation(
|
| - const CommonNavigationParams& params,
|
| + const CommonNavigationParams& common_params,
|
| + const RequestNavigationParams& request_params,
|
| scoped_ptr<StreamOverrideParameters> stream_override,
|
| bool is_view_source_mode_enabled) {
|
| - WebURLRequest request(params.url);
|
| + WebURLRequest request(common_params.url);
|
| if (is_view_source_mode_enabled)
|
| request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad);
|
|
|
| - if (params.referrer.url.is_valid()) {
|
| + if (common_params.referrer.url.is_valid()) {
|
| WebString web_referrer = WebSecurityPolicy::generateReferrerHeader(
|
| - params.referrer.policy,
|
| - params.url,
|
| - WebString::fromUTF8(params.referrer.url.spec()));
|
| + common_params.referrer.policy,
|
| + common_params.url,
|
| + WebString::fromUTF8(common_params.referrer.url.spec()));
|
| if (!web_referrer.isEmpty())
|
| - request.setHTTPReferrer(web_referrer, params.referrer.policy);
|
| + request.setHTTPReferrer(web_referrer, common_params.referrer.policy);
|
| + }
|
| +
|
| + if (!request_params.extra_headers.empty()) {
|
| + for (net::HttpUtil::HeadersIterator i(request_params.extra_headers.begin(),
|
| + request_params.extra_headers.end(),
|
| + "\n");
|
| + i.GetNext();) {
|
| + request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
|
| + WebString::fromUTF8(i.values()));
|
| + }
|
| + }
|
| +
|
| + if (request_params.is_post) {
|
| + request.setHTTPMethod(WebString::fromUTF8("POST"));
|
| +
|
| + // Set post data.
|
| + WebHTTPBody http_body;
|
| + http_body.initialize();
|
| + const char* data = NULL;
|
| + if (request_params.browser_initiated_post_data.size()) {
|
| + data = reinterpret_cast<const char*>(
|
| + &request_params.browser_initiated_post_data.front());
|
| + }
|
| + http_body.appendData(
|
| + WebData(data, request_params.browser_initiated_post_data.size()));
|
| + request.setHTTPBody(http_body);
|
| }
|
|
|
| RequestExtraData* extra_data = new RequestExtraData();
|
| @@ -410,6 +437,35 @@ void UpdateFrameNavigationTiming(WebFrame* frame,
|
| }
|
| }
|
|
|
| +// PlzNavigate
|
| +FrameHostMsg_BeginNavigation_Params MakeBeginNavigationParams(
|
| + const blink::WebURLRequest& request) {
|
| + FrameHostMsg_BeginNavigation_Params params;
|
| + params.method = request.httpMethod().latin1();
|
| + params.headers = GetWebURLRequestHeaders(request);
|
| + params.load_flags = GetLoadFlagsForWebURLRequest(request);
|
| + // TODO(clamy): fill the http body.
|
| + params.has_user_gesture = request.hasUserGesture();
|
| + return params;
|
| +}
|
| +
|
| +// PlzNavigate
|
| +CommonNavigationParams MakeCommonNavigationParams(
|
| + const blink::WebURLRequest& request) {
|
| + const RequestExtraData kEmptyData;
|
| + const RequestExtraData* extra_data =
|
| + static_cast<RequestExtraData*>(request.extraData());
|
| + if (!extra_data)
|
| + extra_data = &kEmptyData;
|
| + CommonNavigationParams params;
|
| + params.url = request.url();
|
| + params.referrer = Referrer(
|
| + GURL(request.httpHeaderField(WebString::fromUTF8("Referer")).latin1()),
|
| + request.referrerPolicy());
|
| + params.transition = extra_data->transition_type();
|
| + return params;
|
| +}
|
| +
|
| } // namespace
|
|
|
| static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) =
|
| @@ -847,6 +903,7 @@ bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
|
| IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode,
|
| OnSetAccessibilityMode)
|
| IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener)
|
| + IPC_MESSAGE_HANDLER(FrameMsg_RequestNavigation, OnRequestNavigation)
|
| IPC_MESSAGE_HANDLER(FrameMsg_CommitNavigation, OnCommitNavigation)
|
| #if defined(OS_ANDROID)
|
| IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems)
|
| @@ -958,40 +1015,15 @@ void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) {
|
| }
|
| } else {
|
| // Navigate to the given URL.
|
| - WebURLRequest request = CreateURLRequestForNavigation(
|
| - params.common_params, scoped_ptr<StreamOverrideParameters>(),
|
| - frame->isViewSourceModeEnabled());
|
| + WebURLRequest request =
|
| + CreateURLRequestForNavigation(params.common_params,
|
| + params.request_params,
|
| + scoped_ptr<StreamOverrideParameters>(),
|
| + frame->isViewSourceModeEnabled());
|
|
|
| // A session history navigation should have been accompanied by state.
|
| CHECK_EQ(params.page_id, -1);
|
|
|
| - if (!params.request_params.extra_headers.empty()) {
|
| - for (net::HttpUtil::HeadersIterator i(
|
| - params.request_params.extra_headers.begin(),
|
| - params.request_params.extra_headers.end(),
|
| - "\n");
|
| - i.GetNext();) {
|
| - request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
|
| - WebString::fromUTF8(i.values()));
|
| - }
|
| - }
|
| -
|
| - if (params.request_params.is_post) {
|
| - request.setHTTPMethod(WebString::fromUTF8("POST"));
|
| -
|
| - // Set post data.
|
| - WebHTTPBody http_body;
|
| - http_body.initialize();
|
| - const char* data = NULL;
|
| - if (params.request_params.browser_initiated_post_data.size()) {
|
| - data = reinterpret_cast<const char*>(
|
| - ¶ms.request_params.browser_initiated_post_data.front());
|
| - }
|
| - http_body.appendData(WebData(
|
| - data, params.request_params.browser_initiated_post_data.size()));
|
| - request.setHTTPBody(http_body);
|
| - }
|
| -
|
| // Record this before starting the load, we need a lower bound of this time
|
| // to sanitize the navigationStart override set below.
|
| base::TimeTicks renderer_navigation_start = base::TimeTicks::Now();
|
| @@ -3448,6 +3480,40 @@ void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) {
|
| }
|
|
|
| // PlzNavigate
|
| +void RenderFrameImpl::OnRequestNavigation(
|
| + const CommonNavigationParams& common_params,
|
| + const RequestNavigationParams& request_params) {
|
| + CHECK(CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableBrowserSideNavigation));
|
| +
|
| + // TODO(clamy): Execute the beforeunload event.
|
| +
|
| + WebURLRequest request =
|
| + CreateURLRequestForNavigation(common_params,
|
| + request_params,
|
| + scoped_ptr<StreamOverrideParameters>(),
|
| + frame_->isViewSourceModeEnabled());
|
| +
|
| + // Note: At this stage, the goal is to apply all the modifications the
|
| + // renderer wants to make to the request, and then send it to the browser, so
|
| + // that the actual network request can be started. Ideally, all such
|
| + // modifications should take place in willSendRequest, and in the
|
| + // implementation of willSendRequest for the various InspectorAgents
|
| + // (devtools).
|
| + //
|
| + // TODO(clamy): Apply devtools override.
|
| + // TODO(clamy): Make sure that navigation requests are not modified somewhere
|
| + // else in blink.
|
| + willSendRequest(frame_, 0, request, blink::WebURLResponse());
|
| +
|
| + // TODO(clamy): Same-document navigations should not be sent back to the
|
| + // browser.
|
| + Send(new FrameHostMsg_BeginNavigation(routing_id_,
|
| + MakeBeginNavigationParams(request),
|
| + MakeCommonNavigationParams(request)));
|
| +}
|
| +
|
| +// PlzNavigate
|
| void RenderFrameImpl::OnCommitNavigation(
|
| const ResourceResponseHead& response,
|
| const GURL& stream_url,
|
| @@ -3475,8 +3541,11 @@ void RenderFrameImpl::OnCommitNavigation(
|
| new StreamOverrideParameters());
|
| stream_override->stream_url = stream_url;
|
| stream_override->response = response;
|
| - WebURLRequest request = CreateURLRequestForNavigation(
|
| - common_params, stream_override.Pass(), frame_->isViewSourceModeEnabled());
|
| + WebURLRequest request =
|
| + CreateURLRequestForNavigation(common_params,
|
| + RequestNavigationParams(),
|
| + stream_override.Pass(),
|
| + frame_->isViewSourceModeEnabled());
|
|
|
| // Record this before starting the load. A lower bound of this time is needed
|
| // to sanitize the navigationStart override set below.
|
|
|