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

Side by Side Diff: chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm

Issue 1109493002: [MacViews] Fix behavior of non-resizable windows in fullscreen. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 // This file tests whichever implementation of NativeAppWindow is used. 5 // This file tests whichever implementation of NativeAppWindow is used.
6 // I.e. it could be NativeAppWindowCocoa or ChromeNativeAppWindowViewsMac. 6 // I.e. it could be NativeAppWindowCocoa or ChromeNativeAppWindowViewsMac.
7 #include "extensions/browser/app_window/native_app_window.h" 7 #include "extensions/browser/app_window/native_app_window.h"
8 8
9 #import <Cocoa/Cocoa.h> 9 #import <Cocoa/Cocoa.h>
10 10
11 #include "base/mac/mac_util.h" 11 #include "base/mac/mac_util.h"
12 #include "base/mac/scoped_nsobject.h" 12 #include "base/mac/scoped_nsobject.h"
13 #include "base/mac/sdk_forward_declarations.h" 13 #include "base/mac/sdk_forward_declarations.h"
14 #include "chrome/browser/apps/app_browsertest_util.h" 14 #include "chrome/browser/apps/app_browsertest_util.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/ui/extensions/app_launch_params.h" 16 #include "chrome/browser/ui/extensions/app_launch_params.h"
17 #include "chrome/browser/ui/extensions/application_launch.h" 17 #include "chrome/browser/ui/extensions/application_launch.h"
18 #include "content/public/browser/notification_service.h" 18 #include "content/public/browser/notification_service.h"
19 #include "content/public/test/test_utils.h" 19 #include "content/public/test/test_utils.h"
20 #include "extensions/browser/app_window/app_window_registry.h" 20 #include "extensions/browser/app_window/app_window_registry.h"
21 #include "extensions/common/constants.h" 21 #include "extensions/common/constants.h"
22 22
23 using extensions::AppWindow;
23 using extensions::PlatformAppBrowserTest; 24 using extensions::PlatformAppBrowserTest;
24 25
25 namespace { 26 namespace {
26 27
27 class NativeAppWindowCocoaBrowserTest : public PlatformAppBrowserTest { 28 class NativeAppWindowCocoaBrowserTest : public PlatformAppBrowserTest {
28 protected: 29 protected:
29 NativeAppWindowCocoaBrowserTest() {} 30 NativeAppWindowCocoaBrowserTest() {}
30 31
31 void SetUpAppWithWindows(int num_windows) { 32 void SetUpAppWithWindows(int num_windows) {
32 app_ = InstallExtension( 33 app_ = InstallExtension(
(...skipping 18 matching lines...) Expand all
51 }; 52 };
52 53
53 } // namespace 54 } // namespace
54 55
55 // Test interaction of Hide/Show() with Hide/ShowWithApp(). 56 // Test interaction of Hide/Show() with Hide/ShowWithApp().
56 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, HideShowWithApp) { 57 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, HideShowWithApp) {
57 SetUpAppWithWindows(2); 58 SetUpAppWithWindows(2);
58 extensions::AppWindowRegistry::AppWindowList windows = 59 extensions::AppWindowRegistry::AppWindowList windows =
59 extensions::AppWindowRegistry::Get(profile())->app_windows(); 60 extensions::AppWindowRegistry::Get(profile())->app_windows();
60 61
61 extensions::AppWindow* app_window = windows.front(); 62 AppWindow* app_window = windows.front();
62 extensions::NativeAppWindow* native_window = app_window->GetBaseWindow(); 63 extensions::NativeAppWindow* native_window = app_window->GetBaseWindow();
63 NSWindow* ns_window = native_window->GetNativeWindow(); 64 NSWindow* ns_window = native_window->GetNativeWindow();
64 65
65 extensions::AppWindow* other_app_window = windows.back(); 66 AppWindow* other_app_window = windows.back();
66 extensions::NativeAppWindow* other_native_window = 67 extensions::NativeAppWindow* other_native_window =
67 other_app_window->GetBaseWindow(); 68 other_app_window->GetBaseWindow();
68 NSWindow* other_ns_window = other_native_window->GetNativeWindow(); 69 NSWindow* other_ns_window = other_native_window->GetNativeWindow();
69 70
70 // Normal Hide/Show. 71 // Normal Hide/Show.
71 app_window->Hide(); 72 app_window->Hide();
72 EXPECT_FALSE([ns_window isVisible]); 73 EXPECT_FALSE([ns_window isVisible]);
73 app_window->Show(extensions::AppWindow::SHOW_ACTIVE); 74 app_window->Show(AppWindow::SHOW_ACTIVE);
74 EXPECT_TRUE([ns_window isVisible]); 75 EXPECT_TRUE([ns_window isVisible]);
75 76
76 // Normal Hide/ShowWithApp. 77 // Normal Hide/ShowWithApp.
77 native_window->HideWithApp(); 78 native_window->HideWithApp();
78 EXPECT_FALSE([ns_window isVisible]); 79 EXPECT_FALSE([ns_window isVisible]);
79 native_window->ShowWithApp(); 80 native_window->ShowWithApp();
80 EXPECT_TRUE([ns_window isVisible]); 81 EXPECT_TRUE([ns_window isVisible]);
81 82
82 // HideWithApp, Hide, ShowWithApp does not show. 83 // HideWithApp, Hide, ShowWithApp does not show.
83 native_window->HideWithApp(); 84 native_window->HideWithApp();
84 app_window->Hide(); 85 app_window->Hide();
85 native_window->ShowWithApp(); 86 native_window->ShowWithApp();
86 EXPECT_FALSE([ns_window isVisible]); 87 EXPECT_FALSE([ns_window isVisible]);
87 88
88 // Hide, HideWithApp, ShowWithApp does not show. 89 // Hide, HideWithApp, ShowWithApp does not show.
89 native_window->HideWithApp(); 90 native_window->HideWithApp();
90 native_window->ShowWithApp(); 91 native_window->ShowWithApp();
91 EXPECT_FALSE([ns_window isVisible]); 92 EXPECT_FALSE([ns_window isVisible]);
92 93
93 // Return to shown state. 94 // Return to shown state.
94 app_window->Show(extensions::AppWindow::SHOW_ACTIVE); 95 app_window->Show(AppWindow::SHOW_ACTIVE);
95 EXPECT_TRUE([ns_window isVisible]); 96 EXPECT_TRUE([ns_window isVisible]);
96 97
97 // HideWithApp the other window. 98 // HideWithApp the other window.
98 EXPECT_TRUE([other_ns_window isVisible]); 99 EXPECT_TRUE([other_ns_window isVisible]);
99 other_native_window->HideWithApp(); 100 other_native_window->HideWithApp();
100 EXPECT_FALSE([other_ns_window isVisible]); 101 EXPECT_FALSE([other_ns_window isVisible]);
101 102
102 // HideWithApp, Show shows all windows for this app. 103 // HideWithApp, Show shows all windows for this app.
103 native_window->HideWithApp(); 104 native_window->HideWithApp();
104 EXPECT_FALSE([ns_window isVisible]); 105 EXPECT_FALSE([ns_window isVisible]);
105 app_window->Show(extensions::AppWindow::SHOW_ACTIVE); 106 app_window->Show(AppWindow::SHOW_ACTIVE);
106 EXPECT_TRUE([ns_window isVisible]); 107 EXPECT_TRUE([ns_window isVisible]);
107 EXPECT_TRUE([other_ns_window isVisible]); 108 EXPECT_TRUE([other_ns_window isVisible]);
108 109
109 // Hide the other window. 110 // Hide the other window.
110 other_app_window->Hide(); 111 other_app_window->Hide();
111 EXPECT_FALSE([other_ns_window isVisible]); 112 EXPECT_FALSE([other_ns_window isVisible]);
112 113
113 // HideWithApp, ShowWithApp does not show the other window. 114 // HideWithApp, ShowWithApp does not show the other window.
114 native_window->HideWithApp(); 115 native_window->HideWithApp();
115 EXPECT_FALSE([ns_window isVisible]); 116 EXPECT_FALSE([ns_window isVisible]);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 155
155 @end 156 @end
156 157
157 // Test that NativeAppWindow and AppWindow fullscreen state is updated when 158 // Test that NativeAppWindow and AppWindow fullscreen state is updated when
158 // the window is fullscreened natively. 159 // the window is fullscreened natively.
159 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Fullscreen) { 160 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Fullscreen) {
160 if (!base::mac::IsOSLionOrLater()) 161 if (!base::mac::IsOSLionOrLater())
161 return; 162 return;
162 163
163 SetUpAppWithWindows(1); 164 SetUpAppWithWindows(1);
164 extensions::AppWindow* app_window = GetFirstAppWindow(); 165 AppWindow* app_window = GetFirstAppWindow();
165 extensions::NativeAppWindow* window = app_window->GetBaseWindow(); 166 extensions::NativeAppWindow* window = app_window->GetBaseWindow();
166 NSWindow* ns_window = app_window->GetNativeWindow(); 167 NSWindow* ns_window = app_window->GetNativeWindow();
167 base::scoped_nsobject<ScopedNotificationWatcher> watcher; 168 base::scoped_nsobject<ScopedNotificationWatcher> watcher;
168 169
169 EXPECT_EQ(extensions::AppWindow::FULLSCREEN_TYPE_NONE, 170 EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE,
170 app_window->fullscreen_types_for_test()); 171 app_window->fullscreen_types_for_test());
171 EXPECT_FALSE(window->IsFullscreen()); 172 EXPECT_FALSE(window->IsFullscreen());
172 EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask); 173 EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask);
173 174
174 watcher.reset([[ScopedNotificationWatcher alloc] 175 watcher.reset([[ScopedNotificationWatcher alloc]
175 initWithNotification:NSWindowDidEnterFullScreenNotification 176 initWithNotification:NSWindowDidEnterFullScreenNotification
176 andObject:ns_window]); 177 andObject:ns_window]);
177 [ns_window toggleFullScreen:nil]; 178 [ns_window toggleFullScreen:nil];
178 [watcher waitForNotification]; 179 [watcher waitForNotification];
179 EXPECT_TRUE(app_window->fullscreen_types_for_test() & 180 EXPECT_TRUE(app_window->fullscreen_types_for_test() &
180 extensions::AppWindow::FULLSCREEN_TYPE_OS); 181 AppWindow::FULLSCREEN_TYPE_OS);
181 EXPECT_TRUE(window->IsFullscreen()); 182 EXPECT_TRUE(window->IsFullscreen());
182 EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask); 183 EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask);
183 184
184 watcher.reset([[ScopedNotificationWatcher alloc] 185 watcher.reset([[ScopedNotificationWatcher alloc]
185 initWithNotification:NSWindowDidExitFullScreenNotification 186 initWithNotification:NSWindowDidExitFullScreenNotification
186 andObject:ns_window]); 187 andObject:ns_window]);
187 app_window->Restore(); 188 app_window->Restore();
188 EXPECT_FALSE(window->IsFullscreenOrPending()); 189 EXPECT_FALSE(window->IsFullscreenOrPending());
189 [watcher waitForNotification]; 190 [watcher waitForNotification];
190 EXPECT_EQ(extensions::AppWindow::FULLSCREEN_TYPE_NONE, 191 EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE,
191 app_window->fullscreen_types_for_test()); 192 app_window->fullscreen_types_for_test());
192 EXPECT_FALSE(window->IsFullscreen()); 193 EXPECT_FALSE(window->IsFullscreen());
193 EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask); 194 EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask);
194 195
195 watcher.reset([[ScopedNotificationWatcher alloc] 196 watcher.reset([[ScopedNotificationWatcher alloc]
196 initWithNotification:NSWindowDidEnterFullScreenNotification 197 initWithNotification:NSWindowDidEnterFullScreenNotification
197 andObject:ns_window]); 198 andObject:ns_window]);
198 app_window->Fullscreen(); 199 app_window->Fullscreen();
199 EXPECT_TRUE(window->IsFullscreenOrPending()); 200 EXPECT_TRUE(window->IsFullscreenOrPending());
200 [watcher waitForNotification]; 201 [watcher waitForNotification];
201 EXPECT_TRUE(app_window->fullscreen_types_for_test() & 202 EXPECT_TRUE(app_window->fullscreen_types_for_test() &
202 extensions::AppWindow::FULLSCREEN_TYPE_WINDOW_API); 203 AppWindow::FULLSCREEN_TYPE_WINDOW_API);
203 EXPECT_TRUE(window->IsFullscreen()); 204 EXPECT_TRUE(window->IsFullscreen());
204 EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask); 205 EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask);
205 206
206 watcher.reset([[ScopedNotificationWatcher alloc] 207 watcher.reset([[ScopedNotificationWatcher alloc]
207 initWithNotification:NSWindowDidExitFullScreenNotification 208 initWithNotification:NSWindowDidExitFullScreenNotification
208 andObject:ns_window]); 209 andObject:ns_window]);
209 [ns_window toggleFullScreen:nil]; 210 [ns_window toggleFullScreen:nil];
210 [watcher waitForNotification]; 211 [watcher waitForNotification];
211 EXPECT_EQ(extensions::AppWindow::FULLSCREEN_TYPE_NONE, 212 EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE,
212 app_window->fullscreen_types_for_test()); 213 app_window->fullscreen_types_for_test());
213 EXPECT_FALSE(window->IsFullscreen()); 214 EXPECT_FALSE(window->IsFullscreen());
214 EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask); 215 EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask);
215 } 216 }
216 217
217 // Test that, in frameless windows, the web contents has the same size as the 218 // Test that, in frameless windows, the web contents has the same size as the
218 // window. 219 // window.
219 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Frameless) { 220 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Frameless) {
220 extensions::AppWindow* app_window = 221 AppWindow* app_window = CreateTestAppWindow("{\"frame\": \"none\"}");
221 CreateTestAppWindow("{\"frame\": \"none\"}");
222 NSWindow* ns_window = app_window->GetNativeWindow(); 222 NSWindow* ns_window = app_window->GetNativeWindow();
223 NSView* web_contents = app_window->web_contents()->GetNativeView(); 223 NSView* web_contents = app_window->web_contents()->GetNativeView();
224 EXPECT_TRUE(NSEqualSizes(NSMakeSize(512, 384), [web_contents frame].size)); 224 EXPECT_TRUE(NSEqualSizes(NSMakeSize(512, 384), [web_contents frame].size));
225 // Move and resize the window. 225 // Move and resize the window.
226 NSRect new_frame = NSMakeRect(50, 50, 200, 200); 226 NSRect new_frame = NSMakeRect(50, 50, 200, 200);
227 [ns_window setFrame:new_frame display:YES]; 227 [ns_window setFrame:new_frame display:YES];
228 EXPECT_TRUE(NSEqualSizes(new_frame.size, [web_contents frame].size)); 228 EXPECT_TRUE(NSEqualSizes(new_frame.size, [web_contents frame].size));
229 229
230 // Windows created with NSBorderlessWindowMask by default don't have shadow, 230 // Windows created with NSBorderlessWindowMask by default don't have shadow,
231 // but packaged apps should always have one. 231 // but packaged apps should always have one.
232 EXPECT_TRUE([ns_window hasShadow]); 232 EXPECT_TRUE([ns_window hasShadow]);
233 233
234 // Since the window has no constraints, it should have all of the following 234 // Since the window has no constraints, it should have all of the following
235 // style mask bits. 235 // style mask bits.
236 NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask | 236 NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask |
237 NSMiniaturizableWindowMask | NSResizableWindowMask | 237 NSMiniaturizableWindowMask | NSResizableWindowMask |
238 NSTexturedBackgroundWindowMask; 238 NSTexturedBackgroundWindowMask;
239 EXPECT_EQ(style_mask, [ns_window styleMask]); 239 EXPECT_EQ(style_mask, [ns_window styleMask]);
240 240
241 CloseAppWindow(app_window); 241 CloseAppWindow(app_window);
242 } 242 }
243 243
244 namespace { 244 namespace {
245 245
246 // Test that resize and fullscreen controls are correctly enabled/disabled. 246 // Test that resize and fullscreen controls are correctly enabled/disabled.
247 void TestControls(extensions::AppWindow* app_window) { 247 void TestControls(AppWindow* app_window) {
248 NSWindow* ns_window = app_window->GetNativeWindow(); 248 NSWindow* ns_window = app_window->GetNativeWindow();
249 249
250 // The window is resizable. 250 // The window is resizable.
251 EXPECT_TRUE([ns_window styleMask] & NSResizableWindowMask); 251 EXPECT_TRUE([ns_window styleMask] & NSResizableWindowMask);
252 if (base::mac::IsOSSnowLeopard()) 252 if (base::mac::IsOSSnowLeopard())
253 EXPECT_TRUE([ns_window showsResizeIndicator]); 253 EXPECT_TRUE([ns_window showsResizeIndicator]);
254 254
255 // Due to this bug: http://crbug.com/362039, which manifests on the Cocoa 255 // Due to this bug: http://crbug.com/362039, which manifests on the Cocoa
256 // implementation but not the views one, frameless windows should have 256 // implementation but not the views one, frameless windows should have
257 // fullscreen controls disabled. 257 // fullscreen controls disabled.
(...skipping 28 matching lines...) Expand all
286 // Set a minimum size equal to the maximum size. 286 // Set a minimum size equal to the maximum size.
287 app_window->SetContentSizeConstraints(gfx::Size(200, 201), 287 app_window->SetContentSizeConstraints(gfx::Size(200, 201),
288 gfx::Size(200, 201)); 288 gfx::Size(200, 201));
289 EXPECT_EQ(200, [ns_window contentMinSize].width); 289 EXPECT_EQ(200, [ns_window contentMinSize].width);
290 EXPECT_EQ(201, [ns_window contentMinSize].height); 290 EXPECT_EQ(201, [ns_window contentMinSize].height);
291 291
292 // No longer resizable. 292 // No longer resizable.
293 EXPECT_FALSE([ns_window styleMask] & NSResizableWindowMask); 293 EXPECT_FALSE([ns_window styleMask] & NSResizableWindowMask);
294 if (base::mac::IsOSSnowLeopard()) 294 if (base::mac::IsOSSnowLeopard())
295 EXPECT_FALSE([ns_window showsResizeIndicator]); 295 EXPECT_FALSE([ns_window showsResizeIndicator]);
296
297 // If a window is made fullscreen by the API, fullscreen should be enabled so
298 // the user can exit fullscreen.
299 if (base::mac::IsOSLionOrLater()) {
300 app_window->SetFullscreen(AppWindow::FULLSCREEN_TYPE_WINDOW_API, true);
301 EXPECT_TRUE([ns_window collectionBehavior] &
302 NSWindowCollectionBehaviorFullScreenPrimary);
303 // Once it leaves fullscreen, it is disabled again.
304 app_window->SetFullscreen(AppWindow::FULLSCREEN_TYPE_WINDOW_API, false);
305 EXPECT_FALSE([ns_window collectionBehavior] &
jackhou1 2015/04/24 07:03:01 This line fails. Probably need to wait for the ani
tapted 2015/05/06 06:20:41 bridged_native_widget_interactive_uitest.mm has so
jackhou1 2015/05/13 04:27:53 Done.
306 NSWindowCollectionBehaviorFullScreenPrimary);
307 }
296 } 308 }
297 309
298 } // namespace 310 } // namespace
299 311
300 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Controls) { 312 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Controls) {
301 TestControls(CreateTestAppWindow("{}")); 313 TestControls(CreateTestAppWindow("{}"));
302 } 314 }
303 315
304 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, ControlsFrameless) { 316 IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, ControlsFrameless) {
305 TestControls(CreateTestAppWindow("{\"frame\": \"none\"}")); 317 TestControls(CreateTestAppWindow("{\"frame\": \"none\"}"));
306 } 318 }
OLDNEW
« no previous file with comments | « no previous file | ui/views/cocoa/bridged_native_widget.mm » ('j') | ui/views/cocoa/bridged_native_widget.mm » ('J')

Powered by Google App Engine
This is Rietveld 408576698