Index: ui/views/widget/root_view_unittest.cc |
diff --git a/ui/views/widget/root_view_unittest.cc b/ui/views/widget/root_view_unittest.cc |
index b4d712e8c7b365ee2488df884c21511a0040c481..54eeee2164465677ba5b43a9869d72fb1d715e13 100644 |
--- a/ui/views/widget/root_view_unittest.cc |
+++ b/ui/views/widget/root_view_unittest.cc |
@@ -12,6 +12,7 @@ |
#include "ui/views/view_targeter.h" |
#include "ui/views/widget/root_view.h" |
#include "ui/views/widget/widget_deletion_observer.h" |
+#include "ui/views/window/dialog_delegate.h" |
namespace views { |
namespace test { |
@@ -540,5 +541,48 @@ TEST_F(RootViewTest, DeleteWidgetOnMouseExitDispatchFromChild) { |
EXPECT_FALSE(widget_deletion_observer.IsWidgetAlive()); |
} |
+namespace { |
+class RootViewTestDialogDelegate : public DialogDelegateView { |
+ public: |
+ RootViewTestDialogDelegate() {} |
+ |
+ int layout_count() const { return layout_count_; } |
+ |
+ // DialogDelegateView: |
+ gfx::Size GetPreferredSize() const override { return preferred_size_; } |
+ void Layout() override { |
+ EXPECT_EQ(size(), preferred_size_); |
+ ++layout_count_; |
+ } |
+ int GetDialogButtons() const override { |
+ return ui::DIALOG_BUTTON_NONE; // Ensure buttons do not influence size. |
+ } |
+ |
+ private: |
+ const gfx::Size preferred_size_ = gfx::Size(111, 111); |
+ |
+ int layout_count_ = 0; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RootViewTestDialogDelegate); |
+}; |
+} // namespace |
+ |
+// Ensure only one call to Layout() happens during Widget initialization, and |
+// ensure it happens at the ContentView's preferred size. |
+TEST_F(RootViewTest, SingleLayoutDuringInit) { |
+ RootViewTestDialogDelegate* delegate = new RootViewTestDialogDelegate(); |
+ Widget* widget = |
+ DialogDelegate::CreateDialogWidget(delegate, GetContext(), nullptr); |
+ EXPECT_EQ(1, delegate->layout_count()); |
+ widget->CloseNow(); |
+ |
+ // Also test Aura desktop Widget codepaths. |
+ views_delegate()->set_use_desktop_native_widgets(true); |
+ delegate = new RootViewTestDialogDelegate(); |
+ widget = DialogDelegate::CreateDialogWidget(delegate, GetContext(), nullptr); |
+ EXPECT_EQ(1, delegate->layout_count()); |
+ widget->CloseNow(); |
+} |
+ |
} // namespace test |
} // namespace views |