diff options
author | msw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-01 01:15:11 +0000 |
---|---|---|
committer | msw@chromium.org <msw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-01 01:15:11 +0000 |
commit | bb53a5aeea4d8f5e19bf6152bb10e17f0af1652f (patch) | |
tree | 2b041e2b1561ac539eb54d813bd22da083bba53d /ui | |
parent | 30c8f5429e4ffe4f1e4fc5ba5fe234929a808454 (diff) | |
download | chromium_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.cc | 141 |
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 |