| 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 4235bf006610264c624f39349fc8683cbb077e90..eb07af63b2f2c54d92ac6ce3473a4c1f6f52ee4c 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -99,6 +99,7 @@ ServiceWorkerVersion::ServiceWorkerVersion(
|
| status_(NEW),
|
| context_(context),
|
| script_cache_map_(this, context),
|
| + is_doomed_(false),
|
| weak_factory_(this) {
|
| DCHECK(context_);
|
| DCHECK(registration);
|
| @@ -386,10 +387,12 @@ void ServiceWorkerVersion::RemoveControllee(
|
| controllee_by_id_.Remove(found->second);
|
| controllee_map_.erase(found);
|
| RemoveProcessFromWorker(provider_host->process_id());
|
| - if (!HasControllee()) {
|
| - ScheduleStopWorker();
|
| - FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
|
| - }
|
| + if (HasControllee())
|
| + return;
|
| + ScheduleStopWorker();
|
| + if (is_doomed_)
|
| + DoomInternal();
|
| + FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
|
| }
|
|
|
| void ServiceWorkerVersion::AddPotentialControllee(
|
| @@ -410,6 +413,23 @@ void ServiceWorkerVersion::RemoveListener(Listener* listener) {
|
| listeners_.RemoveObserver(listener);
|
| }
|
|
|
| +void ServiceWorkerVersion::Doom() {
|
| + if (is_doomed_)
|
| + return;
|
| + is_doomed_ = true;
|
| + if (!HasControllee())
|
| + DoomInternal();
|
| +}
|
| +
|
| +void ServiceWorkerVersion::DoomInternal() {
|
| + SetStatus(REDUNDANT);
|
| + if (!context_)
|
| + return;
|
| + std::vector<ServiceWorkerDatabase::ResourceRecord> resources;
|
| + script_cache_map_.GetResources(&resources);
|
| + context_->storage()->PurgeResources(resources);
|
| +}
|
| +
|
| void ServiceWorkerVersion::OnStarted() {
|
| DCHECK_EQ(RUNNING, running_status());
|
| // Fire all start callbacks.
|
|
|