Index: ui/views/view_unittest.cc |
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc |
index e1b6710554409fd3a4dce25fd321645b93530eff..3f3a7af9a81cefa3b89b1627664867d89551e36e 100644 |
--- a/ui/views/view_unittest.cc |
+++ b/ui/views/view_unittest.cc |
@@ -3335,6 +3335,93 @@ TEST_F(ViewTest, ViewHierarchyChanged) { |
EXPECT_EQ(v2.get(), v4->add_details().move_view); |
} |
+class WidgetObserverView : public View { |
+ public: |
+ WidgetObserverView(); |
+ ~WidgetObserverView() override; |
+ |
+ void ResetTestState(); |
+ |
+ bool was_added_to_widget() { return was_added_to_widget_; } |
+ bool was_removed_from_widget() { return was_removed_from_widget_; } |
+ |
+ private: |
+ void AddedToWidget() override; |
+ void RemovedFromWidget() override; |
+ |
+ bool was_added_to_widget_; |
sky
2017/02/22 17:21:33
Make these counts, so you know if called more ofte
|
+ bool was_removed_from_widget_; |
+}; |
sky
2017/02/22 17:21:33
DISALLOW...
|
+ |
+WidgetObserverView::WidgetObserverView() { |
+ ResetTestState(); |
+} |
+ |
+WidgetObserverView::~WidgetObserverView() {} |
+ |
+void WidgetObserverView::ResetTestState() { |
+ was_added_to_widget_ = false; |
+ was_removed_from_widget_ = false; |
+} |
+ |
+void WidgetObserverView::AddedToWidget() { |
+ was_added_to_widget_ = true; |
+} |
+ |
+void WidgetObserverView::RemovedFromWidget() { |
+ was_removed_from_widget_ = true; |
+} |
+ |
+// Verifies that AddedToWidget and RemovedFromWidget are called for a view when |
+// it is added to hierarchy. |
+// The tree looks like this: |
+// widget |
+// +-- root |
+// |
+// then v1 is added to root: |
+// |
+// v1 |
+// +-- v2 |
+// |
+// finally v1 is removed from root. |
+TEST_F(ViewTest, AddedToRemovedFromWidget) { |
+ std::unique_ptr<Widget> widget(new Widget); |
sky
2017/02/22 17:21:33
No need for a unique_ptr here, create on stack.
|
+ Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ params.bounds = gfx::Rect(50, 50, 650, 650); |
+ widget->Init(params); |
+ |
+ View* root = widget->GetRootView(); |
+ |
+ WidgetObserverView v1; |
+ WidgetObserverView v2; |
+ v1.set_owned_by_client(); |
+ v2.set_owned_by_client(); |
+ |
+ v1.AddChildView(&v2); |
+ EXPECT_FALSE(v2.was_added_to_widget()); |
+ EXPECT_FALSE(v2.was_removed_from_widget()); |
+ |
+ root->AddChildView(&v1); |
+ EXPECT_TRUE(v1.was_added_to_widget()); |
+ EXPECT_FALSE(v1.was_removed_from_widget()); |
+ EXPECT_TRUE(v2.was_added_to_widget()); |
+ EXPECT_FALSE(v2.was_removed_from_widget()); |
+ |
+ v1.ResetTestState(); |
+ v2.ResetTestState(); |
+ |
+ root->RemoveChildView(&v1); |
+ EXPECT_FALSE(v1.was_added_to_widget()); |
+ EXPECT_TRUE(v1.was_removed_from_widget()); |
+ EXPECT_FALSE(v2.was_added_to_widget()); |
+ EXPECT_TRUE(v2.was_removed_from_widget()); |
+ |
+ v2.ResetTestState(); |
+ v1.RemoveChildView(&v2); |
+ EXPECT_FALSE(v2.was_removed_from_widget()); |
+} |
+ |
// Verifies if the child views added under the root are all deleted when calling |
// RemoveAllChildViews. |
// The tree looks like this: |