| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/base/hit_test.h" | 5 #include "ui/base/hit_test.h" |
| 6 #include "ui/views/bubble/bubble_delegate.h" | 6 #include "ui/views/bubble/bubble_delegate.h" |
| 7 #include "ui/views/bubble/bubble_frame_view.h" | 7 #include "ui/views/bubble/bubble_frame_view.h" |
| 8 #include "ui/views/test/test_widget_observer.h" | 8 #include "ui/views/test/test_widget_observer.h" |
| 9 #include "ui/views/test/views_test_base.h" | 9 #include "ui/views/test/views_test_base.h" |
| 10 #include "ui/views/widget/widget.h" | 10 #include "ui/views/widget/widget.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 | 84 |
| 85 TEST_F(BubbleDelegateTest, CloseAnchorWidget) { | 85 TEST_F(BubbleDelegateTest, CloseAnchorWidget) { |
| 86 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 86 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 87 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 87 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( |
| 88 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 88 anchor_widget->GetContentsView(), BubbleBorder::NONE); |
| 89 // Preventing close on deactivate should not prevent closing with the anchor. | 89 // Preventing close on deactivate should not prevent closing with the anchor. |
| 90 bubble_delegate->set_close_on_deactivate(false); | 90 bubble_delegate->set_close_on_deactivate(false); |
| 91 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 91 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); |
| 92 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 92 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
| 93 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 93 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
| 94 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 94 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 95 test::TestWidgetObserver bubble_observer(bubble_widget); | 95 test::TestWidgetObserver bubble_observer(bubble_widget); |
| 96 EXPECT_FALSE(bubble_observer.widget_closed()); | 96 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 97 | 97 |
| 98 bubble_widget->Show(); | 98 bubble_widget->Show(); |
| 99 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 99 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 100 EXPECT_FALSE(bubble_observer.widget_closed()); | 100 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 101 | 101 |
| 102 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: | 102 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: |
| 103 // aura::test::TestActivationClient::OnWindowDestroyed(). | 103 // aura::test::TestActivationClient::OnWindowDestroyed(). |
| 104 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); | 104 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); |
| 105 EXPECT_FALSE(bubble_observer.widget_closed()); | 105 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 106 | 106 |
| 107 // Ensure that closing the anchor widget also closes the bubble itself. | 107 // Ensure that closing the anchor widget also closes the bubble itself. |
| 108 anchor_widget->CloseNow(); | 108 anchor_widget->CloseNow(); |
| 109 EXPECT_TRUE(bubble_observer.widget_closed()); | 109 EXPECT_TRUE(bubble_observer.widget_closed()); |
| 110 } | 110 } |
| 111 | 111 |
| 112 // This test checks that the bubble delegate is capable to handle an early | 112 // This test checks that the bubble delegate is capable to handle an early |
| 113 // destruction of the used anchor view. (Animations and delayed closure of the | 113 // destruction of the used anchor view. (Animations and delayed closure of the |
| 114 // bubble will call upon the anchor view to get its location). | 114 // bubble will call upon the anchor view to get its location). |
| 115 TEST_F(BubbleDelegateTest, CloseAnchorViewTest) { | 115 TEST_F(BubbleDelegateTest, CloseAnchorViewTest) { |
| 116 // Create an anchor widget and add a view to be used as an anchor view. | 116 // Create an anchor widget and add a view to be used as an anchor view. |
| 117 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 117 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 118 scoped_ptr<View> anchor_view(new View()); | 118 scoped_ptr<View> anchor_view(new View()); |
| 119 anchor_widget->GetContentsView()->AddChildView(anchor_view.get()); | 119 anchor_widget->GetContentsView()->AddChildView(anchor_view.get()); |
| 120 TestBubbleDelegateView* bubble_delegate = new TestBubbleDelegateView( | 120 TestBubbleDelegateView* bubble_delegate = new TestBubbleDelegateView( |
| 121 anchor_view.get()); | 121 anchor_view.get()); |
| 122 // Prevent flakes by avoiding closing on activation changes. | 122 // Prevent flakes by avoiding closing on activation changes. |
| 123 bubble_delegate->set_close_on_deactivate(false); | 123 bubble_delegate->set_close_on_deactivate(false); |
| 124 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 124 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); |
| 125 | 125 |
| 126 // Check that the anchor view is correct and set up an anchor view rect. | 126 // Check that the anchor view is correct and set up an anchor view rect. |
| 127 // Make sure that this rect will get ignored (as long as the anchor view is | 127 // Make sure that this rect will get ignored (as long as the anchor view is |
| 128 // attached). | 128 // attached). |
| 129 EXPECT_EQ(anchor_view, bubble_delegate->GetAnchorView()); | 129 EXPECT_EQ(anchor_view.get(), bubble_delegate->GetAnchorView()); |
| 130 const gfx::Rect set_anchor_rect = gfx::Rect(10, 10, 100, 100); | 130 const gfx::Rect set_anchor_rect = gfx::Rect(10, 10, 100, 100); |
| 131 bubble_delegate->SetAnchorRectForTest(set_anchor_rect); | 131 bubble_delegate->SetAnchorRectForTest(set_anchor_rect); |
| 132 const gfx::Rect view_rect = bubble_delegate->GetAnchorRect(); | 132 const gfx::Rect view_rect = bubble_delegate->GetAnchorRect(); |
| 133 EXPECT_NE(view_rect.ToString(), set_anchor_rect.ToString()); | 133 EXPECT_NE(view_rect.ToString(), set_anchor_rect.ToString()); |
| 134 | 134 |
| 135 // Create the bubble. | 135 // Create the bubble. |
| 136 bubble_widget->Show(); | 136 bubble_widget->Show(); |
| 137 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 137 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 138 | 138 |
| 139 // Remove now the anchor view and make sure that the original found rect | 139 // Remove now the anchor view and make sure that the original found rect |
| 140 // is still kept, so that the bubble does not jump when the view gets deleted. | 140 // is still kept, so that the bubble does not jump when the view gets deleted. |
| 141 anchor_widget->GetContentsView()->RemoveChildView(anchor_view.get()); | 141 anchor_widget->GetContentsView()->RemoveChildView(anchor_view.get()); |
| 142 anchor_view.reset(); | 142 anchor_view.reset(); |
| 143 EXPECT_EQ(NULL, bubble_delegate->GetAnchorView()); | 143 EXPECT_EQ(NULL, bubble_delegate->GetAnchorView()); |
| 144 EXPECT_EQ(view_rect.ToString(), bubble_delegate->GetAnchorRect().ToString()); | 144 EXPECT_EQ(view_rect.ToString(), bubble_delegate->GetAnchorRect().ToString()); |
| 145 } | 145 } |
| 146 | 146 |
| 147 // Testing that a move of the anchor view will lead to new bubble locations. | 147 // Testing that a move of the anchor view will lead to new bubble locations. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 167 | 167 |
| 168 // Make sure the bubble widget is parented to a widget other than the anchor | 168 // Make sure the bubble widget is parented to a widget other than the anchor |
| 169 // widget so that closing the anchor widget does not close the bubble widget. | 169 // widget so that closing the anchor widget does not close the bubble widget. |
| 170 scoped_ptr<Widget> parent_widget(CreateTestWidget()); | 170 scoped_ptr<Widget> parent_widget(CreateTestWidget()); |
| 171 bubble_delegate->set_parent_window(parent_widget->GetNativeView()); | 171 bubble_delegate->set_parent_window(parent_widget->GetNativeView()); |
| 172 // Preventing close on deactivate should not prevent closing with the parent. | 172 // Preventing close on deactivate should not prevent closing with the parent. |
| 173 bubble_delegate->set_close_on_deactivate(false); | 173 bubble_delegate->set_close_on_deactivate(false); |
| 174 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 174 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); |
| 175 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 175 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
| 176 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 176 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
| 177 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 177 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 178 test::TestWidgetObserver bubble_observer(bubble_widget); | 178 test::TestWidgetObserver bubble_observer(bubble_widget); |
| 179 EXPECT_FALSE(bubble_observer.widget_closed()); | 179 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 180 | 180 |
| 181 // Showing and hiding the bubble widget should have no effect on its anchor. | 181 // Showing and hiding the bubble widget should have no effect on its anchor. |
| 182 bubble_widget->Show(); | 182 bubble_widget->Show(); |
| 183 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 183 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 184 bubble_widget->Hide(); | 184 bubble_widget->Hide(); |
| 185 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 185 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 186 | 186 |
| 187 // Ensure that closing the anchor widget clears the bubble's reference to that | 187 // Ensure that closing the anchor widget clears the bubble's reference to that |
| 188 // anchor widget, but the bubble itself does not close. | 188 // anchor widget, but the bubble itself does not close. |
| 189 anchor_widget->CloseNow(); | 189 anchor_widget->CloseNow(); |
| 190 EXPECT_NE(anchor_widget, bubble_delegate->anchor_widget()); | 190 EXPECT_NE(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 191 EXPECT_FALSE(bubble_observer.widget_closed()); | 191 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 192 | 192 |
| 193 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: | 193 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: |
| 194 // aura::test::TestActivationClient::OnWindowDestroyed(). | 194 // aura::test::TestActivationClient::OnWindowDestroyed(). |
| 195 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); | 195 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); |
| 196 EXPECT_FALSE(bubble_observer.widget_closed()); | 196 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 197 | 197 |
| 198 // Ensure that closing the parent widget also closes the bubble itself. | 198 // Ensure that closing the parent widget also closes the bubble itself. |
| 199 parent_widget->CloseNow(); | 199 parent_widget->CloseNow(); |
| 200 EXPECT_TRUE(bubble_observer.widget_closed()); | 200 EXPECT_TRUE(bubble_observer.widget_closed()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 255 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 256 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 256 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( |
| 257 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 257 anchor_widget->GetContentsView(), BubbleBorder::NONE); |
| 258 bubble_delegate->set_can_activate(false); | 258 bubble_delegate->set_can_activate(false); |
| 259 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 259 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); |
| 260 bubble_widget->Show(); | 260 bubble_widget->Show(); |
| 261 EXPECT_FALSE(bubble_widget->CanActivate()); | 261 EXPECT_FALSE(bubble_widget->CanActivate()); |
| 262 } | 262 } |
| 263 | 263 |
| 264 } // namespace views | 264 } // namespace views |
| OLD | NEW |