OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #import "ui/views/widget/native_widget_mac.h" |
| 6 |
| 7 #import <Cocoa/Cocoa.h> |
| 8 |
| 9 #include "ui/views/test/test_widget_observer.h" |
| 10 #include "ui/views/test/widget_test.h" |
| 11 |
| 12 namespace views { |
| 13 namespace test { |
| 14 |
| 15 // Tests for parts of NativeWidgetMac not covered by BridgedNativeWidget, which |
| 16 // need access to Cocoa APIs. |
| 17 typedef WidgetTest NativeWidgetMacTest; |
| 18 |
| 19 class WidgetChangeObserver : public TestWidgetObserver { |
| 20 public: |
| 21 WidgetChangeObserver(Widget* widget) |
| 22 : TestWidgetObserver(widget), |
| 23 bounds_changed_count_(0), |
| 24 gained_visible_count_(0), |
| 25 lost_visible_count_(0) {} |
| 26 |
| 27 gfx::Rect last_bounds_when_changed() const { |
| 28 return last_bounds_when_changed_; |
| 29 } |
| 30 int bounds_changed_count() const { return bounds_changed_count_; } |
| 31 int gained_visible_count() const { return gained_visible_count_; } |
| 32 int lost_visible_count() const { return lost_visible_count_; } |
| 33 |
| 34 private: |
| 35 // WidgetObserver: |
| 36 virtual void OnWidgetVisibilityChanged(Widget* widget, |
| 37 bool visible) OVERRIDE { |
| 38 ++(visible ? gained_visible_count_ : lost_visible_count_); |
| 39 } |
| 40 |
| 41 virtual void OnWidgetBoundsChanged(Widget* widget, |
| 42 const gfx::Rect& new_bounds) OVERRIDE { |
| 43 ++bounds_changed_count_; |
| 44 last_bounds_when_changed_ = new_bounds; |
| 45 } |
| 46 |
| 47 gfx::Rect last_bounds_when_changed_; |
| 48 int bounds_changed_count_; |
| 49 |
| 50 int gained_visible_count_; |
| 51 int lost_visible_count_; |
| 52 |
| 53 DISALLOW_COPY_AND_ASSIGN(WidgetChangeObserver); |
| 54 }; |
| 55 |
| 56 // Test visibility states triggered externally. |
| 57 TEST_F(NativeWidgetMacTest, HideAndShowExternally) { |
| 58 Widget* widget = CreateTopLevelPlatformWidget(); |
| 59 NSWindow* ns_window = widget->GetNativeWindow(); |
| 60 WidgetChangeObserver observer(widget); |
| 61 |
| 62 // Should initially be hidden. |
| 63 EXPECT_FALSE(widget->IsVisible()); |
| 64 EXPECT_FALSE([ns_window isVisible]); |
| 65 EXPECT_EQ(0, observer.gained_visible_count()); |
| 66 EXPECT_EQ(0, observer.lost_visible_count()); |
| 67 |
| 68 widget->Show(); |
| 69 EXPECT_TRUE(widget->IsVisible()); |
| 70 EXPECT_TRUE([ns_window isVisible]); |
| 71 EXPECT_EQ(1, observer.gained_visible_count()); |
| 72 EXPECT_EQ(0, observer.lost_visible_count()); |
| 73 |
| 74 widget->Hide(); |
| 75 EXPECT_FALSE(widget->IsVisible()); |
| 76 EXPECT_FALSE([ns_window isVisible]); |
| 77 EXPECT_EQ(1, observer.gained_visible_count()); |
| 78 EXPECT_EQ(1, observer.lost_visible_count()); |
| 79 |
| 80 widget->Show(); |
| 81 EXPECT_TRUE(widget->IsVisible()); |
| 82 EXPECT_TRUE([ns_window isVisible]); |
| 83 EXPECT_EQ(2, observer.gained_visible_count()); |
| 84 EXPECT_EQ(1, observer.lost_visible_count()); |
| 85 |
| 86 // Test when hiding individual windows. |
| 87 [ns_window orderOut:nil]; |
| 88 EXPECT_FALSE(widget->IsVisible()); |
| 89 EXPECT_FALSE([ns_window isVisible]); |
| 90 EXPECT_EQ(2, observer.gained_visible_count()); |
| 91 EXPECT_EQ(2, observer.lost_visible_count()); |
| 92 |
| 93 [ns_window orderFront:nil]; |
| 94 EXPECT_TRUE(widget->IsVisible()); |
| 95 EXPECT_TRUE([ns_window isVisible]); |
| 96 EXPECT_EQ(3, observer.gained_visible_count()); |
| 97 EXPECT_EQ(2, observer.lost_visible_count()); |
| 98 |
| 99 // Test when hiding the entire application. This doesn't send an orderOut: |
| 100 // to the NSWindow. |
| 101 [NSApp hide:nil]; |
| 102 EXPECT_FALSE(widget->IsVisible()); |
| 103 EXPECT_FALSE([ns_window isVisible]); |
| 104 EXPECT_EQ(3, observer.gained_visible_count()); |
| 105 EXPECT_EQ(3, observer.lost_visible_count()); |
| 106 |
| 107 [NSApp unhideWithoutActivation]; |
| 108 EXPECT_TRUE(widget->IsVisible()); |
| 109 EXPECT_TRUE([ns_window isVisible]); |
| 110 EXPECT_EQ(4, observer.gained_visible_count()); |
| 111 EXPECT_EQ(3, observer.lost_visible_count()); |
| 112 |
| 113 // Hide again to test unhiding with an activation. |
| 114 [NSApp hide:nil]; |
| 115 EXPECT_EQ(4, observer.lost_visible_count()); |
| 116 [NSApp unhide:nil]; |
| 117 EXPECT_EQ(5, observer.gained_visible_count()); |
| 118 |
| 119 // No change when closing. |
| 120 widget->CloseNow(); |
| 121 EXPECT_EQ(4, observer.lost_visible_count()); |
| 122 EXPECT_EQ(5, observer.gained_visible_count()); |
| 123 } |
| 124 |
| 125 // Test minimized states triggered externally, implied visibility and restored |
| 126 // bounds whilst minimized. |
| 127 TEST_F(NativeWidgetMacTest, MiniaturizeExternally) { |
| 128 Widget* widget = CreateTopLevelPlatformWidget(); |
| 129 NSWindow* ns_window = widget->GetNativeWindow(); |
| 130 WidgetChangeObserver observer(widget); |
| 131 |
| 132 widget->Show(); |
| 133 EXPECT_EQ(1, observer.gained_visible_count()); |
| 134 EXPECT_EQ(0, observer.lost_visible_count()); |
| 135 const gfx::Rect restored_bounds = widget->GetRestoredBounds(); |
| 136 EXPECT_FALSE(restored_bounds.IsEmpty()); |
| 137 |
| 138 [ns_window miniaturize:nil]; |
| 139 |
| 140 EXPECT_TRUE(widget->IsMinimized()); |
| 141 EXPECT_FALSE(widget->IsVisible()); |
| 142 EXPECT_EQ(1, observer.gained_visible_count()); |
| 143 EXPECT_EQ(1, observer.lost_visible_count()); |
| 144 EXPECT_EQ(restored_bounds, widget->GetRestoredBounds()); |
| 145 |
| 146 [ns_window deminiaturize:nil]; |
| 147 EXPECT_FALSE(widget->IsMinimized()); |
| 148 EXPECT_TRUE(widget->IsVisible()); |
| 149 EXPECT_EQ(2, observer.gained_visible_count()); |
| 150 EXPECT_EQ(1, observer.lost_visible_count()); |
| 151 EXPECT_EQ(restored_bounds, widget->GetRestoredBounds()); |
| 152 |
| 153 EXPECT_FALSE([ns_window isMiniaturized]); |
| 154 widget->Minimize(); |
| 155 EXPECT_TRUE(widget->IsMinimized()); |
| 156 EXPECT_TRUE([ns_window isMiniaturized]); |
| 157 EXPECT_EQ(2, observer.gained_visible_count()); |
| 158 EXPECT_EQ(2, observer.lost_visible_count()); |
| 159 EXPECT_EQ(restored_bounds, widget->GetRestoredBounds()); |
| 160 |
| 161 widget->Restore(); // If miniaturized, should deminiaturize. |
| 162 EXPECT_FALSE(widget->IsMinimized()); |
| 163 EXPECT_FALSE([ns_window isMiniaturized]); |
| 164 EXPECT_EQ(3, observer.gained_visible_count()); |
| 165 EXPECT_EQ(2, observer.lost_visible_count()); |
| 166 EXPECT_EQ(restored_bounds, widget->GetRestoredBounds()); |
| 167 |
| 168 widget->Restore(); // If not miniaturized, does nothing. |
| 169 EXPECT_FALSE(widget->IsMinimized()); |
| 170 EXPECT_FALSE([ns_window isMiniaturized]); |
| 171 EXPECT_EQ(3, observer.gained_visible_count()); |
| 172 EXPECT_EQ(2, observer.lost_visible_count()); |
| 173 EXPECT_EQ(restored_bounds, widget->GetRestoredBounds()); |
| 174 } |
| 175 |
| 176 // Test moving and resizing the window externally. |
| 177 TEST_F(NativeWidgetMacTest, MoveAndResizeExternally) { |
| 178 Widget* widget = new Widget; // Note: will be owned by NativeWidgetMac. |
| 179 |
| 180 // Start observing early. |
| 181 WidgetChangeObserver observer(widget); |
| 182 widget->Init(Widget::InitParams()); |
| 183 |
| 184 EXPECT_EQ(0, observer.bounds_changed_count()); |
| 185 widget->Show(); |
| 186 |
| 187 // Should be one change when going on screen. |
| 188 EXPECT_EQ(1, observer.bounds_changed_count()); |
| 189 |
| 190 // Make sure it hasn't changed since. |
| 191 EXPECT_EQ(observer.last_bounds_when_changed(), |
| 192 widget->GetWindowBoundsInScreen()); |
| 193 EXPECT_EQ(observer.last_bounds_when_changed(), widget->GetRestoredBounds()); |
| 194 } |
| 195 |
| 196 } // namespace test |
| 197 } // namespace views |
OLD | NEW |