| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |