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/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "base/strings/string16.h" | 9 #include "base/strings/string16.h" |
10 #include "content/browser/service_worker/embedded_worker_instance.h" | 10 #include "content/browser/service_worker/embedded_worker_instance.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 | 92 |
93 ServiceWorkerVersion::ServiceWorkerVersion( | 93 ServiceWorkerVersion::ServiceWorkerVersion( |
94 ServiceWorkerRegistration* registration, | 94 ServiceWorkerRegistration* registration, |
95 int64 version_id, | 95 int64 version_id, |
96 base::WeakPtr<ServiceWorkerContextCore> context) | 96 base::WeakPtr<ServiceWorkerContextCore> context) |
97 : version_id_(version_id), | 97 : version_id_(version_id), |
98 registration_id_(kInvalidServiceWorkerVersionId), | 98 registration_id_(kInvalidServiceWorkerVersionId), |
99 status_(NEW), | 99 status_(NEW), |
100 context_(context), | 100 context_(context), |
101 script_cache_map_(this, context), | 101 script_cache_map_(this, context), |
| 102 is_doomed_(false), |
102 weak_factory_(this) { | 103 weak_factory_(this) { |
103 DCHECK(context_); | 104 DCHECK(context_); |
104 DCHECK(registration); | 105 DCHECK(registration); |
105 if (registration) { | 106 if (registration) { |
106 registration_id_ = registration->id(); | 107 registration_id_ = registration->id(); |
107 script_url_ = registration->script_url(); | 108 script_url_ = registration->script_url(); |
108 scope_ = registration->pattern(); | 109 scope_ = registration->pattern(); |
109 } | 110 } |
110 context_->AddLiveVersion(this); | 111 context_->AddLiveVersion(this); |
111 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); | 112 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 stop_worker_timer_.Stop(); | 380 stop_worker_timer_.Stop(); |
380 } | 381 } |
381 | 382 |
382 void ServiceWorkerVersion::RemoveControllee( | 383 void ServiceWorkerVersion::RemoveControllee( |
383 ServiceWorkerProviderHost* provider_host) { | 384 ServiceWorkerProviderHost* provider_host) { |
384 ControlleeMap::iterator found = controllee_map_.find(provider_host); | 385 ControlleeMap::iterator found = controllee_map_.find(provider_host); |
385 DCHECK(found != controllee_map_.end()); | 386 DCHECK(found != controllee_map_.end()); |
386 controllee_by_id_.Remove(found->second); | 387 controllee_by_id_.Remove(found->second); |
387 controllee_map_.erase(found); | 388 controllee_map_.erase(found); |
388 RemoveProcessFromWorker(provider_host->process_id()); | 389 RemoveProcessFromWorker(provider_host->process_id()); |
389 if (!HasControllee()) { | 390 if (HasControllee()) |
390 ScheduleStopWorker(); | 391 return; |
391 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this)); | 392 ScheduleStopWorker(); |
392 } | 393 if (is_doomed_) |
| 394 DoomInternal(); |
393 } | 395 } |
394 | 396 |
395 void ServiceWorkerVersion::AddPotentialControllee( | 397 void ServiceWorkerVersion::AddPotentialControllee( |
396 ServiceWorkerProviderHost* provider_host) { | 398 ServiceWorkerProviderHost* provider_host) { |
397 AddProcessToWorker(provider_host->process_id()); | 399 AddProcessToWorker(provider_host->process_id()); |
398 } | 400 } |
399 | 401 |
400 void ServiceWorkerVersion::RemovePotentialControllee( | 402 void ServiceWorkerVersion::RemovePotentialControllee( |
401 ServiceWorkerProviderHost* provider_host) { | 403 ServiceWorkerProviderHost* provider_host) { |
402 RemoveProcessFromWorker(provider_host->process_id()); | 404 RemoveProcessFromWorker(provider_host->process_id()); |
403 } | 405 } |
404 | 406 |
405 void ServiceWorkerVersion::AddListener(Listener* listener) { | 407 void ServiceWorkerVersion::AddListener(Listener* listener) { |
406 listeners_.AddObserver(listener); | 408 listeners_.AddObserver(listener); |
407 } | 409 } |
408 | 410 |
409 void ServiceWorkerVersion::RemoveListener(Listener* listener) { | 411 void ServiceWorkerVersion::RemoveListener(Listener* listener) { |
410 listeners_.RemoveObserver(listener); | 412 listeners_.RemoveObserver(listener); |
411 } | 413 } |
412 | 414 |
| 415 void ServiceWorkerVersion::Doom() { |
| 416 if (is_doomed_) |
| 417 return; |
| 418 is_doomed_ = true; |
| 419 if (!HasControllee()) |
| 420 DoomInternal(); |
| 421 } |
| 422 |
413 void ServiceWorkerVersion::OnStarted() { | 423 void ServiceWorkerVersion::OnStarted() { |
414 DCHECK_EQ(RUNNING, running_status()); | 424 DCHECK_EQ(RUNNING, running_status()); |
415 // Fire all start callbacks. | 425 // Fire all start callbacks. |
416 RunCallbacks(this, &start_callbacks_, SERVICE_WORKER_OK); | 426 RunCallbacks(this, &start_callbacks_, SERVICE_WORKER_OK); |
417 FOR_EACH_OBSERVER(Listener, listeners_, OnWorkerStarted(this)); | 427 FOR_EACH_OBSERVER(Listener, listeners_, OnWorkerStarted(this)); |
418 } | 428 } |
419 | 429 |
420 void ServiceWorkerVersion::OnStopped() { | 430 void ServiceWorkerVersion::OnStopped() { |
421 DCHECK_EQ(STOPPED, running_status()); | 431 DCHECK_EQ(STOPPED, running_status()); |
422 scoped_refptr<ServiceWorkerVersion> protect(this); | 432 scoped_refptr<ServiceWorkerVersion> protect(this); |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 stop_worker_timer_.Reset(); | 659 stop_worker_timer_.Reset(); |
650 return; | 660 return; |
651 } | 661 } |
652 stop_worker_timer_.Start( | 662 stop_worker_timer_.Start( |
653 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay), | 663 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay), |
654 base::Bind(&ServiceWorkerVersion::StopWorker, | 664 base::Bind(&ServiceWorkerVersion::StopWorker, |
655 weak_factory_.GetWeakPtr(), | 665 weak_factory_.GetWeakPtr(), |
656 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback))); | 666 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback))); |
657 } | 667 } |
658 | 668 |
| 669 void ServiceWorkerVersion::DoomInternal() { |
| 670 SetStatus(REDUNDANT); |
| 671 if (!context_) |
| 672 return; |
| 673 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
| 674 script_cache_map_.GetResources(&resources); |
| 675 context_->storage()->PurgeResources(resources); |
| 676 } |
| 677 |
659 } // namespace content | 678 } // namespace content |
OLD | NEW |