| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/child/service_worker/web_service_worker_registration_impl.h" | 5 #include "content/child/service_worker/web_service_worker_registration_impl.h" |
| 6 | 6 |
| 7 #include "content/child/service_worker/service_worker_dispatcher.h" | 7 #include "content/child/service_worker/service_worker_dispatcher.h" |
| 8 #include "content/child/service_worker/service_worker_registration_handle_refere
nce.h" | 8 #include "content/child/service_worker/service_worker_registration_handle_refere
nce.h" |
| 9 #include "content/child/service_worker/web_service_worker_impl.h" |
| 9 #include "content/common/service_worker/service_worker_types.h" | 10 #include "content/common/service_worker/service_worker_types.h" |
| 10 #include "third_party/WebKit/public/platform/WebServiceWorkerRegistrationProxy.h
" | 11 #include "third_party/WebKit/public/platform/WebServiceWorkerRegistrationProxy.h
" |
| 11 | 12 |
| 12 namespace content { | 13 namespace content { |
| 13 | 14 |
| 15 WebServiceWorkerRegistrationImpl::QueuedTask::QueuedTask( |
| 16 QueuedTaskType type, |
| 17 blink::WebServiceWorker* worker) |
| 18 : type(type), |
| 19 worker(worker) { |
| 20 } |
| 21 |
| 14 WebServiceWorkerRegistrationImpl::WebServiceWorkerRegistrationImpl( | 22 WebServiceWorkerRegistrationImpl::WebServiceWorkerRegistrationImpl( |
| 15 scoped_ptr<ServiceWorkerRegistrationHandleReference> handle_ref) | 23 scoped_ptr<ServiceWorkerRegistrationHandleReference> handle_ref) |
| 16 : handle_ref_(handle_ref.Pass()), | 24 : handle_ref_(handle_ref.Pass()), |
| 17 proxy_(NULL) { | 25 proxy_(NULL) { |
| 18 DCHECK(handle_ref_); | 26 DCHECK(handle_ref_); |
| 19 DCHECK_NE(kInvalidServiceWorkerRegistrationHandleId, | 27 DCHECK_NE(kInvalidServiceWorkerRegistrationHandleId, |
| 20 handle_ref_->handle_id()); | 28 handle_ref_->handle_id()); |
| 21 ServiceWorkerDispatcher* dispatcher = | 29 ServiceWorkerDispatcher* dispatcher = |
| 22 ServiceWorkerDispatcher::GetThreadSpecificInstance(); | 30 ServiceWorkerDispatcher::GetThreadSpecificInstance(); |
| 23 DCHECK(dispatcher); | 31 DCHECK(dispatcher); |
| 24 dispatcher->AddServiceWorkerRegistration(handle_ref_->handle_id(), this); | 32 dispatcher->AddServiceWorkerRegistration(handle_ref_->handle_id(), this); |
| 25 } | 33 } |
| 26 | 34 |
| 27 WebServiceWorkerRegistrationImpl::~WebServiceWorkerRegistrationImpl() { | 35 WebServiceWorkerRegistrationImpl::~WebServiceWorkerRegistrationImpl() { |
| 28 ServiceWorkerDispatcher* dispatcher = | 36 ServiceWorkerDispatcher* dispatcher = |
| 29 ServiceWorkerDispatcher::GetThreadSpecificInstance(); | 37 ServiceWorkerDispatcher::GetThreadSpecificInstance(); |
| 30 if (dispatcher) | 38 if (dispatcher) |
| 31 dispatcher->RemoveServiceWorkerRegistration(handle_ref_->handle_id()); | 39 dispatcher->RemoveServiceWorkerRegistration(handle_ref_->handle_id()); |
| 40 ClearQueuedTasks(); |
| 32 } | 41 } |
| 33 | 42 |
| 34 void WebServiceWorkerRegistrationImpl::SetInstalling( | 43 void WebServiceWorkerRegistrationImpl::SetInstalling( |
| 35 blink::WebServiceWorker* service_worker) { | 44 blink::WebServiceWorker* service_worker) { |
| 36 DCHECK(proxy_); | 45 if (proxy_) |
| 37 proxy_->setInstalling(service_worker); | 46 proxy_->setInstalling(service_worker); |
| 47 else |
| 48 queued_tasks_.push_back(QueuedTask(INSTALLING, service_worker)); |
| 38 } | 49 } |
| 39 | 50 |
| 40 void WebServiceWorkerRegistrationImpl::SetWaiting( | 51 void WebServiceWorkerRegistrationImpl::SetWaiting( |
| 41 blink::WebServiceWorker* service_worker) { | 52 blink::WebServiceWorker* service_worker) { |
| 42 DCHECK(proxy_); | 53 if (proxy_) |
| 43 proxy_->setWaiting(service_worker); | 54 proxy_->setWaiting(service_worker); |
| 55 else |
| 56 queued_tasks_.push_back(QueuedTask(WAITING, service_worker)); |
| 44 } | 57 } |
| 45 | 58 |
| 46 void WebServiceWorkerRegistrationImpl::SetActive( | 59 void WebServiceWorkerRegistrationImpl::SetActive( |
| 47 blink::WebServiceWorker* service_worker) { | 60 blink::WebServiceWorker* service_worker) { |
| 48 DCHECK(proxy_); | 61 if (proxy_) |
| 49 proxy_->setActive(service_worker); | 62 proxy_->setActive(service_worker); |
| 63 else |
| 64 queued_tasks_.push_back(QueuedTask(ACTIVE, service_worker)); |
| 50 } | 65 } |
| 51 | 66 |
| 52 void WebServiceWorkerRegistrationImpl::OnUpdateFound() { | 67 void WebServiceWorkerRegistrationImpl::OnUpdateFound() { |
| 53 DCHECK(proxy_); | 68 if (proxy_) |
| 54 proxy_->dispatchUpdateFoundEvent(); | 69 proxy_->dispatchUpdateFoundEvent(); |
| 70 else |
| 71 queued_tasks_.push_back(QueuedTask(UPDATE_FOUND, NULL)); |
| 55 } | 72 } |
| 56 | 73 |
| 57 void WebServiceWorkerRegistrationImpl::setProxy( | 74 void WebServiceWorkerRegistrationImpl::setProxy( |
| 58 blink::WebServiceWorkerRegistrationProxy* proxy) { | 75 blink::WebServiceWorkerRegistrationProxy* proxy) { |
| 59 proxy_ = proxy; | 76 proxy_ = proxy; |
| 77 RunQueuedTasks(); |
| 78 } |
| 79 |
| 80 void WebServiceWorkerRegistrationImpl::RunQueuedTasks() { |
| 81 DCHECK(proxy_); |
| 82 for (std::vector<QueuedTask>::const_iterator it = queued_tasks_.begin(); |
| 83 it != queued_tasks_.end(); ++it) { |
| 84 if (it->type == INSTALLING) |
| 85 proxy_->setInstalling(it->worker); |
| 86 else if (it->type == WAITING) |
| 87 proxy_->setWaiting(it->worker); |
| 88 else if (it->type == ACTIVE) |
| 89 proxy_->setActive(it->worker); |
| 90 else if (it->type == UPDATE_FOUND) |
| 91 proxy_->dispatchUpdateFoundEvent(); |
| 92 } |
| 93 queued_tasks_.clear(); |
| 94 } |
| 95 |
| 96 void WebServiceWorkerRegistrationImpl::ClearQueuedTasks() { |
| 97 for (std::vector<QueuedTask>::const_iterator it = queued_tasks_.begin(); |
| 98 it != queued_tasks_.end(); ++it) { |
| 99 // If the owner of the WebServiceWorker does not exist, delete it. |
| 100 if (it->worker && !it->worker->proxy()) |
| 101 delete it->worker; |
| 102 } |
| 103 queued_tasks_.clear(); |
| 60 } | 104 } |
| 61 | 105 |
| 62 blink::WebServiceWorkerRegistrationProxy* | 106 blink::WebServiceWorkerRegistrationProxy* |
| 63 WebServiceWorkerRegistrationImpl::proxy() { | 107 WebServiceWorkerRegistrationImpl::proxy() { |
| 64 return proxy_; | 108 return proxy_; |
| 65 } | 109 } |
| 66 | 110 |
| 67 blink::WebURL WebServiceWorkerRegistrationImpl::scope() const { | 111 blink::WebURL WebServiceWorkerRegistrationImpl::scope() const { |
| 68 return handle_ref_->scope(); | 112 return handle_ref_->scope(); |
| 69 } | 113 } |
| 70 | 114 |
| 71 } // namespace content | 115 } // namespace content |
| OLD | NEW |