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

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

Issue 188283003: Add ServiceWorkerVersion::status() (which is to be persisted unlike running status) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added more statuses Created 6 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 | Annotate | Revision Log
OLDNEW
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_version.h" 5 #include "content/browser/service_worker/service_worker_version.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "content/browser/service_worker/embedded_worker_instance.h" 8 #include "content/browser/service_worker/embedded_worker_instance.h"
9 #include "content/browser/service_worker/embedded_worker_registry.h" 9 #include "content/browser/service_worker/embedded_worker_registry.h"
10 #include "content/browser/service_worker/service_worker_context_core.h" 10 #include "content/browser/service_worker/service_worker_context_core.h"
(...skipping 23 matching lines...) Expand all
34 void RunTaskAfterStartWorker( 34 void RunTaskAfterStartWorker(
35 base::WeakPtr<ServiceWorkerVersion> version, 35 base::WeakPtr<ServiceWorkerVersion> version,
36 const StatusCallback& error_callback, 36 const StatusCallback& error_callback,
37 const base::Closure& task, 37 const base::Closure& task,
38 ServiceWorkerStatusCode status) { 38 ServiceWorkerStatusCode status) {
39 if (status != SERVICE_WORKER_OK) { 39 if (status != SERVICE_WORKER_OK) {
40 if (!error_callback.is_null()) 40 if (!error_callback.is_null())
41 error_callback.Run(status); 41 error_callback.Run(status);
42 return; 42 return;
43 } 43 }
44 if (version->status() != ServiceWorkerVersion::RUNNING) { 44 if (version->running_status() != ServiceWorkerVersion::RUNNING) {
45 // We've tried to start the worker (and it has succeeded), but 45 // We've tried to start the worker (and it has succeeded), but
46 // it looks it's not running yet. 46 // it looks it's not running yet.
47 NOTREACHED() << "The worker's not running after successful StartWorker"; 47 NOTREACHED() << "The worker's not running after successful StartWorker";
48 if (!error_callback.is_null()) 48 if (!error_callback.is_null())
49 error_callback.Run(SERVICE_WORKER_ERROR_START_WORKER_FAILED); 49 error_callback.Run(SERVICE_WORKER_ERROR_START_WORKER_FAILED);
50 return; 50 return;
51 } 51 }
52 task.Run(); 52 task.Run();
53 } 53 }
54 54
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 callback.Run(status, response.a); 88 callback.Run(status, response.a);
89 } 89 }
90 90
91 } // namespace 91 } // namespace
92 92
93 ServiceWorkerVersion::ServiceWorkerVersion( 93 ServiceWorkerVersion::ServiceWorkerVersion(
94 ServiceWorkerRegistration* registration, 94 ServiceWorkerRegistration* registration,
95 EmbeddedWorkerRegistry* worker_registry, 95 EmbeddedWorkerRegistry* worker_registry,
96 int64 version_id) 96 int64 version_id)
97 : version_id_(version_id), 97 : version_id_(version_id),
98 status_(NEW),
98 is_shutdown_(false), 99 is_shutdown_(false),
99 registration_(registration), 100 registration_(registration),
100 weak_factory_(this) { 101 weak_factory_(this) {
101 if (worker_registry) { 102 if (worker_registry) {
102 embedded_worker_ = worker_registry->CreateWorker(); 103 embedded_worker_ = worker_registry->CreateWorker();
103 embedded_worker_->AddObserver(this); 104 embedded_worker_->AddObserver(this);
104 } 105 }
105 } 106 }
106 107
107 ServiceWorkerVersion::~ServiceWorkerVersion() { DCHECK(is_shutdown_); } 108 ServiceWorkerVersion::~ServiceWorkerVersion() { DCHECK(is_shutdown_); }
108 109
109 void ServiceWorkerVersion::Shutdown() { 110 void ServiceWorkerVersion::Shutdown() {
110 is_shutdown_ = true; 111 is_shutdown_ = true;
111 registration_ = NULL; 112 registration_ = NULL;
112 if (embedded_worker_) { 113 if (embedded_worker_) {
113 embedded_worker_->RemoveObserver(this); 114 embedded_worker_->RemoveObserver(this);
114 embedded_worker_.reset(); 115 embedded_worker_.reset();
115 } 116 }
116 } 117 }
117 118
118 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { 119 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) {
119 DCHECK(!is_shutdown_); 120 DCHECK(!is_shutdown_);
120 DCHECK(embedded_worker_); 121 DCHECK(embedded_worker_);
121 DCHECK(registration_); 122 DCHECK(registration_);
122 if (status() == RUNNING) { 123 if (running_status() == RUNNING) {
123 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 124 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
124 return; 125 return;
125 } 126 }
126 if (status() == STOPPING) { 127 if (running_status() == STOPPING) {
127 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); 128 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED));
128 return; 129 return;
129 } 130 }
130 if (start_callbacks_.empty()) { 131 if (start_callbacks_.empty()) {
131 ServiceWorkerStatusCode status = embedded_worker_->Start( 132 ServiceWorkerStatusCode status = embedded_worker_->Start(
132 version_id_, 133 version_id_,
133 registration_->script_url()); 134 registration_->script_url());
134 if (status != SERVICE_WORKER_OK) { 135 if (status != SERVICE_WORKER_OK) {
135 RunSoon(base::Bind(callback, status)); 136 RunSoon(base::Bind(callback, status));
136 return; 137 return;
137 } 138 }
138 } 139 }
139 start_callbacks_.push_back(callback); 140 start_callbacks_.push_back(callback);
140 } 141 }
141 142
142 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { 143 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) {
143 DCHECK(!is_shutdown_); 144 DCHECK(!is_shutdown_);
144 DCHECK(embedded_worker_); 145 DCHECK(embedded_worker_);
145 if (status() == STOPPED) { 146 if (running_status() == STOPPED) {
146 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 147 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
147 return; 148 return;
148 } 149 }
149 if (stop_callbacks_.empty()) { 150 if (stop_callbacks_.empty()) {
150 ServiceWorkerStatusCode status = embedded_worker_->Stop(); 151 ServiceWorkerStatusCode status = embedded_worker_->Stop();
151 if (status != SERVICE_WORKER_OK) { 152 if (status != SERVICE_WORKER_OK) {
152 RunSoon(base::Bind(callback, status)); 153 RunSoon(base::Bind(callback, status));
153 return; 154 return;
154 } 155 }
155 } 156 }
156 stop_callbacks_.push_back(callback); 157 stop_callbacks_.push_back(callback);
157 } 158 }
158 159
159 void ServiceWorkerVersion::SendMessage( 160 void ServiceWorkerVersion::SendMessage(
160 const IPC::Message& message, const StatusCallback& callback) { 161 const IPC::Message& message, const StatusCallback& callback) {
161 DCHECK(!is_shutdown_); 162 DCHECK(!is_shutdown_);
162 DCHECK(embedded_worker_); 163 DCHECK(embedded_worker_);
163 if (status() != RUNNING) { 164 if (running_status() != RUNNING) {
164 // Schedule calling this method after starting the worker. 165 // Schedule calling this method after starting the worker.
165 StartWorker(base::Bind(&RunTaskAfterStartWorker, 166 StartWorker(base::Bind(&RunTaskAfterStartWorker,
166 weak_factory_.GetWeakPtr(), callback, 167 weak_factory_.GetWeakPtr(), callback,
167 base::Bind(&self::SendMessage, 168 base::Bind(&self::SendMessage,
168 weak_factory_.GetWeakPtr(), 169 weak_factory_.GetWeakPtr(),
169 message, callback))); 170 message, callback)));
170 return; 171 return;
171 } 172 }
172 173
173 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( 174 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(
174 kInvalidRequestId, message); 175 kInvalidRequestId, message);
175 RunSoon(base::Bind(callback, status)); 176 RunSoon(base::Bind(callback, status));
176 } 177 }
177 178
178 void ServiceWorkerVersion::SendMessageAndRegisterCallback( 179 void ServiceWorkerVersion::SendMessageAndRegisterCallback(
179 const IPC::Message& message, const MessageCallback& callback) { 180 const IPC::Message& message, const MessageCallback& callback) {
180 DCHECK(!is_shutdown_); 181 DCHECK(!is_shutdown_);
181 DCHECK(embedded_worker_); 182 DCHECK(embedded_worker_);
182 if (status() != RUNNING) { 183 if (running_status() != RUNNING) {
183 // Schedule calling this method after starting the worker. 184 // Schedule calling this method after starting the worker.
184 StartWorker(base::Bind(&RunTaskAfterStartWorker, 185 StartWorker(base::Bind(&RunTaskAfterStartWorker,
185 weak_factory_.GetWeakPtr(), 186 weak_factory_.GetWeakPtr(),
186 base::Bind(&RunEmptyMessageCallback, callback), 187 base::Bind(&RunEmptyMessageCallback, callback),
187 base::Bind(&self::SendMessageAndRegisterCallback, 188 base::Bind(&self::SendMessageAndRegisterCallback,
188 weak_factory_.GetWeakPtr(), 189 weak_factory_.GetWeakPtr(),
189 message, callback))); 190 message, callback)));
190 return; 191 return;
191 } 192 }
192 193
193 int request_id = message_callbacks_.Add(new MessageCallback(callback)); 194 int request_id = message_callbacks_.Add(new MessageCallback(callback));
194 ServiceWorkerStatusCode status = 195 ServiceWorkerStatusCode status =
195 embedded_worker_->SendMessage(request_id, message); 196 embedded_worker_->SendMessage(request_id, message);
196 if (status != SERVICE_WORKER_OK) { 197 if (status != SERVICE_WORKER_OK) {
197 message_callbacks_.Remove(request_id); 198 message_callbacks_.Remove(request_id);
198 RunSoon(base::Bind(callback, status, IPC::Message())); 199 RunSoon(base::Bind(callback, status, IPC::Message()));
199 return; 200 return;
200 } 201 }
201 } 202 }
202 203
203 void ServiceWorkerVersion::DispatchInstallEvent( 204 void ServiceWorkerVersion::DispatchInstallEvent(
204 int active_version_embedded_worker_id, 205 int active_version_embedded_worker_id,
205 const StatusCallback& callback) { 206 const StatusCallback& callback) {
207 if (status() != NEW) {
michaeln 2014/03/10 18:53:45 I wonder if we should [D]CHECK these instead of ha
kinuko 2014/03/11 06:58:34 Let me land this as is (branch + NOTREACHED) for n
208 // Unexpected.
209 NOTREACHED();
210 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
211 return;
212 }
206 SendMessageAndRegisterCallback( 213 SendMessageAndRegisterCallback(
207 ServiceWorkerMsg_InstallEvent(active_version_embedded_worker_id), 214 ServiceWorkerMsg_InstallEvent(active_version_embedded_worker_id),
208 base::Bind(&HandleInstallFinished, callback)); 215 base::Bind(&HandleInstallFinished, callback));
209 } 216 }
210 217
211 void ServiceWorkerVersion::DispatchFetchEvent( 218 void ServiceWorkerVersion::DispatchFetchEvent(
212 const ServiceWorkerFetchRequest& request, 219 const ServiceWorkerFetchRequest& request,
213 const FetchCallback& callback) { 220 const FetchCallback& callback) {
221 if (status() != ACTIVE) {
222 // Unexpected.
223 NOTREACHED();
224 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_FAILED,
225 ServiceWorkerFetchResponse()));
226 return;
227 }
214 SendMessageAndRegisterCallback( 228 SendMessageAndRegisterCallback(
215 ServiceWorkerMsg_FetchEvent(request), 229 ServiceWorkerMsg_FetchEvent(request),
216 base::Bind(&HandleFetchResponse, callback)); 230 base::Bind(&HandleFetchResponse, callback));
217 } 231 }
218 232
219 void ServiceWorkerVersion::AddProcessToWorker(int process_id) { 233 void ServiceWorkerVersion::AddProcessToWorker(int process_id) {
220 DCHECK(!is_shutdown_); 234 DCHECK(!is_shutdown_);
221 embedded_worker_->AddProcessReference(process_id); 235 embedded_worker_->AddProcessReference(process_id);
222 } 236 }
223 237
224 void ServiceWorkerVersion::RemoveProcessToWorker(int process_id) { 238 void ServiceWorkerVersion::RemoveProcessToWorker(int process_id) {
225 embedded_worker_->ReleaseProcessReference(process_id); 239 embedded_worker_->ReleaseProcessReference(process_id);
226 } 240 }
227 241
228 void ServiceWorkerVersion::OnStarted() { 242 void ServiceWorkerVersion::OnStarted() {
229 DCHECK_EQ(RUNNING, status()); 243 DCHECK_EQ(RUNNING, running_status());
230 // Fire all start callbacks. 244 // Fire all start callbacks.
231 RunCallbacks(start_callbacks_, SERVICE_WORKER_OK); 245 RunCallbacks(start_callbacks_, SERVICE_WORKER_OK);
232 start_callbacks_.clear(); 246 start_callbacks_.clear();
233 } 247 }
234 248
235 void ServiceWorkerVersion::OnStopped() { 249 void ServiceWorkerVersion::OnStopped() {
236 DCHECK_EQ(STOPPED, status()); 250 DCHECK_EQ(STOPPED, running_status());
237 // Fire all stop callbacks. 251 // Fire all stop callbacks.
238 RunCallbacks(stop_callbacks_, SERVICE_WORKER_OK); 252 RunCallbacks(stop_callbacks_, SERVICE_WORKER_OK);
239 stop_callbacks_.clear(); 253 stop_callbacks_.clear();
240 254
241 // Let all start callbacks fail. 255 // Let all start callbacks fail.
242 RunCallbacks(start_callbacks_, SERVICE_WORKER_ERROR_START_WORKER_FAILED); 256 RunCallbacks(start_callbacks_, SERVICE_WORKER_ERROR_START_WORKER_FAILED);
243 start_callbacks_.clear(); 257 start_callbacks_.clear();
244 258
245 // Let all message callbacks fail. 259 // Let all message callbacks fail.
246 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. 260 // TODO(kinuko): Consider if we want to add queue+resend mechanism here.
(...skipping 11 matching lines...) Expand all
258 if (callback) { 272 if (callback) {
259 callback->Run(SERVICE_WORKER_OK, message); 273 callback->Run(SERVICE_WORKER_OK, message);
260 message_callbacks_.Remove(request_id); 274 message_callbacks_.Remove(request_id);
261 return; 275 return;
262 } 276 }
263 NOTREACHED() << "Got unexpected message: " << request_id 277 NOTREACHED() << "Got unexpected message: " << request_id
264 << " " << message.type(); 278 << " " << message.type();
265 } 279 }
266 280
267 } // namespace content 281 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698