Index: content/browser/service_worker/service_worker_version.cc |
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc |
index fade655ca6c776b425fb9cfb1a995e62a7a17a2b..be530d453cc9805ad03e4dcdb6aa7f55c57ea77b 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -19,6 +19,39 @@ typedef ServiceWorkerVersion::MessageCallback MessageCallback; |
namespace { |
+typedef base::Callback<bool(const IPC::Message* message, |
+ Tuple1<blink::WebServiceWorkerEventResult>* result)> |
+ InstallPhaseEventFinishedMessageReader; |
+ |
+// Parameters for the HandleInstallPhaseEventFinished function, which cannot |
+// accept them directly without exceeding the max arity supported by Bind(). |
+struct HandleInstallPhaseEventFinishedParameters { |
+ HandleInstallPhaseEventFinishedParameters( |
+ base::WeakPtr<ServiceWorkerVersion> version, |
+ uint32 expected_message_type, |
+ const InstallPhaseEventFinishedMessageReader& message_reader, |
+ const StatusCallback& callback, |
+ ServiceWorkerVersion::Status next_status_on_success, |
+ ServiceWorkerVersion::Status next_status_on_error, |
+ ServiceWorkerStatusCode next_status_code_on_event_rejection) |
+ : version(version), |
+ expected_message_type(expected_message_type), |
+ message_reader(message_reader), |
+ callback(callback), |
+ next_status_on_success(next_status_on_success), |
+ next_status_on_error(next_status_on_error), |
+ next_status_code_on_event_rejection( |
+ next_status_code_on_event_rejection) {} |
+ |
+ base::WeakPtr<ServiceWorkerVersion> version; |
+ uint32 expected_message_type; |
+ InstallPhaseEventFinishedMessageReader message_reader; |
+ StatusCallback callback; |
+ ServiceWorkerVersion::Status next_status_on_success; |
+ ServiceWorkerVersion::Status next_status_on_error; |
+ ServiceWorkerStatusCode next_status_code_on_event_rejection; |
+}; |
+ |
void RunSoon(const base::Closure& callback) { |
if (!callback.is_null()) |
base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
@@ -60,29 +93,34 @@ void RunEmptyMessageCallback(const MessageCallback& callback, |
callback.Run(status, IPC::Message()); |
} |
-void HandleEventFinished(base::WeakPtr<ServiceWorkerVersion> version, |
- uint32 expected_message_type, |
- const StatusCallback& callback, |
- ServiceWorkerVersion::Status next_status_on_success, |
- ServiceWorkerVersion::Status next_status_on_error, |
- ServiceWorkerStatusCode status, |
- const IPC::Message& message) { |
- if (!version) |
+void HandleInstallPhaseEventFinished( |
+ const HandleInstallPhaseEventFinishedParameters& params, |
+ ServiceWorkerStatusCode status, |
+ const IPC::Message& message) { |
+ if (!params.version) |
return; |
if (status != SERVICE_WORKER_OK) { |
- version->SetStatus(next_status_on_error); |
- callback.Run(status); |
+ params.version->SetStatus(params.next_status_on_error); |
+ params.callback.Run(status); |
return; |
} |
- if (message.type() != expected_message_type) { |
+ if (message.type() != params.expected_message_type) { |
NOTREACHED() << "Got unexpected response: " << message.type() |
- << " expected:" << expected_message_type; |
- version->SetStatus(next_status_on_error); |
- callback.Run(SERVICE_WORKER_ERROR_FAILED); |
+ << " expected:" << params.expected_message_type; |
+ params.version->SetStatus(params.next_status_on_error); |
+ params.callback.Run(SERVICE_WORKER_ERROR_FAILED); |
return; |
} |
- version->SetStatus(next_status_on_success); |
- callback.Run(SERVICE_WORKER_OK); |
+ params.version->SetStatus(params.next_status_on_success); |
+ |
+ Tuple1<blink::WebServiceWorkerEventResult> result( |
+ blink::WebServiceWorkerEventResultCompleted); |
+ if (!params.message_reader.is_null()) { |
+ params.message_reader.Run(&message, &result); |
+ if (result.a == blink::WebServiceWorkerEventResultRejected) |
+ status = params.next_status_code_on_event_rejection; |
+ } |
+ params.callback.Run(status); |
} |
void HandleFetchResponse(const ServiceWorkerVersion::FetchCallback& callback, |
@@ -247,15 +285,21 @@ void ServiceWorkerVersion::SendMessageAndRegisterCallback( |
} |
void ServiceWorkerVersion::DispatchInstallEvent( |
- int active_version_embedded_worker_id, |
+ int active_version_id, |
const StatusCallback& callback) { |
DCHECK_EQ(NEW, status()) << status(); |
SetStatus(INSTALLING); |
+ HandleInstallPhaseEventFinishedParameters params( |
+ weak_factory_.GetWeakPtr(), |
+ ServiceWorkerHostMsg_InstallEventFinished::ID, |
+ base::Bind(&ServiceWorkerHostMsg_InstallEventFinished::Read), |
+ callback, |
+ INSTALLED, |
+ NEW, |
+ SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); |
SendMessageAndRegisterCallback( |
- ServiceWorkerMsg_InstallEvent(active_version_embedded_worker_id), |
- base::Bind(&HandleEventFinished, weak_factory_.GetWeakPtr(), |
- ServiceWorkerHostMsg_InstallEventFinished::ID, |
- callback, INSTALLED, NEW)); |
+ ServiceWorkerMsg_InstallEvent(active_version_id), |
+ base::Bind(&HandleInstallPhaseEventFinished, params)); |
} |
void ServiceWorkerVersion::DispatchActivateEvent( |
@@ -264,8 +308,16 @@ void ServiceWorkerVersion::DispatchActivateEvent( |
SetStatus(ACTIVATING); |
// TODO(kinuko): Implement. |
NOTIMPLEMENTED(); |
- RunSoon(base::Bind(&HandleEventFinished, weak_factory_.GetWeakPtr(), |
- -1 /* dummy message_id */, callback, ACTIVE, INSTALLED, |
+ HandleInstallPhaseEventFinishedParameters params( |
+ weak_factory_.GetWeakPtr(), |
+ -1 /* dummy message_id */, |
+ InstallPhaseEventFinishedMessageReader(), |
+ callback, |
+ ACTIVE, |
+ INSTALLED, |
+ SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); |
+ RunSoon(base::Bind(&HandleInstallPhaseEventFinished, |
+ params, |
SERVICE_WORKER_OK, |
IPC::Message(-1, -1, IPC::Message::PRIORITY_NORMAL))); |
} |