Chromium Code Reviews| Index: content/renderer/render_frame_impl.cc |
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
| index 045540defef435cabb1f3e97d3223776c42107e0..c795f3cffa1b3ca540dc0104493133cb3d6cb9d6 100644 |
| --- a/content/renderer/render_frame_impl.cc |
| +++ b/content/renderer/render_frame_impl.cc |
| @@ -42,6 +42,7 @@ |
| #include "content/common/input_messages.h" |
| #include "content/common/navigation_params.h" |
| #include "content/common/service_worker/service_worker_types.h" |
| +#include "content/common/service_worker/service_worker_utils.h" |
| #include "content/common/site_isolation_policy.h" |
| #include "content/common/swapped_out_messages.h" |
| #include "content/common/view_messages.h" |
| @@ -2581,23 +2582,49 @@ void RenderFrameImpl::didCreateDataSource(blink::WebLocalFrame* frame, |
| } |
| } |
| - // Create the serviceworker's per-document network observing object if it |
| - // does not exist (When navigation happens within a page, the provider already |
| - // exists). |
| - if (!ServiceWorkerNetworkProvider::FromDocumentState( |
| - DocumentState::FromDataSource(datasource))) { |
| - ServiceWorkerProviderType provider_type = |
| - SERVICE_WORKER_PROVIDER_FOR_WINDOW; |
| + bool browser_side_navigation = |
| + base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableBrowserSideNavigation); |
| + |
| + if (ServiceWorkerNetworkProvider::FromDocumentState( |
| + DocumentState::FromDataSource(datasource))) |
| + 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.
|
| + 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.
|
| + return; |
| + |
| + ServiceWorkerProviderType provider_type = SERVICE_WORKER_PROVIDER_FOR_WINDOW; |
| + scoped_ptr<ServiceWorkerNetworkProvider> network_provider; |
| + |
| + if (browser_side_navigation) { |
| + // PlzNavigate |
| + // Retrieve the service_worker_provider_id from the RequestNavigationParams. |
| + NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( |
| + DocumentState::FromDataSource(datasource)->navigation_state()); |
| + int service_worker_provider_id = |
| + navigation_state->request_params().service_worker_provider_id; |
| + |
| + // 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.
|
| + if (service_worker_provider_id == kInvalidServiceWorkerProviderId) |
| + provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; |
| + else |
| + 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.
|
| + service_worker_provider_id)); |
| + |
| + // Initalize a new ServiceWorkerNetworkProvider. |
| + network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| + new ServiceWorkerNetworkProvider(routing_id_, provider_type, |
| + service_worker_provider_id)); |
| + } else { |
| if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) == |
| blink::WebSandboxFlags::Origin) { |
| provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; |
| } |
| - scoped_ptr<ServiceWorkerNetworkProvider> network_provider( |
| + network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| new ServiceWorkerNetworkProvider(routing_id_, provider_type)); |
| - ServiceWorkerNetworkProvider::AttachToDocumentState( |
| - DocumentState::FromDataSource(datasource), |
| - network_provider.Pass()); |
| } |
| + |
| + ServiceWorkerNetworkProvider::AttachToDocumentState( |
| + DocumentState::FromDataSource(datasource), network_provider.Pass()); |
| } |
| void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, |
| @@ -3337,17 +3364,20 @@ void RenderFrameImpl::willSendRequest( |
| ServiceWorkerNetworkProvider* provider = |
| ServiceWorkerNetworkProvider::FromDocumentState( |
| DocumentState::FromDataSource(frame->provisionalDataSource())); |
| - provider_id = provider->provider_id(); |
| + if (provider) |
| + provider_id = provider->provider_id(); |
| } |
| } else if (frame->dataSource()) { |
| ServiceWorkerNetworkProvider* provider = |
| ServiceWorkerNetworkProvider::FromDocumentState( |
| DocumentState::FromDataSource(frame->dataSource())); |
| - provider_id = provider->provider_id(); |
| - // Explicitly set the SkipServiceWorker flag here if the renderer process |
| - // hasn't received SetControllerServiceWorker message. |
| - if (!provider->IsControlledByServiceWorker()) |
| - request.setSkipServiceWorker(true); |
| + if (provider) { |
| + provider_id = provider->provider_id(); |
| + // Explicitly set the SkipServiceWorker flag here if the renderer process |
| + // hasn't received SetControllerServiceWorker message. |
| + if (!provider->IsControlledByServiceWorker()) |
| + request.setSkipServiceWorker(true); |
| + } |
| } |
| WebFrame* parent = frame->parent(); |
| @@ -4908,12 +4938,28 @@ void RenderFrameImpl::BeginNavigation(blink::WebURLRequest* request) { |
| if (data_source && render_view_->history_list_length_ > 0) { |
| should_replace_current_entry = data_source->replacesCurrentHistoryItem(); |
| } |
| + |
| + 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.
|
| + GetFetchRequestModeForWebURLRequest(*request)); |
| + DCHECK_EQ(FETCH_CREDENTIALS_MODE_INCLUDE, |
| + GetFetchCredentialsModeForWebURLRequest(*request)); |
| + DCHECK(GetFetchRedirectModeForWebURLRequest(*request) == |
| + FetchRedirectMode::MANUAL_MODE); |
| + DCHECK_IMPLIES(!frame_->parent(), |
| + GetRequestContextFrameTypeForWebURLRequest(*request) == |
| + REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL); |
| + DCHECK_IMPLIES(frame_->parent(), |
| + GetRequestContextFrameTypeForWebURLRequest(*request) == |
| + REQUEST_CONTEXT_FRAME_TYPE_NESTED); |
| + |
| Send(new FrameHostMsg_BeginNavigation( |
| routing_id_, |
| MakeCommonNavigationParams(request, should_replace_current_entry), |
| BeginNavigationParams( |
| request->httpMethod().latin1(), GetWebURLRequestHeaders(*request), |
| - GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture()), |
| + GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture(), |
| + request->skipServiceWorker(), |
| + GetRequestContextTypeForWebURLRequest(*request)), |
| GetRequestBodyForWebURLRequest(*request))); |
| } |