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 ed09f30e1c3d2ea6ed3e1f348bc2fa3e543bfa1d..bea893b3377021c432275a2671adff3555d31b6b 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -8,6 +8,7 @@ |
#include "base/stl_util.h" |
#include "base/strings/string16.h" |
#include "content/browser/message_port_message_filter.h" |
+#include "content/browser/message_port_service.h" |
#include "content/browser/service_worker/embedded_worker_instance.h" |
#include "content/browser/service_worker/embedded_worker_registry.h" |
#include "content/browser/service_worker/service_worker_context_core.h" |
@@ -88,6 +89,17 @@ void RunErrorFetchCallback(const ServiceWorkerVersion::FetchCallback& callback, |
ServiceWorkerResponse()); |
} |
+void RunErrorMessageCallback( |
+ const std::vector<int>& sent_message_port_ids, |
+ const ServiceWorkerVersion::StatusCallback& callback, |
+ ServiceWorkerStatusCode status) { |
+ // Transfering the message ports failed, so destroy the ports. |
+ for (int message_port_id : sent_message_port_ids) { |
+ MessagePortService::GetInstance()->ClosePort(message_port_id); |
+ } |
+ callback.Run(status); |
+} |
+ |
} // namespace |
ServiceWorkerVersion::ServiceWorkerVersion( |
@@ -252,12 +264,25 @@ void ServiceWorkerVersion::DispatchMessageEvent( |
const base::string16& message, |
const std::vector<int>& sent_message_port_ids, |
const StatusCallback& callback) { |
+ for (int message_port_id : sent_message_port_ids) { |
+ MessagePortService::GetInstance()->HoldMessages(message_port_id); |
+ } |
+ |
+ DispatchMessageEventInternal(message, sent_message_port_ids, callback); |
+} |
+ |
+void ServiceWorkerVersion::DispatchMessageEventInternal( |
+ const base::string16& message, |
+ const std::vector<int>& sent_message_port_ids, |
+ const StatusCallback& callback) { |
if (running_status() != RUNNING) { |
// Schedule calling this method after starting the worker. |
StartWorker(base::Bind( |
- &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), callback, |
- base::Bind(&self::DispatchMessageEvent, weak_factory_.GetWeakPtr(), |
- message, sent_message_port_ids, callback))); |
+ &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
+ base::Bind(&RunErrorMessageCallback, sent_message_port_ids, callback), |
+ base::Bind(&self::DispatchMessageEventInternal, |
+ weak_factory_.GetWeakPtr(), message, sent_message_port_ids, |
+ callback))); |
return; |
} |