Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index 95fc77e0acd3fda26940cc855991f4f6d59d608a..40ba1e0e381e51527bfd3718b3d215664dfc43be 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -1326,11 +1326,7 @@ TEST_F(WidgetTest, TestViewWidthAfterMinimizingWidget) { |
// and sets state whether subsequent paints are expected. |
class DesktopAuraTestValidPaintWidget : public views::Widget { |
public: |
- DesktopAuraTestValidPaintWidget() |
- : received_paint_(false), |
- expect_paint_(true), |
- received_paint_while_hidden_(false) {} |
- |
+ DesktopAuraTestValidPaintWidget() {} |
~DesktopAuraTestValidPaintWidget() override {} |
void InitForTest(Widget::InitParams create_params); |
@@ -1345,6 +1341,10 @@ class DesktopAuraTestValidPaintWidget : public views::Widget { |
return received_paint_while_hidden_; |
} |
+ int visibility_change_count() const { return visibility_change_count_; } |
+ |
+ bool visible_at_last_change() const { return visible_at_last_change_; } |
+ |
void WaitUntilPaint() { |
if (received_paint_) |
return; |
@@ -1380,10 +1380,20 @@ class DesktopAuraTestValidPaintWidget : public views::Widget { |
quit_closure_.Run(); |
} |
+ void OnNativeWidgetVisibilityChanged(bool visible) override { |
+ ++visibility_change_count_; |
+ visible_at_last_change_ = visible; |
+ views::Widget::OnNativeWidgetVisibilityChanged(visible); |
+ } |
+ |
private: |
- bool received_paint_; |
- bool expect_paint_; |
- bool received_paint_while_hidden_; |
+ int visibility_change_count_ = 0; |
+ bool visible_at_last_change_ = false; |
+ |
+ bool received_paint_ = false; |
+ bool expect_paint_ = true; |
+ bool received_paint_while_hidden_ = false; |
+ |
base::Closure quit_closure_; |
DISALLOW_COPY_AND_ASSIGN(DesktopAuraTestValidPaintWidget); |
@@ -1435,6 +1445,46 @@ TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterHideTest) { |
widget.Close(); |
} |
+// Tests that visibility changes after scheduling an asynchronous Close() are |
+// sane and consistent across platforms. |
+TEST_F(WidgetTest, DesktopNativeWidgetVisibilityAfterCloseTest) { |
+ // TODO(sad): Desktop widgets do not work well in mus https://crbug.com/616551 |
+ if (IsMus()) |
+ return; |
+ |
+ DesktopAuraTestValidPaintWidget widget; |
+ widget.InitForTest(CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS)); |
+ widget.WaitUntilPaint(); |
+ EXPECT_TRUE(widget.ReadReceivedPaintAndReset()); |
+ EXPECT_EQ(1, widget.visibility_change_count()); |
+ EXPECT_TRUE(widget.visible_at_last_change()); |
+ |
+ // Hide before close should behave normally. Hide and show are synchronous. |
+ widget.Hide(); |
+ EXPECT_EQ(2, widget.visibility_change_count()); |
+ EXPECT_FALSE(widget.visible_at_last_change()); |
+ widget.Show(); |
+ EXPECT_EQ(3, widget.visibility_change_count()); |
+ EXPECT_TRUE(widget.visible_at_last_change()); |
+ |
+ RunPendingMessages(); |
+ EXPECT_EQ(3, widget.visibility_change_count()); // No change. |
+ |
+ EXPECT_FALSE(widget.ReadReceivedPaintAndReset()); |
+ widget.WaitUntilPaint(); |
+ EXPECT_TRUE(widget.ReadReceivedPaintAndReset()); |
+ |
+ // After a Close, there should be no changes. |
+ widget.Close(); |
+ EXPECT_EQ(3, widget.visibility_change_count()); // No change. |
+ widget.Hide(); |
+ EXPECT_EQ(3, widget.visibility_change_count()); // No change. |
+ widget.Show(); |
+ EXPECT_EQ(3, widget.visibility_change_count()); // No change. |
+ RunPendingMessages(); |
+ EXPECT_EQ(3, widget.visibility_change_count()); // No change. |
+} |
+ |
// Test to ensure that the aura Window's visiblity state is set to visible if |
// the underlying widget is hidden and then shown. |
TEST_F(WidgetTest, TestWindowVisibilityAfterHide) { |