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 aaccc4354fb359f545106b1e21036860f2f98372..d69ee9d54d08d976ccae0362568fbcb699b62816 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" |
| @@ -2590,20 +2591,61 @@ 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; |
| - if ((frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) == |
| - blink::WebSandboxFlags::Origin) { |
| - provider_type = SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME; |
| + if (ServiceWorkerNetworkProvider::FromDocumentState( |
| + DocumentState::FromDataSource(datasource))) |
| + return; |
| + |
| + bool browser_side_navigation = |
| + base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableBrowserSideNavigation); |
| + scoped_ptr<ServiceWorkerNetworkProvider> network_provider; |
| + |
| + // Determine if a ServiceWorkerNetworkProvider should be created and properly |
| + // initialized for the navigation. A default ServiceWorkerNetworkProvider |
| + // will always be created since it is expected in a certain number of places, |
| + // however it will have an invalid id. |
| + // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if |
| + // it already created the SeviceWorkerProviderHost. |
| + bool should_create_provider_for_window = false; |
| + int service_worker_provider_id = kInvalidServiceWorkerProviderId; |
| + if (browser_side_navigation && !content_initiated) { |
| + NavigationStateImpl* navigation_state = static_cast<NavigationStateImpl*>( |
| + DocumentState::FromDataSource(datasource)->navigation_state()); |
| + should_create_provider_for_window = |
| + navigation_state->request_params().should_create_service_worker; |
| + service_worker_provider_id = |
| + navigation_state->request_params().service_worker_provider_id; |
| + DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( |
| + service_worker_provider_id) || |
| + service_worker_provider_id == kInvalidServiceWorkerProviderId); |
| + } else { |
| + should_create_provider_for_window = |
| + (frame->effectiveSandboxFlags() & blink::WebSandboxFlags::Origin) != |
| + blink::WebSandboxFlags::Origin; |
| + } |
| + |
| + // Now create the ServiceWorkerNetworkProvider (with invalid id if needed). |
| + if (should_create_provider_for_window) { |
| + if (service_worker_provider_id == kInvalidServiceWorkerProviderId) { |
| + network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| + new ServiceWorkerNetworkProvider(routing_id_, |
| + SERVICE_WORKER_PROVIDER_FOR_WINDOW)); |
| + } else { |
| + CHECK(browser_side_navigation); |
| + DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId( |
| + service_worker_provider_id)); |
| + network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| + new ServiceWorkerNetworkProvider(routing_id_, |
| + SERVICE_WORKER_PROVIDER_FOR_WINDOW, |
| + service_worker_provider_id)); |
| } |
| - scoped_ptr<ServiceWorkerNetworkProvider> network_provider( |
| - new ServiceWorkerNetworkProvider(routing_id_, provider_type)); |
| - ServiceWorkerNetworkProvider::AttachToDocumentState( |
| - DocumentState::FromDataSource(datasource), |
| - network_provider.Pass()); |
| + } else { |
| + network_provider = scoped_ptr<ServiceWorkerNetworkProvider>( |
| + new ServiceWorkerNetworkProvider()); |
| } |
|
kinuko
2015/10/23 02:37:45
Could this part be maybe factored out as a utility
clamy
2015/10/27 14:46:13
Done. This is now a static method in ServiceWorker
|
| + |
| + ServiceWorkerNetworkProvider::AttachToDocumentState( |
| + DocumentState::FromDataSource(datasource), network_provider.Pass()); |
| } |
| void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, |
| @@ -3352,12 +3394,14 @@ void RenderFrameImpl::willSendRequest( |
| ServiceWorkerNetworkProvider* provider = |
| ServiceWorkerNetworkProvider::FromDocumentState( |
| DocumentState::FromDataSource(frame->provisionalDataSource())); |
| + DCHECK(provider); |
| provider_id = provider->provider_id(); |
| } |
| } else if (frame->dataSource()) { |
| ServiceWorkerNetworkProvider* provider = |
| ServiceWorkerNetworkProvider::FromDocumentState( |
| DocumentState::FromDataSource(frame->dataSource())); |
| + DCHECK(provider); |
| provider_id = provider->provider_id(); |
| // Explicitly set the SkipServiceWorker flag here if the renderer process |
| // hasn't received SetControllerServiceWorker message. |