Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(865)

Unified Diff: content/browser/service_worker/service_worker_version.h

Issue 2034663002: ServiceWorker: Keep the worker alive until FetchEvent.waitUntil settles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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));
}

Powered by Google App Engine
This is Rietveld 408576698