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 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 24 matching lines...) Expand all Loading... | |
35 #include "content/child/webmessageportchannel_impl.h" | 35 #include "content/child/webmessageportchannel_impl.h" |
36 #include "content/child/websocket_bridge.h" | 36 #include "content/child/websocket_bridge.h" |
37 #include "content/child/weburlresponse_extradata_impl.h" | 37 #include "content/child/weburlresponse_extradata_impl.h" |
38 #include "content/common/accessibility_messages.h" | 38 #include "content/common/accessibility_messages.h" |
39 #include "content/common/clipboard_messages.h" | 39 #include "content/common/clipboard_messages.h" |
40 #include "content/common/frame_messages.h" | 40 #include "content/common/frame_messages.h" |
41 #include "content/common/frame_replication_state.h" | 41 #include "content/common/frame_replication_state.h" |
42 #include "content/common/input_messages.h" | 42 #include "content/common/input_messages.h" |
43 #include "content/common/navigation_params.h" | 43 #include "content/common/navigation_params.h" |
44 #include "content/common/service_worker/service_worker_types.h" | 44 #include "content/common/service_worker/service_worker_types.h" |
45 #include "content/common/service_worker/service_worker_utils.h" | |
45 #include "content/common/site_isolation_policy.h" | 46 #include "content/common/site_isolation_policy.h" |
46 #include "content/common/swapped_out_messages.h" | 47 #include "content/common/swapped_out_messages.h" |
47 #include "content/common/view_messages.h" | 48 #include "content/common/view_messages.h" |
48 #include "content/public/common/bindings_policy.h" | 49 #include "content/public/common/bindings_policy.h" |
49 #include "content/public/common/content_constants.h" | 50 #include "content/public/common/content_constants.h" |
50 #include "content/public/common/content_switches.h" | 51 #include "content/public/common/content_switches.h" |
51 #include "content/public/common/context_menu_params.h" | 52 #include "content/public/common/context_menu_params.h" |
52 #include "content/public/common/isolated_world_ids.h" | 53 #include "content/public/common/isolated_world_ids.h" |
53 #include "content/public/common/page_state.h" | 54 #include "content/public/common/page_state.h" |
54 #include "content/public/common/resource_response.h" | 55 #include "content/public/common/resource_response.h" |
(...skipping 2519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2574 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_STALE_OK); | 2575 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_STALE_OK); |
2575 break; | 2576 break; |
2576 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. | 2577 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. |
2577 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); | 2578 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY); |
2578 break; | 2579 break; |
2579 default: | 2580 default: |
2580 NOTREACHED(); | 2581 NOTREACHED(); |
2581 } | 2582 } |
2582 } | 2583 } |
2583 | 2584 |
2584 // Create the serviceworker's per-document network observing object if it | 2585 bool browser_side_navigation = |
2585 // does not exist (When navigation happens within a page, the provider already | 2586 base::CommandLine::ForCurrentProcess()->HasSwitch( |
2586 // exists). | 2587 switches::kEnableBrowserSideNavigation); |
2587 if (!ServiceWorkerNetworkProvider::FromDocumentState( | 2588 |
2588 DocumentState::FromDataSource(datasource))) { | 2589 if (ServiceWorkerNetworkProvider::FromDocumentState( |
2589 ServiceWorkerProviderType provider_type = | 2590 DocumentState::FromDataSource(datasource))) |
2590 SERVICE_WORKER_PROVIDER_FOR_WINDOW; | 2591 return; |
nasko
2015/10/02 22:09:46
nit: Empty line after the return and before the ne
Fabrice (no longer in Chrome)
2015/10/06 17:21:38
Done.
| |
2592 if (browser_side_navigation && content_initiated) | |
nasko
2015/10/02 22:09:46
Can you include a comment why we are returning her
Fabrice (no longer in Chrome)
2015/10/06 17:21:38
Done.
| |
2593 return; | |
2594 | |
2595 ServiceWorkerProviderType provider_type = SERVICE_WORKER_PROVIDER_FOR_WINDOW; | |
2596 scoped_ptr<ServiceWorkerNetworkProvider> network_provider; | |
2597 | |
2598 if (browser_side_navigation) { | |
2599 // PlzNavigate | |
2600 // Retrieve the service_worker_provider_id from the RequestNavigationParams. | |
2601 NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( | |
2602 DocumentState::FromDataSource(datasource)->navigation_state()); | |
2603 int service_worker_provider_id = | |
2604 navigation_state->request_params().service_worker_provider_id; | |
2605 | |
2606 // The browser sets service_worker_provider_id to -1 for sandboxed frames. | |
nasko
2015/10/02 22:09:46
Let's use the symbolic name, not the constant -1.
Fabrice (no longer in Chrome)
2015/10/06 17:21:38
Done.
| |
2607 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) | |
2608 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; | |
2609 else | |
2610 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( | |
nasko
2015/10/02 22:09:45
More than one line body requires {}.
Fabrice (no longer in Chrome)
2015/10/06 17:21:38
Done.
| |
2611 service_worker_provider_id)); | |
2612 | |
2613 // Initalize a new ServiceWorkerNetworkProvider. | |
2614 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( | |
2615 new ServiceWorkerNetworkProvider(routing_id_, provider_type, | |
2616 service_worker_provider_id)); | |
2617 } else { | |
2591 if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) == | 2618 if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) == |
2592 blink::WebSandboxFlags::Origin) { | 2619 blink::WebSandboxFlags::Origin) { |
2593 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; | 2620 provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; |
2594 } | 2621 } |
2595 scoped_ptr<ServiceWorkerNetworkProvider> network_provider( | 2622 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
2596 new ServiceWorkerNetworkProvider(routing_id_, provider_type)); | 2623 new ServiceWorkerNetworkProvider(routing_id_, provider_type)); |
2597 ServiceWorkerNetworkProvider::AttachToDocumentState( | |
2598 DocumentState::FromDataSource(datasource), | |
2599 network_provider.Pass()); | |
2600 } | 2624 } |
2625 | |
2626 ServiceWorkerNetworkProvider::AttachToDocumentState( | |
2627 DocumentState::FromDataSource(datasource), network_provider.Pass()); | |
2601 } | 2628 } |
2602 | 2629 |
2603 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, | 2630 void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, |
2604 double triggering_event_time) { | 2631 double triggering_event_time) { |
2605 DCHECK(!frame_ || frame_ == frame); | 2632 DCHECK(!frame_ || frame_ == frame); |
2606 WebDataSource* ds = frame->provisionalDataSource(); | 2633 WebDataSource* ds = frame->provisionalDataSource(); |
2607 | 2634 |
2608 // In fast/loader/stop-provisional-loads.html, we abort the load before this | 2635 // In fast/loader/stop-provisional-loads.html, we abort the load before this |
2609 // callback is invoked. | 2636 // callback is invoked. |
2610 if (!ds) | 2637 if (!ds) |
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3330 | 3357 |
3331 int provider_id = kInvalidServiceWorkerProviderId; | 3358 int provider_id = kInvalidServiceWorkerProviderId; |
3332 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || | 3359 if (request.frameType() == blink::WebURLRequest::FrameTypeTopLevel || |
3333 request.frameType() == blink::WebURLRequest::FrameTypeNested) { | 3360 request.frameType() == blink::WebURLRequest::FrameTypeNested) { |
3334 // |provisionalDataSource| may be null in some content::ResourceFetcher | 3361 // |provisionalDataSource| may be null in some content::ResourceFetcher |
3335 // use cases, we don't hook those requests. | 3362 // use cases, we don't hook those requests. |
3336 if (frame->provisionalDataSource()) { | 3363 if (frame->provisionalDataSource()) { |
3337 ServiceWorkerNetworkProvider* provider = | 3364 ServiceWorkerNetworkProvider* provider = |
3338 ServiceWorkerNetworkProvider::FromDocumentState( | 3365 ServiceWorkerNetworkProvider::FromDocumentState( |
3339 DocumentState::FromDataSource(frame->provisionalDataSource())); | 3366 DocumentState::FromDataSource(frame->provisionalDataSource())); |
3340 provider_id = provider->provider_id(); | 3367 if (provider) |
3368 provider_id = provider->provider_id(); | |
3341 } | 3369 } |
3342 } else if (frame->dataSource()) { | 3370 } else if (frame->dataSource()) { |
3343 ServiceWorkerNetworkProvider* provider = | 3371 ServiceWorkerNetworkProvider* provider = |
3344 ServiceWorkerNetworkProvider::FromDocumentState( | 3372 ServiceWorkerNetworkProvider::FromDocumentState( |
3345 DocumentState::FromDataSource(frame->dataSource())); | 3373 DocumentState::FromDataSource(frame->dataSource())); |
3346 provider_id = provider->provider_id(); | 3374 if (provider) { |
3347 // Explicitly set the SkipServiceWorker flag here if the renderer process | 3375 provider_id = provider->provider_id(); |
3348 // hasn't received SetControllerServiceWorker message. | 3376 // Explicitly set the SkipServiceWorker flag here if the renderer process |
3349 if (!provider->IsControlledByServiceWorker()) | 3377 // hasn't received SetControllerServiceWorker message. |
3350 request.setSkipServiceWorker(true); | 3378 if (!provider->IsControlledByServiceWorker()) |
3379 request.setSkipServiceWorker(true); | |
3380 } | |
3351 } | 3381 } |
3352 | 3382 |
3353 WebFrame* parent = frame->parent(); | 3383 WebFrame* parent = frame->parent(); |
3354 int parent_routing_id = MSG_ROUTING_NONE; | 3384 int parent_routing_id = MSG_ROUTING_NONE; |
3355 if (!parent) { | 3385 if (!parent) { |
3356 parent_routing_id = -1; | 3386 parent_routing_id = -1; |
3357 } else if (parent->isWebLocalFrame()) { | 3387 } else if (parent->isWebLocalFrame()) { |
3358 parent_routing_id = FromWebFrame(parent)->GetRoutingID(); | 3388 parent_routing_id = FromWebFrame(parent)->GetRoutingID(); |
3359 } else { | 3389 } else { |
3360 parent_routing_id = RenderFrameProxy::FromWebFrame(parent)->routing_id(); | 3390 parent_routing_id = RenderFrameProxy::FromWebFrame(parent)->routing_id(); |
(...skipping 1540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4901 WebDataSource* provisional_data_source = frame_->provisionalDataSource(); | 4931 WebDataSource* provisional_data_source = frame_->provisionalDataSource(); |
4902 WebDataSource* current_data_source = frame_->dataSource(); | 4932 WebDataSource* current_data_source = frame_->dataSource(); |
4903 WebDataSource* data_source = | 4933 WebDataSource* data_source = |
4904 provisional_data_source ? provisional_data_source : current_data_source; | 4934 provisional_data_source ? provisional_data_source : current_data_source; |
4905 | 4935 |
4906 // The current entry can only be replaced if there already is an entry in the | 4936 // The current entry can only be replaced if there already is an entry in the |
4907 // history list. | 4937 // history list. |
4908 if (data_source && render_view_->history_list_length_ > 0) { | 4938 if (data_source && render_view_->history_list_length_ > 0) { |
4909 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); | 4939 should_replace_current_entry = data_source->replacesCurrentHistoryItem(); |
4910 } | 4940 } |
4941 | |
4942 DCHECK_EQ(FETCH_REQUEST_MODE_SAME_ORIGIN, | |
nasko
2015/10/02 22:09:45
Let's put a comment above all of the DCHECKs to ex
Fabrice (no longer in Chrome)
2015/10/06 17:21:38
Done.
| |
4943 GetFetchRequestModeForWebURLRequest(*request)); | |
4944 DCHECK_EQ(FETCH_CREDENTIALS_MODE_INCLUDE, | |
4945 GetFetchCredentialsModeForWebURLRequest(*request)); | |
4946 DCHECK(GetFetchRedirectModeForWebURLRequest(*request) == | |
4947 FetchRedirectMode::MANUAL_MODE); | |
4948 DCHECK_IMPLIES(!frame_->parent(), | |
4949 GetRequestContextFrameTypeForWebURLRequest(*request) == | |
4950 REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL); | |
4951 DCHECK_IMPLIES(frame_->parent(), | |
4952 GetRequestContextFrameTypeForWebURLRequest(*request) == | |
4953 REQUEST_CONTEXT_FRAME_TYPE_NESTED); | |
4954 | |
4911 Send(new FrameHostMsg_BeginNavigation( | 4955 Send(new FrameHostMsg_BeginNavigation( |
4912 routing_id_, | 4956 routing_id_, |
4913 MakeCommonNavigationParams(request, should_replace_current_entry), | 4957 MakeCommonNavigationParams(request, should_replace_current_entry), |
4914 BeginNavigationParams( | 4958 BeginNavigationParams( |
4915 request->httpMethod().latin1(), GetWebURLRequestHeaders(*request), | 4959 request->httpMethod().latin1(), GetWebURLRequestHeaders(*request), |
4916 GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture()), | 4960 GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture(), |
4961 request->skipServiceWorker(), | |
4962 GetRequestContextTypeForWebURLRequest(*request)), | |
4917 GetRequestBodyForWebURLRequest(*request))); | 4963 GetRequestBodyForWebURLRequest(*request))); |
4918 } | 4964 } |
4919 | 4965 |
4920 void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params, | 4966 void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params, |
4921 WebFrame* frame) { | 4967 WebFrame* frame) { |
4922 // A loadData request with a specified base URL. | 4968 // A loadData request with a specified base URL. |
4923 std::string mime_type, charset, data; | 4969 std::string mime_type, charset, data; |
4924 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { | 4970 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { |
4925 const GURL base_url = params.base_url_for_data_url.is_empty() ? | 4971 const GURL base_url = params.base_url_for_data_url.is_empty() ? |
4926 params.url : params.base_url_for_data_url; | 4972 params.url : params.base_url_for_data_url; |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5178 mojo::ServiceProviderPtr service_provider; | 5224 mojo::ServiceProviderPtr service_provider; |
5179 mojo::URLRequestPtr request(mojo::URLRequest::New()); | 5225 mojo::URLRequestPtr request(mojo::URLRequest::New()); |
5180 request->url = mojo::String::From(url); | 5226 request->url = mojo::String::From(url); |
5181 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), | 5227 mojo_shell_->ConnectToApplication(request.Pass(), GetProxy(&service_provider), |
5182 nullptr, nullptr, | 5228 nullptr, nullptr, |
5183 base::Bind(&OnGotContentHandlerID)); | 5229 base::Bind(&OnGotContentHandlerID)); |
5184 return service_provider.Pass(); | 5230 return service_provider.Pass(); |
5185 } | 5231 } |
5186 | 5232 |
5187 } // namespace content | 5233 } // namespace content |
OLD | NEW |