Chromium Code Reviews| Index: content/browser/service_worker/service_worker_version.h |
| diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h |
| index 4dceb90a723dcc2fca673fb95667b0fb7afd8a37..16623a150bd13ce71ad5f1955542b134e4969d4e 100644 |
| --- a/content/browser/service_worker/service_worker_version.h |
| +++ b/content/browser/service_worker/service_worker_version.h |
| @@ -66,7 +66,7 @@ class CONTENT_EXPORT ServiceWorkerVersion |
| : NON_EXPORTED_BASE(public base::RefCounted<ServiceWorkerVersion>), |
| public EmbeddedWorkerInstance::Listener { |
| public: |
| - typedef base::Callback<void(ServiceWorkerStatusCode)> StatusCallback; |
| + using StatusCallback = base::Callback<void(ServiceWorkerStatusCode)>; |
| // Current version status; some of the status (e.g. INSTALLED and ACTIVATED) |
| // should be persisted unlike running status. |
| @@ -226,19 +226,39 @@ class CONTENT_EXPORT ServiceWorkerVersion |
| template <typename Interface> |
| base::WeakPtr<Interface> GetMojoServiceForRequest(int request_id); |
| - // Dispatches an event. If dispatching the event fails, the error callback |
| - // associated with the |request_id| is called. Any messages sent back in |
| - // response to this event are passed on to the response |callback|. |
| + // Dispatches an event. If dispatching the event fails, all of the error |
| + // callbacks that were associated with |request_ids| via StartRequest are |
| + // called. |
| + // Use RegisterRequestCallback or RegisterSimpleRequest to register a callback |
| + // to receive messages sent back in response to this event. |
|
falken
2016/06/22 01:27:31
Should probably mention that the callback should b
shimazu
2016/06/22 05:41:27
Done.
|
| + // This must be called when the worker is running. |
| + void DispatchEvent(const std::vector<int>& request_ids, |
| + const IPC::Message& message); |
| + |
| + // This method registers a callback to receive messages sent back from the |
| + // service worker in response to |request_id|. |
| // ResponseMessage is the type of the IPC message that is used for the |
| // response, and its first argument MUST be the request_id. |
| - // This must be called when the worker is running. |
| + // Callback registration should be done once for one request_id. |
| template <typename ResponseMessage, typename ResponseCallbackType> |
| - void DispatchEvent(int request_id, |
| - const IPC::Message& message, |
| - const ResponseCallbackType& callback); |
| + void RegisterRequestCallback(int request_id, |
| + const ResponseCallbackType& callback); |
| + |
| + // You can use this method instead of RegisterRequestCallback when the |
| + // response message sent back from the service worker consists of just |
| + // a request_id and a blink::WebServiceWorkerEventResult field. The result |
| + // field is converted to a ServiceWorkerStatusCode and passed to the error |
| + // handler associated with the request_id which is registered by StartRequest. |
| + // Additionally if you use this method, FinishRequest will be called before |
| + // passing the reply to the callback. |
| + // Callback registration should be done once for one request_id. |
| + template <typename ResponseMessage> |
| + void RegisterSimpleRequest(int request_id); |
| - // For simple events where the full functionality of DispatchEvent is not |
| - // needed, this method can be used instead. The ResponseMessage must consist |
| + // This is a wrapper method equivalent to one RegisterSimpleRequest and one |
| + // DispatchEvent. For simple events where the full functionality of |
| + // RegisterRequestCallback/DispatchEvent is not needed, this method can be |
| + // used instead. The ResponseMessage must consist |
| // of just a request_id and a blink::WebServiceWorkerEventResult field. The |
| // result is converted to a ServiceWorkerStatusCode and passed to the error |
| // handler associated with the request. Additionally this methods calls |
| @@ -353,6 +373,7 @@ class CONTENT_EXPORT ServiceWorkerVersion |
| FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, |
| RequestCustomizedTimeoutKill); |
| FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, MixedRequestTimeouts); |
| + FRIEND_TEST_ALL_PREFIXES(ServiceWorkerURLRequestJobTest, EarlyResponse); |
| class Metrics; |
| class PingController; |
| @@ -386,6 +407,7 @@ class CONTENT_EXPORT ServiceWorkerVersion |
| // this would be Interface::Name_ for some mojo interface. |
| const char* mojo_service = nullptr; |
| std::unique_ptr<EmbeddedWorkerInstance::Listener> listener; |
| + bool is_dispatched = false; |
| }; |
| // Base class to enable storing a list of mojo interface pointers for |
| @@ -430,6 +452,8 @@ class CONTENT_EXPORT ServiceWorkerVersion |
| std::priority_queue<RequestInfo, |
| std::vector<RequestInfo>, |
| std::greater<RequestInfo>>; |
| + using WebStatusCallback = |
| + base::Callback<void(int, blink::WebServiceWorkerEventResult)>; |
| // EmbeddedWorkerInstance Listener implementation which calls a callback |
| // on receiving a particular IPC message. ResponseMessage is the type of |
| @@ -708,32 +732,30 @@ base::WeakPtr<Interface> ServiceWorkerVersion::GetMojoServiceForRequest( |
| return service->GetWeakPtr(); |
| } |
| +template <typename ResponseMessage> |
| +void ServiceWorkerVersion::DispatchSimpleEvent(int request_id, |
| + const IPC::Message& message) { |
| + RegisterSimpleRequest<ResponseMessage>(request_id); |
| + DispatchEvent({request_id}, message); |
| +} |
| + |
| template <typename ResponseMessage, typename ResponseCallbackType> |
| -void ServiceWorkerVersion::DispatchEvent(int request_id, |
| - const IPC::Message& message, |
| - const ResponseCallbackType& callback) { |
| - DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status()); |
| +void ServiceWorkerVersion::RegisterRequestCallback( |
| + int request_id, |
| + const ResponseCallbackType& callback) { |
| PendingRequest<StatusCallback>* request = custom_requests_.Lookup(request_id); |
| DCHECK(request) << "Invalid request id"; |
| - DCHECK(!request->listener) << "Request already dispatched an IPC event"; |
| - |
| - ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); |
| - if (status != SERVICE_WORKER_OK) { |
| - base::ThreadTaskRunnerHandle::Get()->PostTask( |
| - FROM_HERE, base::Bind(request->callback, status)); |
| - custom_requests_.Remove(request_id); |
| - } else { |
| - request->listener.reset( |
| - new EventResponseHandler<ResponseMessage, ResponseCallbackType>( |
| - embedded_worker()->AsWeakPtr(), request_id, callback)); |
| - } |
| + DCHECK(!request->listener) << "Callback was already registered"; |
| + DCHECK(!request->is_dispatched) << "Request already dispatched an IPC event"; |
| + request->listener.reset( |
| + new EventResponseHandler<ResponseMessage, ResponseCallbackType>( |
| + embedded_worker()->AsWeakPtr(), request_id, callback)); |
| } |
| template <typename ResponseMessage> |
| -void ServiceWorkerVersion::DispatchSimpleEvent(int request_id, |
| - const IPC::Message& message) { |
| - DispatchEvent<ResponseMessage>( |
| - request_id, message, |
| +void ServiceWorkerVersion::RegisterSimpleRequest(int request_id) { |
| + RegisterRequestCallback<ResponseMessage>( |
| + request_id, |
| base::Bind(&ServiceWorkerVersion::OnSimpleEventResponse, this)); |
| } |