Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(955)

Unified Diff: ui/views/view_unittest.cc

Issue 2713643002: Add View::AddedToWidget and RemovedFromWidget. (Closed)
Patch Set: Review fixes. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/view.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/view_unittest.cc
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index e1b6710554409fd3a4dce25fd321645b93530eff..05f015507ffbb55a2764684ebbae79304704363b 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -3335,6 +3335,146 @@ TEST_F(ViewTest, ViewHierarchyChanged) {
EXPECT_EQ(v2.get(), v4->add_details().move_view);
}
+class WidgetObserverView : public View {
+ public:
+ WidgetObserverView();
+ ~WidgetObserverView() override;
+
+ void ResetTestState();
+
+ int added_to_widget_count() { return added_to_widget_count_; }
+ int removed_from_widget_count() { return removed_from_widget_count_; }
+
+ private:
+ void AddedToWidget() override;
+ void RemovedFromWidget() override;
+
+ int added_to_widget_count_ = 0;
+ int removed_from_widget_count_ = 0;
+
+ DISALLOW_COPY_AND_ASSIGN(WidgetObserverView);
+};
+
+WidgetObserverView::WidgetObserverView() {
+ ResetTestState();
+}
+
+WidgetObserverView::~WidgetObserverView() {}
+
+void WidgetObserverView::ResetTestState() {
+ added_to_widget_count_ = 0;
+ removed_from_widget_count_ = 0;
+}
+
+void WidgetObserverView::AddedToWidget() {
+ ++added_to_widget_count_;
+}
+
+void WidgetObserverView::RemovedFromWidget() {
+ ++removed_from_widget_count_;
+}
+
+// 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) {
+ Widget widget;
+ 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;
+ WidgetObserverView v3;
+ v1.set_owned_by_client();
+ v2.set_owned_by_client();
+ v3.set_owned_by_client();
+
+ v1.AddChildView(&v2);
+ EXPECT_EQ(0, v2.added_to_widget_count());
+ EXPECT_EQ(0, v2.removed_from_widget_count());
+
+ root->AddChildView(&v1);
+ EXPECT_EQ(1, v1.added_to_widget_count());
+ EXPECT_EQ(0, v1.removed_from_widget_count());
+ EXPECT_EQ(1, v2.added_to_widget_count());
+ EXPECT_EQ(0, v2.removed_from_widget_count());
+
+ v1.ResetTestState();
+ v2.ResetTestState();
+
+ v2.AddChildView(&v3);
+ EXPECT_EQ(0, v1.added_to_widget_count());
+ EXPECT_EQ(0, v1.removed_from_widget_count());
+ EXPECT_EQ(0, v2.added_to_widget_count());
+ EXPECT_EQ(0, v2.removed_from_widget_count());
+
+ v1.ResetTestState();
+ v2.ResetTestState();
+
+ root->RemoveChildView(&v1);
+ EXPECT_EQ(0, v1.added_to_widget_count());
+ EXPECT_EQ(1, v1.removed_from_widget_count());
+ EXPECT_EQ(0, v2.added_to_widget_count());
+ EXPECT_EQ(1, v2.removed_from_widget_count());
+
+ v2.ResetTestState();
+ v1.RemoveChildView(&v2);
+ EXPECT_EQ(0, v2.removed_from_widget_count());
+
+ // Test move between parents in a single Widget.
+ v2.RemoveChildView(&v3);
+ v1.ResetTestState();
+ v2.ResetTestState();
+ v3.ResetTestState();
+
+ v1.AddChildView(&v2);
+ root->AddChildView(&v1);
+ root->AddChildView(&v3);
+ EXPECT_EQ(1, v1.added_to_widget_count());
+ EXPECT_EQ(1, v2.added_to_widget_count());
+ EXPECT_EQ(1, v3.added_to_widget_count());
+
+ v3.AddChildView(&v1);
+ EXPECT_EQ(1, v1.added_to_widget_count());
+ EXPECT_EQ(0, v1.removed_from_widget_count());
+ EXPECT_EQ(1, v2.added_to_widget_count());
+ EXPECT_EQ(0, v2.removed_from_widget_count());
+ EXPECT_EQ(1, v3.added_to_widget_count());
+ EXPECT_EQ(0, v3.removed_from_widget_count());
+
+ // Test move between widgets.
+ Widget second_widget;
+ params.bounds = gfx::Rect(150, 150, 650, 650);
+ second_widget.Init(params);
+
+ View* second_root = second_widget.GetRootView();
+
+ v1.ResetTestState();
+ v2.ResetTestState();
+ v3.ResetTestState();
+
+ second_root->AddChildView(&v1);
+ EXPECT_EQ(1, v1.removed_from_widget_count());
+ EXPECT_EQ(1, v1.added_to_widget_count());
+ EXPECT_EQ(1, v2.added_to_widget_count());
+ EXPECT_EQ(1, v2.removed_from_widget_count());
+ EXPECT_EQ(0, v3.added_to_widget_count());
+ EXPECT_EQ(0, v3.removed_from_widget_count());
+}
+
// Verifies if the child views added under the root are all deleted when calling
// RemoveAllChildViews.
// The tree looks like this:
« no previous file with comments | « ui/views/view.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698