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 <algorithm> | 5 #include <algorithm> |
6 #include <set> | 6 #include <set> |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "ui/aura/client/aura_constants.h" | |
16 #include "ui/aura/client/window_tree_client.h" | |
17 #include "ui/aura/test/event_generator.h" | 15 #include "ui/aura/test/event_generator.h" |
18 #include "ui/aura/test/test_window_delegate.h" | |
19 #include "ui/aura/window.h" | 16 #include "ui/aura/window.h" |
20 #include "ui/aura/window_tree_host.h" | |
21 #include "ui/base/hit_test.h" | 17 #include "ui/base/hit_test.h" |
22 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 18 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
23 #include "ui/compositor/scoped_layer_animation_settings.h" | 19 #include "ui/compositor/scoped_layer_animation_settings.h" |
24 #include "ui/events/event_processor.h" | 20 #include "ui/events/event_processor.h" |
25 #include "ui/events/event_utils.h" | 21 #include "ui/events/event_utils.h" |
26 #include "ui/gfx/native_widget_types.h" | 22 #include "ui/gfx/native_widget_types.h" |
27 #include "ui/gfx/point.h" | 23 #include "ui/gfx/point.h" |
28 #include "ui/views/bubble/bubble_delegate.h" | 24 #include "ui/views/bubble/bubble_delegate.h" |
29 #include "ui/views/controls/textfield/textfield.h" | 25 #include "ui/views/controls/textfield/textfield.h" |
30 #include "ui/views/test/test_views_delegate.h" | 26 #include "ui/views/test/test_views_delegate.h" |
31 #include "ui/views/test/widget_test.h" | 27 #include "ui/views/test/widget_test.h" |
32 #include "ui/views/views_delegate.h" | 28 #include "ui/views/views_delegate.h" |
33 #include "ui/views/widget/native_widget_aura.h" | |
34 #include "ui/views/widget/native_widget_delegate.h" | 29 #include "ui/views/widget/native_widget_delegate.h" |
35 #include "ui/views/widget/root_view.h" | 30 #include "ui/views/widget/root_view.h" |
36 #include "ui/views/widget/widget_deletion_observer.h" | 31 #include "ui/views/widget/widget_deletion_observer.h" |
37 #include "ui/views/window/dialog_delegate.h" | 32 #include "ui/views/window/dialog_delegate.h" |
38 #include "ui/views/window/native_frame_view.h" | 33 #include "ui/views/window/native_frame_view.h" |
39 | 34 |
40 #if !defined(OS_CHROMEOS) | |
41 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" | |
42 #endif | |
43 | |
44 #if defined(OS_WIN) | 35 #if defined(OS_WIN) |
45 #include "ui/views/win/hwnd_util.h" | 36 #include "ui/views/win/hwnd_util.h" |
46 #endif | 37 #endif |
47 | 38 |
48 namespace views { | 39 namespace views { |
49 namespace test { | 40 namespace test { |
50 | 41 |
51 // A view that keeps track of the events it receives, but consumes no events. | 42 // A view that keeps track of the events it receives, but consumes no events. |
52 class EventCountView : public View { | 43 class EventCountView : public View { |
53 public: | 44 public: |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 // A bag of state to monitor destructions. | 298 // A bag of state to monitor destructions. |
308 struct OwnershipTestState { | 299 struct OwnershipTestState { |
309 OwnershipTestState() : widget_deleted(false), native_widget_deleted(false) {} | 300 OwnershipTestState() : widget_deleted(false), native_widget_deleted(false) {} |
310 | 301 |
311 bool widget_deleted; | 302 bool widget_deleted; |
312 bool native_widget_deleted; | 303 bool native_widget_deleted; |
313 }; | 304 }; |
314 | 305 |
315 // A platform NativeWidget subclass that updates a bag of state when it is | 306 // A platform NativeWidget subclass that updates a bag of state when it is |
316 // destroyed. | 307 // destroyed. |
317 class OwnershipTestNativeWidget : public NativeWidgetAura { | 308 class OwnershipTestNativeWidget : public PlatformNativeWidget { |
318 public: | 309 public: |
319 OwnershipTestNativeWidget(internal::NativeWidgetDelegate* delegate, | 310 OwnershipTestNativeWidget(internal::NativeWidgetDelegate* delegate, |
320 OwnershipTestState* state) | 311 OwnershipTestState* state) |
321 : NativeWidgetAura(delegate), | 312 : PlatformNativeWidget(delegate), |
322 state_(state) { | 313 state_(state) { |
323 } | 314 } |
324 virtual ~OwnershipTestNativeWidget() { | 315 virtual ~OwnershipTestNativeWidget() { |
325 state_->native_widget_deleted = true; | 316 state_->native_widget_deleted = true; |
326 } | 317 } |
327 | 318 |
328 private: | 319 private: |
329 OwnershipTestState* state_; | 320 OwnershipTestState* state_; |
330 | 321 |
331 DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidget); | 322 DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidget); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 Ownership_PlatformNativeWidgetOwnsWidget_NativeDestroy) { | 479 Ownership_PlatformNativeWidgetOwnsWidget_NativeDestroy) { |
489 OwnershipTestState state; | 480 OwnershipTestState state; |
490 | 481 |
491 Widget* widget = new OwnershipTestWidget(&state); | 482 Widget* widget = new OwnershipTestWidget(&state); |
492 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); | 483 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
493 params.native_widget = | 484 params.native_widget = |
494 new OwnershipTestNativeWidgetAura(widget, &state); | 485 new OwnershipTestNativeWidgetAura(widget, &state); |
495 widget->Init(params); | 486 widget->Init(params); |
496 | 487 |
497 // Now simulate a destroy of the platform native widget from the OS: | 488 // Now simulate a destroy of the platform native widget from the OS: |
498 delete widget->GetNativeView(); | 489 SimulateNativeDestroy(widget); |
499 | 490 |
500 EXPECT_TRUE(state.widget_deleted); | 491 EXPECT_TRUE(state.widget_deleted); |
501 EXPECT_TRUE(state.native_widget_deleted); | 492 EXPECT_TRUE(state.native_widget_deleted); |
502 } | 493 } |
503 | 494 |
504 // NativeWidget owns its Widget, part 4: NativeWidget is a NativeWidget, | 495 // NativeWidget owns its Widget, part 4: NativeWidget is a NativeWidget, |
505 // destroyed by the view hierarchy that contains it. | 496 // destroyed by the view hierarchy that contains it. |
506 TEST_F(WidgetOwnershipTest, | 497 TEST_F(WidgetOwnershipTest, |
507 Ownership_ViewsNativeWidgetOwnsWidget_NativeDestroy) { | 498 Ownership_ViewsNativeWidgetOwnsWidget_NativeDestroy) { |
508 OwnershipTestState state; | 499 OwnershipTestState state; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 widget.Init(params); | 637 widget.Init(params); |
647 widget.Show(); | 638 widget.Show(); |
648 | 639 |
649 widget.native_widget_private()->CloseNow(); | 640 widget.native_widget_private()->CloseNow(); |
650 InvokeWidgetMethods(&widget); | 641 InvokeWidgetMethods(&widget); |
651 } | 642 } |
652 #if !defined(OS_CHROMEOS) | 643 #if !defined(OS_CHROMEOS) |
653 { | 644 { |
654 Widget widget; | 645 Widget widget; |
655 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); | 646 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
656 params.native_widget = new DesktopNativeWidgetAura(&widget); | 647 params.native_widget = new PlatformDesktopNativeWidget(&widget); |
657 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 648 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
658 widget.Init(params); | 649 widget.Init(params); |
659 widget.Show(); | 650 widget.Show(); |
660 | 651 |
661 widget.native_widget_private()->CloseNow(); | 652 widget.native_widget_private()->CloseNow(); |
662 InvokeWidgetMethods(&widget); | 653 InvokeWidgetMethods(&widget); |
663 } | 654 } |
664 #endif | 655 #endif |
665 } | 656 } |
666 | 657 |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
927 TEST_F(WidgetTest, DISABLED_FocusChangesOnBubble) { | 918 TEST_F(WidgetTest, DISABLED_FocusChangesOnBubble) { |
928 // Create a widget, show and activate it and focus the contents view. | 919 // Create a widget, show and activate it and focus the contents view. |
929 View* contents_view = new View; | 920 View* contents_view = new View; |
930 contents_view->SetFocusable(true); | 921 contents_view->SetFocusable(true); |
931 Widget widget; | 922 Widget widget; |
932 Widget::InitParams init_params = | 923 Widget::InitParams init_params = |
933 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); | 924 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
934 init_params.bounds = gfx::Rect(0, 0, 200, 200); | 925 init_params.bounds = gfx::Rect(0, 0, 200, 200); |
935 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 926 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
936 #if !defined(OS_CHROMEOS) | 927 #if !defined(OS_CHROMEOS) |
937 init_params.native_widget = new DesktopNativeWidgetAura(&widget); | 928 init_params.native_widget = new PlatformDesktopNativeWidget(&widget); |
938 #endif | 929 #endif |
939 widget.Init(init_params); | 930 widget.Init(init_params); |
940 widget.SetContentsView(contents_view); | 931 widget.SetContentsView(contents_view); |
941 widget.Show(); | 932 widget.Show(); |
942 widget.Activate(); | 933 widget.Activate(); |
943 contents_view->RequestFocus(); | 934 contents_view->RequestFocus(); |
944 EXPECT_TRUE(contents_view->HasFocus()); | 935 EXPECT_TRUE(contents_view->HasFocus()); |
945 | 936 |
946 // Show a bubble. | 937 // Show a bubble. |
947 BubbleDelegateView* bubble_delegate_view = | 938 BubbleDelegateView* bubble_delegate_view = |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
995 // Test to ensure that after minimize, view width is set to zero. | 986 // Test to ensure that after minimize, view width is set to zero. |
996 TEST_F(WidgetTest, TestViewWidthAfterMinimizingWidget) { | 987 TEST_F(WidgetTest, TestViewWidthAfterMinimizingWidget) { |
997 // Create a widget. | 988 // Create a widget. |
998 Widget widget; | 989 Widget widget; |
999 Widget::InitParams init_params = | 990 Widget::InitParams init_params = |
1000 CreateParams(Widget::InitParams::TYPE_WINDOW); | 991 CreateParams(Widget::InitParams::TYPE_WINDOW); |
1001 init_params.show_state = ui::SHOW_STATE_NORMAL; | 992 init_params.show_state = ui::SHOW_STATE_NORMAL; |
1002 gfx::Rect initial_bounds(0, 0, 300, 400); | 993 gfx::Rect initial_bounds(0, 0, 300, 400); |
1003 init_params.bounds = initial_bounds; | 994 init_params.bounds = initial_bounds; |
1004 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 995 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
1005 init_params.native_widget = new DesktopNativeWidgetAura(&widget); | 996 init_params.native_widget = new PlatformDesktopNativeWidget(&widget); |
1006 widget.Init(init_params); | 997 widget.Init(init_params); |
1007 NonClientView* non_client_view = widget.non_client_view(); | 998 NonClientView* non_client_view = widget.non_client_view(); |
1008 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); | 999 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); |
1009 non_client_view->SetFrameView(frame_view); | 1000 non_client_view->SetFrameView(frame_view); |
1010 widget.Show(); | 1001 widget.Show(); |
1011 widget.Minimize(); | 1002 widget.Minimize(); |
1012 EXPECT_EQ(0, frame_view->width()); | 1003 EXPECT_EQ(0, frame_view->width()); |
1013 } | 1004 } |
1014 | 1005 |
1015 // This class validates whether paints are received for a visible Widget. | 1006 // This class validates whether paints are received for a visible Widget. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1049 | 1040 |
1050 bool received_paint_while_hidden() const { | 1041 bool received_paint_while_hidden() const { |
1051 return received_paint_while_hidden_; | 1042 return received_paint_while_hidden_; |
1052 } | 1043 } |
1053 | 1044 |
1054 private: | 1045 private: |
1055 bool expect_paint_; | 1046 bool expect_paint_; |
1056 bool received_paint_while_hidden_; | 1047 bool received_paint_while_hidden_; |
1057 }; | 1048 }; |
1058 | 1049 |
1059 TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterCloseTest) { | 1050 TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterCloseTest) { |
1060 View* contents_view = new View; | 1051 View* contents_view = new View; |
1061 contents_view->SetFocusable(true); | 1052 contents_view->SetFocusable(true); |
1062 DesktopAuraTestValidPaintWidget widget; | 1053 DesktopAuraTestValidPaintWidget widget; |
1063 Widget::InitParams init_params = | 1054 Widget::InitParams init_params = |
1064 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); | 1055 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
1065 init_params.bounds = gfx::Rect(0, 0, 200, 200); | 1056 init_params.bounds = gfx::Rect(0, 0, 200, 200); |
1066 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 1057 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
1067 init_params.native_widget = new DesktopNativeWidgetAura(&widget); | 1058 init_params.native_widget = new PlatformDesktopNativeWidget(&widget); |
1068 widget.Init(init_params); | 1059 widget.Init(init_params); |
1069 widget.SetContentsView(contents_view); | 1060 widget.SetContentsView(contents_view); |
1070 widget.Show(); | 1061 widget.Show(); |
1071 widget.Activate(); | 1062 widget.Activate(); |
1072 RunPendingMessages(); | 1063 RunPendingMessages(); |
1073 widget.SchedulePaintInRect(init_params.bounds); | 1064 widget.SchedulePaintInRect(init_params.bounds); |
1074 widget.Close(); | 1065 widget.Close(); |
1075 RunPendingMessages(); | 1066 RunPendingMessages(); |
1076 EXPECT_FALSE(widget.received_paint_while_hidden()); | 1067 EXPECT_FALSE(widget.received_paint_while_hidden()); |
1077 } | 1068 } |
1078 | 1069 |
1079 TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterHideTest) { | 1070 TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterHideTest) { |
1080 View* contents_view = new View; | 1071 View* contents_view = new View; |
1081 contents_view->SetFocusable(true); | 1072 contents_view->SetFocusable(true); |
1082 DesktopAuraTestValidPaintWidget widget; | 1073 DesktopAuraTestValidPaintWidget widget; |
1083 Widget::InitParams init_params = | 1074 Widget::InitParams init_params = |
1084 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); | 1075 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
1085 init_params.bounds = gfx::Rect(0, 0, 200, 200); | 1076 init_params.bounds = gfx::Rect(0, 0, 200, 200); |
1086 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 1077 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
1087 init_params.native_widget = new DesktopNativeWidgetAura(&widget); | 1078 init_params.native_widget = new PlatformDesktopNativeWidget(&widget); |
1088 widget.Init(init_params); | 1079 widget.Init(init_params); |
1089 widget.SetContentsView(contents_view); | 1080 widget.SetContentsView(contents_view); |
1090 widget.Show(); | 1081 widget.Show(); |
1091 widget.Activate(); | 1082 widget.Activate(); |
1092 RunPendingMessages(); | 1083 RunPendingMessages(); |
1093 widget.SchedulePaintInRect(init_params.bounds); | 1084 widget.SchedulePaintInRect(init_params.bounds); |
1094 widget.Hide(); | 1085 widget.Hide(); |
1095 RunPendingMessages(); | 1086 RunPendingMessages(); |
1096 EXPECT_FALSE(widget.received_paint_while_hidden()); | 1087 EXPECT_FALSE(widget.received_paint_while_hidden()); |
1097 widget.Close(); | 1088 widget.Close(); |
1098 } | 1089 } |
1099 | 1090 |
1100 // This class provides functionality to create fullscreen and top level popup | |
1101 // windows. It additionally tests whether the destruction of these windows | |
1102 // occurs correctly in desktop AURA without crashing. | |
1103 // It provides facilities to test the following cases:- | |
1104 // 1. Child window destroyed which should lead to the destruction of the | |
1105 // parent. | |
1106 // 2. Parent window destroyed which should lead to the child being destroyed. | |
1107 class DesktopAuraTopLevelWindowTest | |
1108 : public views::TestViewsDelegate, | |
1109 public aura::WindowObserver { | |
1110 public: | |
1111 DesktopAuraTopLevelWindowTest() | |
1112 : top_level_widget_(NULL), | |
1113 owned_window_(NULL), | |
1114 owner_destroyed_(false), | |
1115 owned_window_destroyed_(false) {} | |
1116 | |
1117 virtual ~DesktopAuraTopLevelWindowTest() { | |
1118 EXPECT_TRUE(owner_destroyed_); | |
1119 EXPECT_TRUE(owned_window_destroyed_); | |
1120 top_level_widget_ = NULL; | |
1121 owned_window_ = NULL; | |
1122 } | |
1123 | |
1124 // views::TestViewsDelegate overrides. | |
1125 virtual void OnBeforeWidgetInit( | |
1126 Widget::InitParams* params, | |
1127 internal::NativeWidgetDelegate* delegate) OVERRIDE { | |
1128 if (!params->native_widget) | |
1129 params->native_widget = new views::DesktopNativeWidgetAura(delegate); | |
1130 } | |
1131 | |
1132 void CreateTopLevelWindow(const gfx::Rect& bounds, bool fullscreen) { | |
1133 Widget::InitParams init_params; | |
1134 init_params.type = Widget::InitParams::TYPE_WINDOW; | |
1135 init_params.bounds = bounds; | |
1136 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | |
1137 init_params.layer_type = aura::WINDOW_LAYER_NOT_DRAWN; | |
1138 init_params.accept_events = fullscreen; | |
1139 | |
1140 widget_.Init(init_params); | |
1141 | |
1142 owned_window_ = new aura::Window(&child_window_delegate_); | |
1143 owned_window_->SetType(ui::wm::WINDOW_TYPE_NORMAL); | |
1144 owned_window_->SetName("TestTopLevelWindow"); | |
1145 if (fullscreen) { | |
1146 owned_window_->SetProperty(aura::client::kShowStateKey, | |
1147 ui::SHOW_STATE_FULLSCREEN); | |
1148 } else { | |
1149 owned_window_->SetType(ui::wm::WINDOW_TYPE_MENU); | |
1150 } | |
1151 owned_window_->Init(aura::WINDOW_LAYER_TEXTURED); | |
1152 aura::client::ParentWindowWithContext( | |
1153 owned_window_, | |
1154 widget_.GetNativeView()->GetRootWindow(), | |
1155 gfx::Rect(0, 0, 1900, 1600)); | |
1156 owned_window_->Show(); | |
1157 owned_window_->AddObserver(this); | |
1158 | |
1159 ASSERT_TRUE(owned_window_->parent() != NULL); | |
1160 owned_window_->parent()->AddObserver(this); | |
1161 | |
1162 top_level_widget_ = | |
1163 views::Widget::GetWidgetForNativeView(owned_window_->parent()); | |
1164 ASSERT_TRUE(top_level_widget_ != NULL); | |
1165 } | |
1166 | |
1167 void DestroyOwnedWindow() { | |
1168 ASSERT_TRUE(owned_window_ != NULL); | |
1169 delete owned_window_; | |
1170 } | |
1171 | |
1172 void DestroyOwnerWindow() { | |
1173 ASSERT_TRUE(top_level_widget_ != NULL); | |
1174 top_level_widget_->CloseNow(); | |
1175 } | |
1176 | |
1177 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { | |
1178 window->RemoveObserver(this); | |
1179 if (window == owned_window_) { | |
1180 owned_window_destroyed_ = true; | |
1181 } else if (window == top_level_widget_->GetNativeView()) { | |
1182 owner_destroyed_ = true; | |
1183 } else { | |
1184 ADD_FAILURE() << "Unexpected window destroyed callback: " << window; | |
1185 } | |
1186 } | |
1187 | |
1188 aura::Window* owned_window() { | |
1189 return owned_window_; | |
1190 } | |
1191 | |
1192 views::Widget* top_level_widget() { | |
1193 return top_level_widget_; | |
1194 } | |
1195 | |
1196 private: | |
1197 views::Widget widget_; | |
1198 views::Widget* top_level_widget_; | |
1199 aura::Window* owned_window_; | |
1200 bool owner_destroyed_; | |
1201 bool owned_window_destroyed_; | |
1202 aura::test::TestWindowDelegate child_window_delegate_; | |
1203 | |
1204 DISALLOW_COPY_AND_ASSIGN(DesktopAuraTopLevelWindowTest); | |
1205 }; | |
1206 | |
1207 TEST_F(WidgetTest, DesktopAuraFullscreenWindowDestroyedBeforeOwnerTest) { | |
1208 ViewsDelegate::views_delegate = NULL; | |
1209 DesktopAuraTopLevelWindowTest fullscreen_window; | |
1210 ASSERT_NO_FATAL_FAILURE(fullscreen_window.CreateTopLevelWindow( | |
1211 gfx::Rect(0, 0, 200, 200), true)); | |
1212 | |
1213 RunPendingMessages(); | |
1214 ASSERT_NO_FATAL_FAILURE(fullscreen_window.DestroyOwnedWindow()); | |
1215 RunPendingMessages(); | |
1216 } | |
1217 | |
1218 TEST_F(WidgetTest, DesktopAuraFullscreenWindowOwnerDestroyed) { | |
1219 ViewsDelegate::views_delegate = NULL; | |
1220 | |
1221 DesktopAuraTopLevelWindowTest fullscreen_window; | |
1222 ASSERT_NO_FATAL_FAILURE(fullscreen_window.CreateTopLevelWindow( | |
1223 gfx::Rect(0, 0, 200, 200), true)); | |
1224 | |
1225 RunPendingMessages(); | |
1226 ASSERT_NO_FATAL_FAILURE(fullscreen_window.DestroyOwnerWindow()); | |
1227 RunPendingMessages(); | |
1228 } | |
1229 | |
1230 TEST_F(WidgetTest, DesktopAuraTopLevelOwnedPopupTest) { | |
1231 ViewsDelegate::views_delegate = NULL; | |
1232 DesktopAuraTopLevelWindowTest popup_window; | |
1233 ASSERT_NO_FATAL_FAILURE(popup_window.CreateTopLevelWindow( | |
1234 gfx::Rect(0, 0, 200, 200), false)); | |
1235 | |
1236 RunPendingMessages(); | |
1237 ASSERT_NO_FATAL_FAILURE(popup_window.DestroyOwnedWindow()); | |
1238 RunPendingMessages(); | |
1239 } | |
1240 | |
1241 // This test validates that when a top level owned popup Aura window is | |
1242 // resized, the widget is resized as well. | |
1243 TEST_F(WidgetTest, DesktopAuraTopLevelOwnedPopupResizeTest) { | |
1244 ViewsDelegate::views_delegate = NULL; | |
1245 DesktopAuraTopLevelWindowTest popup_window; | |
1246 ASSERT_NO_FATAL_FAILURE(popup_window.CreateTopLevelWindow( | |
1247 gfx::Rect(0, 0, 200, 200), false)); | |
1248 | |
1249 gfx::Rect new_size(0, 0, 400, 400); | |
1250 popup_window.owned_window()->SetBounds(new_size); | |
1251 | |
1252 EXPECT_EQ(popup_window.top_level_widget()->GetNativeView()->bounds().size(), | |
1253 new_size.size()); | |
1254 RunPendingMessages(); | |
1255 ASSERT_NO_FATAL_FAILURE(popup_window.DestroyOwnedWindow()); | |
1256 RunPendingMessages(); | |
1257 } | |
1258 | |
1259 // Test to ensure that the aura Window's visiblity state is set to visible if | 1091 // Test to ensure that the aura Window's visiblity state is set to visible if |
1260 // the underlying widget is hidden and then shown. | 1092 // the underlying widget is hidden and then shown. |
1261 TEST_F(WidgetTest, TestWindowVisibilityAfterHide) { | 1093 TEST_F(WidgetTest, TestWindowVisibilityAfterHide) { |
1262 // Create a widget. | 1094 // Create a widget. |
1263 Widget widget; | 1095 Widget widget; |
1264 Widget::InitParams init_params = | 1096 Widget::InitParams init_params = |
1265 CreateParams(Widget::InitParams::TYPE_WINDOW); | 1097 CreateParams(Widget::InitParams::TYPE_WINDOW); |
1266 init_params.show_state = ui::SHOW_STATE_NORMAL; | 1098 init_params.show_state = ui::SHOW_STATE_NORMAL; |
1267 gfx::Rect initial_bounds(0, 0, 300, 400); | 1099 gfx::Rect initial_bounds(0, 0, 300, 400); |
1268 init_params.bounds = initial_bounds; | 1100 init_params.bounds = initial_bounds; |
1269 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 1101 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
1270 init_params.native_widget = new DesktopNativeWidgetAura(&widget); | 1102 init_params.native_widget = new PlatformDesktopNativeWidget(&widget); |
1271 widget.Init(init_params); | 1103 widget.Init(init_params); |
1272 NonClientView* non_client_view = widget.non_client_view(); | 1104 NonClientView* non_client_view = widget.non_client_view(); |
1273 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); | 1105 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); |
1274 non_client_view->SetFrameView(frame_view); | 1106 non_client_view->SetFrameView(frame_view); |
1275 | 1107 |
1276 widget.Hide(); | 1108 widget.Hide(); |
1277 EXPECT_FALSE(widget.GetNativeView()->IsVisible()); | 1109 EXPECT_FALSE(IsNativeWindowVisible(widget.GetNativeWindow())); |
1278 widget.Show(); | 1110 widget.Show(); |
1279 EXPECT_TRUE(widget.GetNativeView()->IsVisible()); | 1111 EXPECT_TRUE(IsNativeWindowVisible(widget.GetNativeWindow())); |
1280 } | 1112 } |
1281 | 1113 |
1282 // The following code verifies we can correctly destroy a Widget from a mouse | 1114 // The following code verifies we can correctly destroy a Widget from a mouse |
1283 // enter/exit. We could test move/drag/enter/exit but in general we don't run | 1115 // enter/exit. We could test move/drag/enter/exit but in general we don't run |
1284 // nested message loops from such events, nor has the code ever really dealt | 1116 // nested message loops from such events, nor has the code ever really dealt |
1285 // with this situation. | 1117 // with this situation. |
1286 | 1118 |
1287 // Generates two moves (first generates enter, second real move), a press, drag | 1119 // Generates two moves (first generates enter, second real move), a press, drag |
1288 // and release stopping at |last_event_type|. | 1120 // and release stopping at |last_event_type|. |
1289 void GenerateMouseEvents(Widget* widget, ui::EventType last_event_type) { | 1121 void GenerateMouseEvents(Widget* widget, ui::EventType last_event_type) { |
1290 const gfx::Rect screen_bounds(widget->GetWindowBoundsInScreen()); | 1122 const gfx::Rect screen_bounds(widget->GetWindowBoundsInScreen()); |
1291 ui::MouseEvent move_event(ui::ET_MOUSE_MOVED, screen_bounds.CenterPoint(), | 1123 ui::MouseEvent move_event(ui::ET_MOUSE_MOVED, screen_bounds.CenterPoint(), |
1292 screen_bounds.CenterPoint(), 0, 0); | 1124 screen_bounds.CenterPoint(), 0, 0); |
1293 ui::EventProcessor* dispatcher = | 1125 ui::EventProcessor* dispatcher = WidgetTest::GetEventProcessor(widget); |
1294 widget->GetNativeWindow()->GetHost()->event_processor(); | |
1295 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move_event); | 1126 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move_event); |
1296 if (last_event_type == ui::ET_MOUSE_ENTERED || details.dispatcher_destroyed) | 1127 if (last_event_type == ui::ET_MOUSE_ENTERED || details.dispatcher_destroyed) |
1297 return; | 1128 return; |
1298 details = dispatcher->OnEventFromSource(&move_event); | 1129 details = dispatcher->OnEventFromSource(&move_event); |
1299 if (last_event_type == ui::ET_MOUSE_MOVED || details.dispatcher_destroyed) | 1130 if (last_event_type == ui::ET_MOUSE_MOVED || details.dispatcher_destroyed) |
1300 return; | 1131 return; |
1301 | 1132 |
1302 ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, screen_bounds.CenterPoint(), | 1133 ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, screen_bounds.CenterPoint(), |
1303 screen_bounds.CenterPoint(), 0, 0); | 1134 screen_bounds.CenterPoint(), 0, 0); |
1304 details = dispatcher->OnEventFromSource(&press_event); | 1135 details = dispatcher->OnEventFromSource(&press_event); |
(...skipping 14 matching lines...) Expand all Loading... |
1319 return; | 1150 return; |
1320 } | 1151 } |
1321 | 1152 |
1322 // Creates a widget and invokes GenerateMouseEvents() with |last_event_type|. | 1153 // Creates a widget and invokes GenerateMouseEvents() with |last_event_type|. |
1323 void RunCloseWidgetDuringDispatchTest(WidgetTest* test, | 1154 void RunCloseWidgetDuringDispatchTest(WidgetTest* test, |
1324 ui::EventType last_event_type) { | 1155 ui::EventType last_event_type) { |
1325 // |widget| is deleted by CloseWidgetView. | 1156 // |widget| is deleted by CloseWidgetView. |
1326 Widget* widget = new Widget; | 1157 Widget* widget = new Widget; |
1327 Widget::InitParams params = | 1158 Widget::InitParams params = |
1328 test->CreateParams(Widget::InitParams::TYPE_POPUP); | 1159 test->CreateParams(Widget::InitParams::TYPE_POPUP); |
1329 params.native_widget = new DesktopNativeWidgetAura(widget); | 1160 params.native_widget = new PlatformDesktopNativeWidget(widget); |
1330 params.bounds = gfx::Rect(0, 0, 50, 100); | 1161 params.bounds = gfx::Rect(0, 0, 50, 100); |
1331 widget->Init(params); | 1162 widget->Init(params); |
1332 widget->SetContentsView(new CloseWidgetView(last_event_type)); | 1163 widget->SetContentsView(new CloseWidgetView(last_event_type)); |
1333 widget->Show(); | 1164 widget->Show(); |
1334 GenerateMouseEvents(widget, last_event_type); | 1165 GenerateMouseEvents(widget, last_event_type); |
1335 } | 1166 } |
1336 | 1167 |
1337 // Verifies deleting the widget from a mouse pressed event doesn't crash. | 1168 // Verifies deleting the widget from a mouse pressed event doesn't crash. |
1338 TEST_F(WidgetTest, CloseWidgetDuringMousePress) { | 1169 TEST_F(WidgetTest, CloseWidgetDuringMousePress) { |
1339 RunCloseWidgetDuringDispatchTest(this, ui::ET_MOUSE_PRESSED); | 1170 RunCloseWidgetDuringDispatchTest(this, ui::ET_MOUSE_PRESSED); |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1608 // Verifies WindowClosing() is invoked correctly on the delegate when a Widget | 1439 // Verifies WindowClosing() is invoked correctly on the delegate when a Widget |
1609 // is closed. | 1440 // is closed. |
1610 TEST_F(WidgetTest, SingleWindowClosing) { | 1441 TEST_F(WidgetTest, SingleWindowClosing) { |
1611 scoped_ptr<ClosingDelegate> delegate(new ClosingDelegate()); | 1442 scoped_ptr<ClosingDelegate> delegate(new ClosingDelegate()); |
1612 Widget* widget = new Widget(); // Destroyed by CloseNow() below. | 1443 Widget* widget = new Widget(); // Destroyed by CloseNow() below. |
1613 Widget::InitParams init_params = | 1444 Widget::InitParams init_params = |
1614 CreateParams(Widget::InitParams::TYPE_WINDOW); | 1445 CreateParams(Widget::InitParams::TYPE_WINDOW); |
1615 init_params.bounds = gfx::Rect(0, 0, 200, 200); | 1446 init_params.bounds = gfx::Rect(0, 0, 200, 200); |
1616 init_params.delegate = delegate.get(); | 1447 init_params.delegate = delegate.get(); |
1617 #if !defined(OS_CHROMEOS) | 1448 #if !defined(OS_CHROMEOS) |
1618 init_params.native_widget = new DesktopNativeWidgetAura(widget); | 1449 init_params.native_widget = new PlatformDesktopNativeWidget(widget); |
1619 #endif | 1450 #endif |
1620 widget->Init(init_params); | 1451 widget->Init(init_params); |
1621 EXPECT_EQ(0, delegate->count()); | 1452 EXPECT_EQ(0, delegate->count()); |
1622 widget->CloseNow(); | 1453 widget->CloseNow(); |
1623 EXPECT_EQ(1, delegate->count()); | 1454 EXPECT_EQ(1, delegate->count()); |
1624 } | 1455 } |
1625 | 1456 |
1626 class WidgetWindowTitleTest : public WidgetTest { | 1457 class WidgetWindowTitleTest : public WidgetTest { |
1627 protected: | 1458 protected: |
1628 void RunTest(bool desktop_native_widget) { | 1459 void RunTest(bool desktop_native_widget) { |
1629 Widget* widget = new Widget(); // Destroyed by CloseNow() below. | 1460 Widget* widget = new Widget(); // Destroyed by CloseNow() below. |
1630 Widget::InitParams init_params = | 1461 Widget::InitParams init_params = |
1631 CreateParams(Widget::InitParams::TYPE_WINDOW); | 1462 CreateParams(Widget::InitParams::TYPE_WINDOW); |
1632 widget->Init(init_params); | 1463 widget->Init(init_params); |
1633 | 1464 |
1634 #if !defined(OS_CHROMEOS) | 1465 #if !defined(OS_CHROMEOS) |
1635 if (desktop_native_widget) | 1466 if (desktop_native_widget) |
1636 init_params.native_widget = new DesktopNativeWidgetAura(widget); | 1467 init_params.native_widget = new PlatformDesktopNativeWidget(widget); |
1637 #else | 1468 #else |
1638 DCHECK(!desktop_native_widget) | 1469 DCHECK(!desktop_native_widget) |
1639 << "DesktopNativeWidget does not exist on non-Aura or on ChromeOS."; | 1470 << "DesktopNativeWidget does not exist on non-Aura or on ChromeOS."; |
1640 #endif | 1471 #endif |
1641 | 1472 |
1642 internal::NativeWidgetPrivate* native_widget = | 1473 internal::NativeWidgetPrivate* native_widget = |
1643 widget->native_widget_private(); | 1474 widget->native_widget_private(); |
1644 | 1475 |
1645 base::string16 empty; | 1476 base::string16 empty; |
1646 base::string16 s1(base::UTF8ToUTF16("Title1")); | 1477 base::string16 s1(base::UTF8ToUTF16("Title1")); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1747 bool RunGetNativeThemeFromDestructor(const Widget::InitParams& in_params, | 1578 bool RunGetNativeThemeFromDestructor(const Widget::InitParams& in_params, |
1748 bool is_first_run) { | 1579 bool is_first_run) { |
1749 bool needs_second_run = false; | 1580 bool needs_second_run = false; |
1750 // Destroyed by CloseNow() below. | 1581 // Destroyed by CloseNow() below. |
1751 Widget* widget = new Widget; | 1582 Widget* widget = new Widget; |
1752 Widget::InitParams params(in_params); | 1583 Widget::InitParams params(in_params); |
1753 // Deletes itself when the Widget is destroyed. | 1584 // Deletes itself when the Widget is destroyed. |
1754 params.delegate = new GetNativeThemeFromDestructorView; | 1585 params.delegate = new GetNativeThemeFromDestructorView; |
1755 #if !defined(OS_CHROMEOS) | 1586 #if !defined(OS_CHROMEOS) |
1756 if (is_first_run) { | 1587 if (is_first_run) { |
1757 params.native_widget = new DesktopNativeWidgetAura(widget); | 1588 params.native_widget = new PlatformDesktopNativeWidget(widget); |
1758 needs_second_run = true; | 1589 needs_second_run = true; |
1759 } | 1590 } |
1760 #endif | 1591 #endif |
1761 widget->Init(params); | 1592 widget->Init(params); |
1762 widget->CloseNow(); | 1593 widget->CloseNow(); |
1763 return needs_second_run; | 1594 return needs_second_run; |
1764 } | 1595 } |
1765 | 1596 |
1766 // See description of RunGetNativeThemeFromDestructor() for details. | 1597 // See description of RunGetNativeThemeFromDestructor() for details. |
1767 TEST_F(WidgetTest, GetNativeThemeFromDestructor) { | 1598 TEST_F(WidgetTest, GetNativeThemeFromDestructor) { |
(...skipping 27 matching lines...) Expand all Loading... |
1795 }; | 1626 }; |
1796 | 1627 |
1797 // Verifies Close() results in destroying. | 1628 // Verifies Close() results in destroying. |
1798 TEST_F(WidgetTest, CloseDestroys) { | 1629 TEST_F(WidgetTest, CloseDestroys) { |
1799 bool destroyed = false; | 1630 bool destroyed = false; |
1800 CloseDestroysWidget* widget = new CloseDestroysWidget(&destroyed); | 1631 CloseDestroysWidget* widget = new CloseDestroysWidget(&destroyed); |
1801 Widget::InitParams params = | 1632 Widget::InitParams params = |
1802 CreateParams(views::Widget::InitParams::TYPE_MENU); | 1633 CreateParams(views::Widget::InitParams::TYPE_MENU); |
1803 params.opacity = Widget::InitParams::OPAQUE_WINDOW; | 1634 params.opacity = Widget::InitParams::OPAQUE_WINDOW; |
1804 #if !defined(OS_CHROMEOS) | 1635 #if !defined(OS_CHROMEOS) |
1805 params.native_widget = new DesktopNativeWidgetAura(widget); | 1636 params.native_widget = new PlatformDesktopNativeWidget(widget); |
1806 #endif | 1637 #endif |
1807 widget->Init(params); | 1638 widget->Init(params); |
1808 widget->Show(); | 1639 widget->Show(); |
1809 widget->Hide(); | 1640 widget->Hide(); |
1810 widget->Close(); | 1641 widget->Close(); |
1811 // Run the message loop as Close() asynchronously deletes. | 1642 // Run the message loop as Close() asynchronously deletes. |
1812 RunPendingMessages(); | 1643 RunPendingMessages(); |
1813 EXPECT_TRUE(destroyed); | 1644 EXPECT_TRUE(destroyed); |
1814 // Close() should destroy the widget. If not we'll cleanup to avoid leaks. | 1645 // Close() should destroy the widget. If not we'll cleanup to avoid leaks. |
1815 if (!destroyed) { | 1646 if (!destroyed) { |
1816 widget->Detach(); | 1647 widget->Detach(); |
1817 widget->CloseNow(); | 1648 widget->CloseNow(); |
1818 } | 1649 } |
1819 } | 1650 } |
1820 | 1651 |
1821 // Tests that killing a widget while animating it does not crash. | 1652 // Tests that killing a widget while animating it does not crash. |
1822 TEST_F(WidgetTest, CloseWidgetWhileAnimating) { | 1653 TEST_F(WidgetTest, CloseWidgetWhileAnimating) { |
1823 scoped_ptr<Widget> widget(new Widget); | 1654 scoped_ptr<Widget> widget(new Widget); |
1824 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); | 1655 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
1825 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 1656 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
1826 widget->Init(params); | 1657 widget->Init(params); |
1827 | 1658 |
1828 // Normal animations for tests have ZERO_DURATION, make sure we are actually | 1659 // Normal animations for tests have ZERO_DURATION, make sure we are actually |
1829 // animating the movement. | 1660 // animating the movement. |
1830 ui::ScopedAnimationDurationScaleMode animation_scale_mode( | 1661 ui::ScopedAnimationDurationScaleMode animation_scale_mode( |
1831 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); | 1662 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); |
1832 ui::ScopedLayerAnimationSettings animation_settings( | 1663 ui::ScopedLayerAnimationSettings animation_settings( |
1833 widget->GetNativeWindow()->layer()->GetAnimator()); | 1664 widget->GetLayer()->GetAnimator()); |
1834 widget->Show(); | 1665 widget->Show(); |
1835 // Animate the bounds change. | 1666 // Animate the bounds change. |
1836 widget->SetBounds(gfx::Rect(0, 0, 200, 200)); | 1667 widget->SetBounds(gfx::Rect(0, 0, 200, 200)); |
1837 } | 1668 } |
1838 | 1669 |
1839 // A view that consumes mouse-pressed event and gesture-tap-down events. | 1670 // A view that consumes mouse-pressed event and gesture-tap-down events. |
1840 class RootViewTestView : public View { | 1671 class RootViewTestView : public View { |
1841 public: | 1672 public: |
1842 RootViewTestView(): View() {} | 1673 RootViewTestView(): View() {} |
1843 | 1674 |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1999 void RunDestroyChildWidgetsTest(bool top_level_has_desktop_native_widget_aura, | 1830 void RunDestroyChildWidgetsTest(bool top_level_has_desktop_native_widget_aura, |
2000 bool child_has_desktop_native_widget_aura) { | 1831 bool child_has_desktop_native_widget_aura) { |
2001 // When a View is destroyed its name is added here. | 1832 // When a View is destroyed its name is added here. |
2002 std::vector<std::string> destroyed; | 1833 std::vector<std::string> destroyed; |
2003 | 1834 |
2004 Widget* top_level = new Widget; | 1835 Widget* top_level = new Widget; |
2005 Widget::InitParams params = | 1836 Widget::InitParams params = |
2006 CreateParams(views::Widget::InitParams::TYPE_WINDOW); | 1837 CreateParams(views::Widget::InitParams::TYPE_WINDOW); |
2007 #if !defined(OS_CHROMEOS) | 1838 #if !defined(OS_CHROMEOS) |
2008 if (top_level_has_desktop_native_widget_aura) | 1839 if (top_level_has_desktop_native_widget_aura) |
2009 params.native_widget = new DesktopNativeWidgetAura(top_level); | 1840 params.native_widget = new PlatformDesktopNativeWidget(top_level); |
2010 #endif | 1841 #endif |
2011 top_level->Init(params); | 1842 top_level->Init(params); |
2012 top_level->GetRootView()->AddChildView( | 1843 top_level->GetRootView()->AddChildView( |
2013 new DestroyedTrackingView("parent", &destroyed)); | 1844 new DestroyedTrackingView("parent", &destroyed)); |
2014 top_level->Show(); | 1845 top_level->Show(); |
2015 | 1846 |
2016 Widget* child = new Widget; | 1847 Widget* child = new Widget; |
2017 Widget::InitParams child_params = | 1848 Widget::InitParams child_params = |
2018 CreateParams(views::Widget::InitParams::TYPE_POPUP); | 1849 CreateParams(views::Widget::InitParams::TYPE_POPUP); |
2019 child_params.parent = top_level->GetNativeView(); | 1850 child_params.parent = top_level->GetNativeView(); |
2020 #if !defined(OS_CHROMEOS) | 1851 #if !defined(OS_CHROMEOS) |
2021 if (child_has_desktop_native_widget_aura) | 1852 if (child_has_desktop_native_widget_aura) |
2022 child_params.native_widget = new DesktopNativeWidgetAura(child); | 1853 child_params.native_widget = new PlatformDesktopNativeWidget(child); |
2023 #endif | 1854 #endif |
2024 child->Init(child_params); | 1855 child->Init(child_params); |
2025 child->GetRootView()->AddChildView( | 1856 child->GetRootView()->AddChildView( |
2026 new DestroyedTrackingView("child", &destroyed)); | 1857 new DestroyedTrackingView("child", &destroyed)); |
2027 child->Show(); | 1858 child->Show(); |
2028 | 1859 |
2029 // Should trigger destruction of the child too. | 1860 // Should trigger destruction of the child too. |
2030 top_level->native_widget_private()->CloseNow(); | 1861 top_level->native_widget_private()->CloseNow(); |
2031 | 1862 |
2032 // Child should be destroyed first. | 1863 // Child should be destroyed first. |
(...skipping 13 matching lines...) Expand all Loading... |
2046 DestroyChildWidgetsInOrderWithDesktopNativeWidget) { | 1877 DestroyChildWidgetsInOrderWithDesktopNativeWidget) { |
2047 RunDestroyChildWidgetsTest(true, false); | 1878 RunDestroyChildWidgetsTest(true, false); |
2048 } | 1879 } |
2049 | 1880 |
2050 // See description of RunDestroyChildWidgetsTest(). Both parent and child use | 1881 // See description of RunDestroyChildWidgetsTest(). Both parent and child use |
2051 // DesktopNativeWidgetAura. | 1882 // DesktopNativeWidgetAura. |
2052 TEST_F(WidgetChildDestructionTest, | 1883 TEST_F(WidgetChildDestructionTest, |
2053 DestroyChildWidgetsInOrderWithDesktopNativeWidgetForBoth) { | 1884 DestroyChildWidgetsInOrderWithDesktopNativeWidgetForBoth) { |
2054 RunDestroyChildWidgetsTest(true, true); | 1885 RunDestroyChildWidgetsTest(true, true); |
2055 } | 1886 } |
2056 #endif | 1887 #endif // !defined(OS_CHROMEOS) |
2057 | 1888 |
2058 // See description of RunDestroyChildWidgetsTest(). | 1889 // See description of RunDestroyChildWidgetsTest(). |
2059 TEST_F(WidgetChildDestructionTest, DestroyChildWidgetsInOrder) { | 1890 TEST_F(WidgetChildDestructionTest, DestroyChildWidgetsInOrder) { |
2060 RunDestroyChildWidgetsTest(false, false); | 1891 RunDestroyChildWidgetsTest(false, false); |
2061 } | 1892 } |
2062 | 1893 |
2063 #if !defined(OS_CHROMEOS) | 1894 #if !defined(OS_CHROMEOS) |
2064 // Provides functionality to create a window modal dialog. | 1895 // Provides functionality to create a window modal dialog. |
2065 class ModalDialogDelegate : public DialogDelegateView { | 1896 class ModalDialogDelegate : public DialogDelegateView { |
2066 public: | 1897 public: |
(...skipping 13 matching lines...) Expand all Loading... |
2080 // displayed are eaten or recieved by the dialog. | 1911 // displayed are eaten or recieved by the dialog. |
2081 TEST_F(WidgetTest, WindowMouseModalityTest) { | 1912 TEST_F(WidgetTest, WindowMouseModalityTest) { |
2082 // Create a top level widget. | 1913 // Create a top level widget. |
2083 Widget top_level_widget; | 1914 Widget top_level_widget; |
2084 Widget::InitParams init_params = | 1915 Widget::InitParams init_params = |
2085 CreateParams(Widget::InitParams::TYPE_WINDOW); | 1916 CreateParams(Widget::InitParams::TYPE_WINDOW); |
2086 init_params.show_state = ui::SHOW_STATE_NORMAL; | 1917 init_params.show_state = ui::SHOW_STATE_NORMAL; |
2087 gfx::Rect initial_bounds(0, 0, 500, 500); | 1918 gfx::Rect initial_bounds(0, 0, 500, 500); |
2088 init_params.bounds = initial_bounds; | 1919 init_params.bounds = initial_bounds; |
2089 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 1920 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
2090 init_params.native_widget = new DesktopNativeWidgetAura(&top_level_widget); | 1921 init_params.native_widget = |
| 1922 new PlatformDesktopNativeWidget(&top_level_widget); |
2091 top_level_widget.Init(init_params); | 1923 top_level_widget.Init(init_params); |
2092 top_level_widget.Show(); | 1924 top_level_widget.Show(); |
2093 EXPECT_TRUE(top_level_widget.IsVisible()); | 1925 EXPECT_TRUE(top_level_widget.IsVisible()); |
2094 | 1926 |
2095 // Create a view and validate that a mouse moves makes it to the view. | 1927 // Create a view and validate that a mouse moves makes it to the view. |
2096 EventCountView* widget_view = new EventCountView(); | 1928 EventCountView* widget_view = new EventCountView(); |
2097 widget_view->SetBounds(0, 0, 10, 10); | 1929 widget_view->SetBounds(0, 0, 10, 10); |
2098 top_level_widget.GetRootView()->AddChildView(widget_view); | 1930 top_level_widget.GetRootView()->AddChildView(widget_view); |
2099 | 1931 |
2100 gfx::Point cursor_location_main(5, 5); | 1932 gfx::Point cursor_location_main(5, 5); |
2101 ui::MouseEvent move_main(ui::ET_MOUSE_MOVED, | 1933 ui::MouseEvent move_main(ui::ET_MOUSE_MOVED, |
2102 cursor_location_main, | 1934 cursor_location_main, |
2103 cursor_location_main, | 1935 cursor_location_main, |
2104 ui::EF_NONE, | 1936 ui::EF_NONE, |
2105 ui::EF_NONE); | 1937 ui::EF_NONE); |
2106 ui::EventDispatchDetails details = top_level_widget.GetNativeView()-> | 1938 ui::EventDispatchDetails details = |
2107 GetHost()->event_processor()->OnEventFromSource(&move_main); | 1939 GetEventProcessor(&top_level_widget)->OnEventFromSource(&move_main); |
2108 ASSERT_FALSE(details.dispatcher_destroyed); | 1940 ASSERT_FALSE(details.dispatcher_destroyed); |
2109 | 1941 |
2110 EXPECT_EQ(1, widget_view->GetEventCount(ui::ET_MOUSE_ENTERED)); | 1942 EXPECT_EQ(1, widget_view->GetEventCount(ui::ET_MOUSE_ENTERED)); |
2111 widget_view->ResetCounts(); | 1943 widget_view->ResetCounts(); |
2112 | 1944 |
2113 // Create a modal dialog and validate that a mouse down message makes it to | 1945 // Create a modal dialog and validate that a mouse down message makes it to |
2114 // the main view within the dialog. | 1946 // the main view within the dialog. |
2115 | 1947 |
2116 // This instance will be destroyed when the dialog is destroyed. | 1948 // This instance will be destroyed when the dialog is destroyed. |
2117 ModalDialogDelegate* dialog_delegate = new ModalDialogDelegate; | 1949 ModalDialogDelegate* dialog_delegate = new ModalDialogDelegate; |
2118 | 1950 |
2119 Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget( | 1951 Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget( |
2120 dialog_delegate, NULL, top_level_widget.GetNativeWindow()); | 1952 dialog_delegate, NULL, top_level_widget.GetNativeView()); |
2121 modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200)); | 1953 modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200)); |
2122 EventCountView* dialog_widget_view = new EventCountView(); | 1954 EventCountView* dialog_widget_view = new EventCountView(); |
2123 dialog_widget_view->SetBounds(0, 0, 50, 50); | 1955 dialog_widget_view->SetBounds(0, 0, 50, 50); |
2124 modal_dialog_widget->GetRootView()->AddChildView(dialog_widget_view); | 1956 modal_dialog_widget->GetRootView()->AddChildView(dialog_widget_view); |
2125 modal_dialog_widget->Show(); | 1957 modal_dialog_widget->Show(); |
2126 EXPECT_TRUE(modal_dialog_widget->IsVisible()); | 1958 EXPECT_TRUE(modal_dialog_widget->IsVisible()); |
2127 | 1959 |
2128 gfx::Point cursor_location_dialog(100, 100); | 1960 gfx::Point cursor_location_dialog(100, 100); |
2129 ui::MouseEvent mouse_down_dialog(ui::ET_MOUSE_PRESSED, | 1961 ui::MouseEvent mouse_down_dialog(ui::ET_MOUSE_PRESSED, |
2130 cursor_location_dialog, | 1962 cursor_location_dialog, |
2131 cursor_location_dialog, | 1963 cursor_location_dialog, |
2132 ui::EF_NONE, | 1964 ui::EF_NONE, |
2133 ui::EF_NONE); | 1965 ui::EF_NONE); |
2134 details = top_level_widget.GetNativeView()->GetHost()->event_processor()-> | 1966 details = GetEventProcessor(&top_level_widget)->OnEventFromSource( |
2135 OnEventFromSource(&mouse_down_dialog); | 1967 &mouse_down_dialog); |
2136 ASSERT_FALSE(details.dispatcher_destroyed); | 1968 ASSERT_FALSE(details.dispatcher_destroyed); |
2137 EXPECT_EQ(1, dialog_widget_view->GetEventCount(ui::ET_MOUSE_PRESSED)); | 1969 EXPECT_EQ(1, dialog_widget_view->GetEventCount(ui::ET_MOUSE_PRESSED)); |
2138 | 1970 |
2139 // Send a mouse move message to the main window. It should not be received by | 1971 // Send a mouse move message to the main window. It should not be received by |
2140 // the main window as the modal dialog is still active. | 1972 // the main window as the modal dialog is still active. |
2141 gfx::Point cursor_location_main2(6, 6); | 1973 gfx::Point cursor_location_main2(6, 6); |
2142 ui::MouseEvent mouse_down_main(ui::ET_MOUSE_MOVED, | 1974 ui::MouseEvent mouse_down_main(ui::ET_MOUSE_MOVED, |
2143 cursor_location_main2, | 1975 cursor_location_main2, |
2144 cursor_location_main2, | 1976 cursor_location_main2, |
2145 ui::EF_NONE, | 1977 ui::EF_NONE, |
2146 ui::EF_NONE); | 1978 ui::EF_NONE); |
2147 details = top_level_widget.GetNativeView()->GetHost()->event_processor()-> | 1979 details = GetEventProcessor(&top_level_widget)->OnEventFromSource( |
2148 OnEventFromSource(&mouse_down_main); | 1980 &mouse_down_main); |
2149 ASSERT_FALSE(details.dispatcher_destroyed); | 1981 ASSERT_FALSE(details.dispatcher_destroyed); |
2150 EXPECT_EQ(0, widget_view->GetEventCount(ui::ET_MOUSE_MOVED)); | 1982 EXPECT_EQ(0, widget_view->GetEventCount(ui::ET_MOUSE_MOVED)); |
2151 | 1983 |
2152 modal_dialog_widget->CloseNow(); | 1984 modal_dialog_widget->CloseNow(); |
2153 top_level_widget.CloseNow(); | 1985 top_level_widget.CloseNow(); |
2154 } | 1986 } |
2155 | 1987 |
2156 // Verifies nativeview visbility matches that of Widget visibility when | 1988 // Verifies nativeview visbility matches that of Widget visibility when |
2157 // SetFullscreen is invoked. | 1989 // SetFullscreen is invoked. |
2158 TEST_F(WidgetTest, FullscreenStatePropagated) { | 1990 TEST_F(WidgetTest, FullscreenStatePropagated) { |
2159 Widget::InitParams init_params = | 1991 Widget::InitParams init_params = |
2160 CreateParams(Widget::InitParams::TYPE_WINDOW); | 1992 CreateParams(Widget::InitParams::TYPE_WINDOW); |
2161 init_params.show_state = ui::SHOW_STATE_NORMAL; | 1993 init_params.show_state = ui::SHOW_STATE_NORMAL; |
2162 init_params.bounds = gfx::Rect(0, 0, 500, 500); | 1994 init_params.bounds = gfx::Rect(0, 0, 500, 500); |
2163 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 1995 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
2164 | 1996 |
2165 { | 1997 { |
2166 Widget top_level_widget; | 1998 Widget top_level_widget; |
2167 top_level_widget.Init(init_params); | 1999 top_level_widget.Init(init_params); |
2168 top_level_widget.SetFullscreen(true); | 2000 top_level_widget.SetFullscreen(true); |
2169 EXPECT_EQ(top_level_widget.IsVisible(), | 2001 EXPECT_EQ(top_level_widget.IsVisible(), |
2170 top_level_widget.GetNativeView()->IsVisible()); | 2002 IsNativeWindowVisible(top_level_widget.GetNativeWindow())); |
2171 top_level_widget.CloseNow(); | 2003 top_level_widget.CloseNow(); |
2172 } | 2004 } |
2173 | 2005 |
2174 #if !defined(OS_CHROMEOS) | 2006 #if !defined(OS_CHROMEOS) |
2175 { | 2007 { |
2176 Widget top_level_widget; | 2008 Widget top_level_widget; |
2177 init_params.native_widget = new DesktopNativeWidgetAura(&top_level_widget); | 2009 init_params.native_widget = |
| 2010 new PlatformDesktopNativeWidget(&top_level_widget); |
2178 top_level_widget.Init(init_params); | 2011 top_level_widget.Init(init_params); |
2179 top_level_widget.SetFullscreen(true); | 2012 top_level_widget.SetFullscreen(true); |
2180 EXPECT_EQ(top_level_widget.IsVisible(), | 2013 EXPECT_EQ(top_level_widget.IsVisible(), |
2181 top_level_widget.GetNativeView()->IsVisible()); | 2014 IsNativeWindowVisible(top_level_widget.GetNativeWindow())); |
2182 top_level_widget.CloseNow(); | 2015 top_level_widget.CloseNow(); |
2183 } | 2016 } |
2184 #endif | 2017 #endif |
2185 } | 2018 } |
2186 | 2019 |
2187 #if defined(OS_WIN) | 2020 #if defined(OS_WIN) |
2188 | 2021 |
2189 // Provides functionality to test widget activation via an activation flag | 2022 // Provides functionality to test widget activation via an activation flag |
2190 // which can be set by an accessor. | 2023 // which can be set by an accessor. |
2191 class ModalWindowTestWidgetDelegate : public WidgetDelegate { | 2024 class ModalWindowTestWidgetDelegate : public WidgetDelegate { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2268 LRESULT activate_result = ::SendMessage( | 2101 LRESULT activate_result = ::SendMessage( |
2269 win32_window, | 2102 win32_window, |
2270 WM_MOUSEACTIVATE, | 2103 WM_MOUSEACTIVATE, |
2271 reinterpret_cast<WPARAM>(win32_window), | 2104 reinterpret_cast<WPARAM>(win32_window), |
2272 MAKELPARAM(WM_LBUTTONDOWN, HTCLIENT)); | 2105 MAKELPARAM(WM_LBUTTONDOWN, HTCLIENT)); |
2273 EXPECT_EQ(activate_result, MA_ACTIVATE); | 2106 EXPECT_EQ(activate_result, MA_ACTIVATE); |
2274 | 2107 |
2275 modal_dialog_widget->CloseNow(); | 2108 modal_dialog_widget->CloseNow(); |
2276 top_level_widget.CloseNow(); | 2109 top_level_widget.CloseNow(); |
2277 } | 2110 } |
2278 #endif | 2111 #endif // defined(OS_WIN) |
2279 #endif | 2112 #endif // !defined(OS_CHROMEOS) |
2280 | 2113 |
2281 TEST_F(WidgetTest, ShowCreatesActiveWindow) { | 2114 TEST_F(WidgetTest, ShowCreatesActiveWindow) { |
2282 Widget* widget = CreateTopLevelPlatformWidget(); | 2115 Widget* widget = CreateTopLevelPlatformWidget(); |
2283 | 2116 |
2284 widget->Show(); | 2117 widget->Show(); |
2285 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); | 2118 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); |
2286 | 2119 |
2287 widget->CloseNow(); | 2120 widget->CloseNow(); |
2288 } | 2121 } |
2289 | 2122 |
(...skipping 27 matching lines...) Expand all Loading... |
2317 } | 2150 } |
2318 | 2151 |
2319 #if !defined(OS_CHROMEOS) | 2152 #if !defined(OS_CHROMEOS) |
2320 TEST_F(WidgetTest, InactiveWidgetDoesNotGrabActivation) { | 2153 TEST_F(WidgetTest, InactiveWidgetDoesNotGrabActivation) { |
2321 Widget* widget = CreateTopLevelPlatformWidget(); | 2154 Widget* widget = CreateTopLevelPlatformWidget(); |
2322 widget->Show(); | 2155 widget->Show(); |
2323 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); | 2156 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); |
2324 | 2157 |
2325 Widget widget2; | 2158 Widget widget2; |
2326 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); | 2159 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
2327 params.native_widget = new DesktopNativeWidgetAura(&widget2); | 2160 params.native_widget = new PlatformDesktopNativeWidget(&widget2); |
2328 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 2161 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
2329 widget2.Init(params); | 2162 widget2.Init(params); |
2330 widget2.Show(); | 2163 widget2.Show(); |
2331 | 2164 |
2332 EXPECT_EQ(GetWidgetShowState(&widget2), ui::SHOW_STATE_INACTIVE); | 2165 EXPECT_EQ(GetWidgetShowState(&widget2), ui::SHOW_STATE_INACTIVE); |
2333 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); | 2166 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); |
2334 | 2167 |
2335 widget->CloseNow(); | 2168 widget->CloseNow(); |
2336 widget2.CloseNow(); | 2169 widget2.CloseNow(); |
2337 } | 2170 } |
2338 #endif | 2171 #endif // !defined(OS_CHROMEOS) |
2339 | 2172 |
2340 namespace { | 2173 namespace { |
2341 | 2174 |
2342 class FullscreenAwareFrame : public views::NonClientFrameView { | 2175 class FullscreenAwareFrame : public views::NonClientFrameView { |
2343 public: | 2176 public: |
2344 explicit FullscreenAwareFrame(views::Widget* widget) | 2177 explicit FullscreenAwareFrame(views::Widget* widget) |
2345 : widget_(widget), fullscreen_layout_called_(false) {} | 2178 : widget_(widget), fullscreen_layout_called_(false) {} |
2346 virtual ~FullscreenAwareFrame() {} | 2179 virtual ~FullscreenAwareFrame() {} |
2347 | 2180 |
2348 // views::NonClientFrameView overrides: | 2181 // views::NonClientFrameView overrides: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2418 } // namespace | 2251 } // namespace |
2419 | 2252 |
2420 // Verifies Widget::IsActive() invoked from | 2253 // Verifies Widget::IsActive() invoked from |
2421 // WidgetObserver::OnWidgetDestroying() in a child widget doesn't crash. | 2254 // WidgetObserver::OnWidgetDestroying() in a child widget doesn't crash. |
2422 TEST_F(WidgetTest, IsActiveFromDestroy) { | 2255 TEST_F(WidgetTest, IsActiveFromDestroy) { |
2423 // Create two widgets, one a child of the other. | 2256 // Create two widgets, one a child of the other. |
2424 IsActiveFromDestroyObserver observer; | 2257 IsActiveFromDestroyObserver observer; |
2425 Widget parent_widget; | 2258 Widget parent_widget; |
2426 Widget::InitParams parent_params = | 2259 Widget::InitParams parent_params = |
2427 CreateParams(Widget::InitParams::TYPE_POPUP); | 2260 CreateParams(Widget::InitParams::TYPE_POPUP); |
2428 parent_params.native_widget = new DesktopNativeWidgetAura(&parent_widget); | 2261 parent_params.native_widget = new PlatformDesktopNativeWidget(&parent_widget); |
2429 parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 2262 parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
2430 parent_widget.Init(parent_params); | 2263 parent_widget.Init(parent_params); |
2431 parent_widget.Show(); | 2264 parent_widget.Show(); |
2432 | 2265 |
2433 Widget child_widget; | 2266 Widget child_widget; |
2434 Widget::InitParams child_params = | 2267 Widget::InitParams child_params = |
2435 CreateParams(Widget::InitParams::TYPE_POPUP); | 2268 CreateParams(Widget::InitParams::TYPE_POPUP); |
2436 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 2269 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
2437 child_params.context = parent_widget.GetNativeView(); | 2270 child_params.context = parent_widget.GetNativeView(); |
2438 child_widget.Init(child_params); | 2271 child_widget.Init(child_params); |
2439 child_widget.AddObserver(&observer); | 2272 child_widget.AddObserver(&observer); |
2440 child_widget.Show(); | 2273 child_widget.Show(); |
2441 | 2274 |
2442 parent_widget.CloseNow(); | 2275 parent_widget.CloseNow(); |
2443 } | 2276 } |
2444 #endif | 2277 #endif // !defined(OS_CHROMEOS) |
2445 | 2278 |
2446 } // namespace test | 2279 } // namespace test |
2447 } // namespace views | 2280 } // namespace views |
OLD | NEW |