| Index: content/browser/service_worker/service_worker_registration_handle.cc
|
| diff --git a/content/browser/service_worker/service_worker_registration_handle.cc b/content/browser/service_worker/service_worker_registration_handle.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7f005aff0fe7e443a3dc03a72f268d1541e6335e
|
| --- /dev/null
|
| +++ b/content/browser/service_worker/service_worker_registration_handle.cc
|
| @@ -0,0 +1,131 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/browser/service_worker/service_worker_registration_handle.h"
|
| +
|
| +#include "content/browser/service_worker/service_worker_context_core.h"
|
| +#include "content/browser/service_worker/service_worker_dispatcher_host.h"
|
| +#include "content/browser/service_worker/service_worker_handle.h"
|
| +#include "content/common/service_worker/service_worker_messages.h"
|
| +
|
| +namespace content {
|
| +
|
| +static const int kDocumentMainThreadId = 0;
|
| +
|
| +ServiceWorkerRegistrationHandle::ServiceWorkerRegistrationHandle(
|
| + base::WeakPtr<ServiceWorkerContextCore> context,
|
| + ServiceWorkerDispatcherHost* dispatcher_host,
|
| + int provider_id,
|
| + ServiceWorkerRegistration* registration)
|
| + : context_(context),
|
| + dispatcher_host_(dispatcher_host),
|
| + provider_id_(provider_id),
|
| + handle_id_(context ? context->GetNewRegistrationHandleId()
|
| + : kInvalidServiceWorkerRegistrationHandleId),
|
| + ref_count_(1),
|
| + registration_(registration) {
|
| + DCHECK(registration_);
|
| + SetVersionAttributes(registration->installing_version(),
|
| + registration->waiting_version(),
|
| + registration->active_version());
|
| + registration_->AddListener(this);
|
| +}
|
| +
|
| +ServiceWorkerRegistrationHandle::~ServiceWorkerRegistrationHandle() {
|
| + registration_->RemoveListener(this);
|
| +}
|
| +
|
| +void ServiceWorkerRegistrationHandle::IncrementRefCount() {
|
| + DCHECK_GT(ref_count_, 0);
|
| + ++ref_count_;
|
| +}
|
| +
|
| +void ServiceWorkerRegistrationHandle::DecrementRefCount() {
|
| + DCHECK_GT(ref_count_, 0);
|
| + --ref_count_;
|
| +}
|
| +
|
| +void ServiceWorkerRegistrationHandle::OnVersionAttributesChanged(
|
| + ServiceWorkerRegistration* registration,
|
| + ChangedVersionAttributesMask changed_mask,
|
| + const ServiceWorkerRegistrationInfo& info) {
|
| + DCHECK_EQ(registration->id(), registration_->id());
|
| + SetVersionAttributes(registration->installing_version(),
|
| + registration->waiting_version(),
|
| + registration->active_version());
|
| +}
|
| +
|
| +void ServiceWorkerRegistrationHandle::OnRegistrationFailed(
|
| + ServiceWorkerRegistration* registration) {
|
| + DCHECK_EQ(registration->id(), registration_->id());
|
| + ClearVersionAttributes();
|
| + registration_->RemoveListener(this);
|
| + registration_ = NULL;
|
| +}
|
| +
|
| +void ServiceWorkerRegistrationHandle::SetVersionAttributes(
|
| + ServiceWorkerVersion* installing_version,
|
| + ServiceWorkerVersion* waiting_version,
|
| + ServiceWorkerVersion* active_version) {
|
| + ChangedVersionAttributesMask mask;
|
| +
|
| + if (installing_version != installing_version_) {
|
| + installing_version_ = installing_version;
|
| + mask.add(ChangedVersionAttributesMask::INSTALLING_VERSION);
|
| + }
|
| + if (waiting_version != waiting_version_) {
|
| + waiting_version_ = waiting_version;
|
| + mask.add(ChangedVersionAttributesMask::WAITING_VERSION);
|
| + }
|
| + if (active_version != active_version_) {
|
| + active_version_ = active_version;
|
| + mask.add(ChangedVersionAttributesMask::ACTIVE_VERSION);
|
| + }
|
| +
|
| + if (!dispatcher_host_)
|
| + return; // Could be NULL in some tests.
|
| + if (!mask.changed())
|
| + return;
|
| +
|
| + ServiceWorkerVersionAttributes attributes;
|
| + if (mask.installing_changed()) {
|
| + attributes.installing =
|
| + CreateServiceWorkerHandleAndPass(installing_version);
|
| + }
|
| + if (mask.waiting_changed()) {
|
| + attributes.waiting =
|
| + CreateServiceWorkerHandleAndPass(waiting_version);
|
| + }
|
| + if (mask.active_changed()) {
|
| + attributes.active =
|
| + CreateServiceWorkerHandleAndPass(active_version);
|
| + }
|
| +
|
| + dispatcher_host_->Send(new ServiceWorkerMsg_SetVersionAttributes(
|
| + kDocumentMainThreadId, provider_id_, handle_id_,
|
| + mask.changed(), attributes));
|
| +}
|
| +
|
| +void ServiceWorkerRegistrationHandle::ClearVersionAttributes() {
|
| + SetVersionAttributes(NULL, NULL, NULL);
|
| +}
|
| +
|
| +ServiceWorkerObjectInfo
|
| +ServiceWorkerRegistrationHandle::CreateServiceWorkerHandleAndPass(
|
| + ServiceWorkerVersion* version) {
|
| + ServiceWorkerObjectInfo info;
|
| + if (context_ && version) {
|
| + scoped_ptr<ServiceWorkerHandle> handle =
|
| + ServiceWorkerHandle::Create(context_,
|
| + dispatcher_host_,
|
| + kDocumentMainThreadId,
|
| + provider_id_,
|
| + version);
|
| + info = handle->GetObjectInfo();
|
| + dispatcher_host_->RegisterServiceWorkerHandle(handle.Pass());
|
| + }
|
| + return info;
|
| +}
|
| +
|
| +} // namespace content
|
|
|