diff options
author | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-31 03:32:06 +0000 |
---|---|---|
committer | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-31 03:32:06 +0000 |
commit | b3e2fad0a13695466c07ce4c982fa98448e407a0 (patch) | |
tree | 1a8a24741bd016446bafac5ff802590a430e3a2a /base/observer_list_unittest.cc | |
parent | 13301121d7efad67b74f0e0b6a4c1f46d866c425 (diff) | |
download | chromium_src-b3e2fad0a13695466c07ce4c982fa98448e407a0.zip chromium_src-b3e2fad0a13695466c07ce4c982fa98448e407a0.tar.gz chromium_src-b3e2fad0a13695466c07ce4c982fa98448e407a0.tar.bz2 |
Adds the ability for ObserverList to not notify observers added during
notification. I need this for bookmarks. If a new observer is added
while the bookmark model is in the process of sending out notification
the newly added observer gets confused.
BUG=674
TEST=none
Review URL: http://codereview.chromium.org/8919
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4267 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/observer_list_unittest.cc')
-rw-r--r-- | base/observer_list_unittest.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/base/observer_list_unittest.cc b/base/observer_list_unittest.cc index 8f69256..1d3668d 100644 --- a/base/observer_list_unittest.cc +++ b/base/observer_list_unittest.cc @@ -60,6 +60,26 @@ class ThreadSafeDisrupter : public Foo { Foo* doomed_; }; +class AddInObserve : public Foo { + public: + AddInObserve(ObserverList<Foo>* observer_list) + : added(false), + observer_list(observer_list), + adder(1) { + } + virtual void Observe(int x) { + if (!added) { + added = true; + observer_list->AddObserver(&adder); + } + } + + bool added; + ObserverList<Foo>* observer_list; + Adder adder; +}; + + class ObserverListThreadSafeTest : public testing::Test { }; @@ -262,3 +282,23 @@ TEST(ObserverListThreadSafeTest, CrossThreadNotifications) { // the main thread and all 3 observer threads. ThreadSafeObserverHarness(3, true); } + +TEST(ObserverListTest, Existing) { + ObserverList<Foo> observer_list(ObserverList<Foo>::NOTIFY_EXISTING_ONLY); + Adder a(1); + AddInObserve b(&observer_list); + + observer_list.AddObserver(&a); + observer_list.AddObserver(&b); + + FOR_EACH_OBSERVER(Foo, observer_list, Observe(1)); + + EXPECT_TRUE(b.added); + // B's adder should not have been notified because it was added during + // notificaiton. + EXPECT_EQ(0, b.adder.total); + + // Notify again to make sure b's adder is notified. + FOR_EACH_OBSERVER(Foo, observer_list, Observe(1)); + EXPECT_EQ(1, b.adder.total); +} |