| Index: content/browser/service_worker/service_worker_registration.cc
|
| diff --git a/content/browser/service_worker/service_worker_registration.cc b/content/browser/service_worker/service_worker_registration.cc
|
| index 7ea5029b10cdd734cdbf03d6ddd4442283eeb690..9c5f572d909f32730bf5ef3226e9db906e38ada2 100644
|
| --- a/content/browser/service_worker/service_worker_registration.cc
|
| +++ b/content/browser/service_worker/service_worker_registration.cc
|
| @@ -10,6 +10,16 @@
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| +ServiceWorkerVersionInfo GetVersionInfo(ServiceWorkerVersion* version) {
|
| + if (!version)
|
| + return ServiceWorkerVersionInfo();
|
| + return version->GetInfo();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| ServiceWorkerRegistration::ServiceWorkerRegistration(
|
| const GURL& pattern,
|
| const GURL& script_url,
|
| @@ -18,7 +28,6 @@ ServiceWorkerRegistration::ServiceWorkerRegistration(
|
| : pattern_(pattern),
|
| script_url_(script_url),
|
| registration_id_(registration_id),
|
| - is_shutdown_(false),
|
| context_(context) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| DCHECK(context_);
|
| @@ -31,29 +40,87 @@ ServiceWorkerRegistration::~ServiceWorkerRegistration() {
|
| context_->RemoveLiveRegistration(registration_id_);
|
| }
|
|
|
| +void ServiceWorkerRegistration::AddListener(Listener* listener) {
|
| + listeners_.AddObserver(listener);
|
| +}
|
| +
|
| +void ServiceWorkerRegistration::RemoveListener(Listener* listener) {
|
| + listeners_.RemoveObserver(listener);
|
| +}
|
| +
|
| ServiceWorkerRegistrationInfo ServiceWorkerRegistration::GetInfo() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| return ServiceWorkerRegistrationInfo(
|
| script_url(),
|
| pattern(),
|
| registration_id_,
|
| - active_version_ ? active_version_->GetInfo() : ServiceWorkerVersionInfo(),
|
| - waiting_version_ ? waiting_version_->GetInfo()
|
| - : ServiceWorkerVersionInfo());
|
| + GetVersionInfo(active_version_),
|
| + GetVersionInfo(waiting_version_),
|
| + GetVersionInfo(installing_version_));
|
| }
|
|
|
| -ServiceWorkerVersion* ServiceWorkerRegistration::GetNewestVersion() {
|
| - if (active_version())
|
| - return active_version();
|
| - return waiting_version();
|
| +void ServiceWorkerRegistration::SetActiveVersion(
|
| + ServiceWorkerVersion* version) {
|
| + SetVersionInternal(version, &active_version_,
|
| + ChangedVersionAttributesMask::ACTIVE_VERSION);
|
| }
|
|
|
| -void ServiceWorkerRegistration::ActivateWaitingVersion() {
|
| - active_version_->SetStatus(ServiceWorkerVersion::REDUNDANT);
|
| - active_version_ = waiting_version_;
|
| - // TODO(kinuko): This should be set to ACTIVATING until activation finishes.
|
| - active_version_->SetStatus(ServiceWorkerVersion::ACTIVE);
|
| - waiting_version_ = NULL;
|
| +void ServiceWorkerRegistration::SetWaitingVersion(
|
| + ServiceWorkerVersion* version) {
|
| + SetVersionInternal(version, &waiting_version_,
|
| + ChangedVersionAttributesMask::WAITING_VERSION);
|
| }
|
|
|
| +void ServiceWorkerRegistration::SetInstallingVersion(
|
| + ServiceWorkerVersion* version) {
|
| + SetVersionInternal(version, &installing_version_,
|
| + ChangedVersionAttributesMask::INSTALLING_VERSION);
|
| +}
|
| +
|
| +void ServiceWorkerRegistration::UnsetVersion(ServiceWorkerVersion* version) {
|
| + if (!version)
|
| + return;
|
| + ChangedVersionAttributesMask mask;
|
| + UnsetVersionInternal(version, &mask);
|
| + if (mask.changed()) {
|
| + ServiceWorkerRegistrationInfo info = GetInfo();
|
| + FOR_EACH_OBSERVER(Listener, listeners_,
|
| + OnVersionAttributesChanged(this, mask, info));
|
| + }
|
| +}
|
| +
|
| +void ServiceWorkerRegistration::SetVersionInternal(
|
| + ServiceWorkerVersion* version,
|
| + scoped_refptr<ServiceWorkerVersion>* data_member,
|
| + int change_flag) {
|
| + if (version == data_member->get())
|
| + return;
|
| + scoped_refptr<ServiceWorkerVersion> protect(version);
|
| + ChangedVersionAttributesMask mask;
|
| + if (version)
|
| + UnsetVersionInternal(version, &mask);
|
| + *data_member = version;
|
| + mask.add(change_flag);
|
| + ServiceWorkerRegistrationInfo info = GetInfo();
|
| + FOR_EACH_OBSERVER(Listener, listeners_,
|
| + OnVersionAttributesChanged(this, mask, info));
|
| +}
|
| +
|
| + void ServiceWorkerRegistration::UnsetVersionInternal(
|
| + ServiceWorkerVersion* version,
|
| + ChangedVersionAttributesMask* mask) {
|
| + DCHECK(version);
|
| + if (installing_version_ == version) {
|
| + installing_version_ = NULL;
|
| + mask->add(ChangedVersionAttributesMask::INSTALLING_VERSION);
|
| + } else if (waiting_version_ == version) {
|
| + waiting_version_ = NULL;
|
| + mask->add(ChangedVersionAttributesMask::WAITING_VERSION);
|
| + } else if (active_version_ == version) {
|
| + active_version_ = NULL;
|
| + mask->add(ChangedVersionAttributesMask::ACTIVE_VERSION);
|
| + }
|
| +}
|
| +
|
| +
|
| } // namespace content
|
|
|