OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/render_frame_impl.h" | 5 #include "content/renderer/render_frame_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 #endif // ADDRESS_SANITIZER || SYZYASAN | 552 #endif // ADDRESS_SANITIZER || SYZYASAN |
553 } | 553 } |
554 | 554 |
555 // Returns false unless this is a top-level navigation. | 555 // Returns false unless this is a top-level navigation. |
556 bool IsTopLevelNavigation(WebFrame* frame) { | 556 bool IsTopLevelNavigation(WebFrame* frame) { |
557 return frame->parent() == NULL; | 557 return frame->parent() == NULL; |
558 } | 558 } |
559 | 559 |
560 WebURLRequest CreateURLRequestForNavigation( | 560 WebURLRequest CreateURLRequestForNavigation( |
561 const CommonNavigationParams& common_params, | 561 const CommonNavigationParams& common_params, |
| 562 const RequestNavigationParams& request_params, |
562 std::unique_ptr<StreamOverrideParameters> stream_override, | 563 std::unique_ptr<StreamOverrideParameters> stream_override, |
563 bool is_view_source_mode_enabled, | 564 bool is_view_source_mode_enabled, |
564 bool is_same_document_navigation, | 565 bool is_same_document_navigation) { |
565 int nav_entry_id) { | 566 // PlzNavigate: use the original navigation url to construct the |
566 WebURLRequest request(common_params.url); | 567 // WebURLRequest. The WebURLloaderImpl will replay the redirects afterwards |
| 568 // and will eventually commit the final url. |
| 569 const GURL navigation_url = IsBrowserSideNavigationEnabled() && |
| 570 !request_params.original_url.is_empty() |
| 571 ? request_params.original_url |
| 572 : common_params.url; |
| 573 const std::string navigation_method = |
| 574 IsBrowserSideNavigationEnabled() && |
| 575 !request_params.original_method.empty() |
| 576 ? request_params.original_method |
| 577 : common_params.method; |
| 578 WebURLRequest request(navigation_url); |
| 579 request.setHTTPMethod(WebString::fromUTF8(navigation_method)); |
| 580 |
567 if (is_view_source_mode_enabled) | 581 if (is_view_source_mode_enabled) |
568 request.setCachePolicy(WebCachePolicy::ReturnCacheDataElseLoad); | 582 request.setCachePolicy(WebCachePolicy::ReturnCacheDataElseLoad); |
569 | 583 |
570 request.setHTTPMethod(WebString::fromUTF8(common_params.method)); | |
571 if (common_params.referrer.url.is_valid()) { | 584 if (common_params.referrer.url.is_valid()) { |
572 WebString web_referrer = WebSecurityPolicy::generateReferrerHeader( | 585 WebString web_referrer = WebSecurityPolicy::generateReferrerHeader( |
573 common_params.referrer.policy, common_params.url, | 586 common_params.referrer.policy, common_params.url, |
574 WebString::fromUTF8(common_params.referrer.url.spec())); | 587 WebString::fromUTF8(common_params.referrer.url.spec())); |
575 if (!web_referrer.isEmpty()) { | 588 if (!web_referrer.isEmpty()) { |
576 request.setHTTPReferrer(web_referrer, common_params.referrer.policy); | 589 request.setHTTPReferrer(web_referrer, common_params.referrer.policy); |
577 request.addHTTPOriginIfNeeded( | 590 request.addHTTPOriginIfNeeded( |
578 WebSecurityOrigin(url::Origin(common_params.referrer.url))); | 591 WebSecurityOrigin(url::Origin(common_params.referrer.url))); |
579 } | 592 } |
580 } | 593 } |
581 | 594 |
582 request.setIsSameDocumentNavigation(is_same_document_navigation); | 595 request.setIsSameDocumentNavigation(is_same_document_navigation); |
583 request.setPreviewsState( | 596 request.setPreviewsState( |
584 static_cast<WebURLRequest::PreviewsState>(common_params.previews_state)); | 597 static_cast<WebURLRequest::PreviewsState>(common_params.previews_state)); |
585 | 598 |
586 RequestExtraData* extra_data = new RequestExtraData(); | 599 RequestExtraData* extra_data = new RequestExtraData(); |
587 extra_data->set_stream_override(std::move(stream_override)); | 600 extra_data->set_stream_override(std::move(stream_override)); |
588 extra_data->set_navigation_initiated_by_renderer(nav_entry_id == 0); | 601 extra_data->set_navigation_initiated_by_renderer( |
| 602 request_params.nav_entry_id == 0); |
589 request.setExtraData(extra_data); | 603 request.setExtraData(extra_data); |
590 | 604 |
591 // Set the ui timestamp for this navigation. Currently the timestamp here is | 605 // Set the ui timestamp for this navigation. Currently the timestamp here is |
592 // only non empty when the navigation was triggered by an Android intent. The | 606 // only non empty when the navigation was triggered by an Android intent. The |
593 // timestamp is converted to a double version supported by blink. It will be | 607 // timestamp is converted to a double version supported by blink. It will be |
594 // passed back to the browser in the DidCommitProvisionalLoad and the | 608 // passed back to the browser in the DidCommitProvisionalLoad and the |
595 // DocumentLoadComplete IPCs. | 609 // DocumentLoadComplete IPCs. |
596 base::TimeDelta ui_timestamp = common_params.ui_timestamp - base::TimeTicks(); | 610 base::TimeDelta ui_timestamp = common_params.ui_timestamp - base::TimeTicks(); |
597 request.setUiStartTime(ui_timestamp.InSecondsF()); | 611 request.setUiStartTime(ui_timestamp.InSecondsF()); |
598 request.setInputPerfMetricReportPolicy( | 612 request.setInputPerfMetricReportPolicy( |
(...skipping 2758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3357 observer.WillSubmitForm(form); | 3371 observer.WillSubmitForm(form); |
3358 } | 3372 } |
3359 | 3373 |
3360 void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, | 3374 void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, |
3361 blink::WebDataSource* datasource) { | 3375 blink::WebDataSource* datasource) { |
3362 DCHECK(!frame_ || frame_ == frame); | 3376 DCHECK(!frame_ || frame_ == frame); |
3363 | 3377 |
3364 bool content_initiated = !pending_navigation_params_.get(); | 3378 bool content_initiated = !pending_navigation_params_.get(); |
3365 | 3379 |
3366 // Make sure any previous redirect URLs end up in our new data source. | 3380 // Make sure any previous redirect URLs end up in our new data source. |
3367 if (pending_navigation_params_.get()) { | 3381 if (pending_navigation_params_.get() && !IsBrowserSideNavigationEnabled()) { |
3368 for (const auto& i : | 3382 for (const auto& i : |
3369 pending_navigation_params_->request_params.redirects) { | 3383 pending_navigation_params_->request_params.redirects) { |
3370 datasource->appendRedirect(i); | 3384 datasource->appendRedirect(i); |
3371 } | 3385 } |
3372 } | 3386 } |
3373 | 3387 |
3374 DocumentState* document_state = DocumentState::FromDataSource(datasource); | 3388 DocumentState* document_state = DocumentState::FromDataSource(datasource); |
3375 if (!document_state) { | 3389 if (!document_state) { |
3376 document_state = new DocumentState; | 3390 document_state = new DocumentState; |
3377 datasource->setExtraData(document_state); | 3391 datasource->setExtraData(document_state); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3414 !navigation_state->request_params() | 3428 !navigation_state->request_params() |
3415 .navigation_timing.fetch_start.is_null()) { | 3429 .navigation_timing.fetch_start.is_null()) { |
3416 // Set timing of several events that happened during navigation. | 3430 // Set timing of several events that happened during navigation. |
3417 // They will be used in blink for the Navigation Timing API. | 3431 // They will be used in blink for the Navigation Timing API. |
3418 double redirect_start = ConvertToBlinkTime( | 3432 double redirect_start = ConvertToBlinkTime( |
3419 navigation_state->request_params().navigation_timing.redirect_start); | 3433 navigation_state->request_params().navigation_timing.redirect_start); |
3420 double redirect_end = ConvertToBlinkTime( | 3434 double redirect_end = ConvertToBlinkTime( |
3421 navigation_state->request_params().navigation_timing.redirect_end); | 3435 navigation_state->request_params().navigation_timing.redirect_end); |
3422 double fetch_start = ConvertToBlinkTime( | 3436 double fetch_start = ConvertToBlinkTime( |
3423 navigation_state->request_params().navigation_timing.fetch_start); | 3437 navigation_state->request_params().navigation_timing.fetch_start); |
3424 std::vector<GURL> redirectChain = | |
3425 navigation_state->request_params().redirects; | |
3426 redirectChain.push_back(navigation_state->common_params().url); | |
3427 | 3438 |
3428 datasource->updateNavigation(redirect_start, redirect_end, fetch_start, | 3439 datasource->updateNavigation( |
3429 redirectChain); | 3440 redirect_start, redirect_end, fetch_start, |
| 3441 !navigation_state->request_params().redirects.empty()); |
3430 // TODO(clamy) We need to provide additional timing values for the | 3442 // TODO(clamy) We need to provide additional timing values for the |
3431 // Navigation Timing API to work with browser-side navigations. | 3443 // Navigation Timing API to work with browser-side navigations. |
3432 // UnloadEventStart and UnloadEventEnd are still missing. | 3444 // UnloadEventStart and UnloadEventEnd are still missing. |
3433 } | 3445 } |
3434 | 3446 |
3435 // Create the serviceworker's per-document network observing object if it | 3447 // Create the serviceworker's per-document network observing object if it |
3436 // does not exist (When navigation happens within a page, the provider already | 3448 // does not exist (When navigation happens within a page, the provider already |
3437 // exists). | 3449 // exists). |
3438 if (ServiceWorkerNetworkProvider::FromDocumentState( | 3450 if (ServiceWorkerNetworkProvider::FromDocumentState( |
3439 DocumentState::FromDataSource(datasource))) | 3451 DocumentState::FromDataSource(datasource))) |
(...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5139 const RequestNavigationParams& request_params) { | 5151 const RequestNavigationParams& request_params) { |
5140 CHECK(IsBrowserSideNavigationEnabled()); | 5152 CHECK(IsBrowserSideNavigationEnabled()); |
5141 // This will override the url requested by the WebURLLoader, as well as | 5153 // This will override the url requested by the WebURLLoader, as well as |
5142 // provide it with the response to the request. | 5154 // provide it with the response to the request. |
5143 std::unique_ptr<StreamOverrideParameters> stream_override( | 5155 std::unique_ptr<StreamOverrideParameters> stream_override( |
5144 new StreamOverrideParameters()); | 5156 new StreamOverrideParameters()); |
5145 stream_override->stream_url = stream_url; | 5157 stream_override->stream_url = stream_url; |
5146 stream_override->response = response; | 5158 stream_override->response = response; |
5147 stream_override->redirects = request_params.redirects; | 5159 stream_override->redirects = request_params.redirects; |
5148 stream_override->redirect_responses = request_params.redirect_response; | 5160 stream_override->redirect_responses = request_params.redirect_response; |
| 5161 stream_override->redirect_infos = request_params.redirect_infos; |
5149 | 5162 |
5150 // If the request was initiated in the context of a user gesture then make | 5163 // If the request was initiated in the context of a user gesture then make |
5151 // sure that the navigation also executes in the context of a user gesture. | 5164 // sure that the navigation also executes in the context of a user gesture. |
5152 std::unique_ptr<blink::WebScopedUserGesture> gesture( | 5165 std::unique_ptr<blink::WebScopedUserGesture> gesture( |
5153 request_params.has_user_gesture ? new blink::WebScopedUserGesture(frame_) | 5166 request_params.has_user_gesture ? new blink::WebScopedUserGesture(frame_) |
5154 : nullptr); | 5167 : nullptr); |
5155 | 5168 |
5156 browser_side_navigation_pending_ = false; | 5169 browser_side_navigation_pending_ = false; |
5157 | 5170 |
5158 NavigateInternal(common_params, StartNavigationParams(), request_params, | 5171 NavigateInternal(common_params, StartNavigationParams(), request_params, |
(...skipping 23 matching lines...) Expand all Loading... |
5182 // already committed other loads. | 5195 // already committed other loads. |
5183 if (request_params.has_committed_real_load && frame_->parent()) | 5196 if (request_params.has_committed_real_load && frame_->parent()) |
5184 frame_->setCommittedFirstRealLoad(); | 5197 frame_->setCommittedFirstRealLoad(); |
5185 | 5198 |
5186 pending_navigation_params_.reset(new NavigationParams( | 5199 pending_navigation_params_.reset(new NavigationParams( |
5187 common_params, StartNavigationParams(), request_params)); | 5200 common_params, StartNavigationParams(), request_params)); |
5188 | 5201 |
5189 // Send the provisional load failure. | 5202 // Send the provisional load failure. |
5190 blink::WebURLError error = | 5203 blink::WebURLError error = |
5191 CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code); | 5204 CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code); |
5192 WebURLRequest failed_request = CreateURLRequestForNavigation( | 5205 WebURLRequest failed_request = |
5193 common_params, std::unique_ptr<StreamOverrideParameters>(), | 5206 CreateURLRequestForNavigation(common_params, request_params, |
5194 frame_->isViewSourceModeEnabled(), | 5207 std::unique_ptr<StreamOverrideParameters>(), |
5195 false, // is_same_document_navigation | 5208 frame_->isViewSourceModeEnabled(), |
5196 request_params.nav_entry_id); | 5209 false); // is_same_document_navigation |
5197 | 5210 |
5198 if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { | 5211 if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { |
5199 // The browser expects this frame to be loading an error page. Inform it | 5212 // The browser expects this frame to be loading an error page. Inform it |
5200 // that the load stopped. | 5213 // that the load stopped. |
5201 Send(new FrameHostMsg_DidStopLoading(routing_id_)); | 5214 Send(new FrameHostMsg_DidStopLoading(routing_id_)); |
5202 browser_side_navigation_pending_ = false; | 5215 browser_side_navigation_pending_ = false; |
5203 return; | 5216 return; |
5204 } | 5217 } |
5205 | 5218 |
5206 // On load failure, a frame can ask its owner to render fallback content. | 5219 // On load failure, a frame can ask its owner to render fallback content. |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5868 bool should_load_request = false; | 5881 bool should_load_request = false; |
5869 WebHistoryItem item_for_history_navigation; | 5882 WebHistoryItem item_for_history_navigation; |
5870 | 5883 |
5871 // Enforce same-document navigation from the browser only if | 5884 // Enforce same-document navigation from the browser only if |
5872 // browser-side-navigation is enabled. | 5885 // browser-side-navigation is enabled. |
5873 bool is_same_document = | 5886 bool is_same_document = |
5874 IsBrowserSideNavigationEnabled() && | 5887 IsBrowserSideNavigationEnabled() && |
5875 FrameMsg_Navigate_Type::IsSameDocument(common_params.navigation_type); | 5888 FrameMsg_Navigate_Type::IsSameDocument(common_params.navigation_type); |
5876 | 5889 |
5877 WebURLRequest request = CreateURLRequestForNavigation( | 5890 WebURLRequest request = CreateURLRequestForNavigation( |
5878 common_params, std::move(stream_params), | 5891 common_params, request_params, std::move(stream_params), |
5879 frame_->isViewSourceModeEnabled(), is_same_document, | 5892 frame_->isViewSourceModeEnabled(), is_same_document); |
5880 request_params.nav_entry_id); | |
5881 request.setFrameType(IsTopLevelNavigation(frame_) | 5893 request.setFrameType(IsTopLevelNavigation(frame_) |
5882 ? blink::WebURLRequest::FrameTypeTopLevel | 5894 ? blink::WebURLRequest::FrameTypeTopLevel |
5883 : blink::WebURLRequest::FrameTypeNested); | 5895 : blink::WebURLRequest::FrameTypeNested); |
5884 | 5896 |
5885 if (IsBrowserSideNavigationEnabled() && common_params.post_data) | 5897 if (IsBrowserSideNavigationEnabled() && common_params.post_data) |
5886 request.setHTTPBody(GetWebHTTPBodyForRequestBody(common_params.post_data)); | 5898 request.setHTTPBody(GetWebHTTPBodyForRequestBody(common_params.post_data)); |
5887 | 5899 |
5888 // Used to determine whether this frame is actually loading a request as part | 5900 // Used to determine whether this frame is actually loading a request as part |
5889 // of a history navigation. | 5901 // of a history navigation. |
5890 bool has_history_navigation_in_frame = false; | 5902 bool has_history_navigation_in_frame = false; |
(...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6838 // event target. Potentially a Pepper plugin will receive the event. | 6850 // event target. Potentially a Pepper plugin will receive the event. |
6839 // In order to tell whether a plugin gets the last mouse event and which it | 6851 // In order to tell whether a plugin gets the last mouse event and which it |
6840 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets | 6852 // is, we set |pepper_last_mouse_event_target_| to null here. If a plugin gets |
6841 // the event, it will notify us via DidReceiveMouseEvent() and set itself as | 6853 // the event, it will notify us via DidReceiveMouseEvent() and set itself as |
6842 // |pepper_last_mouse_event_target_|. | 6854 // |pepper_last_mouse_event_target_|. |
6843 pepper_last_mouse_event_target_ = nullptr; | 6855 pepper_last_mouse_event_target_ = nullptr; |
6844 #endif | 6856 #endif |
6845 } | 6857 } |
6846 | 6858 |
6847 } // namespace content | 6859 } // namespace content |
OLD | NEW |