Chromium Code Reviews| 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" | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |