Index: content/browser/service_worker/service_worker_version.cc |
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc |
index 5bd0d354205d8649af268b6b8e37ffeecac42604..4f05ec96baedb2ace60cabd54b048a4c06af3e72 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -169,6 +169,7 @@ ServiceWorkerVersion::ServiceWorkerVersion( |
context_(context), |
script_cache_map_(this, context), |
is_doomed_(false), |
+ skip_waiting_(false), |
weak_factory_(this) { |
DCHECK(context_); |
DCHECK(registration); |
@@ -198,6 +199,12 @@ void ServiceWorkerVersion::SetStatus(Status status) { |
status_ = status; |
+ if (skip_waiting_ && status_ == ACTIVATED) { |
+ for (int request_id : pending_skip_waiting_requests_) |
+ DidSkipWaiting(request_id); |
+ pending_skip_waiting_requests_.clear(); |
+ } |
+ |
std::vector<base::Closure> callbacks; |
callbacks.swap(status_change_callbacks_); |
for (const auto& callback : callbacks) |
@@ -710,6 +717,8 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
OnGetClientInfoSuccess) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoError, |
OnGetClientInfoError) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting, |
+ OnSkipWaiting) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -972,6 +981,27 @@ void ServiceWorkerVersion::OnFocusClientFinished(int request_id, bool result) { |
request_id, result)); |
} |
+void ServiceWorkerVersion::OnSkipWaiting(int request_id) { |
+ skip_waiting_ = true; |
+ if (status_ != INSTALLED) |
+ return DidSkipWaiting(request_id); |
+ |
+ if (!context_) |
+ return; |
+ ServiceWorkerRegistration* registration = |
+ context_->GetLiveRegistration(registration_id_); |
+ if (!registration) |
+ return; |
+ pending_skip_waiting_requests_.push_back(request_id); |
+ if (pending_skip_waiting_requests_.size() == 1) |
+ registration->ActivateWaitingVersionWhenReady(); |
+} |
+ |
+void ServiceWorkerVersion::DidSkipWaiting(int request_id) { |
+ if (running_status() == STARTING || running_status() == RUNNING) |
+ embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id)); |
+} |
+ |
void ServiceWorkerVersion::ScheduleStopWorker() { |
if (running_status() != RUNNING) |
return; |