Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: content/browser/service_worker/service_worker_context_watcher.cc

Issue 998173002: Revise ServiceWorker DevTools protocols. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: incorporated kinuko's comment Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/service_worker/service_worker_context_watcher.h"
6
7 #include "base/bind.h"
8 #include "base/containers/scoped_ptr_hash_map.h"
9 #include "content/browser/service_worker/service_worker_context_observer.h"
10 #include "content/browser/service_worker/service_worker_context_wrapper.h"
11 #include "content/browser/service_worker/service_worker_version.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "url/gurl.h"
14
15 namespace content {
16 namespace {
17
18 bool IsStoppedAndRedundant(const ServiceWorkerVersionInfo& version_info) {
19 return version_info.running_status ==
20 content::ServiceWorkerVersion::STOPPED &&
21 version_info.status == content::ServiceWorkerVersion::REDUNDANT;
22 }
23
24 } // namespace
25
26 ServiceWorkerContextWatcher::ServiceWorkerContextWatcher(
27 scoped_refptr<ServiceWorkerContextWrapper> context,
28 const WorkerRegistrationUpdatedCallback& registration_callback,
29 const WorkerVersionUpdatedCallback& version_callback)
30 : context_(context),
31 registration_callback_(registration_callback),
32 version_callback_(version_callback) {
33 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
34 }
35
36 void ServiceWorkerContextWatcher::Start() {
37 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
38 BrowserThread::PostTask(
39 BrowserThread::IO, FROM_HERE,
40 base::Bind(&ServiceWorkerContextWatcher::GetStoredRegistrationsOnIOThread,
41 this));
42 }
43
44 void ServiceWorkerContextWatcher::Stop() {
45 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
46 BrowserThread::PostTask(
47 BrowserThread::IO, FROM_HERE,
48 base::Bind(&ServiceWorkerContextWatcher::StopOnIOThread, this));
49 }
50
51 void ServiceWorkerContextWatcher::GetStoredRegistrationsOnIOThread() {
52 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
53 context_->context()->storage()->GetAllRegistrations(base::Bind(
54 &ServiceWorkerContextWatcher::OnStoredRegistrationsOnIOThread, this));
55 }
56
57 void ServiceWorkerContextWatcher::OnStoredRegistrationsOnIOThread(
58 const std::vector<ServiceWorkerRegistrationInfo>& stored_registrations) {
59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
60 context_->AddObserver(this);
61
62 base::ScopedPtrHashMap<int64, ServiceWorkerRegistrationInfo>
63 registration_info_map;
64 for (const auto& registration : stored_registrations)
65 StoreRegistrationInfo(registration, &registration_info_map);
66 for (const auto& registration :
67 context_->context()->GetAllLiveRegistrationInfo()) {
68 StoreRegistrationInfo(registration, &registration_info_map);
69 }
70 for (const auto& version : context_->context()->GetAllLiveVersionInfo())
71 StoreVersionInfo(version);
72
73 std::vector<ServiceWorkerRegistrationInfo> registrations;
74 registrations.reserve(registration_info_map.size());
75 for (const auto& registration_id_info_pair : registration_info_map)
76 registrations.push_back(*registration_id_info_pair.second);
77
78 std::vector<ServiceWorkerVersionInfo> versions;
79 versions.reserve(version_info_map_.size());
80
81 for (auto version_it = version_info_map_.begin();
82 version_it != version_info_map_.end();) {
83 versions.push_back(*version_it->second);
84 if (IsStoppedAndRedundant(*version_it->second))
85 version_info_map_.erase(version_it++);
86 else
87 ++version_it;
88 }
89
90 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
91 base::Bind(registration_callback_, registrations));
92 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
93 base::Bind(version_callback_, versions));
94 }
95
96 void ServiceWorkerContextWatcher::StopOnIOThread() {
97 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
98 context_->RemoveObserver(this);
99 }
100
101 ServiceWorkerContextWatcher::~ServiceWorkerContextWatcher() {
102 }
103
104 void ServiceWorkerContextWatcher::StoreRegistrationInfo(
105 const ServiceWorkerRegistrationInfo& registration_info,
106 base::ScopedPtrHashMap<int64, ServiceWorkerRegistrationInfo>* info_map) {
107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
108 if (registration_info.registration_id == kInvalidServiceWorkerRegistrationId)
109 return;
110 info_map->set(registration_info.registration_id,
111 scoped_ptr<ServiceWorkerRegistrationInfo>(
112 new ServiceWorkerRegistrationInfo(registration_info)));
113 StoreVersionInfo(registration_info.active_version);
114 StoreVersionInfo(registration_info.waiting_version);
115 StoreVersionInfo(registration_info.installing_version);
116 }
117
118 void ServiceWorkerContextWatcher::StoreVersionInfo(
119 const ServiceWorkerVersionInfo& version_info) {
120 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
121 if (version_info.version_id == kInvalidServiceWorkerVersionId)
122 return;
123 version_info_map_.set(version_info.version_id,
124 scoped_ptr<ServiceWorkerVersionInfo>(
125 new ServiceWorkerVersionInfo(version_info)));
126 }
127
128 void ServiceWorkerContextWatcher::SendRegistrationInfo(
129 int64 registration_id,
130 const GURL& pattern,
131 ServiceWorkerRegistrationInfo::DeleteFlag delete_flag) {
132 std::vector<ServiceWorkerRegistrationInfo> registrations;
133 registrations.push_back(
134 ServiceWorkerRegistrationInfo(pattern, registration_id, delete_flag));
135 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
136 base::Bind(registration_callback_, registrations));
137 }
138
139 void ServiceWorkerContextWatcher::SendVersionInfo(
140 const ServiceWorkerVersionInfo& version_info) {
141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
142 std::vector<ServiceWorkerVersionInfo> versions;
143 versions.push_back(version_info);
144 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
145 base::Bind(version_callback_, versions));
146 }
147
148 void ServiceWorkerContextWatcher::OnNewLiveRegistration(int64 registration_id,
149 const GURL& pattern) {
150 SendRegistrationInfo(registration_id, pattern,
151 ServiceWorkerRegistrationInfo::IsNotDeleted);
152 }
153
154 void ServiceWorkerContextWatcher::OnNewLiveVersion(int64 version_id,
155 int64 registration_id,
156 const GURL& script_url) {
157 if (ServiceWorkerVersionInfo* version = version_info_map_.get(version_id)) {
158 DCHECK_EQ(version->registration_id, registration_id);
159 DCHECK_EQ(version->script_url, script_url);
160 return;
161 }
162
163 scoped_ptr<ServiceWorkerVersionInfo> version(new ServiceWorkerVersionInfo());
164 version->version_id = version_id;
165 version->registration_id = registration_id;
166 version->script_url = script_url;
167 SendVersionInfo(*version);
168 if (!IsStoppedAndRedundant(*version))
169 version_info_map_.set(version_id, version.Pass());
170 }
171
172 void ServiceWorkerContextWatcher::OnRunningStateChanged(
173 int64 version_id,
174 content::ServiceWorkerVersion::RunningStatus running_status) {
175 ServiceWorkerVersionInfo* version = version_info_map_.get(version_id);
176 DCHECK(version);
177 if (version->running_status == running_status)
178 return;
179 version->running_status = running_status;
180 SendVersionInfo(*version);
181 if (IsStoppedAndRedundant(*version))
182 version_info_map_.erase(version_id);
183 }
184
185 void ServiceWorkerContextWatcher::OnVersionStateChanged(
186 int64 version_id,
187 content::ServiceWorkerVersion::Status status) {
188 ServiceWorkerVersionInfo* version = version_info_map_.get(version_id);
189 DCHECK(version);
190 if (version->status == status)
191 return;
192 version->status = status;
193 SendVersionInfo(*version);
194 if (IsStoppedAndRedundant(*version))
195 version_info_map_.erase(version_id);
196 }
197
198 void ServiceWorkerContextWatcher::OnRegistrationStored(int64 registration_id,
199 const GURL& pattern) {
200 SendRegistrationInfo(registration_id, pattern,
201 ServiceWorkerRegistrationInfo::IsNotDeleted);
202 }
203
204 void ServiceWorkerContextWatcher::OnRegistrationDeleted(int64 registration_id,
205 const GURL& pattern) {
206 SendRegistrationInfo(registration_id, pattern,
207 ServiceWorkerRegistrationInfo::IsDeleted);
208 }
209
210 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698