Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Side by Side Diff: ui/views/widget/widget_unittest.cc

Issue 322893005: MacViews: Add WidgetEventGenerator to abstract platform-specific event generation for tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cull orthogonal stuff, add WidgetTest.MouseEventTypesViaGenerator Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
18 #include "ui/aura/test/test_window_delegate.h"
19 #include "ui/aura/window.h"
20 #include "ui/aura/window_tree_host.h"
21 #include "ui/base/hit_test.h" 15 #include "ui/base/hit_test.h"
22 #include "ui/compositor/scoped_animation_duration_scale_mode.h" 16 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
23 #include "ui/compositor/scoped_layer_animation_settings.h" 17 #include "ui/compositor/scoped_layer_animation_settings.h"
24 #include "ui/events/event_processor.h" 18 #include "ui/events/event_processor.h"
25 #include "ui/events/event_utils.h" 19 #include "ui/events/event_utils.h"
26 #include "ui/gfx/native_widget_types.h" 20 #include "ui/gfx/native_widget_types.h"
27 #include "ui/gfx/point.h" 21 #include "ui/gfx/point.h"
28 #include "ui/views/bubble/bubble_delegate.h" 22 #include "ui/views/bubble/bubble_delegate.h"
29 #include "ui/views/controls/textfield/textfield.h" 23 #include "ui/views/controls/textfield/textfield.h"
24 #include "ui/views/ime/input_method_delegate.h"
30 #include "ui/views/test/test_views_delegate.h" 25 #include "ui/views/test/test_views_delegate.h"
26 #include "ui/views/test/widget_event_generator.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:
54 EventCountView() {} 45 EventCountView() : last_flags_(0) {}
55 virtual ~EventCountView() {} 46 virtual ~EventCountView() {}
56 47
57 int GetEventCount(ui::EventType type) { 48 int GetEventCount(ui::EventType type) {
58 return event_count_[type]; 49 return event_count_[type];
59 } 50 }
60 51
61 void ResetCounts() { 52 void ResetCounts() {
62 event_count_.clear(); 53 event_count_.clear();
63 } 54 }
64 55
56 int last_flags() const {
57 return last_flags_;
58 }
59
65 protected: 60 protected:
61 // Overridden from View:
62 virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE {
63 // MouseMove events are not re-dispatched from the RootView.
64 ++event_count_[ui::ET_MOUSE_MOVED];
65 last_flags_ = 0;
66 }
67
66 // Overridden from ui::EventHandler: 68 // Overridden from ui::EventHandler:
67 virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { 69 virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE {
68 RecordEvent(*event); 70 RecordEvent(event);
69 } 71 }
70 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 72 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
71 RecordEvent(*event); 73 RecordEvent(event);
72 } 74 }
73 virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 75 virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
74 RecordEvent(*event); 76 RecordEvent(event);
75 } 77 }
76 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 78 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
77 RecordEvent(*event); 79 RecordEvent(event);
78 } 80 }
79 81
80 private: 82 private:
81 void RecordEvent(const ui::Event& event) { 83 void RecordEvent(ui::Event* event) {
82 ++event_count_[event.type()]; 84 ++event_count_[event->type()];
85 last_flags_ = event->flags();
86 // Mark the event as handled so that EventCountView receives future events
87 // in the event sequence.
88 event->SetHandled();
83 } 89 }
84 90
85 std::map<ui::EventType, int> event_count_; 91 std::map<ui::EventType, int> event_count_;
92 int last_flags_;
86 93
87 DISALLOW_COPY_AND_ASSIGN(EventCountView); 94 DISALLOW_COPY_AND_ASSIGN(EventCountView);
88 }; 95 };
89 96
90 // A view that keeps track of the events it receives, and consumes all scroll 97 // A view that keeps track of the events it receives, and consumes all scroll
91 // gesture events and ui::ET_SCROLL events. 98 // gesture events and ui::ET_SCROLL events.
92 class ScrollableEventCountView : public EventCountView { 99 class ScrollableEventCountView : public EventCountView {
93 public: 100 public:
94 ScrollableEventCountView() {} 101 ScrollableEventCountView() {}
95 virtual ~ScrollableEventCountView() {} 102 virtual ~ScrollableEventCountView() {}
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 // A bag of state to monitor destructions. 314 // A bag of state to monitor destructions.
308 struct OwnershipTestState { 315 struct OwnershipTestState {
309 OwnershipTestState() : widget_deleted(false), native_widget_deleted(false) {} 316 OwnershipTestState() : widget_deleted(false), native_widget_deleted(false) {}
310 317
311 bool widget_deleted; 318 bool widget_deleted;
312 bool native_widget_deleted; 319 bool native_widget_deleted;
313 }; 320 };
314 321
315 // A platform NativeWidget subclass that updates a bag of state when it is 322 // A platform NativeWidget subclass that updates a bag of state when it is
316 // destroyed. 323 // destroyed.
317 class OwnershipTestNativeWidget : public NativeWidgetAura { 324 class OwnershipTestNativeWidget : public PlatformNativeWidget {
318 public: 325 public:
319 OwnershipTestNativeWidget(internal::NativeWidgetDelegate* delegate, 326 OwnershipTestNativeWidget(internal::NativeWidgetDelegate* delegate,
320 OwnershipTestState* state) 327 OwnershipTestState* state)
321 : NativeWidgetAura(delegate), 328 : PlatformNativeWidget(delegate),
322 state_(state) { 329 state_(state) {
323 } 330 }
324 virtual ~OwnershipTestNativeWidget() { 331 virtual ~OwnershipTestNativeWidget() {
325 state_->native_widget_deleted = true; 332 state_->native_widget_deleted = true;
326 } 333 }
327 334
328 private: 335 private:
329 OwnershipTestState* state_; 336 OwnershipTestState* state_;
330 337
331 DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidget); 338 DISALLOW_COPY_AND_ASSIGN(OwnershipTestNativeWidget);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 Ownership_PlatformNativeWidgetOwnsWidget_NativeDestroy) { 495 Ownership_PlatformNativeWidgetOwnsWidget_NativeDestroy) {
489 OwnershipTestState state; 496 OwnershipTestState state;
490 497
491 Widget* widget = new OwnershipTestWidget(&state); 498 Widget* widget = new OwnershipTestWidget(&state);
492 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 499 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
493 params.native_widget = 500 params.native_widget =
494 new OwnershipTestNativeWidgetAura(widget, &state); 501 new OwnershipTestNativeWidgetAura(widget, &state);
495 widget->Init(params); 502 widget->Init(params);
496 503
497 // Now simulate a destroy of the platform native widget from the OS: 504 // Now simulate a destroy of the platform native widget from the OS:
498 delete widget->GetNativeView(); 505 test::WidgetEventGenerator::SimulateNativeDestroy(widget);
499 506
500 EXPECT_TRUE(state.widget_deleted); 507 EXPECT_TRUE(state.widget_deleted);
501 EXPECT_TRUE(state.native_widget_deleted); 508 EXPECT_TRUE(state.native_widget_deleted);
502 } 509 }
503 510
504 // NativeWidget owns its Widget, part 4: NativeWidget is a NativeWidget, 511 // NativeWidget owns its Widget, part 4: NativeWidget is a NativeWidget,
505 // destroyed by the view hierarchy that contains it. 512 // destroyed by the view hierarchy that contains it.
506 TEST_F(WidgetOwnershipTest, 513 TEST_F(WidgetOwnershipTest,
507 Ownership_ViewsNativeWidgetOwnsWidget_NativeDestroy) { 514 Ownership_ViewsNativeWidgetOwnsWidget_NativeDestroy) {
508 OwnershipTestState state; 515 OwnershipTestState state;
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 { 649 {
643 Widget widget; 650 Widget widget;
644 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 651 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
645 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 652 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
646 widget.Init(params); 653 widget.Init(params);
647 widget.Show(); 654 widget.Show();
648 655
649 widget.native_widget_private()->CloseNow(); 656 widget.native_widget_private()->CloseNow();
650 InvokeWidgetMethods(&widget); 657 InvokeWidgetMethods(&widget);
651 } 658 }
659
652 #if !defined(OS_CHROMEOS) 660 #if !defined(OS_CHROMEOS)
653 { 661 {
654 Widget widget; 662 Widget widget;
655 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 663 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
656 params.native_widget = new DesktopNativeWidgetAura(&widget); 664 params.native_widget = new PlatformDesktopNativeWidget(&widget);
657 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 665 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
658 widget.Init(params); 666 widget.Init(params);
659 widget.Show(); 667 widget.Show();
660 668
661 widget.native_widget_private()->CloseNow(); 669 widget.native_widget_private()->CloseNow();
662 InvokeWidgetMethods(&widget); 670 InvokeWidgetMethods(&widget);
663 } 671 }
664 #endif 672 #endif
665 } 673 }
666 674
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 TEST_F(WidgetTest, DISABLED_FocusChangesOnBubble) { 935 TEST_F(WidgetTest, DISABLED_FocusChangesOnBubble) {
928 // Create a widget, show and activate it and focus the contents view. 936 // Create a widget, show and activate it and focus the contents view.
929 View* contents_view = new View; 937 View* contents_view = new View;
930 contents_view->SetFocusable(true); 938 contents_view->SetFocusable(true);
931 Widget widget; 939 Widget widget;
932 Widget::InitParams init_params = 940 Widget::InitParams init_params =
933 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 941 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
934 init_params.bounds = gfx::Rect(0, 0, 200, 200); 942 init_params.bounds = gfx::Rect(0, 0, 200, 200);
935 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 943 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
936 #if !defined(OS_CHROMEOS) 944 #if !defined(OS_CHROMEOS)
937 init_params.native_widget = new DesktopNativeWidgetAura(&widget); 945 init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
938 #endif 946 #endif
939 widget.Init(init_params); 947 widget.Init(init_params);
940 widget.SetContentsView(contents_view); 948 widget.SetContentsView(contents_view);
941 widget.Show(); 949 widget.Show();
942 widget.Activate(); 950 widget.Activate();
943 contents_view->RequestFocus(); 951 contents_view->RequestFocus();
944 EXPECT_TRUE(contents_view->HasFocus()); 952 EXPECT_TRUE(contents_view->HasFocus());
945 953
946 // Show a bubble. 954 // Show a bubble.
947 BubbleDelegateView* bubble_delegate_view = 955 BubbleDelegateView* bubble_delegate_view =
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 // Test to ensure that after minimize, view width is set to zero. 1003 // Test to ensure that after minimize, view width is set to zero.
996 TEST_F(WidgetTest, TestViewWidthAfterMinimizingWidget) { 1004 TEST_F(WidgetTest, TestViewWidthAfterMinimizingWidget) {
997 // Create a widget. 1005 // Create a widget.
998 Widget widget; 1006 Widget widget;
999 Widget::InitParams init_params = 1007 Widget::InitParams init_params =
1000 CreateParams(Widget::InitParams::TYPE_WINDOW); 1008 CreateParams(Widget::InitParams::TYPE_WINDOW);
1001 init_params.show_state = ui::SHOW_STATE_NORMAL; 1009 init_params.show_state = ui::SHOW_STATE_NORMAL;
1002 gfx::Rect initial_bounds(0, 0, 300, 400); 1010 gfx::Rect initial_bounds(0, 0, 300, 400);
1003 init_params.bounds = initial_bounds; 1011 init_params.bounds = initial_bounds;
1004 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1012 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1005 init_params.native_widget = new DesktopNativeWidgetAura(&widget); 1013 init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
1006 widget.Init(init_params); 1014 widget.Init(init_params);
1007 NonClientView* non_client_view = widget.non_client_view(); 1015 NonClientView* non_client_view = widget.non_client_view();
1008 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); 1016 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget);
1009 non_client_view->SetFrameView(frame_view); 1017 non_client_view->SetFrameView(frame_view);
1010 widget.Show(); 1018 widget.Show();
1011 widget.Minimize(); 1019 widget.Minimize();
1012 EXPECT_EQ(0, frame_view->width()); 1020 EXPECT_EQ(0, frame_view->width());
1013 } 1021 }
1014 1022
1015 // This class validates whether paints are received for a visible Widget. 1023 // This class validates whether paints are received for a visible Widget.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 1057
1050 bool received_paint_while_hidden() const { 1058 bool received_paint_while_hidden() const {
1051 return received_paint_while_hidden_; 1059 return received_paint_while_hidden_;
1052 } 1060 }
1053 1061
1054 private: 1062 private:
1055 bool expect_paint_; 1063 bool expect_paint_;
1056 bool received_paint_while_hidden_; 1064 bool received_paint_while_hidden_;
1057 }; 1065 };
1058 1066
1059 TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterCloseTest) { 1067 TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterCloseTest) {
1060 View* contents_view = new View; 1068 View* contents_view = new View;
1061 contents_view->SetFocusable(true); 1069 contents_view->SetFocusable(true);
1062 DesktopAuraTestValidPaintWidget widget; 1070 DesktopAuraTestValidPaintWidget widget;
1063 Widget::InitParams init_params = 1071 Widget::InitParams init_params =
1064 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 1072 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
1065 init_params.bounds = gfx::Rect(0, 0, 200, 200); 1073 init_params.bounds = gfx::Rect(0, 0, 200, 200);
1066 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1074 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1067 init_params.native_widget = new DesktopNativeWidgetAura(&widget); 1075 init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
1068 widget.Init(init_params); 1076 widget.Init(init_params);
1069 widget.SetContentsView(contents_view); 1077 widget.SetContentsView(contents_view);
1070 widget.Show(); 1078 widget.Show();
1071 widget.Activate(); 1079 widget.Activate();
1072 RunPendingMessages(); 1080 RunPendingMessages();
1073 widget.SchedulePaintInRect(init_params.bounds); 1081 widget.SchedulePaintInRect(init_params.bounds);
1074 widget.Close(); 1082 widget.Close();
1075 RunPendingMessages(); 1083 RunPendingMessages();
1076 EXPECT_FALSE(widget.received_paint_while_hidden()); 1084 EXPECT_FALSE(widget.received_paint_while_hidden());
1077 } 1085 }
1078 1086
1079 TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterHideTest) { 1087 TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterHideTest) {
1080 View* contents_view = new View; 1088 View* contents_view = new View;
1081 contents_view->SetFocusable(true); 1089 contents_view->SetFocusable(true);
1082 DesktopAuraTestValidPaintWidget widget; 1090 DesktopAuraTestValidPaintWidget widget;
1083 Widget::InitParams init_params = 1091 Widget::InitParams init_params =
1084 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 1092 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
1085 init_params.bounds = gfx::Rect(0, 0, 200, 200); 1093 init_params.bounds = gfx::Rect(0, 0, 200, 200);
1086 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1094 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1087 init_params.native_widget = new DesktopNativeWidgetAura(&widget); 1095 init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
1088 widget.Init(init_params); 1096 widget.Init(init_params);
1089 widget.SetContentsView(contents_view); 1097 widget.SetContentsView(contents_view);
1090 widget.Show(); 1098 widget.Show();
1091 widget.Activate(); 1099 widget.Activate();
1092 RunPendingMessages(); 1100 RunPendingMessages();
1093 widget.SchedulePaintInRect(init_params.bounds); 1101 widget.SchedulePaintInRect(init_params.bounds);
1094 widget.Hide(); 1102 widget.Hide();
1095 RunPendingMessages(); 1103 RunPendingMessages();
1096 EXPECT_FALSE(widget.received_paint_while_hidden()); 1104 EXPECT_FALSE(widget.received_paint_while_hidden());
1097 widget.Close(); 1105 widget.Close();
1098 } 1106 }
1099 1107
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 1108 // Test to ensure that the aura Window's visiblity state is set to visible if
1260 // the underlying widget is hidden and then shown. 1109 // the underlying widget is hidden and then shown.
1261 TEST_F(WidgetTest, TestWindowVisibilityAfterHide) { 1110 TEST_F(WidgetTest, TestWindowVisibilityAfterHide) {
1262 // Create a widget. 1111 // Create a widget.
1263 Widget widget; 1112 Widget widget;
1264 Widget::InitParams init_params = 1113 Widget::InitParams init_params =
1265 CreateParams(Widget::InitParams::TYPE_WINDOW); 1114 CreateParams(Widget::InitParams::TYPE_WINDOW);
1266 init_params.show_state = ui::SHOW_STATE_NORMAL; 1115 init_params.show_state = ui::SHOW_STATE_NORMAL;
1267 gfx::Rect initial_bounds(0, 0, 300, 400); 1116 gfx::Rect initial_bounds(0, 0, 300, 400);
1268 init_params.bounds = initial_bounds; 1117 init_params.bounds = initial_bounds;
1269 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1118 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1270 init_params.native_widget = new DesktopNativeWidgetAura(&widget); 1119 init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
1271 widget.Init(init_params); 1120 widget.Init(init_params);
1272 NonClientView* non_client_view = widget.non_client_view(); 1121 NonClientView* non_client_view = widget.non_client_view();
1273 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget); 1122 NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget);
1274 non_client_view->SetFrameView(frame_view); 1123 non_client_view->SetFrameView(frame_view);
1275 1124
1276 widget.Hide(); 1125 widget.Hide();
1277 EXPECT_FALSE(widget.GetNativeView()->IsVisible()); 1126 EXPECT_FALSE(IsNativeWindowVisible(widget.GetNativeWindow()));
1278 widget.Show(); 1127 widget.Show();
1279 EXPECT_TRUE(widget.GetNativeView()->IsVisible()); 1128 EXPECT_TRUE(IsNativeWindowVisible(widget.GetNativeWindow()));
1280 } 1129 }
1281 1130
1282 // The following code verifies we can correctly destroy a Widget from a mouse 1131 // 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 1132 // 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 1133 // nested message loops from such events, nor has the code ever really dealt
1285 // with this situation. 1134 // with this situation.
1286 1135
1287 // Generates two moves (first generates enter, second real move), a press, drag 1136 // Generates two moves (first generates enter, second real move), a press, drag
1288 // and release stopping at |last_event_type|. 1137 // and release stopping at |last_event_type|.
1289 void GenerateMouseEvents(Widget* widget, ui::EventType last_event_type) { 1138 void GenerateMouseEvents(Widget* widget, ui::EventType last_event_type) {
1290 const gfx::Rect screen_bounds(widget->GetWindowBoundsInScreen()); 1139 const gfx::Rect screen_bounds(widget->GetWindowBoundsInScreen());
1291 ui::MouseEvent move_event(ui::ET_MOUSE_MOVED, screen_bounds.CenterPoint(), 1140 ui::MouseEvent move_event(ui::ET_MOUSE_MOVED, screen_bounds.CenterPoint(),
1292 screen_bounds.CenterPoint(), 0, 0); 1141 screen_bounds.CenterPoint(), 0, 0);
1293 ui::EventProcessor* dispatcher = 1142 ui::EventProcessor* dispatcher = WidgetTest::GetEventProcessor(widget);
1294 widget->GetNativeWindow()->GetHost()->event_processor();
1295 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move_event); 1143 ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move_event);
1296 if (last_event_type == ui::ET_MOUSE_ENTERED || details.dispatcher_destroyed) 1144 if (last_event_type == ui::ET_MOUSE_ENTERED || details.dispatcher_destroyed)
1297 return; 1145 return;
1298 details = dispatcher->OnEventFromSource(&move_event); 1146 details = dispatcher->OnEventFromSource(&move_event);
1299 if (last_event_type == ui::ET_MOUSE_MOVED || details.dispatcher_destroyed) 1147 if (last_event_type == ui::ET_MOUSE_MOVED || details.dispatcher_destroyed)
1300 return; 1148 return;
1301 1149
1302 ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, screen_bounds.CenterPoint(), 1150 ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, screen_bounds.CenterPoint(),
1303 screen_bounds.CenterPoint(), 0, 0); 1151 screen_bounds.CenterPoint(), 0, 0);
1304 details = dispatcher->OnEventFromSource(&press_event); 1152 details = dispatcher->OnEventFromSource(&press_event);
(...skipping 14 matching lines...) Expand all
1319 return; 1167 return;
1320 } 1168 }
1321 1169
1322 // Creates a widget and invokes GenerateMouseEvents() with |last_event_type|. 1170 // Creates a widget and invokes GenerateMouseEvents() with |last_event_type|.
1323 void RunCloseWidgetDuringDispatchTest(WidgetTest* test, 1171 void RunCloseWidgetDuringDispatchTest(WidgetTest* test,
1324 ui::EventType last_event_type) { 1172 ui::EventType last_event_type) {
1325 // |widget| is deleted by CloseWidgetView. 1173 // |widget| is deleted by CloseWidgetView.
1326 Widget* widget = new Widget; 1174 Widget* widget = new Widget;
1327 Widget::InitParams params = 1175 Widget::InitParams params =
1328 test->CreateParams(Widget::InitParams::TYPE_POPUP); 1176 test->CreateParams(Widget::InitParams::TYPE_POPUP);
1329 params.native_widget = new DesktopNativeWidgetAura(widget); 1177 params.native_widget = new PlatformDesktopNativeWidget(widget);
1330 params.bounds = gfx::Rect(0, 0, 50, 100); 1178 params.bounds = gfx::Rect(0, 0, 50, 100);
1331 widget->Init(params); 1179 widget->Init(params);
1332 widget->SetContentsView(new CloseWidgetView(last_event_type)); 1180 widget->SetContentsView(new CloseWidgetView(last_event_type));
1333 widget->Show(); 1181 widget->Show();
1334 GenerateMouseEvents(widget, last_event_type); 1182 GenerateMouseEvents(widget, last_event_type);
1335 } 1183 }
1336 1184
1337 // Verifies deleting the widget from a mouse pressed event doesn't crash. 1185 // Verifies deleting the widget from a mouse pressed event doesn't crash.
1338 TEST_F(WidgetTest, CloseWidgetDuringMousePress) { 1186 TEST_F(WidgetTest, CloseWidgetDuringMousePress) {
1339 RunCloseWidgetDuringDispatchTest(this, ui::ET_MOUSE_PRESSED); 1187 RunCloseWidgetDuringDispatchTest(this, ui::ET_MOUSE_PRESSED);
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1608 // Verifies WindowClosing() is invoked correctly on the delegate when a Widget 1456 // Verifies WindowClosing() is invoked correctly on the delegate when a Widget
1609 // is closed. 1457 // is closed.
1610 TEST_F(WidgetTest, SingleWindowClosing) { 1458 TEST_F(WidgetTest, SingleWindowClosing) {
1611 scoped_ptr<ClosingDelegate> delegate(new ClosingDelegate()); 1459 scoped_ptr<ClosingDelegate> delegate(new ClosingDelegate());
1612 Widget* widget = new Widget(); // Destroyed by CloseNow() below. 1460 Widget* widget = new Widget(); // Destroyed by CloseNow() below.
1613 Widget::InitParams init_params = 1461 Widget::InitParams init_params =
1614 CreateParams(Widget::InitParams::TYPE_WINDOW); 1462 CreateParams(Widget::InitParams::TYPE_WINDOW);
1615 init_params.bounds = gfx::Rect(0, 0, 200, 200); 1463 init_params.bounds = gfx::Rect(0, 0, 200, 200);
1616 init_params.delegate = delegate.get(); 1464 init_params.delegate = delegate.get();
1617 #if !defined(OS_CHROMEOS) 1465 #if !defined(OS_CHROMEOS)
1618 init_params.native_widget = new DesktopNativeWidgetAura(widget); 1466 init_params.native_widget = new PlatformDesktopNativeWidget(widget);
1619 #endif 1467 #endif
1620 widget->Init(init_params); 1468 widget->Init(init_params);
1621 EXPECT_EQ(0, delegate->count()); 1469 EXPECT_EQ(0, delegate->count());
1622 widget->CloseNow(); 1470 widget->CloseNow();
1623 EXPECT_EQ(1, delegate->count()); 1471 EXPECT_EQ(1, delegate->count());
1624 } 1472 }
1625 1473
1626 class WidgetWindowTitleTest : public WidgetTest { 1474 class WidgetWindowTitleTest : public WidgetTest {
1627 protected: 1475 protected:
1628 void RunTest(bool desktop_native_widget) { 1476 void RunTest(bool desktop_native_widget) {
1629 Widget* widget = new Widget(); // Destroyed by CloseNow() below. 1477 Widget* widget = new Widget(); // Destroyed by CloseNow() below.
1630 Widget::InitParams init_params = 1478 Widget::InitParams init_params =
1631 CreateParams(Widget::InitParams::TYPE_WINDOW); 1479 CreateParams(Widget::InitParams::TYPE_WINDOW);
1632 widget->Init(init_params); 1480 widget->Init(init_params);
1633 1481
1634 #if !defined(OS_CHROMEOS) 1482 #if !defined(OS_CHROMEOS)
1635 if (desktop_native_widget) 1483 if (desktop_native_widget)
1636 init_params.native_widget = new DesktopNativeWidgetAura(widget); 1484 init_params.native_widget = new PlatformDesktopNativeWidget(widget);
1637 #else 1485 #else
1638 DCHECK(!desktop_native_widget) 1486 DCHECK(!desktop_native_widget)
1639 << "DesktopNativeWidget does not exist on non-Aura or on ChromeOS."; 1487 << "DesktopNativeWidget does not exist on non-Aura or on ChromeOS.";
1640 #endif 1488 #endif
1641 1489
1642 internal::NativeWidgetPrivate* native_widget = 1490 internal::NativeWidgetPrivate* native_widget =
1643 widget->native_widget_private(); 1491 widget->native_widget_private();
1644 1492
1645 base::string16 empty; 1493 base::string16 empty;
1646 base::string16 s1(base::UTF8ToUTF16("Title1")); 1494 base::string16 s1(base::UTF8ToUTF16("Title1"));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1684 Widget* widget = new Widget; 1532 Widget* widget = new Widget;
1685 Widget::InitParams params = 1533 Widget::InitParams params =
1686 CreateParams(views::Widget::InitParams::TYPE_POPUP); 1534 CreateParams(views::Widget::InitParams::TYPE_POPUP);
1687 widget->Init(params); 1535 widget->Init(params);
1688 1536
1689 widget->SetContentsView(new CloseWidgetView(ui::ET_MOUSE_PRESSED)); 1537 widget->SetContentsView(new CloseWidgetView(ui::ET_MOUSE_PRESSED));
1690 1538
1691 widget->SetSize(gfx::Size(100, 100)); 1539 widget->SetSize(gfx::Size(100, 100));
1692 widget->Show(); 1540 widget->Show();
1693 1541
1694 aura::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); 1542 test::WidgetEventGenerator generator(GetContext(), widget);
1695 1543
1696 WidgetDeletionObserver deletion_observer(widget); 1544 WidgetDeletionObserver deletion_observer(widget);
1697 generator.ClickLeftButton(); 1545 generator.ClickLeftButton();
1698 EXPECT_FALSE(deletion_observer.IsWidgetAlive()); 1546 EXPECT_FALSE(deletion_observer.IsWidgetAlive());
1699 1547
1700 // Yay we did not crash! 1548 // Yay we did not crash!
1701 } 1549 }
1702 1550
1703 TEST_F(WidgetTest, WidgetDeleted_InDispatchGestureEvent) { 1551 TEST_F(WidgetTest, WidgetDeleted_InDispatchGestureEvent) {
1704 Widget* widget = new Widget; 1552 Widget* widget = new Widget;
1705 Widget::InitParams params = 1553 Widget::InitParams params =
1706 CreateParams(views::Widget::InitParams::TYPE_POPUP); 1554 CreateParams(views::Widget::InitParams::TYPE_POPUP);
1707 widget->Init(params); 1555 widget->Init(params);
1708 1556
1709 widget->SetContentsView(new CloseWidgetView(ui::ET_GESTURE_TAP_DOWN)); 1557 widget->SetContentsView(new CloseWidgetView(ui::ET_GESTURE_TAP_DOWN));
1710 1558
1711 widget->SetSize(gfx::Size(100, 100)); 1559 widget->SetSize(gfx::Size(100, 100));
1712 widget->Show(); 1560 widget->Show();
1713 1561
1714 aura::test::EventGenerator generator(GetContext()); 1562 test::WidgetEventGenerator generator(GetContext());
1715 1563
1716 WidgetDeletionObserver deletion_observer(widget); 1564 WidgetDeletionObserver deletion_observer(widget);
1717 generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint()); 1565 generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint());
1718 EXPECT_FALSE(deletion_observer.IsWidgetAlive()); 1566 EXPECT_FALSE(deletion_observer.IsWidgetAlive());
1719 1567
1720 // Yay we did not crash! 1568 // Yay we did not crash!
1721 } 1569 }
1722 1570
1723 // See description of RunGetNativeThemeFromDestructor() for details. 1571 // See description of RunGetNativeThemeFromDestructor() for details.
1724 class GetNativeThemeFromDestructorView : public WidgetDelegateView { 1572 class GetNativeThemeFromDestructorView : public WidgetDelegateView {
(...skipping 22 matching lines...) Expand all
1747 bool RunGetNativeThemeFromDestructor(const Widget::InitParams& in_params, 1595 bool RunGetNativeThemeFromDestructor(const Widget::InitParams& in_params,
1748 bool is_first_run) { 1596 bool is_first_run) {
1749 bool needs_second_run = false; 1597 bool needs_second_run = false;
1750 // Destroyed by CloseNow() below. 1598 // Destroyed by CloseNow() below.
1751 Widget* widget = new Widget; 1599 Widget* widget = new Widget;
1752 Widget::InitParams params(in_params); 1600 Widget::InitParams params(in_params);
1753 // Deletes itself when the Widget is destroyed. 1601 // Deletes itself when the Widget is destroyed.
1754 params.delegate = new GetNativeThemeFromDestructorView; 1602 params.delegate = new GetNativeThemeFromDestructorView;
1755 #if !defined(OS_CHROMEOS) 1603 #if !defined(OS_CHROMEOS)
1756 if (is_first_run) { 1604 if (is_first_run) {
1757 params.native_widget = new DesktopNativeWidgetAura(widget); 1605 params.native_widget = new PlatformDesktopNativeWidget(widget);
1758 needs_second_run = true; 1606 needs_second_run = true;
1759 } 1607 }
1760 #endif 1608 #endif
1761 widget->Init(params); 1609 widget->Init(params);
1762 widget->CloseNow(); 1610 widget->CloseNow();
1763 return needs_second_run; 1611 return needs_second_run;
1764 } 1612 }
1765 1613
1766 // See description of RunGetNativeThemeFromDestructor() for details. 1614 // See description of RunGetNativeThemeFromDestructor() for details.
1767 TEST_F(WidgetTest, GetNativeThemeFromDestructor) { 1615 TEST_F(WidgetTest, GetNativeThemeFromDestructor) {
(...skipping 27 matching lines...) Expand all
1795 }; 1643 };
1796 1644
1797 // Verifies Close() results in destroying. 1645 // Verifies Close() results in destroying.
1798 TEST_F(WidgetTest, CloseDestroys) { 1646 TEST_F(WidgetTest, CloseDestroys) {
1799 bool destroyed = false; 1647 bool destroyed = false;
1800 CloseDestroysWidget* widget = new CloseDestroysWidget(&destroyed); 1648 CloseDestroysWidget* widget = new CloseDestroysWidget(&destroyed);
1801 Widget::InitParams params = 1649 Widget::InitParams params =
1802 CreateParams(views::Widget::InitParams::TYPE_MENU); 1650 CreateParams(views::Widget::InitParams::TYPE_MENU);
1803 params.opacity = Widget::InitParams::OPAQUE_WINDOW; 1651 params.opacity = Widget::InitParams::OPAQUE_WINDOW;
1804 #if !defined(OS_CHROMEOS) 1652 #if !defined(OS_CHROMEOS)
1805 params.native_widget = new DesktopNativeWidgetAura(widget); 1653 params.native_widget = new PlatformDesktopNativeWidget(widget);
1806 #endif 1654 #endif
1807 widget->Init(params); 1655 widget->Init(params);
1808 widget->Show(); 1656 widget->Show();
1809 widget->Hide(); 1657 widget->Hide();
1810 widget->Close(); 1658 widget->Close();
1811 // Run the message loop as Close() asynchronously deletes. 1659 // Run the message loop as Close() asynchronously deletes.
1812 RunPendingMessages(); 1660 RunPendingMessages();
1813 EXPECT_TRUE(destroyed); 1661 EXPECT_TRUE(destroyed);
1814 // Close() should destroy the widget. If not we'll cleanup to avoid leaks. 1662 // Close() should destroy the widget. If not we'll cleanup to avoid leaks.
1815 if (!destroyed) { 1663 if (!destroyed) {
1816 widget->Detach(); 1664 widget->Detach();
1817 widget->CloseNow(); 1665 widget->CloseNow();
1818 } 1666 }
1819 } 1667 }
1820 1668
1821 // Tests that killing a widget while animating it does not crash. 1669 // Tests that killing a widget while animating it does not crash.
1822 TEST_F(WidgetTest, CloseWidgetWhileAnimating) { 1670 TEST_F(WidgetTest, CloseWidgetWhileAnimating) {
1823 scoped_ptr<Widget> widget(new Widget); 1671 scoped_ptr<Widget> widget(new Widget);
1824 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 1672 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
1825 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1673 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1826 widget->Init(params); 1674 widget->Init(params);
1827 1675
1828 // Normal animations for tests have ZERO_DURATION, make sure we are actually 1676 // Normal animations for tests have ZERO_DURATION, make sure we are actually
1829 // animating the movement. 1677 // animating the movement.
1830 ui::ScopedAnimationDurationScaleMode animation_scale_mode( 1678 ui::ScopedAnimationDurationScaleMode animation_scale_mode(
1831 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); 1679 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
1832 ui::ScopedLayerAnimationSettings animation_settings( 1680 ui::ScopedLayerAnimationSettings animation_settings(
1833 widget->GetNativeWindow()->layer()->GetAnimator()); 1681 widget->GetLayer()->GetAnimator());
1834 widget->Show(); 1682 widget->Show();
1835 // Animate the bounds change. 1683 // Animate the bounds change.
1836 widget->SetBounds(gfx::Rect(0, 0, 200, 200)); 1684 widget->SetBounds(gfx::Rect(0, 0, 200, 200));
1837 } 1685 }
1838 1686
1839 // A view that consumes mouse-pressed event and gesture-tap-down events. 1687 // A view that consumes mouse-pressed event and gesture-tap-down events.
1840 class RootViewTestView : public View { 1688 class RootViewTestView : public View {
1841 public: 1689 public:
1842 RootViewTestView(): View() {} 1690 RootViewTestView(): View() {}
1843 1691
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1999 void RunDestroyChildWidgetsTest(bool top_level_has_desktop_native_widget_aura, 1847 void RunDestroyChildWidgetsTest(bool top_level_has_desktop_native_widget_aura,
2000 bool child_has_desktop_native_widget_aura) { 1848 bool child_has_desktop_native_widget_aura) {
2001 // When a View is destroyed its name is added here. 1849 // When a View is destroyed its name is added here.
2002 std::vector<std::string> destroyed; 1850 std::vector<std::string> destroyed;
2003 1851
2004 Widget* top_level = new Widget; 1852 Widget* top_level = new Widget;
2005 Widget::InitParams params = 1853 Widget::InitParams params =
2006 CreateParams(views::Widget::InitParams::TYPE_WINDOW); 1854 CreateParams(views::Widget::InitParams::TYPE_WINDOW);
2007 #if !defined(OS_CHROMEOS) 1855 #if !defined(OS_CHROMEOS)
2008 if (top_level_has_desktop_native_widget_aura) 1856 if (top_level_has_desktop_native_widget_aura)
2009 params.native_widget = new DesktopNativeWidgetAura(top_level); 1857 params.native_widget = new PlatformDesktopNativeWidget(top_level);
2010 #endif 1858 #endif
2011 top_level->Init(params); 1859 top_level->Init(params);
2012 top_level->GetRootView()->AddChildView( 1860 top_level->GetRootView()->AddChildView(
2013 new DestroyedTrackingView("parent", &destroyed)); 1861 new DestroyedTrackingView("parent", &destroyed));
2014 top_level->Show(); 1862 top_level->Show();
2015 1863
2016 Widget* child = new Widget; 1864 Widget* child = new Widget;
2017 Widget::InitParams child_params = 1865 Widget::InitParams child_params =
2018 CreateParams(views::Widget::InitParams::TYPE_POPUP); 1866 CreateParams(views::Widget::InitParams::TYPE_POPUP);
2019 child_params.parent = top_level->GetNativeView(); 1867 child_params.parent = top_level->GetNativeView();
2020 #if !defined(OS_CHROMEOS) 1868 #if !defined(OS_CHROMEOS)
2021 if (child_has_desktop_native_widget_aura) 1869 if (child_has_desktop_native_widget_aura)
2022 child_params.native_widget = new DesktopNativeWidgetAura(child); 1870 child_params.native_widget = new PlatformDesktopNativeWidget(child);
2023 #endif 1871 #endif
2024 child->Init(child_params); 1872 child->Init(child_params);
2025 child->GetRootView()->AddChildView( 1873 child->GetRootView()->AddChildView(
2026 new DestroyedTrackingView("child", &destroyed)); 1874 new DestroyedTrackingView("child", &destroyed));
2027 child->Show(); 1875 child->Show();
2028 1876
2029 // Should trigger destruction of the child too. 1877 // Should trigger destruction of the child too.
2030 top_level->native_widget_private()->CloseNow(); 1878 top_level->native_widget_private()->CloseNow();
2031 1879
2032 // Child should be destroyed first. 1880 // Child should be destroyed first.
(...skipping 13 matching lines...) Expand all
2046 DestroyChildWidgetsInOrderWithDesktopNativeWidget) { 1894 DestroyChildWidgetsInOrderWithDesktopNativeWidget) {
2047 RunDestroyChildWidgetsTest(true, false); 1895 RunDestroyChildWidgetsTest(true, false);
2048 } 1896 }
2049 1897
2050 // See description of RunDestroyChildWidgetsTest(). Both parent and child use 1898 // See description of RunDestroyChildWidgetsTest(). Both parent and child use
2051 // DesktopNativeWidgetAura. 1899 // DesktopNativeWidgetAura.
2052 TEST_F(WidgetChildDestructionTest, 1900 TEST_F(WidgetChildDestructionTest,
2053 DestroyChildWidgetsInOrderWithDesktopNativeWidgetForBoth) { 1901 DestroyChildWidgetsInOrderWithDesktopNativeWidgetForBoth) {
2054 RunDestroyChildWidgetsTest(true, true); 1902 RunDestroyChildWidgetsTest(true, true);
2055 } 1903 }
2056 #endif 1904 #endif // !defined(OS_CHROMEOS)
2057 1905
2058 // See description of RunDestroyChildWidgetsTest(). 1906 // See description of RunDestroyChildWidgetsTest().
2059 TEST_F(WidgetChildDestructionTest, DestroyChildWidgetsInOrder) { 1907 TEST_F(WidgetChildDestructionTest, DestroyChildWidgetsInOrder) {
2060 RunDestroyChildWidgetsTest(false, false); 1908 RunDestroyChildWidgetsTest(false, false);
2061 } 1909 }
2062 1910
2063 #if !defined(OS_CHROMEOS) 1911 #if !defined(OS_CHROMEOS)
2064 // Provides functionality to create a window modal dialog. 1912 // Provides functionality to create a window modal dialog.
2065 class ModalDialogDelegate : public DialogDelegateView { 1913 class ModalDialogDelegate : public DialogDelegateView {
2066 public: 1914 public:
(...skipping 13 matching lines...) Expand all
2080 // displayed are eaten or recieved by the dialog. 1928 // displayed are eaten or recieved by the dialog.
2081 TEST_F(WidgetTest, WindowMouseModalityTest) { 1929 TEST_F(WidgetTest, WindowMouseModalityTest) {
2082 // Create a top level widget. 1930 // Create a top level widget.
2083 Widget top_level_widget; 1931 Widget top_level_widget;
2084 Widget::InitParams init_params = 1932 Widget::InitParams init_params =
2085 CreateParams(Widget::InitParams::TYPE_WINDOW); 1933 CreateParams(Widget::InitParams::TYPE_WINDOW);
2086 init_params.show_state = ui::SHOW_STATE_NORMAL; 1934 init_params.show_state = ui::SHOW_STATE_NORMAL;
2087 gfx::Rect initial_bounds(0, 0, 500, 500); 1935 gfx::Rect initial_bounds(0, 0, 500, 500);
2088 init_params.bounds = initial_bounds; 1936 init_params.bounds = initial_bounds;
2089 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 1937 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2090 init_params.native_widget = new DesktopNativeWidgetAura(&top_level_widget); 1938 init_params.native_widget =
1939 new PlatformDesktopNativeWidget(&top_level_widget);
2091 top_level_widget.Init(init_params); 1940 top_level_widget.Init(init_params);
2092 top_level_widget.Show(); 1941 top_level_widget.Show();
2093 EXPECT_TRUE(top_level_widget.IsVisible()); 1942 EXPECT_TRUE(top_level_widget.IsVisible());
2094 1943
2095 // Create a view and validate that a mouse moves makes it to the view. 1944 // Create a view and validate that a mouse moves makes it to the view.
2096 EventCountView* widget_view = new EventCountView(); 1945 EventCountView* widget_view = new EventCountView();
2097 widget_view->SetBounds(0, 0, 10, 10); 1946 widget_view->SetBounds(0, 0, 10, 10);
2098 top_level_widget.GetRootView()->AddChildView(widget_view); 1947 top_level_widget.GetRootView()->AddChildView(widget_view);
2099 1948
2100 gfx::Point cursor_location_main(5, 5); 1949 gfx::Point cursor_location_main(5, 5);
2101 ui::MouseEvent move_main(ui::ET_MOUSE_MOVED, 1950 ui::MouseEvent move_main(ui::ET_MOUSE_MOVED,
2102 cursor_location_main, 1951 cursor_location_main,
2103 cursor_location_main, 1952 cursor_location_main,
2104 ui::EF_NONE, 1953 ui::EF_NONE,
2105 ui::EF_NONE); 1954 ui::EF_NONE);
2106 ui::EventDispatchDetails details = top_level_widget.GetNativeView()-> 1955 ui::EventDispatchDetails details =
2107 GetHost()->event_processor()->OnEventFromSource(&move_main); 1956 GetEventProcessor(&top_level_widget)->OnEventFromSource(&move_main);
2108 ASSERT_FALSE(details.dispatcher_destroyed); 1957 ASSERT_FALSE(details.dispatcher_destroyed);
2109 1958
2110 EXPECT_EQ(1, widget_view->GetEventCount(ui::ET_MOUSE_ENTERED)); 1959 EXPECT_EQ(1, widget_view->GetEventCount(ui::ET_MOUSE_ENTERED));
2111 widget_view->ResetCounts(); 1960 widget_view->ResetCounts();
2112 1961
2113 // Create a modal dialog and validate that a mouse down message makes it to 1962 // Create a modal dialog and validate that a mouse down message makes it to
2114 // the main view within the dialog. 1963 // the main view within the dialog.
2115 1964
2116 // This instance will be destroyed when the dialog is destroyed. 1965 // This instance will be destroyed when the dialog is destroyed.
2117 ModalDialogDelegate* dialog_delegate = new ModalDialogDelegate; 1966 ModalDialogDelegate* dialog_delegate = new ModalDialogDelegate;
2118 1967
2119 Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget( 1968 Widget* modal_dialog_widget = views::DialogDelegate::CreateDialogWidget(
2120 dialog_delegate, NULL, top_level_widget.GetNativeWindow()); 1969 dialog_delegate, NULL, top_level_widget.GetNativeView());
2121 modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200)); 1970 modal_dialog_widget->SetBounds(gfx::Rect(100, 100, 200, 200));
2122 EventCountView* dialog_widget_view = new EventCountView(); 1971 EventCountView* dialog_widget_view = new EventCountView();
2123 dialog_widget_view->SetBounds(0, 0, 50, 50); 1972 dialog_widget_view->SetBounds(0, 0, 50, 50);
2124 modal_dialog_widget->GetRootView()->AddChildView(dialog_widget_view); 1973 modal_dialog_widget->GetRootView()->AddChildView(dialog_widget_view);
2125 modal_dialog_widget->Show(); 1974 modal_dialog_widget->Show();
2126 EXPECT_TRUE(modal_dialog_widget->IsVisible()); 1975 EXPECT_TRUE(modal_dialog_widget->IsVisible());
2127 1976
2128 gfx::Point cursor_location_dialog(100, 100); 1977 gfx::Point cursor_location_dialog(100, 100);
2129 ui::MouseEvent mouse_down_dialog(ui::ET_MOUSE_PRESSED, 1978 ui::MouseEvent mouse_down_dialog(ui::ET_MOUSE_PRESSED,
2130 cursor_location_dialog, 1979 cursor_location_dialog,
2131 cursor_location_dialog, 1980 cursor_location_dialog,
2132 ui::EF_NONE, 1981 ui::EF_NONE,
2133 ui::EF_NONE); 1982 ui::EF_NONE);
2134 details = top_level_widget.GetNativeView()->GetHost()->event_processor()-> 1983 details = GetEventProcessor(&top_level_widget)->OnEventFromSource(
2135 OnEventFromSource(&mouse_down_dialog); 1984 &mouse_down_dialog);
2136 ASSERT_FALSE(details.dispatcher_destroyed); 1985 ASSERT_FALSE(details.dispatcher_destroyed);
2137 EXPECT_EQ(1, dialog_widget_view->GetEventCount(ui::ET_MOUSE_PRESSED)); 1986 EXPECT_EQ(1, dialog_widget_view->GetEventCount(ui::ET_MOUSE_PRESSED));
2138 1987
2139 // Send a mouse move message to the main window. It should not be received by 1988 // 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. 1989 // the main window as the modal dialog is still active.
2141 gfx::Point cursor_location_main2(6, 6); 1990 gfx::Point cursor_location_main2(6, 6);
2142 ui::MouseEvent mouse_down_main(ui::ET_MOUSE_MOVED, 1991 ui::MouseEvent mouse_down_main(ui::ET_MOUSE_MOVED,
2143 cursor_location_main2, 1992 cursor_location_main2,
2144 cursor_location_main2, 1993 cursor_location_main2,
2145 ui::EF_NONE, 1994 ui::EF_NONE,
2146 ui::EF_NONE); 1995 ui::EF_NONE);
2147 details = top_level_widget.GetNativeView()->GetHost()->event_processor()-> 1996 details = GetEventProcessor(&top_level_widget)->OnEventFromSource(
2148 OnEventFromSource(&mouse_down_main); 1997 &mouse_down_main);
2149 ASSERT_FALSE(details.dispatcher_destroyed); 1998 ASSERT_FALSE(details.dispatcher_destroyed);
2150 EXPECT_EQ(0, widget_view->GetEventCount(ui::ET_MOUSE_MOVED)); 1999 EXPECT_EQ(0, widget_view->GetEventCount(ui::ET_MOUSE_MOVED));
2151 2000
2152 modal_dialog_widget->CloseNow(); 2001 modal_dialog_widget->CloseNow();
2153 top_level_widget.CloseNow(); 2002 top_level_widget.CloseNow();
2154 } 2003 }
2155 2004
2156 // Verifies nativeview visbility matches that of Widget visibility when 2005 // Verifies nativeview visbility matches that of Widget visibility when
2157 // SetFullscreen is invoked. 2006 // SetFullscreen is invoked.
2158 TEST_F(WidgetTest, FullscreenStatePropagated) { 2007 TEST_F(WidgetTest, FullscreenStatePropagated) {
2159 Widget::InitParams init_params = 2008 Widget::InitParams init_params =
2160 CreateParams(Widget::InitParams::TYPE_WINDOW); 2009 CreateParams(Widget::InitParams::TYPE_WINDOW);
2161 init_params.show_state = ui::SHOW_STATE_NORMAL; 2010 init_params.show_state = ui::SHOW_STATE_NORMAL;
2162 init_params.bounds = gfx::Rect(0, 0, 500, 500); 2011 init_params.bounds = gfx::Rect(0, 0, 500, 500);
2163 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 2012 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2164 2013
2165 { 2014 {
2166 Widget top_level_widget; 2015 Widget top_level_widget;
2167 top_level_widget.Init(init_params); 2016 top_level_widget.Init(init_params);
2168 top_level_widget.SetFullscreen(true); 2017 top_level_widget.SetFullscreen(true);
2169 EXPECT_EQ(top_level_widget.IsVisible(), 2018 EXPECT_EQ(top_level_widget.IsVisible(),
2170 top_level_widget.GetNativeView()->IsVisible()); 2019 IsNativeWindowVisible(top_level_widget.GetNativeWindow()));
2171 top_level_widget.CloseNow(); 2020 top_level_widget.CloseNow();
2172 } 2021 }
2173 2022
2174 #if !defined(OS_CHROMEOS)
2175 { 2023 {
2176 Widget top_level_widget; 2024 Widget top_level_widget;
2177 init_params.native_widget = new DesktopNativeWidgetAura(&top_level_widget); 2025 init_params.native_widget =
2026 new PlatformDesktopNativeWidget(&top_level_widget);
2178 top_level_widget.Init(init_params); 2027 top_level_widget.Init(init_params);
2179 top_level_widget.SetFullscreen(true); 2028 top_level_widget.SetFullscreen(true);
2180 EXPECT_EQ(top_level_widget.IsVisible(), 2029 EXPECT_EQ(top_level_widget.IsVisible(),
2181 top_level_widget.GetNativeView()->IsVisible()); 2030 IsNativeWindowVisible(top_level_widget.GetNativeWindow()));
2182 top_level_widget.CloseNow(); 2031 top_level_widget.CloseNow();
2183 } 2032 }
2184 #endif
2185 } 2033 }
2186 2034
2187 #if defined(OS_WIN) 2035 #if defined(OS_WIN)
2188 2036
2189 // Provides functionality to test widget activation via an activation flag 2037 // Provides functionality to test widget activation via an activation flag
2190 // which can be set by an accessor. 2038 // which can be set by an accessor.
2191 class ModalWindowTestWidgetDelegate : public WidgetDelegate { 2039 class ModalWindowTestWidgetDelegate : public WidgetDelegate {
2192 public: 2040 public:
2193 ModalWindowTestWidgetDelegate() 2041 ModalWindowTestWidgetDelegate()
2194 : widget_(NULL), 2042 : widget_(NULL),
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2268 LRESULT activate_result = ::SendMessage( 2116 LRESULT activate_result = ::SendMessage(
2269 win32_window, 2117 win32_window,
2270 WM_MOUSEACTIVATE, 2118 WM_MOUSEACTIVATE,
2271 reinterpret_cast<WPARAM>(win32_window), 2119 reinterpret_cast<WPARAM>(win32_window),
2272 MAKELPARAM(WM_LBUTTONDOWN, HTCLIENT)); 2120 MAKELPARAM(WM_LBUTTONDOWN, HTCLIENT));
2273 EXPECT_EQ(activate_result, MA_ACTIVATE); 2121 EXPECT_EQ(activate_result, MA_ACTIVATE);
2274 2122
2275 modal_dialog_widget->CloseNow(); 2123 modal_dialog_widget->CloseNow();
2276 top_level_widget.CloseNow(); 2124 top_level_widget.CloseNow();
2277 } 2125 }
2278 #endif 2126 #endif // defined(OS_WIN)
2279 #endif 2127 #endif // !defined(OS_CHROMEOS)
2280 2128
2281 TEST_F(WidgetTest, ShowCreatesActiveWindow) { 2129 TEST_F(WidgetTest, ShowCreatesActiveWindow) {
2282 Widget* widget = CreateTopLevelPlatformWidget(); 2130 Widget* widget = CreateTopLevelPlatformWidget();
2283 2131
2284 widget->Show(); 2132 widget->Show();
2285 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); 2133 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL);
2286 2134
2287 widget->CloseNow(); 2135 widget->CloseNow();
2288 } 2136 }
2289 2137
(...skipping 27 matching lines...) Expand all
2317 } 2165 }
2318 2166
2319 #if !defined(OS_CHROMEOS) 2167 #if !defined(OS_CHROMEOS)
2320 TEST_F(WidgetTest, InactiveWidgetDoesNotGrabActivation) { 2168 TEST_F(WidgetTest, InactiveWidgetDoesNotGrabActivation) {
2321 Widget* widget = CreateTopLevelPlatformWidget(); 2169 Widget* widget = CreateTopLevelPlatformWidget();
2322 widget->Show(); 2170 widget->Show();
2323 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); 2171 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL);
2324 2172
2325 Widget widget2; 2173 Widget widget2;
2326 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 2174 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
2327 params.native_widget = new DesktopNativeWidgetAura(&widget2); 2175 params.native_widget = new PlatformDesktopNativeWidget(&widget2);
2328 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 2176 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2329 widget2.Init(params); 2177 widget2.Init(params);
2330 widget2.Show(); 2178 widget2.Show();
2331 2179
2332 EXPECT_EQ(GetWidgetShowState(&widget2), ui::SHOW_STATE_INACTIVE); 2180 EXPECT_EQ(GetWidgetShowState(&widget2), ui::SHOW_STATE_INACTIVE);
2333 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL); 2181 EXPECT_EQ(GetWidgetShowState(widget), ui::SHOW_STATE_NORMAL);
2334 2182
2335 widget->CloseNow(); 2183 widget->CloseNow();
2336 widget2.CloseNow(); 2184 widget2.CloseNow();
2337 } 2185 }
2338 #endif 2186 #endif // !defined(OS_CHROMEOS)
2339 2187
2340 namespace { 2188 namespace {
2341 2189
2342 class FullscreenAwareFrame : public views::NonClientFrameView { 2190 class FullscreenAwareFrame : public views::NonClientFrameView {
2343 public: 2191 public:
2344 explicit FullscreenAwareFrame(views::Widget* widget) 2192 explicit FullscreenAwareFrame(views::Widget* widget)
2345 : widget_(widget), fullscreen_layout_called_(false) {} 2193 : widget_(widget), fullscreen_layout_called_(false) {}
2346 virtual ~FullscreenAwareFrame() {} 2194 virtual ~FullscreenAwareFrame() {}
2347 2195
2348 // views::NonClientFrameView overrides: 2196 // views::NonClientFrameView overrides:
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
2418 } // namespace 2266 } // namespace
2419 2267
2420 // Verifies Widget::IsActive() invoked from 2268 // Verifies Widget::IsActive() invoked from
2421 // WidgetObserver::OnWidgetDestroying() in a child widget doesn't crash. 2269 // WidgetObserver::OnWidgetDestroying() in a child widget doesn't crash.
2422 TEST_F(WidgetTest, IsActiveFromDestroy) { 2270 TEST_F(WidgetTest, IsActiveFromDestroy) {
2423 // Create two widgets, one a child of the other. 2271 // Create two widgets, one a child of the other.
2424 IsActiveFromDestroyObserver observer; 2272 IsActiveFromDestroyObserver observer;
2425 Widget parent_widget; 2273 Widget parent_widget;
2426 Widget::InitParams parent_params = 2274 Widget::InitParams parent_params =
2427 CreateParams(Widget::InitParams::TYPE_POPUP); 2275 CreateParams(Widget::InitParams::TYPE_POPUP);
2428 parent_params.native_widget = new DesktopNativeWidgetAura(&parent_widget); 2276 parent_params.native_widget = new PlatformDesktopNativeWidget(&parent_widget);
2429 parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 2277 parent_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2430 parent_widget.Init(parent_params); 2278 parent_widget.Init(parent_params);
2431 parent_widget.Show(); 2279 parent_widget.Show();
2432 2280
2433 Widget child_widget; 2281 Widget child_widget;
2434 Widget::InitParams child_params = 2282 Widget::InitParams child_params =
2435 CreateParams(Widget::InitParams::TYPE_POPUP); 2283 CreateParams(Widget::InitParams::TYPE_POPUP);
2436 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 2284 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2437 child_params.context = parent_widget.GetNativeView(); 2285 child_params.context = parent_widget.GetNativeView();
2438 child_widget.Init(child_params); 2286 child_widget.Init(child_params);
2439 child_widget.AddObserver(&observer); 2287 child_widget.AddObserver(&observer);
2440 child_widget.Show(); 2288 child_widget.Show();
2441 2289
2442 parent_widget.CloseNow(); 2290 parent_widget.CloseNow();
2443 } 2291 }
2444 #endif 2292 #endif // !defined(OS_CHROMEOS)
2293
2294 // Tests that events propagate through from the dispatcher with the correct
2295 // event type, and that the different platforms behave the same.
2296 TEST_F(WidgetTest, MouseEventTypesViaGenerator) {
2297 EventCountView* view = new EventCountView;
2298 view->SetBounds(10, 10, 50, 40);
2299
2300 Widget* widget = CreateTopLevelPlatformWidget();
2301 widget->GetRootView()->AddChildView(view);
2302
2303 widget->SetBounds(gfx::Rect(0, 0, 100, 80));
2304
2305 test::WidgetEventGenerator generator(widget);
2306 generator.set_current_location(gfx::Point(20, 20));
2307
2308 generator.ClickLeftButton();
2309 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2310 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2311 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags());
2312
2313 generator.PressRightButton();
2314 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2315 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2316 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, view->last_flags());
2317
2318 generator.ReleaseRightButton();
2319 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2320 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2321 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, view->last_flags());
2322
2323 // Test mouse move events.
Andre 2014/06/17 21:17:56 In Cocoa, mouseEntered: and mouseExited: are sent
tapted 2014/06/18 08:28:06 Yeah - EmulateSendEvent in the event generator cur
2324 EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_MOVED));
2325 EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2326
2327 // Move the mouse within the view (20, 20) -> (30, 30).
2328 generator.MoveMouseTo(gfx::Point(30, 30));
2329 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_MOVED));
2330 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2331 EXPECT_EQ(ui::EF_NONE, view->last_flags());
2332
2333 // Move it again - entered count shouldn't change.
2334 generator.MoveMouseTo(gfx::Point(31, 31));
2335 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_MOVED));
2336 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2337 EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_EXITED));
2338
2339 // Move it off the view.
2340 generator.MoveMouseTo(gfx::Point(5, 5));
2341 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_MOVED));
Andre 2014/06/17 21:17:56 MOUSE_MOVED does not increase to 3 here? Seems a l
tapted 2014/06/18 08:28:06 I think that's reasonable - if a MOUSEMOVED were s
2342 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_EXITED));
2343
2344 // Move it back on.
2345 generator.MoveMouseTo(gfx::Point(20, 20));
2346 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_MOVED));
2347 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2348 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_EXITED));
2349
2350 // Drargging. Cover HasCapture() and NativeWidgetPrivate::IsMouseButtonDown().
2351 generator.DragMouseTo(gfx::Point(40, 40));
2352 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2353 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2354 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_DRAGGED));
2355 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags());
2356
2357 widget->CloseNow();
2358 }
2445 2359
2446 } // namespace test 2360 } // namespace test
2447 } // namespace views 2361 } // namespace views
OLDNEW
« ui/views/test/widget_test_mac.mm ('K') | « ui/views/widget/native_widget_mac.mm ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698