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 } | |
Robert Sesek
2016/01/21 23:41:35
" // namespace" and a line before
tapted
2016/01/22 00:28:06
Done.
| |
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]); | |
tapted
2016/01/22 00:28:06
yegads AppKit. So with the bridge()->parent() => [
| |
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]); | |
tapted
2016/01/21 23:02:27
oops#2 - I meant to comment on this too that this
| |
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 |