summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authormsw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-01 01:15:11 +0000
committermsw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-01 01:15:11 +0000
commitbb53a5aeea4d8f5e19bf6152bb10e17f0af1652f (patch)
tree2b041e2b1561ac539eb54d813bd22da083bba53d /ui
parent30c8f5429e4ffe4f1e4fc5ba5fe234929a808454 (diff)
downloadchromium_src-bb53a5aeea4d8f5e19bf6152bb10e17f0af1652f.zip
chromium_src-bb53a5aeea4d8f5e19bf6152bb10e17f0af1652f.tar.gz
chromium_src-bb53a5aeea4d8f5e19bf6152bb10e17f0af1652f.tar.bz2
Reland: Fix and expand upon BubbleDelegateTests.
This is a continuation of https://codereview.chromium.org/10889014 That CL was reverted due to test failures in linux_chromeos and win_aura bots: http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Tests%20%281%29/builds/10785/steps/views_unittests/logs/stdio http://build.chromium.org/p/chromium/builders/Win%20Aura/builds/20590/steps/views_unittests/logs/stdio This revised CL adds a workaround hack for Aura to activate an unrelated Widget before closing the anchor/owner widgets, so that aura::test::TestActivationClient::OnWindowDestroyed doesn't try to activate destroyed windows. Original CL description: =============================================== Fix and expand upon BubbleDelegateTests. BubbleDelegateTest.ResetAnchorWidget was previously failing and crashing because of it's widget ownership pattern and lack of close_on_deactivate. Add TestWidgetObserver to observe bubbles closing. Ensure the bubble widget closes as expected in each test. BUG=none TEST=unit tests pass Review URL: https://chromiumcodereview.appspot.com/10920028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@154558 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/views/bubble/bubble_delegate_unittest.cc141
1 files changed, 113 insertions, 28 deletions
diff --git a/ui/views/bubble/bubble_delegate_unittest.cc b/ui/views/bubble/bubble_delegate_unittest.cc
index 2fa3b40..3c08e91 100644
--- a/ui/views/bubble/bubble_delegate_unittest.cc
+++ b/ui/views/bubble/bubble_delegate_unittest.cc
@@ -9,6 +9,40 @@
namespace views {
+namespace {
+
+// A Widget observer class used in the tests below to observe bubbles closing.
+class TestWidgetObserver : public WidgetObserver {
+ public:
+ explicit TestWidgetObserver(Widget* widget);
+ virtual ~TestWidgetObserver();
+
+ // WidgetObserver overrides:
+ virtual void OnWidgetClosing(Widget* widget) OVERRIDE;
+
+ bool widget_closed() const { return widget_ == NULL; }
+
+ private:
+ Widget* widget_;
+};
+
+TestWidgetObserver::TestWidgetObserver(Widget* widget)
+ : widget_(widget) {
+ widget_->AddObserver(this);
+}
+
+TestWidgetObserver::~TestWidgetObserver() {
+ if (widget_)
+ widget_->RemoveObserver(this);
+}
+
+void TestWidgetObserver::OnWidgetClosing(Widget* widget) {
+ DCHECK_EQ(widget_, widget);
+ widget_ = NULL;
+}
+
+} // namespace
+
typedef ViewsTestBase BubbleDelegateTest;
TEST_F(BubbleDelegateTest, CreateDelegate) {
@@ -19,6 +53,8 @@ TEST_F(BubbleDelegateTest, CreateDelegate) {
BubbleDelegateView::CreateBubble(bubble_delegate));
EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate());
EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget());
+ TestWidgetObserver bubble_observer(bubble_widget);
+ EXPECT_FALSE(bubble_observer.widget_closed());
BubbleBorder* border =
bubble_delegate->GetBubbleFrameView()->bubble_border();
@@ -27,52 +63,101 @@ TEST_F(BubbleDelegateTest, CreateDelegate) {
bubble_widget->CloseNow();
RunPendingMessages();
+ EXPECT_TRUE(bubble_observer.widget_closed());
}
-TEST_F(BubbleDelegateTest, ResetAnchorWidget) {
- // Create the anchor widget first.
- Widget* widget = new Widget;
- View* contents = new View;
-
+TEST_F(BubbleDelegateTest, CloseAnchorWidget) {
+ // Create the anchor widget.
Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
- widget->Init(params);
- widget->SetContentsView(contents);
- widget->Show();
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ scoped_ptr<Widget> anchor_widget(new Widget);
+ anchor_widget->Init(params);
+ anchor_widget->Show();
- Widget* parent = new Widget;
- parent->Init(params);
- parent->SetContentsView(new View);
- parent->Show();
+ BubbleDelegateView* bubble_delegate = new BubbleDelegateView(
+ anchor_widget->GetContentsView(), BubbleBorder::NONE);
+ // Preventing close on deactivate should not prevent closing with the anchor.
+ bubble_delegate->set_close_on_deactivate(false);
+ Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate);
+ EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate());
+ EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget());
+ EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
+ TestWidgetObserver bubble_observer(bubble_widget);
+ EXPECT_FALSE(bubble_observer.widget_closed());
+
+ bubble_widget->Show();
+ RunPendingMessages();
+ EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
+ EXPECT_FALSE(bubble_observer.widget_closed());
+
+#if defined(USE_AURA)
+ // TODO(msw): Remove activation hack to prevent bookkeeping errors in:
+ // aura::test::TestActivationClient::OnWindowDestroyed().
+ scoped_ptr<Widget> smoke_and_mirrors_widget(new Widget);
+ smoke_and_mirrors_widget->Init(params);
+ smoke_and_mirrors_widget->Show();
+ EXPECT_FALSE(bubble_observer.widget_closed());
+#endif
+
+ // Ensure that closing the anchor widget also closes the bubble itself.
+ anchor_widget->CloseNow();
+ RunPendingMessages();
+ EXPECT_TRUE(bubble_observer.widget_closed());
+}
+
+TEST_F(BubbleDelegateTest, ResetAnchorWidget) {
+ // Create the anchor and parent widgets.
+ Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ scoped_ptr<Widget> anchor_widget(new Widget);
+ anchor_widget->Init(params);
+ anchor_widget->Show();
+ scoped_ptr<Widget> parent_widget(new Widget);
+ parent_widget->Init(params);
+ parent_widget->Show();
// Make sure the bubble widget is parented to a widget other than the anchor
// widget so that closing the anchor widget does not close the bubble widget.
- BubbleDelegateView* bubble_delegate =
- new BubbleDelegateView(contents, BubbleBorder::NONE);
- bubble_delegate->set_parent_window(parent->GetNativeView());
- bubble_delegate->set_color(SK_ColorGREEN);
- Widget* bubble_widget(
- BubbleDelegateView::CreateBubble(bubble_delegate));
+ BubbleDelegateView* bubble_delegate = new BubbleDelegateView(
+ anchor_widget->GetContentsView(), BubbleBorder::NONE);
+ bubble_delegate->set_parent_window(parent_widget->GetNativeView());
+ // Preventing close on deactivate should not prevent closing with the parent.
+ bubble_delegate->set_close_on_deactivate(false);
+ Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate);
EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate());
EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget());
- EXPECT_EQ(widget, bubble_delegate->anchor_widget());
+ EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
+ TestWidgetObserver bubble_observer(bubble_widget);
+ EXPECT_FALSE(bubble_observer.widget_closed());
+ // Showing and hiding the bubble widget should have no effect on its anchor.
bubble_widget->Show();
RunPendingMessages();
- EXPECT_EQ(widget, bubble_delegate->anchor_widget());
-
+ EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
bubble_widget->Hide();
RunPendingMessages();
- EXPECT_EQ(widget, bubble_delegate->anchor_widget());
+ EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
- // Closing the anchor widget should unset the reference to the anchor widget
- // for the bubble.
- widget->CloseNow();
+ // Ensure that closing the anchor widget clears the bubble's reference to that
+ // anchor widget, but the bubble itself does not close.
+ anchor_widget->CloseNow();
RunPendingMessages();
- EXPECT_NE(bubble_delegate->anchor_widget(), widget);
+ EXPECT_NE(anchor_widget.get(), bubble_delegate->anchor_widget());
+ EXPECT_FALSE(bubble_observer.widget_closed());
- bubble_widget->CloseNow();
- parent->CloseNow();
+#if defined(USE_AURA)
+ // TODO(msw): Remove activation hack to prevent bookkeeping errors in:
+ // aura::test::TestActivationClient::OnWindowDestroyed().
+ scoped_ptr<Widget> smoke_and_mirrors_widget(new Widget);
+ smoke_and_mirrors_widget->Init(params);
+ smoke_and_mirrors_widget->Show();
+ EXPECT_FALSE(bubble_observer.widget_closed());
+#endif
+
+ // Ensure that closing the parent widget also closes the bubble itself.
+ parent_widget->CloseNow();
RunPendingMessages();
+ EXPECT_TRUE(bubble_observer.widget_closed());
}
} // namespace views