Commit 22699a56 authored by Rushan Suleymanov's avatar Rushan Suleymanov Committed by Commit Bot

Fix notifying observers in SpecialStoragePolicy

This CL restricts adding, removing and notifying observers in
SpecialStoragePolicy within one thread using sequence checker. It also
makes all call sites to notify observers from the correct (IO) thread.

The fix should also mitigate MigrationSingleClientTest tests flakiness.

Bug: 1094907
Change-Id: Ife32fe48af22129ef0e04779c62c707b5f20f3db
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2301972Reviewed-by: default avatarDavid Bertoni <dbertoni@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Commit-Queue: Victor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789733}
parent 8c662eb2
...@@ -74,7 +74,7 @@ class ExtensionSpecialStoragePolicy::CookieSettingsObserver ...@@ -74,7 +74,7 @@ class ExtensionSpecialStoragePolicy::CookieSettingsObserver
// Post a task to avoid any potential re-entrancy issues with // Post a task to avoid any potential re-entrancy issues with
// |NotifyPolicyChangedImpl()| since it holds a lock while calling back into // |NotifyPolicyChangedImpl()| since it holds a lock while calling back into
// ExtensionSpecialStoragePolicy. // ExtensionSpecialStoragePolicy.
content::GetUIThreadTaskRunner({})->PostTask( content::GetIOThreadTaskRunner({})->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce(&CookieSettingsObserver::NotifyPolicyChangedImpl, base::BindOnce(&CookieSettingsObserver::NotifyPolicyChangedImpl,
base::Unretained(this))); base::Unretained(this)));
......
...@@ -8,20 +8,25 @@ namespace storage { ...@@ -8,20 +8,25 @@ namespace storage {
SpecialStoragePolicy::Observer::~Observer() = default; SpecialStoragePolicy::Observer::~Observer() = default;
SpecialStoragePolicy::SpecialStoragePolicy() = default; SpecialStoragePolicy::SpecialStoragePolicy() {
DETACH_FROM_SEQUENCE(sequence_checker_);
}
SpecialStoragePolicy::~SpecialStoragePolicy() = default; SpecialStoragePolicy::~SpecialStoragePolicy() = default;
void SpecialStoragePolicy::AddObserver(Observer* observer) { void SpecialStoragePolicy::AddObserver(Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
observers_.AddObserver(observer); observers_.AddObserver(observer);
} }
void SpecialStoragePolicy::RemoveObserver(Observer* observer) { void SpecialStoragePolicy::RemoveObserver(Observer* observer) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
observers_.RemoveObserver(observer); observers_.RemoveObserver(observer);
} }
void SpecialStoragePolicy::NotifyGranted(const url::Origin& origin, void SpecialStoragePolicy::NotifyGranted(const url::Origin& origin,
int change_flags) { int change_flags) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
scoped_refptr<SpecialStoragePolicy> protect(this); scoped_refptr<SpecialStoragePolicy> protect(this);
for (auto& observer : observers_) for (auto& observer : observers_)
observer.OnGranted(origin, change_flags); observer.OnGranted(origin, change_flags);
...@@ -30,6 +35,7 @@ void SpecialStoragePolicy::NotifyGranted(const url::Origin& origin, ...@@ -30,6 +35,7 @@ void SpecialStoragePolicy::NotifyGranted(const url::Origin& origin,
void SpecialStoragePolicy::NotifyRevoked(const url::Origin& origin, void SpecialStoragePolicy::NotifyRevoked(const url::Origin& origin,
int change_flags) { int change_flags) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
scoped_refptr<SpecialStoragePolicy> protect(this); scoped_refptr<SpecialStoragePolicy> protect(this);
for (auto& observer : observers_) for (auto& observer : observers_)
observer.OnRevoked(origin, change_flags); observer.OnRevoked(origin, change_flags);
...@@ -37,6 +43,7 @@ void SpecialStoragePolicy::NotifyRevoked(const url::Origin& origin, ...@@ -37,6 +43,7 @@ void SpecialStoragePolicy::NotifyRevoked(const url::Origin& origin,
} }
void SpecialStoragePolicy::NotifyCleared() { void SpecialStoragePolicy::NotifyCleared() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
scoped_refptr<SpecialStoragePolicy> protect(this); scoped_refptr<SpecialStoragePolicy> protect(this);
for (auto& observer : observers_) for (auto& observer : observers_)
observer.OnCleared(); observer.OnCleared();
...@@ -44,6 +51,7 @@ void SpecialStoragePolicy::NotifyCleared() { ...@@ -44,6 +51,7 @@ void SpecialStoragePolicy::NotifyCleared() {
} }
void SpecialStoragePolicy::NotifyPolicyChanged() { void SpecialStoragePolicy::NotifyPolicyChanged() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
scoped_refptr<SpecialStoragePolicy> protect(this); scoped_refptr<SpecialStoragePolicy> protect(this);
for (auto& observer : observers_) for (auto& observer : observers_)
observer.OnPolicyChanged(); observer.OnPolicyChanged();
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/component_export.h" #include "base/component_export.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "services/network/public/cpp/session_cookie_delete_predicate.h" #include "services/network/public/cpp/session_cookie_delete_predicate.h"
class GURL; class GURL;
...@@ -109,7 +110,9 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) SpecialStoragePolicy ...@@ -109,7 +110,9 @@ class COMPONENT_EXPORT(STORAGE_BROWSER) SpecialStoragePolicy
// above notifications. // above notifications.
void NotifyPolicyChanged(); void NotifyPolicyChanged();
base::ObserverList<Observer>::Unchecked observers_; base::ObserverList<Observer>::Unchecked observers_
GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
}; };
} // namespace storage } // namespace storage
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment