diff options
author | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-10 05:29:37 +0000 |
---|---|---|
committer | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-10 05:29:37 +0000 |
commit | 44f6474d33aff975d7655898a5036a8377cebf3a (patch) | |
tree | f8a7e1f8db29a9a909d7f235b000a94e8396dfcb /content/browser/service_worker | |
parent | 17db8dd5e979d0376094662dd0d896fda95805f3 (diff) | |
download | chromium_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.cc | 1 | ||||
-rw-r--r-- | content/browser/service_worker/service_worker_version_unittest.cc | 4 |
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). |