summaryrefslogtreecommitdiffstats
path: root/content/browser/service_worker
diff options
context:
space:
mode:
authorkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-10 05:29:37 +0000
committerkinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-10 05:29:37 +0000
commit44f6474d33aff975d7655898a5036a8377cebf3a (patch)
treef8a7e1f8db29a9a909d7f235b000a94e8396dfcb /content/browser/service_worker
parent17db8dd5e979d0376094662dd0d896fda95805f3 (diff)
downloadchromium_src-44f6474d33aff975d7655898a5036a8377cebf3a.zip
chromium_src-44f6474d33aff975d7655898a5036a8377cebf3a.tar.gz
chromium_src-44f6474d33aff975d7655898a5036a8377cebf3a.tar.bz2
Fix leak in ServiceWorkerVersionTest.RepeatedlyObserveStatusChanges
In r262636 I deleted the Shutdown() methods from SWRegistration and SWVersion, but it caused a leak in RepeatedlyObserveStatusChanges. In the previous code the status change callback (ObserveStatusChanges) holds a ref to ServiceWorkerVersion, which was ok when we had Shutdown() (as we could explicitly clear the status change callback there), but now we don't, so we have cyclic reference there. I just changed make_scoped_refptr(version) to base::Unretained(version) when we pass the version to the callback, so that the callback no longer holds a ref to the Version. BUG=361504 TEST=ServiceWorkerVersionTest.RepeatedlyObserveStatusChanges with asan/lsan Review URL: https://codereview.chromium.org/230373003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262933 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/service_worker')
-rw-r--r--content/browser/service_worker/service_worker_version.cc1
-rw-r--r--content/browser/service_worker/service_worker_version_unittest.cc4
2 files changed, 2 insertions, 3 deletions
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 6aa8e61..2413aeb 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -182,7 +182,6 @@ ServiceWorkerVersion::ServiceWorkerVersion(
}
ServiceWorkerVersion::~ServiceWorkerVersion() {
- status_change_callbacks_.clear();
if (embedded_worker_) {
embedded_worker_->RemoveObserver(this);
embedded_worker_.reset();
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc
index 4814630..9234da2 100644
--- a/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -94,7 +94,7 @@ void ObserveStatusChanges(ServiceWorkerVersion* version,
std::vector<ServiceWorkerVersion::Status>* statuses) {
statuses->push_back(version->status());
version->RegisterStatusChangeCallback(
- base::Bind(&ObserveStatusChanges, make_scoped_refptr(version), statuses));
+ base::Bind(&ObserveStatusChanges, base::Unretained(version), statuses));
}
} // namespace
@@ -300,7 +300,7 @@ TEST_F(ServiceWorkerVersionTest, ActivateAndWaitCompletion) {
EXPECT_EQ(ServiceWorkerVersion::ACTIVE, version_->status());
}
-TEST_F(ServiceWorkerVersionTest, DISABLED_RepeatedlyObserveStatusChanges) {
+TEST_F(ServiceWorkerVersionTest, RepeatedlyObserveStatusChanges) {
EXPECT_EQ(ServiceWorkerVersion::NEW, version_->status());
// Repeatedly observe status changes (the callback re-registers itself).