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. |