Chromium Code Reviews| Index: content/renderer/service_worker/service_worker_context_client.cc |
| diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc |
| index 99d447e3d45236bcab070346e859616d8a1b5336..50b7c5d201f73aa78f435bdbe134683b20d0ca71 100644 |
| --- a/content/renderer/service_worker/service_worker_context_client.cc |
| +++ b/content/renderer/service_worker/service_worker_context_client.cc |
| @@ -31,7 +31,9 @@ |
| #include "content/common/devtools_messages.h" |
| #include "content/common/message_port_messages.h" |
| #include "content/common/service_worker/embedded_worker_messages.h" |
| +#include "content/common/service_worker/fetch_event_dispatcher.mojom.h" |
| #include "content/common/service_worker/service_worker_messages.h" |
| +#include "content/common/service_worker/service_worker_status_code.h" |
| #include "content/public/common/push_event_payload.h" |
| #include "content/public/common/referrer.h" |
| #include "content/public/renderer/content_renderer_client.h" |
| @@ -44,6 +46,7 @@ |
| #include "ipc/ipc_message.h" |
| #include "ipc/ipc_message_macros.h" |
| #include "mojo/public/cpp/bindings/interface_request.h" |
| +#include "mojo/public/cpp/bindings/strong_binding.h" |
| #include "services/shell/public/cpp/interface_provider.h" |
| #include "services/shell/public/cpp/interface_registry.h" |
| #include "third_party/WebKit/public/platform/URLConversion.h" |
| @@ -180,6 +183,10 @@ struct ServiceWorkerContextClient::WorkerContextData { |
| IDMap<const base::Callback<void(blink::mojom::ServiceWorkerEventStatus, |
| base::Time /* dispatch_event_time */)>, |
| IDMapOwnPointer>; |
| + using FetchEventCallbacksMap = |
| + IDMap<const base::Callback<void(ServiceWorkerStatusCode, |
| + base::Time /* dispatch_event_time */)>, |
| + IDMapOwnPointer>; |
| explicit WorkerContextData(ServiceWorkerContextClient* owner) |
| : weak_factory(owner), proxy_weak_factory(owner->proxy_) {} |
| @@ -203,6 +210,9 @@ struct ServiceWorkerContextClient::WorkerContextData { |
| // Pending callbacks for Background Sync Events |
| SyncEventCallbacksMap sync_event_callbacks; |
| + // Pending callbacks for Fetch Events |
| + FetchEventCallbacksMap fetch_event_callbacks; |
| + |
| shell::InterfaceRegistry interface_registry; |
| shell::InterfaceProvider remote_interfaces; |
| @@ -211,6 +221,34 @@ struct ServiceWorkerContextClient::WorkerContextData { |
| base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; |
| }; |
| +class ServiceWorkerContextClient::FetchEventDispatcherImpl |
| + : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { |
| + public: |
| + static void Create(mojom::FetchEventDispatcherRequest request) { |
| + mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(), |
| + std::move(request)); |
| + } |
| + |
| + FetchEventDispatcherImpl() {} |
| + |
| + ~FetchEventDispatcherImpl() override {} |
| + |
| + void DispatchFetchEvent(int response_id, |
| + const ServiceWorkerFetchRequest& request, |
| + const DispatchFetchEventCallback& callback) override { |
| + ServiceWorkerContextClient* client = |
| + ServiceWorkerContextClient::ThreadSpecificInstance(); |
| + if (!client) { |
| + callback.Run(SERVICE_WORKER_ERROR_ABORT, base::Time::Now()); |
| + return; |
| + } |
| + client->DispatchFetchEvent(response_id, request, callback); |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(FetchEventDispatcherImpl); |
| +}; |
| + |
| ServiceWorkerContextClient* |
| ServiceWorkerContextClient::ThreadSpecificInstance() { |
| return g_worker_client_tls.Pointer()->Get(); |
| @@ -252,7 +290,6 @@ void ServiceWorkerContextClient::OnMessageReceived( |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ActivateEvent, OnActivateEvent) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ExtendableMessageEvent, |
| OnExtendableMessageEvent) |
| - IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_NotificationClickEvent, |
| OnNotificationClickEvent) |
| @@ -385,6 +422,8 @@ void ServiceWorkerContextClient::workerContextStarted( |
| // Register Mojo interfaces. |
| context_->interface_registry.AddInterface( |
| base::Bind(&BackgroundSyncClientImpl::Create)); |
| + context_->interface_registry.AddInterface( |
| + base::Bind(&FetchEventDispatcherImpl::Create)); |
| SetRegistrationInServiceWorkerGlobalScope(registration_info, version_attrs); |
| @@ -552,9 +591,16 @@ void ServiceWorkerContextClient::didHandleFetchEvent( |
| int event_finish_id, |
| blink::WebServiceWorkerEventResult result, |
| double event_dispatch_time) { |
| - Send(new ServiceWorkerHostMsg_FetchEventFinished( |
| - GetRoutingID(), event_finish_id, result, |
| - base::Time::FromDoubleT(event_dispatch_time))); |
| + const FetchCallback* callback = |
| + context_->fetch_event_callbacks.Lookup(event_finish_id); |
| + if (!callback) |
| + return; |
| + |
| + callback->Run(result == blink::WebServiceWorkerEventResultCompleted |
| + ? SERVICE_WORKER_OK |
| + : SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, |
| + base::Time::FromDoubleT(event_dispatch_time)); |
| + context_->fetch_event_callbacks.Remove(event_finish_id); |
| } |
| void ServiceWorkerContextClient::didHandleNotificationClickEvent( |
| @@ -794,13 +840,16 @@ void ServiceWorkerContextClient::OnInstallEvent(int request_id) { |
| proxy_->dispatchInstallEvent(request_id); |
| } |
| -void ServiceWorkerContextClient::OnFetchEvent( |
| +void ServiceWorkerContextClient::DispatchFetchEvent( |
| int response_id, |
| - int event_finish_id, |
| - const ServiceWorkerFetchRequest& request) { |
| + const ServiceWorkerFetchRequest& request, |
| + const FetchCallback& callback) { |
| blink::WebServiceWorkerRequest webRequest; |
| TRACE_EVENT0("ServiceWorker", |
| - "ServiceWorkerContextClient::OnFetchEvent"); |
| + "ServiceWorkerContextClient::DispatchFetchEvent"); |
| + int event_finish_id = |
|
dcheng
2016/10/04 07:19:53
Nit: I don't have a better idea, but I found it a
horo
2016/10/04 12:16:40
I'm thinking about changing all to fetch_event_id.
|
| + context_->fetch_event_callbacks.Add(new FetchCallback(callback)); |
| + |
| webRequest.setURL(blink::WebURL(request.url)); |
| webRequest.setMethod(blink::WebString::fromUTF8(request.method)); |
| for (ServiceWorkerHeaderMap::const_iterator it = request.headers.begin(); |