summaryrefslogtreecommitdiffstats
path: root/base/observer_list_unittest.cc
diff options
context:
space:
mode:
authorsky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-31 03:32:06 +0000
committersky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-10-31 03:32:06 +0000
commitb3e2fad0a13695466c07ce4c982fa98448e407a0 (patch)
tree1a8a24741bd016446bafac5ff802590a430e3a2a /base/observer_list_unittest.cc
parent13301121d7efad67b74f0e0b6a4c1f46d866c425 (diff)
downloadchromium_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.cc40
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);
+}