| 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 0ef0e80d9a21c432c8c975c48854fc6e9cf6f47f..b15a8ab1f55ffa20369a1929a98889bffd026c47 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,40 @@ 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 before calling this
|
| + // method.
|
| + // 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
|
| @@ -351,6 +372,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;
|
| @@ -384,6 +406,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
|
| @@ -428,6 +451,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
|
| @@ -706,32 +731,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));
|
| }
|
|
|
|
|