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 |