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

Unified Diff: ui/views/view_unittest.cc

Issue 1442683002: Fix views::View::BoundsChanged (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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 38683cc303a93c5be3645c0793ad4adea9bf0993..d398434826b0af19922e1bf75a2f833994de75bd 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -4099,4 +4099,79 @@ TEST_F(ViewTest, OnNativeThemeChanged) {
widget->CloseNow();
}
+class CustomView : public View {
+ public:
+ CustomView() {}
+ ~CustomView() override {}
+ void Layout() override {
+ layout_was_called = true;
+ if (!has_children())
+ return;
+ View* child = child_at(0);
+ child->SetBoundsRect(GetContentsBounds() +
+ gfx::Vector2d(child_x_offset, 0));
+ }
+ using View::needs_layout;
+
+ bool layout_was_called = false;
sky 2015/11/17 18:37:26 Make private (style guide says tests can use prote
+ int child_x_offset = 10;
+};
sky 2015/11/17 18:37:26 private: DISALLOW...
+
+TEST_F(ViewTest, SimpleInvalidateLayout) {
sky 2015/11/17 18:37:26 Please add description of what assertions your tes
+ scoped_ptr<CustomView> parent(new CustomView);
sky 2015/11/17 18:37:26 Why use a scoped_ptr here?
+ CustomView* child = new CustomView;
+
+ parent->SetBounds(0, 0, 100, 100);
+
+ parent->layout_was_called = false;
+ parent->AddChildView(child);
+ // SetBounds must call layout, because AddChildView invalidates layout of
+ // |parent|.
+ parent->SetBounds(10, 0, 100, 100);
flint 2015/11/13 10:05:37 Layout of parent is invalidated during parent->Add
+
+ EXPECT_EQ(parent->child_x_offset, child->bounds().x());
+ EXPECT_TRUE(parent->layout_was_called);
+ EXPECT_FALSE(parent->needs_layout());
+
+ child->layout_was_called = false;
+ child->InvalidateLayout();
+ // SetBounds must call layout, because we invalidates layout of |child| and
+ // parent|.
+ parent->SetBounds(20, 0, 100, 100);
flint 2015/11/13 10:05:37 The child view needs layout (i.e. its contents bec
+
+ EXPECT_EQ(parent->child_x_offset, child->bounds().x());
+ EXPECT_TRUE(parent->layout_was_called);
+ EXPECT_FALSE(parent->needs_layout());
+ EXPECT_FALSE(child->needs_layout());
+}
+
+TEST_F(ViewTest, InvalidateLayout) {
+ scoped_ptr<CustomView> parent(new CustomView);
sky 2015/11/17 18:37:26 Same commeont about scoped_ptr.
+ CustomView* child = new CustomView;
+ CustomView* subchild = new CustomView;
+
+ parent->AddChildView(child);
+ parent->SetBounds(0, 0, 100, 100);
+
+ child->layout_was_called = false;
+ // AddChildView invalidates Layout of |child|.
+ child->AddChildView(subchild);
+ parent->child_x_offset += 100;
+ parent->Layout();
+ // But layout of child mist be called.
+ EXPECT_TRUE(child->layout_was_called);
+ EXPECT_EQ(10, subchild->bounds().x());
+ EXPECT_FALSE(child->needs_layout());
+
+ // If child origin changed Layout of child must call.
+ parent->child_x_offset += 100;
+ child->InvalidateLayout();
+ // Layout of |child| must be called because we invalidate it layout.
+ parent->Layout();
+
+ EXPECT_TRUE(child->layout_was_called);
+ EXPECT_EQ(10, subchild->bounds().x());
+ EXPECT_FALSE(child->needs_layout());
+}
+
} // namespace views
« 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