OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/browser/service_worker/service_worker_registration.h" | 5 #include "content/browser/service_worker/service_worker_registration.h" |
6 | 6 |
7 #include "content/browser/service_worker/service_worker_context_core.h" | 7 #include "content/browser/service_worker/service_worker_context_core.h" |
8 #include "content/browser/service_worker/service_worker_info.h" | 8 #include "content/browser/service_worker/service_worker_info.h" |
9 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" |
10 | 10 |
11 namespace content { | 11 namespace content { |
12 | 12 |
| 13 namespace { |
| 14 |
| 15 ServiceWorkerVersionInfo GetVersionInfo(ServiceWorkerVersion* version) { |
| 16 if (!version) |
| 17 return ServiceWorkerVersionInfo(); |
| 18 return version->GetInfo(); |
| 19 } |
| 20 |
| 21 } // namespace |
| 22 |
13 ServiceWorkerRegistration::ServiceWorkerRegistration( | 23 ServiceWorkerRegistration::ServiceWorkerRegistration( |
14 const GURL& pattern, | 24 const GURL& pattern, |
15 const GURL& script_url, | 25 const GURL& script_url, |
16 int64 registration_id, | 26 int64 registration_id, |
17 base::WeakPtr<ServiceWorkerContextCore> context) | 27 base::WeakPtr<ServiceWorkerContextCore> context) |
18 : pattern_(pattern), | 28 : pattern_(pattern), |
19 script_url_(script_url), | 29 script_url_(script_url), |
20 registration_id_(registration_id), | 30 registration_id_(registration_id), |
21 is_shutdown_(false), | |
22 context_(context) { | 31 context_(context) { |
23 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 32 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
24 DCHECK(context_); | 33 DCHECK(context_); |
25 context_->AddLiveRegistration(this); | 34 context_->AddLiveRegistration(this); |
26 } | 35 } |
27 | 36 |
28 ServiceWorkerRegistration::~ServiceWorkerRegistration() { | 37 ServiceWorkerRegistration::~ServiceWorkerRegistration() { |
29 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 38 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
30 if (context_) | 39 if (context_) |
31 context_->RemoveLiveRegistration(registration_id_); | 40 context_->RemoveLiveRegistration(registration_id_); |
32 } | 41 } |
33 | 42 |
| 43 void ServiceWorkerRegistration::AddListener(Listener* listener) { |
| 44 listeners_.AddObserver(listener); |
| 45 } |
| 46 |
| 47 void ServiceWorkerRegistration::RemoveListener(Listener* listener) { |
| 48 listeners_.RemoveObserver(listener); |
| 49 } |
| 50 |
34 ServiceWorkerRegistrationInfo ServiceWorkerRegistration::GetInfo() { | 51 ServiceWorkerRegistrationInfo ServiceWorkerRegistration::GetInfo() { |
35 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 52 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
36 return ServiceWorkerRegistrationInfo( | 53 return ServiceWorkerRegistrationInfo( |
37 script_url(), | 54 script_url(), |
38 pattern(), | 55 pattern(), |
39 registration_id_, | 56 registration_id_, |
40 active_version_ ? active_version_->GetInfo() : ServiceWorkerVersionInfo(), | 57 GetVersionInfo(active_version_), |
41 waiting_version_ ? waiting_version_->GetInfo() | 58 GetVersionInfo(waiting_version_), |
42 : ServiceWorkerVersionInfo()); | 59 GetVersionInfo(installing_version_)); |
43 } | 60 } |
44 | 61 |
45 ServiceWorkerVersion* ServiceWorkerRegistration::GetNewestVersion() { | 62 void ServiceWorkerRegistration::SetActiveVersion( |
46 if (active_version()) | 63 ServiceWorkerVersion* version) { |
47 return active_version(); | 64 SetVersionInternal(version, &active_version_, |
48 return waiting_version(); | 65 ChangedVersionAttributesMask::ACTIVE_VERSION); |
49 } | 66 } |
50 | 67 |
51 void ServiceWorkerRegistration::ActivateWaitingVersion() { | 68 void ServiceWorkerRegistration::SetWaitingVersion( |
52 active_version_->SetStatus(ServiceWorkerVersion::REDUNDANT); | 69 ServiceWorkerVersion* version) { |
53 active_version_ = waiting_version_; | 70 SetVersionInternal(version, &waiting_version_, |
54 // TODO(kinuko): This should be set to ACTIVATING until activation finishes. | 71 ChangedVersionAttributesMask::WAITING_VERSION); |
55 active_version_->SetStatus(ServiceWorkerVersion::ACTIVE); | |
56 waiting_version_ = NULL; | |
57 } | 72 } |
58 | 73 |
| 74 void ServiceWorkerRegistration::SetInstallingVersion( |
| 75 ServiceWorkerVersion* version) { |
| 76 SetVersionInternal(version, &installing_version_, |
| 77 ChangedVersionAttributesMask::INSTALLING_VERSION); |
| 78 } |
| 79 |
| 80 void ServiceWorkerRegistration::UnsetVersion(ServiceWorkerVersion* version) { |
| 81 if (!version) |
| 82 return; |
| 83 ChangedVersionAttributesMask mask; |
| 84 UnsetVersionInternal(version, &mask); |
| 85 if (mask.changed()) { |
| 86 ServiceWorkerRegistrationInfo info = GetInfo(); |
| 87 FOR_EACH_OBSERVER(Listener, listeners_, |
| 88 OnVersionAttributesChanged(this, mask, info)); |
| 89 } |
| 90 } |
| 91 |
| 92 void ServiceWorkerRegistration::SetVersionInternal( |
| 93 ServiceWorkerVersion* version, |
| 94 scoped_refptr<ServiceWorkerVersion>* data_member, |
| 95 int change_flag) { |
| 96 if (version == data_member->get()) |
| 97 return; |
| 98 scoped_refptr<ServiceWorkerVersion> protect(version); |
| 99 ChangedVersionAttributesMask mask; |
| 100 if (version) |
| 101 UnsetVersionInternal(version, &mask); |
| 102 *data_member = version; |
| 103 mask.add(change_flag); |
| 104 ServiceWorkerRegistrationInfo info = GetInfo(); |
| 105 FOR_EACH_OBSERVER(Listener, listeners_, |
| 106 OnVersionAttributesChanged(this, mask, info)); |
| 107 } |
| 108 |
| 109 void ServiceWorkerRegistration::UnsetVersionInternal( |
| 110 ServiceWorkerVersion* version, |
| 111 ChangedVersionAttributesMask* mask) { |
| 112 DCHECK(version); |
| 113 if (installing_version_ == version) { |
| 114 installing_version_ = NULL; |
| 115 mask->add(ChangedVersionAttributesMask::INSTALLING_VERSION); |
| 116 } else if (waiting_version_ == version) { |
| 117 waiting_version_ = NULL; |
| 118 mask->add(ChangedVersionAttributesMask::WAITING_VERSION); |
| 119 } else if (active_version_ == version) { |
| 120 active_version_ = NULL; |
| 121 mask->add(ChangedVersionAttributesMask::ACTIVE_VERSION); |
| 122 } |
| 123 } |
| 124 |
| 125 |
59 } // namespace content | 126 } // namespace content |
OLD | NEW |