| 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*
|
|
|