| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "views/widget/native_widget_views.h" | 5 #include "views/widget/native_widget_views.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "views/test/test_views_delegate.h" | 11 #include "views/test/test_views_delegate.h" |
| 12 #include "views/test/views_test_base.h" |
| 12 #include "views/views_delegate.h" | 13 #include "views/views_delegate.h" |
| 13 | 14 |
| 14 #if defined(OS_WIN) | 15 #if defined(OS_WIN) |
| 15 #include "views/widget/native_widget_win.h" | 16 #include "views/widget/native_widget_win.h" |
| 16 #elif defined(TOOLKIT_USES_GTK) | 17 #elif defined(TOOLKIT_USES_GTK) |
| 17 #include "views/widget/native_widget_gtk.h" | 18 #include "views/widget/native_widget_gtk.h" |
| 18 #endif | 19 #endif |
| 19 | 20 |
| 20 namespace views { | 21 namespace views { |
| 21 namespace { | 22 namespace { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 virtual View* GetDefaultParentView() OVERRIDE { | 74 virtual View* GetDefaultParentView() OVERRIDE { |
| 74 return default_parent_view_; | 75 return default_parent_view_; |
| 75 } | 76 } |
| 76 | 77 |
| 77 private: | 78 private: |
| 78 View* default_parent_view_; | 79 View* default_parent_view_; |
| 79 | 80 |
| 80 DISALLOW_COPY_AND_ASSIGN(WidgetTestViewsDelegate); | 81 DISALLOW_COPY_AND_ASSIGN(WidgetTestViewsDelegate); |
| 81 }; | 82 }; |
| 82 | 83 |
| 83 class WidgetTest : public testing::Test { | 84 class WidgetTest : public ViewsTestBase { |
| 84 public: | 85 public: |
| 85 WidgetTest() { | 86 WidgetTest() { |
| 86 #if defined(OS_WIN) | |
| 87 OleInitialize(NULL); | |
| 88 #endif | |
| 89 } | 87 } |
| 90 virtual ~WidgetTest() { | 88 virtual ~WidgetTest() { |
| 91 #if defined(OS_WIN) | |
| 92 OleUninitialize(); | |
| 93 #endif | |
| 94 } | 89 } |
| 95 | 90 |
| 96 virtual void TearDown() { | 91 virtual void SetUp() OVERRIDE { |
| 97 // Flush the message loop because we have pending release tasks | 92 set_views_delegate(new WidgetTestViewsDelegate()); |
| 98 // and these tasks if un-executed would upset Valgrind. | 93 ViewsTestBase::SetUp(); |
| 99 RunPendingMessages(); | |
| 100 } | 94 } |
| 101 | 95 |
| 102 void RunPendingMessages() { | 96 WidgetTestViewsDelegate& widget_views_delegate() const { |
| 103 message_loop_.RunAllPending(); | 97 return static_cast<WidgetTestViewsDelegate&>(views_delegate()); |
| 104 } | 98 } |
| 105 | 99 |
| 106 protected: | |
| 107 WidgetTestViewsDelegate views_delegate; | |
| 108 | |
| 109 private: | 100 private: |
| 110 MessageLoopForUI message_loop_; | |
| 111 | |
| 112 DISALLOW_COPY_AND_ASSIGN(WidgetTest); | 101 DISALLOW_COPY_AND_ASSIGN(WidgetTest); |
| 113 }; | 102 }; |
| 114 | 103 |
| 115 NativeWidget* CreatePlatformNativeWidget( | 104 NativeWidget* CreatePlatformNativeWidget( |
| 116 internal::NativeWidgetDelegate* delegate) { | 105 internal::NativeWidgetDelegate* delegate) { |
| 117 #if defined(OS_WIN) | 106 #if defined(OS_WIN) |
| 118 return new NativeWidgetWin(delegate); | 107 return new NativeWidgetWin(delegate); |
| 119 #elif defined(TOOLKIT_USES_GTK) | 108 #elif defined(TOOLKIT_USES_GTK) |
| 120 return new NativeWidgetGtkCapture(delegate); | 109 return new NativeWidgetGtkCapture(delegate); |
| 121 #endif | 110 #endif |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 EXPECT_EQ(toplevel, child->GetTopLevelWidget()); | 166 EXPECT_EQ(toplevel, child->GetTopLevelWidget()); |
| 178 | 167 |
| 179 toplevel->CloseNow(); | 168 toplevel->CloseNow(); |
| 180 // |child| should be automatically destroyed with |toplevel|. | 169 // |child| should be automatically destroyed with |toplevel|. |
| 181 } | 170 } |
| 182 | 171 |
| 183 TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) { | 172 TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) { |
| 184 // Create a hierarchy consisting of a top level platform native widget and a | 173 // Create a hierarchy consisting of a top level platform native widget and a |
| 185 // child NativeWidgetViews. | 174 // child NativeWidgetViews. |
| 186 Widget* toplevel = CreateTopLevelPlatformWidget(); | 175 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 187 views_delegate.set_default_parent_view(toplevel->GetRootView()); | 176 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 188 Widget* child = CreateChildNativeWidgetViews(); | 177 Widget* child = CreateChildNativeWidgetViews(); |
| 189 | 178 |
| 190 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); | 179 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); |
| 191 EXPECT_EQ(child, child->GetTopLevelWidget()); | 180 EXPECT_EQ(child, child->GetTopLevelWidget()); |
| 192 | 181 |
| 193 toplevel->CloseNow(); | 182 toplevel->CloseNow(); |
| 194 // |child| should be automatically destroyed with |toplevel|. | 183 // |child| should be automatically destroyed with |toplevel|. |
| 195 } | 184 } |
| 196 | 185 |
| 197 // Creates a hierarchy consisting of a top level platform native widget, a child | 186 // Creates a hierarchy consisting of a top level platform native widget, a child |
| 198 // NativeWidgetViews, and a child of that child, another NativeWidgetViews. | 187 // NativeWidgetViews, and a child of that child, another NativeWidgetViews. |
| 199 TEST_F(WidgetTest, GetTopLevelWidget_SyntheticParent) { | 188 TEST_F(WidgetTest, GetTopLevelWidget_SyntheticParent) { |
| 200 Widget* toplevel = CreateTopLevelPlatformWidget(); | 189 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 201 views_delegate.set_default_parent_view(toplevel->GetRootView()); | 190 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 202 | 191 |
| 203 Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented | 192 Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented |
| 204 // automatically to | 193 // automatically to |
| 205 // |toplevel|. | 194 // |toplevel|. |
| 206 Widget* child11 = CreateChildNativeWidgetViewsWithParent(child1); | 195 Widget* child11 = CreateChildNativeWidgetViewsWithParent(child1); |
| 207 | 196 |
| 208 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); | 197 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); |
| 209 EXPECT_EQ(child1, child1->GetTopLevelWidget()); | 198 EXPECT_EQ(child1, child1->GetTopLevelWidget()); |
| 210 EXPECT_EQ(child1, child11->GetTopLevelWidget()); | 199 EXPECT_EQ(child1, child11->GetTopLevelWidget()); |
| 211 | 200 |
| 212 toplevel->CloseNow(); | 201 toplevel->CloseNow(); |
| 213 // |child1| and |child11| should be destroyed with |toplevel|. | 202 // |child1| and |child11| should be destroyed with |toplevel|. |
| 214 } | 203 } |
| 215 | 204 |
| 205 // This is flaky on touch build. See crbug.com/94137. |
| 206 #if defined(TOUCH_UI) |
| 207 #define MAYBE_GrabUngrab DISABLED_GrabUngrab |
| 208 #else |
| 209 #define MAYBE_GrabUngrab GrabUngrab |
| 210 #endif |
| 216 // Tests some grab/ungrab events. | 211 // Tests some grab/ungrab events. |
| 217 TEST_F(WidgetTest, GrabUngrab) { | 212 TEST_F(WidgetTest, MAYBE_GrabUngrab) { |
| 218 Widget* toplevel = CreateTopLevelPlatformWidget(); | 213 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 219 views_delegate.set_default_parent_view(toplevel->GetRootView()); | 214 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 220 | 215 |
| 221 Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented | 216 Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented |
| 222 // automatically to | 217 // automatically to |
| 223 // |toplevel|. | 218 // |toplevel|. |
| 224 Widget* child2 = CreateChildNativeWidgetViews(); | 219 Widget* child2 = CreateChildNativeWidgetViews(); |
| 225 | 220 |
| 226 toplevel->SetBounds(gfx::Rect(0, 0, 500, 500)); | 221 toplevel->SetBounds(gfx::Rect(0, 0, 500, 500)); |
| 227 | 222 |
| 228 child1->SetBounds(gfx::Rect(10, 10, 300, 300)); | 223 child1->SetBounds(gfx::Rect(10, 10, 300, 300)); |
| 229 View* view = new MouseView(); | 224 View* view = new MouseView(); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 // InitParams::Ownership param. | 273 // InitParams::Ownership param. |
| 279 | 274 |
| 280 // A WidgetTest that supplies a toplevel widget for NativeWidgetViews to parent | 275 // A WidgetTest that supplies a toplevel widget for NativeWidgetViews to parent |
| 281 // to. | 276 // to. |
| 282 class WidgetOwnershipTest : public WidgetTest { | 277 class WidgetOwnershipTest : public WidgetTest { |
| 283 public: | 278 public: |
| 284 WidgetOwnershipTest() {} | 279 WidgetOwnershipTest() {} |
| 285 virtual ~WidgetOwnershipTest() {} | 280 virtual ~WidgetOwnershipTest() {} |
| 286 | 281 |
| 287 virtual void SetUp() { | 282 virtual void SetUp() { |
| 283 WidgetTest::SetUp(); |
| 288 desktop_widget_ = CreateTopLevelPlatformWidget(); | 284 desktop_widget_ = CreateTopLevelPlatformWidget(); |
| 289 views_delegate.set_default_parent_view(desktop_widget_->GetRootView()); | 285 widget_views_delegate().set_default_parent_view( |
| 286 desktop_widget_->GetRootView()); |
| 290 } | 287 } |
| 291 | 288 |
| 292 virtual void TearDown() { | 289 virtual void TearDown() { |
| 293 desktop_widget_->CloseNow(); | 290 desktop_widget_->CloseNow(); |
| 294 WidgetTest::TearDown(); | 291 WidgetTest::TearDown(); |
| 295 } | 292 } |
| 296 | 293 |
| 297 private: | 294 private: |
| 298 Widget* desktop_widget_; | 295 Widget* desktop_widget_; |
| 299 | 296 |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 | 630 |
| 634 Widget* widget_closed_; | 631 Widget* widget_closed_; |
| 635 Widget* widget_activated_; | 632 Widget* widget_activated_; |
| 636 Widget* widget_deactivated_; | 633 Widget* widget_deactivated_; |
| 637 Widget* widget_shown_; | 634 Widget* widget_shown_; |
| 638 Widget* widget_hidden_; | 635 Widget* widget_hidden_; |
| 639 }; | 636 }; |
| 640 | 637 |
| 641 TEST_F(WidgetObserverTest, ActivationChange) { | 638 TEST_F(WidgetObserverTest, ActivationChange) { |
| 642 Widget* toplevel = CreateTopLevelPlatformWidget(); | 639 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 643 views_delegate.set_default_parent_view(toplevel->GetRootView()); | 640 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 644 | 641 |
| 645 Widget* child1 = NewWidget(); | 642 Widget* child1 = NewWidget(); |
| 646 Widget* child2 = NewWidget(); | 643 Widget* child2 = NewWidget(); |
| 647 | 644 |
| 648 reset(); | 645 reset(); |
| 649 | 646 |
| 650 child1->Activate(); | 647 child1->Activate(); |
| 651 EXPECT_EQ(child1, widget_activated()); | 648 EXPECT_EQ(child1, widget_activated()); |
| 652 | 649 |
| 653 child2->Activate(); | 650 child2->Activate(); |
| 654 EXPECT_EQ(child1, widget_deactivated()); | 651 EXPECT_EQ(child1, widget_deactivated()); |
| 655 EXPECT_EQ(child2, widget_activated()); | 652 EXPECT_EQ(child2, widget_activated()); |
| 656 EXPECT_EQ(child2, active()); | 653 EXPECT_EQ(child2, active()); |
| 657 } | 654 } |
| 658 | 655 |
| 659 TEST_F(WidgetObserverTest, VisibilityChange) { | 656 TEST_F(WidgetObserverTest, VisibilityChange) { |
| 660 Widget* toplevel = CreateTopLevelPlatformWidget(); | 657 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 661 views_delegate.set_default_parent_view(toplevel->GetRootView()); | 658 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 662 | 659 |
| 663 Widget* child1 = NewWidget(); | 660 Widget* child1 = NewWidget(); |
| 664 Widget* child2 = NewWidget(); | 661 Widget* child2 = NewWidget(); |
| 665 | 662 |
| 666 reset(); | 663 reset(); |
| 667 | 664 |
| 668 child1->Hide(); | 665 child1->Hide(); |
| 669 EXPECT_EQ(child1, widget_hidden()); | 666 EXPECT_EQ(child1, widget_hidden()); |
| 670 | 667 |
| 671 child2->Hide(); | 668 child2->Hide(); |
| 672 EXPECT_EQ(child2, widget_hidden()); | 669 EXPECT_EQ(child2, widget_hidden()); |
| 673 | 670 |
| 674 child1->Show(); | 671 child1->Show(); |
| 675 EXPECT_EQ(child1, widget_shown()); | 672 EXPECT_EQ(child1, widget_shown()); |
| 676 | 673 |
| 677 child2->Show(); | 674 child2->Show(); |
| 678 EXPECT_EQ(child2, widget_shown()); | 675 EXPECT_EQ(child2, widget_shown()); |
| 679 } | 676 } |
| 680 | 677 |
| 681 } // namespace | 678 } // namespace |
| 682 } // namespace views | 679 } // namespace views |
| OLD | NEW |