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

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: 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 } 86 }
87 ServiceWorkerHostMsg_FetchEventFinished::Read(&message, &response); 87 ServiceWorkerHostMsg_FetchEventFinished::Read(&message, &response);
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 Status status)
97 : version_id_(version_id), 98 : version_id_(version_id),
99 status_(status),
98 is_shutdown_(false), 100 is_shutdown_(false),
99 registration_(registration), 101 registration_(registration),
100 weak_factory_(this) { 102 weak_factory_(this) {
101 if (worker_registry) { 103 if (worker_registry) {
102 embedded_worker_ = worker_registry->CreateWorker(); 104 embedded_worker_ = worker_registry->CreateWorker();
103 embedded_worker_->AddObserver(this); 105 embedded_worker_->AddObserver(this);
104 } 106 }
105 } 107 }
106 108
107 ServiceWorkerVersion::~ServiceWorkerVersion() { DCHECK(is_shutdown_); } 109 ServiceWorkerVersion::~ServiceWorkerVersion() { DCHECK(is_shutdown_); }
108 110
109 void ServiceWorkerVersion::Shutdown() { 111 void ServiceWorkerVersion::Shutdown() {
110 is_shutdown_ = true; 112 is_shutdown_ = true;
111 registration_ = NULL; 113 registration_ = NULL;
112 if (embedded_worker_) { 114 if (embedded_worker_) {
113 embedded_worker_->RemoveObserver(this); 115 embedded_worker_->RemoveObserver(this);
114 embedded_worker_.reset(); 116 embedded_worker_.reset();
115 } 117 }
116 } 118 }
117 119
118 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { 120 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) {
119 DCHECK(!is_shutdown_); 121 DCHECK(!is_shutdown_);
120 DCHECK(embedded_worker_); 122 DCHECK(embedded_worker_);
121 DCHECK(registration_); 123 DCHECK(registration_);
122 if (status() == RUNNING) { 124 if (running_status() == RUNNING) {
123 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 125 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
124 return; 126 return;
125 } 127 }
126 if (status() == STOPPING) { 128 if (running_status() == STOPPING) {
127 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); 129 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED));
128 return; 130 return;
129 } 131 }
130 if (start_callbacks_.empty()) { 132 if (start_callbacks_.empty()) {
131 ServiceWorkerStatusCode status = embedded_worker_->Start( 133 ServiceWorkerStatusCode status = embedded_worker_->Start(
132 version_id_, 134 version_id_,
133 registration_->script_url()); 135 registration_->script_url());
134 if (status != SERVICE_WORKER_OK) { 136 if (status != SERVICE_WORKER_OK) {
135 RunSoon(base::Bind(callback, status)); 137 RunSoon(base::Bind(callback, status));
136 return; 138 return;
137 } 139 }
138 } 140 }
139 start_callbacks_.push_back(callback); 141 start_callbacks_.push_back(callback);
140 } 142 }
141 143
142 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { 144 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) {
143 DCHECK(!is_shutdown_); 145 DCHECK(!is_shutdown_);
144 DCHECK(embedded_worker_); 146 DCHECK(embedded_worker_);
145 if (status() == STOPPED) { 147 if (running_status() == STOPPED) {
146 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 148 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
147 return; 149 return;
148 } 150 }
149 if (stop_callbacks_.empty()) { 151 if (stop_callbacks_.empty()) {
150 ServiceWorkerStatusCode status = embedded_worker_->Stop(); 152 ServiceWorkerStatusCode status = embedded_worker_->Stop();
151 if (status != SERVICE_WORKER_OK) { 153 if (status != SERVICE_WORKER_OK) {
152 RunSoon(base::Bind(callback, status)); 154 RunSoon(base::Bind(callback, status));
153 return; 155 return;
154 } 156 }
155 } 157 }
156 stop_callbacks_.push_back(callback); 158 stop_callbacks_.push_back(callback);
157 } 159 }
158 160
159 void ServiceWorkerVersion::SendMessage( 161 void ServiceWorkerVersion::SendMessage(
160 const IPC::Message& message, const StatusCallback& callback) { 162 const IPC::Message& message, const StatusCallback& callback) {
161 DCHECK(!is_shutdown_); 163 DCHECK(!is_shutdown_);
162 DCHECK(embedded_worker_); 164 DCHECK(embedded_worker_);
163 if (status() != RUNNING) { 165 if (running_status() != RUNNING) {
164 // Schedule calling this method after starting the worker. 166 // Schedule calling this method after starting the worker.
165 StartWorker(base::Bind(&RunTaskAfterStartWorker, 167 StartWorker(base::Bind(&RunTaskAfterStartWorker,
166 weak_factory_.GetWeakPtr(), callback, 168 weak_factory_.GetWeakPtr(), callback,
167 base::Bind(&self::SendMessage, 169 base::Bind(&self::SendMessage,
168 weak_factory_.GetWeakPtr(), 170 weak_factory_.GetWeakPtr(),
169 message, callback))); 171 message, callback)));
170 return; 172 return;
171 } 173 }
172 174
173 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( 175 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(
174 kInvalidRequestId, message); 176 kInvalidRequestId, message);
175 RunSoon(base::Bind(callback, status)); 177 RunSoon(base::Bind(callback, status));
176 } 178 }
177 179
178 void ServiceWorkerVersion::SendMessageAndRegisterCallback( 180 void ServiceWorkerVersion::SendMessageAndRegisterCallback(
179 const IPC::Message& message, const MessageCallback& callback) { 181 const IPC::Message& message, const MessageCallback& callback) {
180 DCHECK(!is_shutdown_); 182 DCHECK(!is_shutdown_);
181 DCHECK(embedded_worker_); 183 DCHECK(embedded_worker_);
182 if (status() != RUNNING) { 184 if (running_status() != RUNNING) {
183 // Schedule calling this method after starting the worker. 185 // Schedule calling this method after starting the worker.
184 StartWorker(base::Bind(&RunTaskAfterStartWorker, 186 StartWorker(base::Bind(&RunTaskAfterStartWorker,
185 weak_factory_.GetWeakPtr(), 187 weak_factory_.GetWeakPtr(),
186 base::Bind(&RunEmptyMessageCallback, callback), 188 base::Bind(&RunEmptyMessageCallback, callback),
187 base::Bind(&self::SendMessageAndRegisterCallback, 189 base::Bind(&self::SendMessageAndRegisterCallback,
188 weak_factory_.GetWeakPtr(), 190 weak_factory_.GetWeakPtr(),
189 message, callback))); 191 message, callback)));
190 return; 192 return;
191 } 193 }
192 194
193 int request_id = message_callbacks_.Add(new MessageCallback(callback)); 195 int request_id = message_callbacks_.Add(new MessageCallback(callback));
194 ServiceWorkerStatusCode status = 196 ServiceWorkerStatusCode status =
195 embedded_worker_->SendMessage(request_id, message); 197 embedded_worker_->SendMessage(request_id, message);
196 if (status != SERVICE_WORKER_OK) { 198 if (status != SERVICE_WORKER_OK) {
197 message_callbacks_.Remove(request_id); 199 message_callbacks_.Remove(request_id);
198 RunSoon(base::Bind(callback, status, IPC::Message())); 200 RunSoon(base::Bind(callback, status, IPC::Message()));
199 return; 201 return;
200 } 202 }
201 } 203 }
202 204
203 void ServiceWorkerVersion::DispatchInstallEvent( 205 void ServiceWorkerVersion::DispatchInstallEvent(
204 int active_version_embedded_worker_id, 206 int active_version_embedded_worker_id,
205 const StatusCallback& callback) { 207 const StatusCallback& callback) {
208 if (status_ != NEW) {
209 // Unexpected.
210 NOTREACHED();
211 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_FAILED));
212 return;
213 }
206 SendMessageAndRegisterCallback( 214 SendMessageAndRegisterCallback(
207 ServiceWorkerMsg_InstallEvent(active_version_embedded_worker_id), 215 ServiceWorkerMsg_InstallEvent(active_version_embedded_worker_id),
208 base::Bind(&HandleInstallFinished, callback)); 216 base::Bind(&HandleInstallFinished, callback));
209 } 217 }
210 218
211 void ServiceWorkerVersion::DispatchFetchEvent( 219 void ServiceWorkerVersion::DispatchFetchEvent(
212 const ServiceWorkerFetchRequest& request, 220 const ServiceWorkerFetchRequest& request,
213 const FetchCallback& callback) { 221 const FetchCallback& callback) {
222 if (status_ != ACTIVE) {
223 // Unexpected.
224 NOTREACHED();
225 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_FAILED,
226 ServiceWorkerFetchResponse()));
227 return;
228 }
214 SendMessageAndRegisterCallback( 229 SendMessageAndRegisterCallback(
215 ServiceWorkerMsg_FetchEvent(request), 230 ServiceWorkerMsg_FetchEvent(request),
216 base::Bind(&HandleFetchResponse, callback)); 231 base::Bind(&HandleFetchResponse, callback));
217 } 232 }
218 233
219 void ServiceWorkerVersion::AddProcessToWorker(int process_id) { 234 void ServiceWorkerVersion::AddProcessToWorker(int process_id) {
220 DCHECK(!is_shutdown_); 235 DCHECK(!is_shutdown_);
221 embedded_worker_->AddProcessReference(process_id); 236 embedded_worker_->AddProcessReference(process_id);
222 } 237 }
223 238
224 void ServiceWorkerVersion::RemoveProcessToWorker(int process_id) { 239 void ServiceWorkerVersion::RemoveProcessToWorker(int process_id) {
225 embedded_worker_->ReleaseProcessReference(process_id); 240 embedded_worker_->ReleaseProcessReference(process_id);
226 } 241 }
227 242
228 void ServiceWorkerVersion::OnStarted() { 243 void ServiceWorkerVersion::OnStarted() {
229 DCHECK_EQ(RUNNING, status()); 244 DCHECK_EQ(RUNNING, running_status());
230 // Fire all start callbacks. 245 // Fire all start callbacks.
231 RunCallbacks(start_callbacks_, SERVICE_WORKER_OK); 246 RunCallbacks(start_callbacks_, SERVICE_WORKER_OK);
232 start_callbacks_.clear(); 247 start_callbacks_.clear();
233 } 248 }
234 249
235 void ServiceWorkerVersion::OnStopped() { 250 void ServiceWorkerVersion::OnStopped() {
236 DCHECK_EQ(STOPPED, status()); 251 DCHECK_EQ(STOPPED, running_status());
237 // Fire all stop callbacks. 252 // Fire all stop callbacks.
238 RunCallbacks(stop_callbacks_, SERVICE_WORKER_OK); 253 RunCallbacks(stop_callbacks_, SERVICE_WORKER_OK);
239 stop_callbacks_.clear(); 254 stop_callbacks_.clear();
240 255
241 // Let all start callbacks fail. 256 // Let all start callbacks fail.
242 RunCallbacks(start_callbacks_, SERVICE_WORKER_ERROR_START_WORKER_FAILED); 257 RunCallbacks(start_callbacks_, SERVICE_WORKER_ERROR_START_WORKER_FAILED);
243 start_callbacks_.clear(); 258 start_callbacks_.clear();
244 259
245 // Let all message callbacks fail. 260 // Let all message callbacks fail.
246 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. 261 // TODO(kinuko): Consider if we want to add queue+resend mechanism here.
(...skipping 11 matching lines...) Expand all
258 if (callback) { 273 if (callback) {
259 callback->Run(SERVICE_WORKER_OK, message); 274 callback->Run(SERVICE_WORKER_OK, message);
260 message_callbacks_.Remove(request_id); 275 message_callbacks_.Remove(request_id);
261 return; 276 return;
262 } 277 }
263 NOTREACHED() << "Got unexpected message: " << request_id 278 NOTREACHED() << "Got unexpected message: " << request_id
264 << " " << message.type(); 279 << " " << message.type();
265 } 280 }
266 281
267 } // namespace content 282 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698