Chromium Code Reviews| 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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 #include "media/blink/webencryptedmediaclient_impl.h" | 141 #include "media/blink/webencryptedmediaclient_impl.h" |
| 142 #include "media/blink/webmediaplayer_impl.h" | 142 #include "media/blink/webmediaplayer_impl.h" |
| 143 #include "media/renderers/gpu_video_accelerator_factories.h" | 143 #include "media/renderers/gpu_video_accelerator_factories.h" |
| 144 #include "mojo/common/url_type_converters.h" | 144 #include "mojo/common/url_type_converters.h" |
| 145 #include "mojo/edk/js/core.h" | 145 #include "mojo/edk/js/core.h" |
| 146 #include "mojo/edk/js/support.h" | 146 #include "mojo/edk/js/support.h" |
| 147 #include "net/base/data_url.h" | 147 #include "net/base/data_url.h" |
| 148 #include "net/base/net_errors.h" | 148 #include "net/base/net_errors.h" |
| 149 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 149 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| 150 #include "net/http/http_util.h" | 150 #include "net/http/http_util.h" |
| 151 #include "storage/common/data_element.h" | |
| 151 #include "third_party/WebKit/public/platform/URLConversion.h" | 152 #include "third_party/WebKit/public/platform/URLConversion.h" |
| 152 #include "third_party/WebKit/public/platform/WebCachePolicy.h" | 153 #include "third_party/WebKit/public/platform/WebCachePolicy.h" |
| 153 #include "third_party/WebKit/public/platform/WebData.h" | 154 #include "third_party/WebKit/public/platform/WebData.h" |
| 154 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" | 155 #include "third_party/WebKit/public/platform/WebMediaPlayer.h" |
| 155 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" | 156 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" |
| 156 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" | 157 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
| 157 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" | 158 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" |
| 158 #include "third_party/WebKit/public/platform/WebString.h" | 159 #include "third_party/WebKit/public/platform/WebString.h" |
| 159 #include "third_party/WebKit/public/platform/WebURL.h" | 160 #include "third_party/WebKit/public/platform/WebURL.h" |
| 160 #include "third_party/WebKit/public/platform/WebURLError.h" | 161 #include "third_party/WebKit/public/platform/WebURLError.h" |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 535 // passed back to the browser in the DidCommitProvisionalLoad and the | 536 // passed back to the browser in the DidCommitProvisionalLoad and the |
| 536 // DocumentLoadComplete IPCs. | 537 // DocumentLoadComplete IPCs. |
| 537 base::TimeDelta ui_timestamp = common_params.ui_timestamp - base::TimeTicks(); | 538 base::TimeDelta ui_timestamp = common_params.ui_timestamp - base::TimeTicks(); |
| 538 request.setUiStartTime(ui_timestamp.InSecondsF()); | 539 request.setUiStartTime(ui_timestamp.InSecondsF()); |
| 539 request.setInputPerfMetricReportPolicy( | 540 request.setInputPerfMetricReportPolicy( |
| 540 static_cast<WebURLRequest::InputToLoadPerfMetricReportPolicy>( | 541 static_cast<WebURLRequest::InputToLoadPerfMetricReportPolicy>( |
| 541 common_params.report_type)); | 542 common_params.report_type)); |
| 542 return request; | 543 return request; |
| 543 } | 544 } |
| 544 | 545 |
| 546 void AddHTTPBodyToRequest(WebURLRequest* request, | |
|
Charlie Reis
2016/04/27 23:00:56
I'm not sure I understand this either. Where is t
clamy
2016/04/29 16:07:16
This is new code. We have a way to convert a WebHT
| |
| 547 scoped_refptr<ResourceRequestBody> body) { | |
| 548 WebHTTPBody http_body; | |
| 549 http_body.initialize(); | |
| 550 http_body.setIdentifier(body->identifier()); | |
| 551 for (auto element : *(body->elements())) { | |
| 552 switch (element.type()) { | |
| 553 case storage::DataElement::TYPE_BYTES: | |
| 554 http_body.appendData(WebData( | |
| 555 reinterpret_cast<const char*>(element.bytes()), element.length())); | |
| 556 break; | |
| 557 case storage::DataElement::TYPE_FILE: | |
| 558 http_body.appendFileRange( | |
| 559 element.path().AsUTF16Unsafe(), element.offset(), element.length(), | |
| 560 element.expected_modification_time().ToDoubleT()); | |
| 561 break; | |
| 562 case storage::DataElement::TYPE_FILE_FILESYSTEM: | |
| 563 http_body.appendFileSystemURLRange( | |
| 564 element.filesystem_url(), element.offset(), element.length(), | |
| 565 element.expected_modification_time().ToDoubleT()); | |
| 566 break; | |
| 567 case storage::DataElement::TYPE_BLOB: | |
| 568 http_body.appendBlob(WebString::fromUTF8(element.blob_uuid())); | |
| 569 break; | |
| 570 default: | |
| 571 NOTREACHED(); | |
| 572 break; | |
| 573 } | |
| 574 } | |
| 575 request->setHTTPBody(http_body); | |
| 576 } | |
| 577 | |
| 545 // Sanitizes the navigation_start timestamp for browser-initiated navigations, | 578 // Sanitizes the navigation_start timestamp for browser-initiated navigations, |
| 546 // where the browser possibly has a better notion of start time than the | 579 // where the browser possibly has a better notion of start time than the |
| 547 // renderer. In the case of cross-process navigations, this carries over the | 580 // renderer. In the case of cross-process navigations, this carries over the |
| 548 // time of finishing the onbeforeunload handler of the previous page. | 581 // time of finishing the onbeforeunload handler of the previous page. |
| 549 // TimeTicks is sometimes not monotonic across processes, and because | 582 // TimeTicks is sometimes not monotonic across processes, and because |
| 550 // |browser_navigation_start| is likely before this process existed, | 583 // |browser_navigation_start| is likely before this process existed, |
| 551 // InterProcessTimeTicksConverter won't help. The timestamp is sanitized by | 584 // InterProcessTimeTicksConverter won't help. The timestamp is sanitized by |
| 552 // clamping it to renderer_navigation_start, initialized earlier in the call | 585 // clamping it to renderer_navigation_start, initialized earlier in the call |
| 553 // stack. | 586 // stack. |
| 554 base::TimeTicks SanitizeNavigationTiming( | 587 base::TimeTicks SanitizeNavigationTiming( |
| (...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1481 } | 1514 } |
| 1482 | 1515 |
| 1483 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); | 1516 RenderThreadImpl* render_thread_impl = RenderThreadImpl::current(); |
| 1484 // Can be NULL in tests. | 1517 // Can be NULL in tests. |
| 1485 if (render_thread_impl) | 1518 if (render_thread_impl) |
| 1486 render_thread_impl->GetRendererScheduler()->OnNavigationStarted(); | 1519 render_thread_impl->GetRendererScheduler()->OnNavigationStarted(); |
| 1487 DCHECK(!IsBrowserSideNavigationEnabled()); | 1520 DCHECK(!IsBrowserSideNavigationEnabled()); |
| 1488 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", "id", routing_id_, | 1521 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", "id", routing_id_, |
| 1489 "url", common_params.url.possibly_invalid_spec()); | 1522 "url", common_params.url.possibly_invalid_spec()); |
| 1490 NavigateInternal(common_params, start_params, request_params, | 1523 NavigateInternal(common_params, start_params, request_params, |
| 1491 std::unique_ptr<StreamOverrideParameters>()); | 1524 std::unique_ptr<StreamOverrideParameters>(), nullptr); |
| 1492 } | 1525 } |
| 1493 | 1526 |
| 1494 void RenderFrameImpl::BindServiceRegistry( | 1527 void RenderFrameImpl::BindServiceRegistry( |
| 1495 shell::mojom::InterfaceProviderRequest services, | 1528 shell::mojom::InterfaceProviderRequest services, |
| 1496 shell::mojom::InterfaceProviderPtr exposed_services) { | 1529 shell::mojom::InterfaceProviderPtr exposed_services) { |
| 1497 service_registry_.Bind(std::move(services)); | 1530 service_registry_.Bind(std::move(services)); |
| 1498 service_registry_.BindRemoteServiceProvider(std::move(exposed_services)); | 1531 service_registry_.BindRemoteServiceProvider(std::move(exposed_services)); |
| 1499 } | 1532 } |
| 1500 | 1533 |
| 1501 ManifestManager* RenderFrameImpl::manifest_manager() { | 1534 ManifestManager* RenderFrameImpl::manifest_manager() { |
| (...skipping 3064 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4566 if (commit_type == blink::WebStandardCommit) | 4599 if (commit_type == blink::WebStandardCommit) |
| 4567 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; | 4600 params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME; |
| 4568 else | 4601 else |
| 4569 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; | 4602 params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; |
| 4570 | 4603 |
| 4571 DCHECK(!navigation_state->request_params().should_clear_history_list); | 4604 DCHECK(!navigation_state->request_params().should_clear_history_list); |
| 4572 params.history_list_was_cleared = false; | 4605 params.history_list_was_cleared = false; |
| 4573 params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; | 4606 params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; |
| 4574 } | 4607 } |
| 4575 | 4608 |
| 4609 scoped_refptr<ResourceRequestBody> post_data; | |
| 4610 if (IsBrowserSideNavigationEnabled()) { | |
|
Charlie Reis
2016/04/27 23:00:56
I'm nervous about making this PlzNavigate-only. I
clamy
2016/04/29 16:07:16
We no longer send the POST data to the browser.
| |
| 4611 post_data = GetRequestBodyForWebURLRequest(request); | |
| 4612 } | |
| 4613 | |
| 4576 // This message needs to be sent before any of allowScripts(), | 4614 // This message needs to be sent before any of allowScripts(), |
| 4577 // allowImages(), allowPlugins() is called for the new page, so that when | 4615 // allowImages(), allowPlugins() is called for the new page, so that when |
| 4578 // these functions send a ViewHostMsg_ContentBlocked message, it arrives | 4616 // these functions send a ViewHostMsg_ContentBlocked message, it arrives |
| 4579 // after the FrameHostMsg_DidCommitProvisionalLoad message. | 4617 // after the FrameHostMsg_DidCommitProvisionalLoad message. |
| 4580 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params)); | 4618 Send(new FrameHostMsg_DidCommitProvisionalLoad(routing_id_, params, |
| 4619 post_data)); | |
| 4581 | 4620 |
| 4582 // If we end up reusing this WebRequest (for example, due to a #ref click), | 4621 // If we end up reusing this WebRequest (for example, due to a #ref click), |
| 4583 // we don't want the transition type to persist. Just clear it. | 4622 // we don't want the transition type to persist. Just clear it. |
| 4584 navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); | 4623 navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK); |
| 4585 } | 4624 } |
| 4586 | 4625 |
| 4587 void RenderFrameImpl::didStartLoading(bool to_different_document) { | 4626 void RenderFrameImpl::didStartLoading(bool to_different_document) { |
| 4588 TRACE_EVENT1("navigation", "RenderFrameImpl::didStartLoading", | 4627 TRACE_EVENT1("navigation", "RenderFrameImpl::didStartLoading", |
| 4589 "id", routing_id_); | 4628 "id", routing_id_); |
| 4590 render_view_->FrameDidStartLoading(frame_); | 4629 render_view_->FrameDidStartLoading(frame_); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 4619 void RenderFrameImpl::FocusedNodeChangedForAccessibility(const WebNode& node) { | 4658 void RenderFrameImpl::FocusedNodeChangedForAccessibility(const WebNode& node) { |
| 4620 if (renderer_accessibility()) | 4659 if (renderer_accessibility()) |
| 4621 renderer_accessibility()->AccessibilityFocusedNodeChanged(node); | 4660 renderer_accessibility()->AccessibilityFocusedNodeChanged(node); |
| 4622 } | 4661 } |
| 4623 | 4662 |
| 4624 // PlzNavigate | 4663 // PlzNavigate |
| 4625 void RenderFrameImpl::OnCommitNavigation( | 4664 void RenderFrameImpl::OnCommitNavigation( |
| 4626 const ResourceResponseHead& response, | 4665 const ResourceResponseHead& response, |
| 4627 const GURL& stream_url, | 4666 const GURL& stream_url, |
| 4628 const CommonNavigationParams& common_params, | 4667 const CommonNavigationParams& common_params, |
| 4629 const RequestNavigationParams& request_params) { | 4668 const RequestNavigationParams& request_params, |
| 4669 scoped_refptr<ResourceRequestBody> post_data) { | |
| 4630 CHECK(IsBrowserSideNavigationEnabled()); | 4670 CHECK(IsBrowserSideNavigationEnabled()); |
| 4631 // This will override the url requested by the WebURLLoader, as well as | 4671 // This will override the url requested by the WebURLLoader, as well as |
| 4632 // provide it with the response to the request. | 4672 // provide it with the response to the request. |
| 4633 std::unique_ptr<StreamOverrideParameters> stream_override( | 4673 std::unique_ptr<StreamOverrideParameters> stream_override( |
| 4634 new StreamOverrideParameters()); | 4674 new StreamOverrideParameters()); |
| 4635 stream_override->stream_url = stream_url; | 4675 stream_override->stream_url = stream_url; |
| 4636 stream_override->response = response; | 4676 stream_override->response = response; |
| 4637 | 4677 |
| 4638 NavigateInternal(common_params, StartNavigationParams(), request_params, | 4678 NavigateInternal(common_params, StartNavigationParams(), request_params, |
| 4639 std::move(stream_override)); | 4679 std::move(stream_override), post_data); |
| 4640 } | 4680 } |
| 4641 | 4681 |
| 4642 // PlzNavigate | 4682 // PlzNavigate |
| 4643 void RenderFrameImpl::OnFailedNavigation( | 4683 void RenderFrameImpl::OnFailedNavigation( |
| 4644 const CommonNavigationParams& common_params, | 4684 const CommonNavigationParams& common_params, |
| 4645 const RequestNavigationParams& request_params, | 4685 const RequestNavigationParams& request_params, |
| 4646 bool has_stale_copy_in_cache, | 4686 bool has_stale_copy_in_cache, |
| 4647 int error_code) { | 4687 int error_code) { |
| 4648 DCHECK(IsBrowserSideNavigationEnabled()); | 4688 DCHECK(IsBrowserSideNavigationEnabled()); |
| 4649 bool is_reload = IsReload(common_params.navigation_type); | 4689 bool is_reload = IsReload(common_params.navigation_type); |
| (...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5225 params.frame_unique_name = frame_->uniqueName().utf8(); | 5265 params.frame_unique_name = frame_->uniqueName().utf8(); |
| 5226 } | 5266 } |
| 5227 | 5267 |
| 5228 Send(new FrameHostMsg_OpenURL(routing_id_, params)); | 5268 Send(new FrameHostMsg_OpenURL(routing_id_, params)); |
| 5229 } | 5269 } |
| 5230 | 5270 |
| 5231 void RenderFrameImpl::NavigateInternal( | 5271 void RenderFrameImpl::NavigateInternal( |
| 5232 const CommonNavigationParams& common_params, | 5272 const CommonNavigationParams& common_params, |
| 5233 const StartNavigationParams& start_params, | 5273 const StartNavigationParams& start_params, |
| 5234 const RequestNavigationParams& request_params, | 5274 const RequestNavigationParams& request_params, |
| 5235 std::unique_ptr<StreamOverrideParameters> stream_params) { | 5275 std::unique_ptr<StreamOverrideParameters> stream_params, |
| 5276 scoped_refptr<ResourceRequestBody> post_data) { | |
| 5236 bool browser_side_navigation = IsBrowserSideNavigationEnabled(); | 5277 bool browser_side_navigation = IsBrowserSideNavigationEnabled(); |
| 5237 | 5278 |
| 5238 // Lower bound for browser initiated navigation start time. | 5279 // Lower bound for browser initiated navigation start time. |
| 5239 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); | 5280 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); |
| 5240 bool is_reload = IsReload(common_params.navigation_type); | 5281 bool is_reload = IsReload(common_params.navigation_type); |
| 5241 bool is_history_navigation = request_params.page_state.IsValid(); | 5282 bool is_history_navigation = request_params.page_state.IsValid(); |
| 5242 WebCachePolicy cache_policy = WebCachePolicy::UseProtocolCachePolicy; | 5283 WebCachePolicy cache_policy = WebCachePolicy::UseProtocolCachePolicy; |
| 5243 RenderFrameImpl::PrepareRenderViewForNavigation( | 5284 RenderFrameImpl::PrepareRenderViewForNavigation( |
| 5244 common_params.url, request_params); | 5285 common_params.url, request_params); |
| 5245 | 5286 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5286 ? blink::WebFrameLoadType::ReplaceCurrentItem | 5327 ? blink::WebFrameLoadType::ReplaceCurrentItem |
| 5287 : blink::WebFrameLoadType::Standard; | 5328 : blink::WebFrameLoadType::Standard; |
| 5288 blink::WebHistoryLoadType history_load_type = | 5329 blink::WebHistoryLoadType history_load_type = |
| 5289 blink::WebHistoryDifferentDocumentLoad; | 5330 blink::WebHistoryDifferentDocumentLoad; |
| 5290 bool should_load_request = false; | 5331 bool should_load_request = false; |
| 5291 WebHistoryItem item_for_history_navigation; | 5332 WebHistoryItem item_for_history_navigation; |
| 5292 WebURLRequest request = | 5333 WebURLRequest request = |
| 5293 CreateURLRequestForNavigation(common_params, std::move(stream_params), | 5334 CreateURLRequestForNavigation(common_params, std::move(stream_params), |
| 5294 frame_->isViewSourceModeEnabled()); | 5335 frame_->isViewSourceModeEnabled()); |
| 5295 | 5336 |
| 5337 if (IsBrowserSideNavigationEnabled() && post_data) | |
| 5338 AddHTTPBodyToRequest(&request, post_data); | |
| 5339 | |
| 5296 // Used to determine whether this frame is actually loading a request as part | 5340 // Used to determine whether this frame is actually loading a request as part |
| 5297 // of a history navigation. | 5341 // of a history navigation. |
| 5298 bool has_history_navigation_in_frame = false; | 5342 bool has_history_navigation_in_frame = false; |
| 5299 | 5343 |
| 5300 #if defined(OS_ANDROID) | 5344 #if defined(OS_ANDROID) |
| 5301 request.setHasUserGesture(start_params.has_user_gesture); | 5345 request.setHasUserGesture(start_params.has_user_gesture); |
| 5302 #endif | 5346 #endif |
| 5303 | 5347 |
| 5304 // PlzNavigate: Make sure that Blink's loader will not try to use browser side | 5348 // PlzNavigate: Make sure that Blink's loader will not try to use browser side |
| 5305 // navigation for this request (since it already went to the browser). | 5349 // navigation for this request (since it already went to the browser). |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6039 int match_count, | 6083 int match_count, |
| 6040 int ordinal, | 6084 int ordinal, |
| 6041 const WebRect& selection_rect, | 6085 const WebRect& selection_rect, |
| 6042 bool final_status_update) { | 6086 bool final_status_update) { |
| 6043 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count, | 6087 Send(new FrameHostMsg_Find_Reply(routing_id_, request_id, match_count, |
| 6044 selection_rect, ordinal, | 6088 selection_rect, ordinal, |
| 6045 final_status_update)); | 6089 final_status_update)); |
| 6046 } | 6090 } |
| 6047 | 6091 |
| 6048 } // namespace content | 6092 } // namespace content |
| OLD | NEW |