Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 805083006: Schedule the stop-worker-timer even if the ServiceWorker is controlling pages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_version_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 cross_origin_connect_callbacks_.Remove(request_id); 589 cross_origin_connect_callbacks_.Remove(request_id);
590 RunSoon(base::Bind(callback, status, false)); 590 RunSoon(base::Bind(callback, status, false));
591 } 591 }
592 } 592 }
593 593
594 void ServiceWorkerVersion::AddControllee( 594 void ServiceWorkerVersion::AddControllee(
595 ServiceWorkerProviderHost* provider_host) { 595 ServiceWorkerProviderHost* provider_host) {
596 DCHECK(!ContainsKey(controllee_map_, provider_host)); 596 DCHECK(!ContainsKey(controllee_map_, provider_host));
597 int controllee_id = controllee_by_id_.Add(provider_host); 597 int controllee_id = controllee_by_id_.Add(provider_host);
598 controllee_map_[provider_host] = controllee_id; 598 controllee_map_[provider_host] = controllee_id;
599 if (stop_worker_timer_.IsRunning()) 599 // Reset the timer if it's running (so that it's kept alive a bit longer
600 stop_worker_timer_.Stop(); 600 // right after a new controllee is added).
601 ScheduleStopWorker();
601 } 602 }
602 603
603 void ServiceWorkerVersion::RemoveControllee( 604 void ServiceWorkerVersion::RemoveControllee(
604 ServiceWorkerProviderHost* provider_host) { 605 ServiceWorkerProviderHost* provider_host) {
605 ControlleeMap::iterator found = controllee_map_.find(provider_host); 606 ControlleeMap::iterator found = controllee_map_.find(provider_host);
606 DCHECK(found != controllee_map_.end()); 607 DCHECK(found != controllee_map_.end());
607 controllee_by_id_.Remove(found->second); 608 controllee_by_id_.Remove(found->second);
608 controllee_map_.erase(found); 609 controllee_map_.erase(found);
609 if (HasControllee()) 610 if (HasControllee())
610 return; 611 return;
611 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this)); 612 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
612 if (is_doomed_) { 613 if (is_doomed_) {
613 DoomInternal(); 614 DoomInternal();
614 return; 615 return;
615 } 616 }
616 ScheduleStopWorker(); 617 // Schedule the stop-worker-timer if it's not running.
618 if (!stop_worker_timer_.IsRunning())
619 ScheduleStopWorker();
617 } 620 }
618 621
619 void ServiceWorkerVersion::AddListener(Listener* listener) { 622 void ServiceWorkerVersion::AddListener(Listener* listener) {
620 listeners_.AddObserver(listener); 623 listeners_.AddObserver(listener);
621 } 624 }
622 625
623 void ServiceWorkerVersion::RemoveListener(Listener* listener) { 626 void ServiceWorkerVersion::RemoveListener(Listener* listener) {
624 listeners_.RemoveObserver(listener); 627 listeners_.RemoveObserver(listener);
625 } 628 }
626 629
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 if (pending_skip_waiting_requests_.size() == 1) 1060 if (pending_skip_waiting_requests_.size() == 1)
1058 registration->ActivateWaitingVersionWhenReady(); 1061 registration->ActivateWaitingVersionWhenReady();
1059 } 1062 }
1060 1063
1061 void ServiceWorkerVersion::DidSkipWaiting(int request_id) { 1064 void ServiceWorkerVersion::DidSkipWaiting(int request_id) {
1062 if (running_status() == STARTING || running_status() == RUNNING) 1065 if (running_status() == STARTING || running_status() == RUNNING)
1063 embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id)); 1066 embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id));
1064 } 1067 }
1065 1068
1066 void ServiceWorkerVersion::ScheduleStopWorker() { 1069 void ServiceWorkerVersion::ScheduleStopWorker() {
1067 // TODO(kinuko): Currently we don't schedule stop-time-worker when the SW has 1070 if (running_status() != RUNNING)
1068 // controllee, but we should change this default behavior (crbug.com/440259)
1069 if (running_status() != RUNNING || HasControllee())
1070 return; 1071 return;
1071 if (stop_worker_timer_.IsRunning()) { 1072 if (stop_worker_timer_.IsRunning()) {
1072 stop_worker_timer_.Reset(); 1073 stop_worker_timer_.Reset();
1073 return; 1074 return;
1074 } 1075 }
1075 stop_worker_timer_.Start( 1076 stop_worker_timer_.Start(
1076 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay), 1077 FROM_HERE, base::TimeDelta::FromSeconds(kStopWorkerDelay),
1077 base::Bind(&ServiceWorkerVersion::StopWorkerIfIdle, 1078 base::Bind(&ServiceWorkerVersion::StopWorkerIfIdle,
1078 weak_factory_.GetWeakPtr())); 1079 weak_factory_.GetWeakPtr()));
1079 } 1080 }
(...skipping 27 matching lines...) Expand all
1107 SetStatus(REDUNDANT); 1108 SetStatus(REDUNDANT);
1108 StopWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 1109 StopWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
1109 if (!context_) 1110 if (!context_)
1110 return; 1111 return;
1111 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; 1112 std::vector<ServiceWorkerDatabase::ResourceRecord> resources;
1112 script_cache_map_.GetResources(&resources); 1113 script_cache_map_.GetResources(&resources);
1113 context_->storage()->PurgeResources(resources); 1114 context_->storage()->PurgeResources(resources);
1114 } 1115 }
1115 1116
1116 } // namespace content 1117 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_version_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698