Chromium Code Reviews| 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: |