Index: content/child/service_worker/web_service_worker_registration_impl.cc |
diff --git a/content/child/service_worker/web_service_worker_registration_impl.cc b/content/child/service_worker/web_service_worker_registration_impl.cc |
index ce6875312fff735172e7ae1b99e1ca2b4e2a78a8..833d22b9d4571ff113c249be635a4ad1f78b53d4 100644 |
--- a/content/child/service_worker/web_service_worker_registration_impl.cc |
+++ b/content/child/service_worker/web_service_worker_registration_impl.cc |
@@ -6,11 +6,19 @@ |
#include "content/child/service_worker/service_worker_dispatcher.h" |
#include "content/child/service_worker/service_worker_registration_handle_reference.h" |
+#include "content/child/service_worker/web_service_worker_impl.h" |
#include "content/common/service_worker/service_worker_types.h" |
#include "third_party/WebKit/public/platform/WebServiceWorkerRegistrationProxy.h" |
namespace content { |
+WebServiceWorkerRegistrationImpl::QueuedTask::QueuedTask( |
+ QueuedTaskType type, |
+ blink::WebServiceWorker* worker) |
+ : type(type), |
+ worker(worker) { |
+} |
+ |
WebServiceWorkerRegistrationImpl::WebServiceWorkerRegistrationImpl( |
scoped_ptr<ServiceWorkerRegistrationHandleReference> handle_ref) |
: handle_ref_(handle_ref.Pass()), |
@@ -29,34 +37,70 @@ WebServiceWorkerRegistrationImpl::~WebServiceWorkerRegistrationImpl() { |
ServiceWorkerDispatcher::GetThreadSpecificInstance(); |
if (dispatcher) |
dispatcher->RemoveServiceWorkerRegistration(handle_ref_->handle_id()); |
+ ClearQueuedTasks(); |
} |
void WebServiceWorkerRegistrationImpl::SetInstalling( |
blink::WebServiceWorker* service_worker) { |
- DCHECK(proxy_); |
- proxy_->setInstalling(service_worker); |
+ if (proxy_) |
+ proxy_->setInstalling(service_worker); |
+ else |
+ queued_tasks_.push_back(QueuedTask(INSTALLING, service_worker)); |
} |
void WebServiceWorkerRegistrationImpl::SetWaiting( |
blink::WebServiceWorker* service_worker) { |
- DCHECK(proxy_); |
- proxy_->setWaiting(service_worker); |
+ if (proxy_) |
+ proxy_->setWaiting(service_worker); |
+ else |
+ queued_tasks_.push_back(QueuedTask(WAITING, service_worker)); |
} |
void WebServiceWorkerRegistrationImpl::SetActive( |
blink::WebServiceWorker* service_worker) { |
- DCHECK(proxy_); |
- proxy_->setActive(service_worker); |
+ if (proxy_) |
+ proxy_->setActive(service_worker); |
+ else |
+ queued_tasks_.push_back(QueuedTask(ACTIVE, service_worker)); |
} |
void WebServiceWorkerRegistrationImpl::OnUpdateFound() { |
- DCHECK(proxy_); |
- proxy_->dispatchUpdateFoundEvent(); |
+ if (proxy_) |
+ proxy_->dispatchUpdateFoundEvent(); |
+ else |
+ queued_tasks_.push_back(QueuedTask(UPDATE_FOUND, NULL)); |
} |
void WebServiceWorkerRegistrationImpl::setProxy( |
blink::WebServiceWorkerRegistrationProxy* proxy) { |
proxy_ = proxy; |
+ RunQueuedTasks(); |
+} |
+ |
+void WebServiceWorkerRegistrationImpl::RunQueuedTasks() { |
+ DCHECK(proxy_); |
+ for (std::vector<QueuedTask>::const_iterator it = queued_tasks_.begin(); |
+ it != queued_tasks_.end(); ++it) { |
+ if (it->type == INSTALLING) |
+ proxy_->setInstalling(it->worker); |
+ else if (it->type == WAITING) |
+ proxy_->setWaiting(it->worker); |
+ else if (it->type == ACTIVE) |
+ proxy_->setActive(it->worker); |
+ else if (it->type == UPDATE_FOUND) |
+ proxy_->dispatchUpdateFoundEvent(); |
+ } |
+ queued_tasks_.clear(); |
+} |
+ |
+void WebServiceWorkerRegistrationImpl::ClearQueuedTasks() { |
+ for (std::vector<QueuedTask>::const_iterator it = queued_tasks_.begin(); |
+ it != queued_tasks_.end(); ++it) { |
+ // If the owner of the WebServiceWorker does not exist, delete it. |
+ if (it->worker && !it->worker->proxy()) |
+ delete it->worker; |
+ } |
+ queued_tasks_.clear(); |
} |
blink::WebServiceWorkerRegistrationProxy* |