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 8e2b42104c655f7928c825f52aa1059c31fd9fe6..66516d17981a8071134e2deb87865f40c7a594b1 100644 |
--- a/content/browser/service_worker/service_worker_version.h |
+++ b/content/browser/service_worker/service_worker_version.h |
@@ -571,8 +571,14 @@ class CONTENT_EXPORT ServiceWorkerVersion |
// with same arguments as the IPC message. |
// Additionally only calls the callback for messages with a specific request |
// id, which must be the first argument of the IPC message. |
- template <typename ResponseMessage, typename CallbackType> |
- class EventResponseHandler : public EmbeddedWorkerInstance::Listener { |
+ template <typename ResponseMessage, |
+ typename CallbackType, |
+ typename Signature = typename CallbackType::RunType> |
+ class EventResponseHandler; |
+ |
+ template <typename ResponseMessage, typename CallbackType, typename... Args> |
+ class EventResponseHandler<ResponseMessage, CallbackType, void(Args...)> |
+ : public EmbeddedWorkerInstance::Listener { |
public: |
EventResponseHandler(const base::WeakPtr<EmbeddedWorkerInstance>& worker, |
int request_id, |
@@ -587,6 +593,10 @@ class CONTENT_EXPORT ServiceWorkerVersion |
bool OnMessageReceived(const IPC::Message& message) override; |
private: |
+ void RunCallback(Args... args) { |
+ callback_.Run(std::forward<Args>(args)...); |
+ } |
+ |
base::WeakPtr<EmbeddedWorkerInstance> const worker_; |
const int request_id_; |
const CallbackType callback_; |
@@ -895,9 +905,11 @@ void ServiceWorkerVersion::RegisterSimpleRequest(int request_id) { |
base::Bind(&ServiceWorkerVersion::OnSimpleEventResponse, this)); |
} |
-template <typename ResponseMessage, typename CallbackType> |
-bool ServiceWorkerVersion::EventResponseHandler<ResponseMessage, CallbackType>:: |
- OnMessageReceived(const IPC::Message& message) { |
+template <typename ResponseMessage, typename CallbackType, typename... Args> |
+bool ServiceWorkerVersion::EventResponseHandler< |
+ ResponseMessage, |
+ CallbackType, |
+ void(Args...)>::OnMessageReceived(const IPC::Message& message) { |
if (message.type() != ResponseMessage::ID) |
return false; |
int received_request_id; |
@@ -908,8 +920,8 @@ bool ServiceWorkerVersion::EventResponseHandler<ResponseMessage, CallbackType>:: |
CallbackType protect(callback_); |
// Essentially same code as what IPC_MESSAGE_FORWARD expands to. |
void* param = nullptr; |
- if (!ResponseMessage::Dispatch(&message, &callback_, this, param, |
- &CallbackType::Run)) |
+ if (!ResponseMessage::Dispatch(&message, this, this, param, |
+ &EventResponseHandler::RunCallback)) |
message.set_dispatch_error(); |
// At this point |this| can have been deleted, so don't do anything other |