Index: ui/aura/window_unittest.cc |
=================================================================== |
--- ui/aura/window_unittest.cc (revision 119986) |
+++ ui/aura/window_unittest.cc (working copy) |
@@ -1462,5 +1462,98 @@ |
EXPECT_TRUE(LayerIsAbove(window12.get(), window1.get())); |
} |
+class RootWindowAttachmentObserver : public WindowObserver { |
+ public: |
+ RootWindowAttachmentObserver() : added_count_(0), removed_count_(0) {} |
+ virtual ~RootWindowAttachmentObserver() {} |
+ |
+ int added_count() const { return added_count_; } |
+ int removed_count() const { return removed_count_; } |
+ |
+ void Clear() { |
+ added_count_ = 0; |
+ removed_count_ = 0; |
+ } |
+ |
+ // Overridden from WindowObserver: |
+ virtual void OnWindowAddedToRootWindow(Window* window) OVERRIDE { |
+ ++added_count_; |
+ } |
+ virtual void OnWindowRemovingFromRootWindow(Window* window) OVERRIDE { |
+ ++removed_count_; |
+ } |
+ |
+ private: |
+ int added_count_; |
+ int removed_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RootWindowAttachmentObserver); |
+}; |
+ |
+TEST_F(WindowTest, RootWindowAttachment) { |
+ RootWindowAttachmentObserver observer; |
+ |
+ // Test a direct add/remove from the RootWindow. |
+ scoped_ptr<Window> w1(new Window(NULL)); |
+ w1->Init(ui::Layer::LAYER_NOT_DRAWN); |
+ w1->AddObserver(&observer); |
+ |
+ w1->SetParent(NULL); |
+ EXPECT_EQ(1, observer.added_count()); |
+ EXPECT_EQ(0, observer.removed_count()); |
+ |
+ w1.reset(); |
+ EXPECT_EQ(1, observer.added_count()); |
+ EXPECT_EQ(1, observer.removed_count()); |
+ |
+ observer.Clear(); |
+ |
+ // Test an indirect add/remove from the RootWindow. |
+ w1.reset(new Window(NULL)); |
+ w1->Init(ui::Layer::LAYER_NOT_DRAWN); |
+ Window* w11 = new Window(NULL); |
+ w11->Init(ui::Layer::LAYER_NOT_DRAWN); |
+ w11->AddObserver(&observer); |
+ w11->SetParent(w1.get()); |
+ EXPECT_EQ(0, observer.added_count()); |
+ EXPECT_EQ(0, observer.removed_count()); |
+ |
+ w1->SetParent(NULL); |
+ EXPECT_EQ(1, observer.added_count()); |
+ EXPECT_EQ(0, observer.removed_count()); |
+ |
+ w1.reset(); // Deletes w11. |
+ w11 = NULL; |
+ EXPECT_EQ(1, observer.added_count()); |
+ EXPECT_EQ(1, observer.removed_count()); |
+ |
+ observer.Clear(); |
+ |
+ // Test an indirect add/remove with nested observers. |
+ w1.reset(new Window(NULL)); |
+ w1->Init(ui::Layer::LAYER_NOT_DRAWN); |
+ w11 = new Window(NULL); |
+ w11->Init(ui::Layer::LAYER_NOT_DRAWN); |
+ w11->AddObserver(&observer); |
+ w11->SetParent(w1.get()); |
+ Window* w111 = new Window(NULL); |
+ w111->Init(ui::Layer::LAYER_NOT_DRAWN); |
+ w111->AddObserver(&observer); |
+ w111->SetParent(w11); |
+ |
+ EXPECT_EQ(0, observer.added_count()); |
+ EXPECT_EQ(0, observer.removed_count()); |
+ |
+ w1->SetParent(NULL); |
+ EXPECT_EQ(2, observer.added_count()); |
+ EXPECT_EQ(0, observer.removed_count()); |
+ |
+ w1.reset(); // Deletes w11 and w111. |
+ w11 = NULL; |
+ w111 = NULL; |
+ EXPECT_EQ(2, observer.added_count()); |
+ EXPECT_EQ(2, observer.removed_count()); |
+} |
+ |
} // namespace test |
} // namespace aura |