OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "ui/views/widget/native_widget_mac.h" | 5 #include "ui/views/widget/native_widget_mac.h" |
6 | 6 |
7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 | 8 |
| 9 #import "base/mac/mac_util.h" |
9 #import "base/mac/scoped_nsobject.h" | 10 #import "base/mac/scoped_nsobject.h" |
10 #include "base/macros.h" | 11 #include "base/macros.h" |
11 #import "ui/base/test/windowed_nsnotification_observer.h" | 12 #import "ui/base/test/windowed_nsnotification_observer.h" |
| 13 #include "ui/views/bubble/bubble_delegate.h" |
12 #include "ui/views/test/test_widget_observer.h" | 14 #include "ui/views/test/test_widget_observer.h" |
13 #include "ui/views/test/widget_test.h" | 15 #include "ui/views/test/widget_test.h" |
14 | 16 |
15 namespace views { | 17 namespace views { |
16 namespace test { | 18 namespace test { |
17 | 19 |
18 // Tests for NativeWidgetMac that rely on global window manager state, and can | 20 // Tests for NativeWidgetMac that rely on global window manager state, and can |
19 // not be parallelized. | 21 // not be parallelized. |
20 class NativeWidgetMacInteractiveUITest | 22 class NativeWidgetMacInteractiveUITest |
21 : public WidgetTest, | 23 : public WidgetTest, |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 // Activating the inactive widget should make it key, asynchronously. | 128 // Activating the inactive widget should make it key, asynchronously. |
127 widget->Activate(); | 129 widget->Activate(); |
128 [waiter wait]; | 130 [waiter wait]; |
129 EXPECT_EQ(1, [waiter notificationCount]); | 131 EXPECT_EQ(1, [waiter notificationCount]); |
130 EXPECT_TRUE(widget->IsActive()); | 132 EXPECT_TRUE(widget->IsActive()); |
131 EXPECT_TRUE([widget->GetNativeWindow() isKeyWindow]); | 133 EXPECT_TRUE([widget->GetNativeWindow() isKeyWindow]); |
132 | 134 |
133 widget->CloseNow(); | 135 widget->CloseNow(); |
134 } | 136 } |
135 | 137 |
| 138 namespace { |
| 139 |
| 140 // Show |widget| and wait for it to become the key window. |
| 141 void ShowKeyWindow(Widget* widget) { |
| 142 base::scoped_nsobject<WindowedNSNotificationObserver> waiter( |
| 143 [[WindowedNSNotificationObserver alloc] |
| 144 initForNotification:NSWindowDidBecomeKeyNotification |
| 145 object:widget->GetNativeWindow()]); |
| 146 widget->Show(); |
| 147 EXPECT_TRUE([waiter wait]); |
| 148 EXPECT_TRUE([widget->GetNativeWindow() isKeyWindow]); |
| 149 } |
| 150 |
| 151 NSData* ViewAsTIFF(NSView* view) { |
| 152 NSBitmapImageRep* bitmap = |
| 153 [view bitmapImageRepForCachingDisplayInRect:[view bounds]]; |
| 154 [view cacheDisplayInRect:[view bounds] toBitmapImageRep:bitmap]; |
| 155 return [bitmap TIFFRepresentation]; |
| 156 } |
| 157 } |
| 158 |
| 159 // Test that parent windows keep their traffic lights enabled when showing |
| 160 // dialogs. |
| 161 TEST_F(NativeWidgetMacInteractiveUITest, ParentWindowTrafficLights) { |
| 162 // Snow leopard doesn't have -[NSWindow _sharesParentKeyState]. |
| 163 if (base::mac::IsOSSnowLeopard()) |
| 164 return; |
| 165 |
| 166 Widget* parent_widget = CreateTopLevelPlatformWidget(); |
| 167 parent_widget->SetBounds(gfx::Rect(100, 100, 100, 100)); |
| 168 ShowKeyWindow(parent_widget); |
| 169 |
| 170 NSWindow* parent = parent_widget->GetNativeWindow(); |
| 171 EXPECT_TRUE([parent isMainWindow]); |
| 172 |
| 173 NSButton* button = [parent standardWindowButton:NSWindowCloseButton]; |
| 174 EXPECT_TRUE(button); |
| 175 NSData* active_button_image = ViewAsTIFF(button); |
| 176 EXPECT_TRUE(active_button_image); |
| 177 |
| 178 // Create an activatable frameless child. Frameless so that it doesn't have |
| 179 // traffic lights of its own, and activatable so that it can take key status. |
| 180 Widget* child_widget = new Widget; |
| 181 Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
| 182 params.native_widget = new NativeWidgetMac(child_widget); |
| 183 params.bounds = gfx::Rect(130, 130, 100, 100); |
| 184 params.parent = parent_widget->GetNativeView(); |
| 185 child_widget->Init(params); |
| 186 ShowKeyWindow(child_widget); |
| 187 |
| 188 // Ensure the button instance is still valid. |
| 189 EXPECT_EQ(button, [parent standardWindowButton:NSWindowCloseButton]); |
| 190 |
| 191 // Parent window should still be main, and have its traffic lights active. |
| 192 EXPECT_TRUE([parent isMainWindow]); |
| 193 EXPECT_FALSE([parent isKeyWindow]); |
| 194 |
| 195 // Enabled status doesn't actually change, but check anyway. |
| 196 EXPECT_TRUE([button isEnabled]); |
| 197 NSData* button_image_with_child = ViewAsTIFF(button); |
| 198 EXPECT_TRUE([active_button_image isEqualToData:button_image_with_child]); |
| 199 |
| 200 // Verify that activating some other random window does change the button. |
| 201 Widget* other_widget = CreateTopLevelPlatformWidget(); |
| 202 other_widget->SetBounds(gfx::Rect(200, 200, 100, 100)); |
| 203 ShowKeyWindow(other_widget); |
| 204 EXPECT_FALSE([parent isMainWindow]); |
| 205 EXPECT_FALSE([parent isKeyWindow]); |
| 206 EXPECT_TRUE([button isEnabled]); |
| 207 NSData* inactive_button_image = ViewAsTIFF(button); |
| 208 EXPECT_FALSE([active_button_image isEqualToData:inactive_button_image]); |
| 209 |
| 210 other_widget->CloseNow(); |
| 211 parent_widget->CloseNow(); |
| 212 } |
| 213 |
136 INSTANTIATE_TEST_CASE_P(NativeWidgetMacInteractiveUITestInstance, | 214 INSTANTIATE_TEST_CASE_P(NativeWidgetMacInteractiveUITestInstance, |
137 NativeWidgetMacInteractiveUITest, | 215 NativeWidgetMacInteractiveUITest, |
138 ::testing::Bool()); | 216 ::testing::Bool()); |
139 | 217 |
140 } // namespace test | 218 } // namespace test |
141 } // namespace views | 219 } // namespace views |
OLD | NEW |