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/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 const GURL& script_url, | 162 const GURL& script_url, |
163 int64 version_id, | 163 int64 version_id, |
164 base::WeakPtr<ServiceWorkerContextCore> context) | 164 base::WeakPtr<ServiceWorkerContextCore> context) |
165 : version_id_(version_id), | 165 : version_id_(version_id), |
166 registration_id_(kInvalidServiceWorkerVersionId), | 166 registration_id_(kInvalidServiceWorkerVersionId), |
167 script_url_(script_url), | 167 script_url_(script_url), |
168 status_(NEW), | 168 status_(NEW), |
169 context_(context), | 169 context_(context), |
170 script_cache_map_(this, context), | 170 script_cache_map_(this, context), |
171 is_doomed_(false), | 171 is_doomed_(false), |
| 172 skip_waiting_(false), |
172 weak_factory_(this) { | 173 weak_factory_(this) { |
173 DCHECK(context_); | 174 DCHECK(context_); |
174 DCHECK(registration); | 175 DCHECK(registration); |
175 if (registration) { | 176 if (registration) { |
176 registration_id_ = registration->id(); | 177 registration_id_ = registration->id(); |
177 scope_ = registration->pattern(); | 178 scope_ = registration->pattern(); |
178 } | 179 } |
179 context_->AddLiveVersion(this); | 180 context_->AddLiveVersion(this); |
180 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); | 181 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); |
181 embedded_worker_->AddListener(this); | 182 embedded_worker_->AddListener(this); |
182 } | 183 } |
183 | 184 |
184 ServiceWorkerVersion::~ServiceWorkerVersion() { | 185 ServiceWorkerVersion::~ServiceWorkerVersion() { |
185 embedded_worker_->RemoveListener(this); | 186 embedded_worker_->RemoveListener(this); |
186 if (context_) | 187 if (context_) |
187 context_->RemoveLiveVersion(version_id_); | 188 context_->RemoveLiveVersion(version_id_); |
188 // EmbeddedWorker's dtor sends StopWorker if it's still running. | 189 // EmbeddedWorker's dtor sends StopWorker if it's still running. |
189 } | 190 } |
190 | 191 |
191 void ServiceWorkerVersion::SetStatus(Status status) { | 192 void ServiceWorkerVersion::SetStatus(Status status) { |
192 if (status_ == status) | 193 if (status_ == status) |
193 return; | 194 return; |
194 | 195 |
195 // Schedule to stop worker after registration successfully completed. | 196 // Schedule to stop worker after registration successfully completed. |
196 if (status_ == ACTIVATING && status == ACTIVATED && !HasControllee()) | 197 if (status_ == ACTIVATING && status == ACTIVATED && !HasControllee()) |
197 ScheduleStopWorker(); | 198 ScheduleStopWorker(); |
198 | 199 |
199 status_ = status; | 200 status_ = status; |
200 | 201 |
| 202 if (skip_waiting_ && status_ == ACTIVATED) { |
| 203 for (int request_id : pending_skip_waiting_requests_) |
| 204 DidSkipWaiting(request_id); |
| 205 pending_skip_waiting_requests_.clear(); |
| 206 } |
| 207 |
201 std::vector<base::Closure> callbacks; | 208 std::vector<base::Closure> callbacks; |
202 callbacks.swap(status_change_callbacks_); | 209 callbacks.swap(status_change_callbacks_); |
203 for (const auto& callback : callbacks) | 210 for (const auto& callback : callbacks) |
204 callback.Run(); | 211 callback.Run(); |
205 | 212 |
206 FOR_EACH_OBSERVER(Listener, listeners_, OnVersionStateChanged(this)); | 213 FOR_EACH_OBSERVER(Listener, listeners_, OnVersionStateChanged(this)); |
207 } | 214 } |
208 | 215 |
209 void ServiceWorkerVersion::RegisterStatusChangeCallback( | 216 void ServiceWorkerVersion::RegisterStatusChangeCallback( |
210 const base::Closure& callback) { | 217 const base::Closure& callback) { |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, | 710 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, |
704 OnGeofencingEventFinished) | 711 OnGeofencingEventFinished) |
705 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, | 712 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, |
706 OnPostMessageToDocument) | 713 OnPostMessageToDocument) |
707 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, | 714 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, |
708 OnFocusClient) | 715 OnFocusClient) |
709 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoSuccess, | 716 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoSuccess, |
710 OnGetClientInfoSuccess) | 717 OnGetClientInfoSuccess) |
711 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoError, | 718 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoError, |
712 OnGetClientInfoError) | 719 OnGetClientInfoError) |
| 720 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting, |
| 721 OnSkipWaiting) |
713 IPC_MESSAGE_UNHANDLED(handled = false) | 722 IPC_MESSAGE_UNHANDLED(handled = false) |
714 IPC_END_MESSAGE_MAP() | 723 IPC_END_MESSAGE_MAP() |
715 return handled; | 724 return handled; |
716 } | 725 } |
717 | 726 |
718 void ServiceWorkerVersion::OnStartMessageSent( | 727 void ServiceWorkerVersion::OnStartMessageSent( |
719 ServiceWorkerStatusCode status) { | 728 ServiceWorkerStatusCode status) { |
720 if (status != SERVICE_WORKER_OK) | 729 if (status != SERVICE_WORKER_OK) |
721 RunCallbacks(this, &start_callbacks_, status); | 730 RunCallbacks(this, &start_callbacks_, status); |
722 } | 731 } |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
965 void ServiceWorkerVersion::OnFocusClientFinished(int request_id, bool result) { | 974 void ServiceWorkerVersion::OnFocusClientFinished(int request_id, bool result) { |
966 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 975 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
967 | 976 |
968 if (running_status() != RUNNING) | 977 if (running_status() != RUNNING) |
969 return; | 978 return; |
970 | 979 |
971 embedded_worker_->SendMessage(ServiceWorkerMsg_FocusClientResponse( | 980 embedded_worker_->SendMessage(ServiceWorkerMsg_FocusClientResponse( |
972 request_id, result)); | 981 request_id, result)); |
973 } | 982 } |
974 | 983 |
| 984 void ServiceWorkerVersion::OnSkipWaiting(int request_id) { |
| 985 skip_waiting_ = true; |
| 986 if (status_ != INSTALLED) |
| 987 return DidSkipWaiting(request_id); |
| 988 |
| 989 if (!context_) |
| 990 return; |
| 991 ServiceWorkerRegistration* registration = |
| 992 context_->GetLiveRegistration(registration_id_); |
| 993 if (!registration) |
| 994 return; |
| 995 pending_skip_waiting_requests_.push_back(request_id); |
| 996 if (pending_skip_waiting_requests_.size() == 1) |
| 997 registration->ActivateWaitingVersionWhenReady(); |
| 998 } |
| 999 |
| 1000 void ServiceWorkerVersion::DidSkipWaiting(int request_id) { |
| 1001 if (running_status() == STARTING || running_status() == RUNNING) |
| 1002 embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id)); |
| 1003 } |
| 1004 |
975 void ServiceWorkerVersion::ScheduleStopWorker() { | 1005 void ServiceWorkerVersion::ScheduleStopWorker() { |
976 if (running_status() != RUNNING) | 1006 if (running_status() != RUNNING) |
977 return; | 1007 return; |
978 if (stop_worker_timer_.IsRunning()) { | 1008 if (stop_worker_timer_.IsRunning()) { |
979 stop_worker_timer_.Reset(); | 1009 stop_worker_timer_.Reset(); |
980 return; | 1010 return; |
981 } | 1011 } |
982 stop_worker_timer_.Start( | 1012 stop_worker_timer_.Start( |
983 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay), | 1013 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay), |
984 base::Bind(&ServiceWorkerVersion::StopWorker, | 1014 base::Bind(&ServiceWorkerVersion::StopWorker, |
985 weak_factory_.GetWeakPtr(), | 1015 weak_factory_.GetWeakPtr(), |
986 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback))); | 1016 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback))); |
987 } | 1017 } |
988 | 1018 |
989 void ServiceWorkerVersion::DoomInternal() { | 1019 void ServiceWorkerVersion::DoomInternal() { |
990 DCHECK(!HasControllee()); | 1020 DCHECK(!HasControllee()); |
991 SetStatus(REDUNDANT); | 1021 SetStatus(REDUNDANT); |
992 StopWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1022 StopWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
993 if (!context_) | 1023 if (!context_) |
994 return; | 1024 return; |
995 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; | 1025 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
996 script_cache_map_.GetResources(&resources); | 1026 script_cache_map_.GetResources(&resources); |
997 context_->storage()->PurgeResources(resources); | 1027 context_->storage()->PurgeResources(resources); |
998 } | 1028 } |
999 | 1029 |
1000 } // namespace content | 1030 } // namespace content |
OLD | NEW |