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 8e044057fbe78485f1770d1631295832a1c25df8..7d668a4939666ee64186cec687231153350a05b1 100644 |
| --- a/content/renderer/render_frame_impl.cc |
| +++ b/content/renderer/render_frame_impl.cc |
| @@ -187,6 +187,7 @@ |
| #include "third_party/WebKit/public/platform/WebURLError.h" |
| #include "third_party/WebKit/public/platform/WebURLResponse.h" |
| #include "third_party/WebKit/public/platform/WebVector.h" |
| +#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerNetworkProvider.h" |
| #include "third_party/WebKit/public/platform/scheduler/renderer/renderer_scheduler.h" |
| #include "third_party/WebKit/public/web/WebColorSuggestion.h" |
| #include "third_party/WebKit/public/web/WebConsoleMessage.h" |
| @@ -2982,16 +2983,14 @@ RenderFrameImpl::createServiceWorkerProvider() { |
| if (!ChildThreadImpl::current()) |
| return nullptr; // May be null in some tests. |
| ServiceWorkerNetworkProvider* provider = |
| - ServiceWorkerNetworkProvider::FromDocumentState( |
| - DocumentState::FromDataSource(frame_->dataSource())); |
| - DCHECK(provider); |
| + ServiceWorkerNetworkProvider::GetInwardProviderForNavigation( |
| + frame_->dataSource()->getServiceWorkerNetworkProvider()); |
| if (!provider->context()) { |
| // The context can be null when the frame is sandboxed. |
| return nullptr; |
| } |
| return new WebServiceWorkerProviderImpl( |
| - ChildThreadImpl::current()->thread_safe_sender(), |
| - provider->context()); |
| + ChildThreadImpl::current()->thread_safe_sender(), provider->context()); |
| } |
| void RenderFrameImpl::didAccessInitialDocument() { |
| @@ -3413,12 +3412,10 @@ 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))) |
| + if (datasource->getServiceWorkerNetworkProvider()) |
| return; |
| - ServiceWorkerNetworkProvider::AttachToDocumentState( |
| - DocumentState::FromDataSource(datasource), |
| + datasource->setServiceWorkerNetworkProvider( |
| ServiceWorkerNetworkProvider::CreateForNavigation( |
| routing_id_, navigation_state->request_params(), frame, |
| content_initiated)); |
| @@ -4275,38 +4272,6 @@ void RenderFrameImpl::willSendRequest(blink::WebLocalFrame* frame, |
| // when it is re-created in the new process. |
| bool should_replace_current_entry = data_source->replacesCurrentHistoryItem(); |
| - int provider_id = kInvalidServiceWorkerProviderId; |
| - if (request.getFrameType() == blink::WebURLRequest::FrameTypeTopLevel || |
| - request.getFrameType() == blink::WebURLRequest::FrameTypeNested) { |
| - // |provisionalDataSource| may be null in some content::ResourceFetcher |
| - // use cases, we don't hook those requests. |
| - if (frame->provisionalDataSource()) { |
| - 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(); |
| - // If the provider does not have a controller at this point, the renderer |
| - // expects the request to never be handled by a controlling service worker, |
| - // so set the ServiceWorkerMode to skip local workers here. Otherwise, a |
| - // service worker that is in the process of becoming the controller (i.e., |
| - // via claim()) on the browser-side could handle the request and break |
| - // the assumptions of the renderer. |
| - if (!provider->IsControlledByServiceWorker() && |
| - request.getServiceWorkerMode() != |
| - blink::WebURLRequest::ServiceWorkerMode::None) { |
| - request.setServiceWorkerMode( |
| - blink::WebURLRequest::ServiceWorkerMode::Foreign); |
| - } |
| - } |
| - |
| WebFrame* parent = frame->parent(); |
| int parent_routing_id = parent ? GetRoutingIdForFrameOrProxy(parent) : -1; |
| @@ -4324,7 +4289,6 @@ void RenderFrameImpl::willSendRequest(blink::WebLocalFrame* frame, |
| navigation_state->common_params().allow_download); |
| extra_data->set_transition_type(transition_type); |
| extra_data->set_should_replace_current_entry(should_replace_current_entry); |
| - extra_data->set_service_worker_provider_id(provider_id); |
| extra_data->set_stream_override(std::move(stream_override)); |
| bool is_prefetch = |
| GetContentClient()->renderer()->IsPrefetchOnly(this, request); |
| @@ -4357,6 +4321,38 @@ void RenderFrameImpl::willSendRequest(blink::WebLocalFrame* frame, |
| request.setExtraData(extra_data); |
| + // Initializes service worker related request info. |
| + // This must be done after we set extra data. |
|
falken
2017/03/10 04:26:00
Could you also write (briefly) why the order matte
kinuko
2017/03/10 05:52:28
Revised to make it order-independent.
|
| + if (request.getFrameType() == blink::WebURLRequest::FrameTypeTopLevel || |
| + request.getFrameType() == blink::WebURLRequest::FrameTypeNested) { |
| + // |provisionalDataSource| may be null in some content::ResourceFetcher |
| + // use cases, we don't hook those requests. |
| + if (frame->provisionalDataSource()) { |
| + blink::WebServiceWorkerNetworkProvider* provider = |
| + frame->provisionalDataSource()->getServiceWorkerNetworkProvider(); |
| + DCHECK(provider); |
| + provider->willSendRequest(request); |
| + } |
| + } else if (frame->dataSource()) { |
| + blink::WebServiceWorkerNetworkProvider* provider = |
| + frame->dataSource()->getServiceWorkerNetworkProvider(); |
| + DCHECK(provider); |
| + provider->willSendRequest(request); |
| + |
| + // If the provider does not have a controller at this point, the renderer |
| + // expects the request to never be handled by a controlling service worker, |
| + // so set the ServiceWorkerMode to skip local workers here. Otherwise, a |
| + // service worker that is in the process of becoming the controller (i.e., |
| + // via claim()) on the browser-side could handle the request and break |
| + // the assumptions of the renderer. |
| + if (!provider->isControlledByServiceWorker() && |
| + request.getServiceWorkerMode() != |
| + blink::WebURLRequest::ServiceWorkerMode::None) { |
| + request.setServiceWorkerMode( |
| + blink::WebURLRequest::ServiceWorkerMode::Foreign); |
| + } |
| + } |
| + |
| if (request.getPreviewsState() == WebURLRequest::PreviewsUnspecified) { |
| if (is_main_frame_ && !navigation_state->request_committed()) { |
| request.setPreviewsState(static_cast<WebURLRequest::PreviewsState>( |
| @@ -4656,22 +4652,6 @@ blink::WebScreenOrientationClient* |
| return screen_orientation_dispatcher_; |
| } |
| -bool RenderFrameImpl::isControlledByServiceWorker(WebDataSource& data_source) { |
| - ServiceWorkerNetworkProvider* provider = |
| - ServiceWorkerNetworkProvider::FromDocumentState( |
| - DocumentState::FromDataSource(&data_source)); |
| - return provider->IsControlledByServiceWorker(); |
| -} |
| - |
| -int64_t RenderFrameImpl::serviceWorkerID(WebDataSource& data_source) { |
| - ServiceWorkerNetworkProvider* provider = |
| - ServiceWorkerNetworkProvider::FromDocumentState( |
| - DocumentState::FromDataSource(&data_source)); |
| - if (provider->context() && provider->context()->controller()) |
| - return provider->context()->controller()->version_id(); |
| - return kInvalidServiceWorkerVersionId; |
| -} |
| - |
| void RenderFrameImpl::postAccessibilityEvent(const blink::WebAXObject& obj, |
| blink::WebAXEvent event) { |
| HandleWebAccessibilityEvent(obj, event); |