Chromium Code Reviews| 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_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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |