| 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" |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) { | 125 Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) { |
| 126 Widget* child = new Widget; | 126 Widget* child = new Widget; |
| 127 Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); | 127 Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); |
| 128 child_params.native_widget = CreatePlatformNativeWidget(child); | 128 child_params.native_widget = CreatePlatformNativeWidget(child); |
| 129 child_params.parent = parent_native_view; | 129 child_params.parent = parent_native_view; |
| 130 child->Init(child_params); | 130 child->Init(child_params); |
| 131 child->SetContentsView(new View); | 131 child->SetContentsView(new View); |
| 132 return child; | 132 return child; |
| 133 } | 133 } |
| 134 | 134 |
| 135 Widget* CreateTopLevelNativeWidgetViews() { |
| 136 Widget* toplevel = new Widget; |
| 137 Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); |
| 138 params.native_widget = new NativeWidgetViews(toplevel); |
| 139 toplevel->Init(params); |
| 140 toplevel->SetContentsView(new View); |
| 141 return toplevel; |
| 142 } |
| 143 |
| 135 Widget* CreateChildNativeWidgetViewsWithParent(Widget* parent) { | 144 Widget* CreateChildNativeWidgetViewsWithParent(Widget* parent) { |
| 136 Widget* child = new Widget; | 145 Widget* child = new Widget; |
| 137 Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); | 146 Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); |
| 138 params.native_widget = new NativeWidgetViews(child); | 147 params.native_widget = new NativeWidgetViews(child); |
| 139 params.parent_widget = parent; | 148 params.parent_widget = parent; |
| 140 child->Init(params); | 149 child->Init(params); |
| 141 child->SetContentsView(new View); | 150 child->SetContentsView(new View); |
| 142 return child; | 151 return child; |
| 143 } | 152 } |
| 144 | 153 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 171 | 180 |
| 172 toplevel->CloseNow(); | 181 toplevel->CloseNow(); |
| 173 // |child| should be automatically destroyed with |toplevel|. | 182 // |child| should be automatically destroyed with |toplevel|. |
| 174 } | 183 } |
| 175 | 184 |
| 176 TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) { | 185 TEST_F(WidgetTest, GetTopLevelWidget_Synthetic) { |
| 177 // Create a hierarchy consisting of a top level platform native widget and a | 186 // Create a hierarchy consisting of a top level platform native widget and a |
| 178 // child NativeWidgetViews. | 187 // child NativeWidgetViews. |
| 179 Widget* toplevel = CreateTopLevelPlatformWidget(); | 188 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 180 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); | 189 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 181 Widget* child = CreateChildNativeWidgetViews(); | 190 Widget* child = CreateTopLevelNativeWidgetViews(); |
| 182 | 191 |
| 183 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); | 192 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); |
| 184 EXPECT_EQ(child, child->GetTopLevelWidget()); | 193 EXPECT_EQ(child, child->GetTopLevelWidget()); |
| 185 | 194 |
| 186 toplevel->CloseNow(); | 195 toplevel->CloseNow(); |
| 187 // |child| should be automatically destroyed with |toplevel|. | 196 // |child| should be automatically destroyed with |toplevel|. |
| 188 } | 197 } |
| 189 | 198 |
| 190 // Creates a hierarchy consisting of a top level platform native widget, a child | 199 // Creates a hierarchy consisting of a desktop platform native widget, a |
| 191 // NativeWidgetViews, and a child of that child, another NativeWidgetViews. | 200 // toplevel NativeWidgetViews, and a child of that toplevel, another |
| 192 TEST_F(WidgetTest, GetTopLevelWidget_SyntheticParent) { | 201 // NativeWidgetViews. |
| 193 Widget* toplevel = CreateTopLevelPlatformWidget(); | 202 TEST_F(WidgetTest, GetTopLevelWidget_SyntheticDesktop) { |
| 194 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); | 203 // Create a hierarchy consisting of a desktop platform native widget, |
| 204 // a toplevel NativeWidgetViews and a chlid NativeWidgetViews. |
| 205 Widget* desktop = CreateTopLevelPlatformWidget(); |
| 206 widget_views_delegate().set_default_parent_view(desktop->GetRootView()); |
| 207 Widget* toplevel = CreateTopLevelNativeWidgetViews(); // Will be parented |
| 208 // automatically to |
| 209 // |toplevel|. |
| 195 | 210 |
| 196 Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented | 211 Widget* child = CreateChildNativeWidgetViewsWithParent(toplevel); |
| 197 // automatically to | |
| 198 // |toplevel|. | |
| 199 Widget* child11 = CreateChildNativeWidgetViewsWithParent(child1); | |
| 200 | 212 |
| 213 EXPECT_EQ(desktop, desktop->GetTopLevelWidget()); |
| 201 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); | 214 EXPECT_EQ(toplevel, toplevel->GetTopLevelWidget()); |
| 202 EXPECT_EQ(child1, child1->GetTopLevelWidget()); | 215 EXPECT_EQ(toplevel, child->GetTopLevelWidget()); |
| 203 EXPECT_EQ(child1, child11->GetTopLevelWidget()); | |
| 204 | 216 |
| 205 toplevel->CloseNow(); | 217 desktop->CloseNow(); |
| 206 // |child1| and |child11| should be destroyed with |toplevel|. | 218 // |toplevel|, |child| should be automatically destroyed with |toplevel|. |
| 207 } | 219 } |
| 208 | 220 |
| 209 // This is flaky on touch build. See crbug.com/94137. | 221 // This is flaky on touch build. See crbug.com/94137. |
| 210 #if defined(TOUCH_UI) | 222 #if defined(TOUCH_UI) |
| 211 #define MAYBE_GrabUngrab DISABLED_GrabUngrab | 223 #define MAYBE_GrabUngrab DISABLED_GrabUngrab |
| 212 #else | 224 #else |
| 213 #define MAYBE_GrabUngrab GrabUngrab | 225 #define MAYBE_GrabUngrab GrabUngrab |
| 214 #endif | 226 #endif |
| 215 // Tests some grab/ungrab events. | 227 // Tests some grab/ungrab events. |
| 216 TEST_F(WidgetTest, MAYBE_GrabUngrab) { | 228 TEST_F(WidgetTest, MAYBE_GrabUngrab) { |
| 217 Widget* toplevel = CreateTopLevelPlatformWidget(); | 229 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 218 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); | 230 Widget* child1 = CreateChildNativeWidgetViewsWithParent(toplevel); |
| 219 | 231 Widget* child2 = CreateChildNativeWidgetViewsWithParent(toplevel); |
| 220 Widget* child1 = CreateChildNativeWidgetViews(); // Will be parented | |
| 221 // automatically to | |
| 222 // |toplevel|. | |
| 223 Widget* child2 = CreateChildNativeWidgetViews(); | |
| 224 | 232 |
| 225 toplevel->SetBounds(gfx::Rect(0, 0, 500, 500)); | 233 toplevel->SetBounds(gfx::Rect(0, 0, 500, 500)); |
| 226 | 234 |
| 227 child1->SetBounds(gfx::Rect(10, 10, 300, 300)); | 235 child1->SetBounds(gfx::Rect(10, 10, 300, 300)); |
| 228 View* view = new MouseView(); | 236 View* view = new MouseView(); |
| 229 view->SetBounds(0, 0, 300, 300); | 237 view->SetBounds(0, 0, 300, 300); |
| 230 child1->GetRootView()->AddChildView(view); | 238 child1->GetRootView()->AddChildView(view); |
| 231 | 239 |
| 232 child2->SetBounds(gfx::Rect(200, 10, 200, 200)); | 240 child2->SetBounds(gfx::Rect(200, 10, 200, 200)); |
| 233 view = new MouseView(); | 241 view = new MouseView(); |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 void reset() { | 651 void reset() { |
| 644 active_ = NULL; | 652 active_ = NULL; |
| 645 widget_closed_ = NULL; | 653 widget_closed_ = NULL; |
| 646 widget_activated_ = NULL; | 654 widget_activated_ = NULL; |
| 647 widget_deactivated_ = NULL; | 655 widget_deactivated_ = NULL; |
| 648 widget_shown_ = NULL; | 656 widget_shown_ = NULL; |
| 649 widget_hidden_ = NULL; | 657 widget_hidden_ = NULL; |
| 650 } | 658 } |
| 651 | 659 |
| 652 Widget* NewWidget() { | 660 Widget* NewWidget() { |
| 653 Widget* widget = CreateChildNativeWidgetViews(); | 661 Widget* widget = CreateTopLevelNativeWidgetViews(); |
| 654 widget->AddObserver(this); | 662 widget->AddObserver(this); |
| 655 return widget; | 663 return widget; |
| 656 } | 664 } |
| 657 | 665 |
| 658 const Widget* active() const { return active_; } | 666 const Widget* active() const { return active_; } |
| 659 const Widget* widget_closed() const { return widget_closed_; } | 667 const Widget* widget_closed() const { return widget_closed_; } |
| 660 const Widget* widget_activated() const { return widget_activated_; } | 668 const Widget* widget_activated() const { return widget_activated_; } |
| 661 const Widget* widget_deactivated() const { return widget_deactivated_; } | 669 const Widget* widget_deactivated() const { return widget_deactivated_; } |
| 662 const Widget* widget_shown() const { return widget_shown_; } | 670 const Widget* widget_shown() const { return widget_shown_; } |
| 663 const Widget* widget_hidden() const { return widget_hidden_; } | 671 const Widget* widget_hidden() const { return widget_hidden_; } |
| 664 | 672 |
| 665 private: | 673 private: |
| 666 | 674 |
| 667 Widget* active_; | 675 Widget* active_; |
| 668 | 676 |
| 669 Widget* widget_closed_; | 677 Widget* widget_closed_; |
| 670 Widget* widget_activated_; | 678 Widget* widget_activated_; |
| 671 Widget* widget_deactivated_; | 679 Widget* widget_deactivated_; |
| 672 Widget* widget_shown_; | 680 Widget* widget_shown_; |
| 673 Widget* widget_hidden_; | 681 Widget* widget_hidden_; |
| 674 }; | 682 }; |
| 675 | 683 |
| 676 TEST_F(WidgetObserverTest, ActivationChange) { | 684 TEST_F(WidgetObserverTest, ActivationChange) { |
| 677 Widget* toplevel = CreateTopLevelPlatformWidget(); | 685 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 678 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); | 686 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 679 | 687 |
| 680 Widget* child1 = NewWidget(); | 688 Widget* toplevel1 = NewWidget(); |
| 681 Widget* child2 = NewWidget(); | 689 Widget* toplevel2 = NewWidget(); |
| 690 |
| 691 toplevel1->Show(); |
| 692 toplevel2->Show(); |
| 682 | 693 |
| 683 reset(); | 694 reset(); |
| 684 | 695 |
| 685 child1->Activate(); | 696 toplevel1->Activate(); |
| 686 EXPECT_EQ(child1, widget_activated()); | |
| 687 | 697 |
| 688 child2->Activate(); | 698 RunPendingMessages(); |
| 689 EXPECT_EQ(child1, widget_deactivated()); | 699 EXPECT_EQ(toplevel1, widget_activated()); |
| 690 EXPECT_EQ(child2, widget_activated()); | 700 |
| 691 EXPECT_EQ(child2, active()); | 701 toplevel2->Activate(); |
| 702 RunPendingMessages(); |
| 703 EXPECT_EQ(toplevel1, widget_deactivated()); |
| 704 EXPECT_EQ(toplevel2, widget_activated()); |
| 705 EXPECT_EQ(toplevel2, active()); |
| 706 |
| 707 toplevel->CloseNow(); |
| 692 } | 708 } |
| 693 | 709 |
| 694 TEST_F(WidgetObserverTest, VisibilityChange) { | 710 TEST_F(WidgetObserverTest, VisibilityChange) { |
| 695 Widget* toplevel = CreateTopLevelPlatformWidget(); | 711 Widget* toplevel = CreateTopLevelPlatformWidget(); |
| 696 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); | 712 widget_views_delegate().set_default_parent_view(toplevel->GetRootView()); |
| 697 | 713 |
| 698 Widget* child1 = NewWidget(); | 714 Widget* child1 = NewWidget(); |
| 699 Widget* child2 = NewWidget(); | 715 Widget* child2 = NewWidget(); |
| 700 | 716 |
| 701 reset(); | 717 reset(); |
| 702 | 718 |
| 703 child1->Hide(); | 719 child1->Hide(); |
| 704 EXPECT_EQ(child1, widget_hidden()); | 720 EXPECT_EQ(child1, widget_hidden()); |
| 705 | 721 |
| 706 child2->Hide(); | 722 child2->Hide(); |
| 707 EXPECT_EQ(child2, widget_hidden()); | 723 EXPECT_EQ(child2, widget_hidden()); |
| 708 | 724 |
| 709 child1->Show(); | 725 child1->Show(); |
| 710 EXPECT_EQ(child1, widget_shown()); | 726 EXPECT_EQ(child1, widget_shown()); |
| 711 | 727 |
| 712 child2->Show(); | 728 child2->Show(); |
| 713 EXPECT_EQ(child2, widget_shown()); | 729 EXPECT_EQ(child2, widget_shown()); |
| 730 |
| 731 toplevel->CloseNow(); |
| 714 } | 732 } |
| 715 | 733 |
| 716 } // namespace | 734 } // namespace |
| 717 } // namespace views | 735 } // namespace views |
| OLD | NEW |