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 30d9fd5a0a1b0ae5ce39b581c24c49d385544d4a..fe27f875aed532507ff66b2d6cc8fab2a071737f 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -101,6 +101,7 @@ ServiceWorkerVersion::ServiceWorkerVersion( |
context_(context), |
script_cache_map_(this, context), |
is_doomed_(false), |
+ skip_waiting_(false), |
weak_factory_(this) { |
DCHECK(context_); |
DCHECK(registration); |
@@ -130,6 +131,12 @@ void ServiceWorkerVersion::SetStatus(Status status) { |
status_ = status; |
+ if (skip_waiting_ && status_ == ACTIVATED) { |
+ for (size_t i = 0; i < pending_skip_waiting_requests_.size(); ++i) |
michaeln
2014/11/14 23:06:39
good place for (int request_id : pending_skip_wait
xiang
2014/11/17 08:42:10
Done.
|
+ DidSkipWaiting(pending_skip_waiting_requests_[i]); |
+ pending_skip_waiting_requests_.clear(); |
+ } |
+ |
std::vector<base::Closure> callbacks; |
callbacks.swap(status_change_callbacks_); |
for (std::vector<base::Closure>::const_iterator i = callbacks.begin(); |
@@ -551,6 +558,7 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
OnGeofencingEventFinished) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, |
OnPostMessageToDocument) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting, OnSkipWaiting) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -734,6 +742,26 @@ void ServiceWorkerVersion::OnPostMessageToDocument( |
provider_host->PostMessage(message, sent_message_port_ids); |
} |
+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); |
+ registration->ActivateWaitingVersion(); |
michaeln
2014/11/14 23:06:39
I don't think ActivateWaitingVersion expects to be
xiang
2014/11/17 08:42:10
Done. Thanks!
|
+} |
+ |
+void ServiceWorkerVersion::DidSkipWaiting(int request_id) { |
+ if (running_status() == STARTING || running_status() == RUNNING) |
falken
2014/11/14 04:00:15
I'm curious in what circumstances can this occur?
xiang
2014/11/17 08:42:10
When .skipWaiting called in worker script parsing
|
+ embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id)); |
+} |
+ |
void ServiceWorkerVersion::ScheduleStopWorker() { |
if (running_status() != RUNNING) |
return; |