OLD | NEW |
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 #include "extensions/browser/app_window/native_app_window.h" | 5 #include "extensions/browser/app_window/native_app_window.h" |
6 | 6 |
7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 | 8 |
9 #import "base/mac/foundation_util.h" | 9 #import "base/mac/foundation_util.h" |
10 #import "base/mac/mac_util.h" | 10 #import "base/mac/mac_util.h" |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 EXPECT_CALL(*mock, FindHost(_, _)).WillOnce(Return(&mock_host)); | 216 EXPECT_CALL(*mock, FindHost(_, _)).WillOnce(Return(&mock_host)); |
217 native_window->Activate(); | 217 native_window->Activate(); |
218 EXPECT_TRUE([ns_window isVisible]); | 218 EXPECT_TRUE([ns_window isVisible]); |
219 testing::Mock::VerifyAndClearExpectations(mock); | 219 testing::Mock::VerifyAndClearExpectations(mock); |
220 testing::Mock::VerifyAndClearExpectations(&mock_host); | 220 testing::Mock::VerifyAndClearExpectations(&mock_host); |
221 } | 221 } |
222 | 222 |
223 // Test that NativeAppWindow and AppWindow fullscreen state is updated when | 223 // Test that NativeAppWindow and AppWindow fullscreen state is updated when |
224 // the window is fullscreened natively. | 224 // the window is fullscreened natively. |
225 IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Fullscreen) { | 225 IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Fullscreen) { |
226 if (!base::mac::IsOSLionOrLater()) | |
227 return; | |
228 | |
229 ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen; | 226 ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen; |
230 | 227 |
231 extensions::AppWindow* app_window = | 228 extensions::AppWindow* app_window = |
232 CreateTestAppWindow("{\"alwaysOnTop\": true }"); | 229 CreateTestAppWindow("{\"alwaysOnTop\": true }"); |
233 extensions::NativeAppWindow* window = app_window->GetBaseWindow(); | 230 extensions::NativeAppWindow* window = app_window->GetBaseWindow(); |
234 NSWindow* ns_window = app_window->GetNativeWindow(); | 231 NSWindow* ns_window = app_window->GetNativeWindow(); |
235 base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter( | 232 base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter( |
236 [[NSWindowFullscreenNotificationWaiter alloc] initWithWindow:ns_window]); | 233 [[NSWindowFullscreenNotificationWaiter alloc] initWithWindow:ns_window]); |
237 | 234 |
238 EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE, | 235 EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE, |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 | 542 |
546 // The window is resizable. | 543 // The window is resizable. |
547 EXPECT_TRUE([ns_window styleMask] & NSResizableWindowMask); | 544 EXPECT_TRUE([ns_window styleMask] & NSResizableWindowMask); |
548 | 545 |
549 // Due to this bug: http://crbug.com/362039, which manifests on the Cocoa | 546 // Due to this bug: http://crbug.com/362039, which manifests on the Cocoa |
550 // implementation but not the views one, frameless windows should have | 547 // implementation but not the views one, frameless windows should have |
551 // fullscreen controls disabled. | 548 // fullscreen controls disabled. |
552 BOOL can_fullscreen = | 549 BOOL can_fullscreen = |
553 ![NSStringFromClass([ns_window class]) isEqualTo:@"AppFramelessNSWindow"]; | 550 ![NSStringFromClass([ns_window class]) isEqualTo:@"AppFramelessNSWindow"]; |
554 // The window can fullscreen and maximize. | 551 // The window can fullscreen and maximize. |
555 if (base::mac::IsOSLionOrLater()) { | 552 EXPECT_EQ(can_fullscreen, !!([ns_window collectionBehavior] & |
556 EXPECT_EQ(can_fullscreen, !!([ns_window collectionBehavior] & | 553 NSWindowCollectionBehaviorFullScreenPrimary)); |
557 NSWindowCollectionBehaviorFullScreenPrimary)); | |
558 } | |
559 | 554 |
560 // In OSX 10.10+, the zoom button performs the zoom action rather than the | 555 // In OSX 10.10+, the zoom button performs the zoom action rather than the |
561 // fullscreen action. The above check that collectionBehavior does not include | 556 // fullscreen action. The above check that collectionBehavior does not include |
562 // NSWindowCollectionBehaviorFullScreenPrimary is sufficient to determine that | 557 // NSWindowCollectionBehaviorFullScreenPrimary is sufficient to determine that |
563 // the window can't be fullscreened. | 558 // the window can't be fullscreened. |
564 if (base::mac::IsOSMavericksOrEarlier()) { | 559 if (base::mac::IsOSMavericksOrEarlier()) { |
565 EXPECT_EQ(can_fullscreen, | 560 EXPECT_EQ(can_fullscreen, |
566 [[ns_window standardWindowButton:NSWindowZoomButton] isEnabled]); | 561 [[ns_window standardWindowButton:NSWindowZoomButton] isEnabled]); |
567 } | 562 } |
568 | 563 |
569 // Set a maximum size. | 564 // Set a maximum size. |
570 app_window->SetContentSizeConstraints(gfx::Size(), gfx::Size(200, 201)); | 565 app_window->SetContentSizeConstraints(gfx::Size(), gfx::Size(200, 201)); |
571 EXPECT_EQ(200, [ns_window contentMaxSize].width); | 566 EXPECT_EQ(200, [ns_window contentMaxSize].width); |
572 EXPECT_EQ(201, [ns_window contentMaxSize].height); | 567 EXPECT_EQ(201, [ns_window contentMaxSize].height); |
573 NSView* web_contents = app_window->web_contents()->GetNativeView(); | 568 NSView* web_contents = app_window->web_contents()->GetNativeView(); |
574 EXPECT_EQ(200, [web_contents frame].size.width); | 569 EXPECT_EQ(200, [web_contents frame].size.width); |
575 EXPECT_EQ(201, [web_contents frame].size.height); | 570 EXPECT_EQ(201, [web_contents frame].size.height); |
576 | 571 |
577 // Still resizable. | 572 // Still resizable. |
578 EXPECT_TRUE([ns_window styleMask] & NSResizableWindowMask); | 573 EXPECT_TRUE([ns_window styleMask] & NSResizableWindowMask); |
579 | 574 |
580 // Fullscreen and maximize are disabled. | 575 // Fullscreen and maximize are disabled. |
581 if (base::mac::IsOSLionOrLater()) | 576 EXPECT_FALSE([ns_window collectionBehavior] & |
582 EXPECT_FALSE([ns_window collectionBehavior] & | 577 NSWindowCollectionBehaviorFullScreenPrimary); |
583 NSWindowCollectionBehaviorFullScreenPrimary); | |
584 EXPECT_FALSE([[ns_window standardWindowButton:NSWindowZoomButton] isEnabled]); | 578 EXPECT_FALSE([[ns_window standardWindowButton:NSWindowZoomButton] isEnabled]); |
585 | 579 |
586 // Set a minimum size equal to the maximum size. | 580 // Set a minimum size equal to the maximum size. |
587 app_window->SetContentSizeConstraints(gfx::Size(200, 201), | 581 app_window->SetContentSizeConstraints(gfx::Size(200, 201), |
588 gfx::Size(200, 201)); | 582 gfx::Size(200, 201)); |
589 EXPECT_EQ(200, [ns_window contentMinSize].width); | 583 EXPECT_EQ(200, [ns_window contentMinSize].width); |
590 EXPECT_EQ(201, [ns_window contentMinSize].height); | 584 EXPECT_EQ(201, [ns_window contentMinSize].height); |
591 | 585 |
592 // No longer resizable. | 586 // No longer resizable. |
593 EXPECT_FALSE([ns_window styleMask] & NSResizableWindowMask); | 587 EXPECT_FALSE([ns_window styleMask] & NSResizableWindowMask); |
594 | 588 |
595 // If a window is made fullscreen by the API, fullscreen should be enabled so | 589 // If a window is made fullscreen by the API, fullscreen should be enabled so |
596 // the user can exit fullscreen. | 590 // the user can exit fullscreen. |
597 if (base::mac::IsOSLionOrLater()) { | 591 ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen; |
598 ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen; | 592 base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter( |
599 base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter([ | 593 [[NSWindowFullscreenNotificationWaiter alloc] initWithWindow:ns_window]); |
600 [NSWindowFullscreenNotificationWaiter alloc] initWithWindow:ns_window]); | 594 app_window->SetFullscreen(AppWindow::FULLSCREEN_TYPE_WINDOW_API, true); |
601 app_window->SetFullscreen(AppWindow::FULLSCREEN_TYPE_WINDOW_API, true); | 595 [waiter waitForEnterCount:1 exitCount:0]; |
602 [waiter waitForEnterCount:1 exitCount:0]; | 596 EXPECT_TRUE([ns_window collectionBehavior] & |
603 EXPECT_TRUE([ns_window collectionBehavior] & | 597 NSWindowCollectionBehaviorFullScreenPrimary); |
604 NSWindowCollectionBehaviorFullScreenPrimary); | 598 EXPECT_EQ(NSWidth([[ns_window contentView] frame]), |
605 EXPECT_EQ(NSWidth([[ns_window contentView] frame]), | 599 NSWidth([ns_window frame])); |
606 NSWidth([ns_window frame])); | 600 // Once it leaves fullscreen, it is disabled again. |
607 // Once it leaves fullscreen, it is disabled again. | 601 app_window->SetFullscreen(AppWindow::FULLSCREEN_TYPE_WINDOW_API, false); |
608 app_window->SetFullscreen(AppWindow::FULLSCREEN_TYPE_WINDOW_API, false); | 602 [waiter waitForEnterCount:1 exitCount:1]; |
609 [waiter waitForEnterCount:1 exitCount:1]; | 603 EXPECT_FALSE([ns_window collectionBehavior] & |
610 EXPECT_FALSE([ns_window collectionBehavior] & | 604 NSWindowCollectionBehaviorFullScreenPrimary); |
611 NSWindowCollectionBehaviorFullScreenPrimary); | |
612 } | |
613 } | 605 } |
614 | 606 |
615 } // namespace | 607 } // namespace |
616 | 608 |
617 IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Controls) { | 609 IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Controls) { |
618 TestControls(CreateTestAppWindow("{}")); | 610 TestControls(CreateTestAppWindow("{}")); |
619 } | 611 } |
620 | 612 |
621 IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, ControlsFrameless) { | 613 IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, ControlsFrameless) { |
622 TestControls(CreateTestAppWindow("{\"frame\": \"none\"}")); | 614 TestControls(CreateTestAppWindow("{\"frame\": \"none\"}")); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 [expected_color getComponents:expected_components]; | 689 [expected_color getComponents:expected_components]; |
698 [color getComponents:color_components]; | 690 [color getComponents:color_components]; |
699 EXPECT_NEAR(expected_components[0], color_components[0], 0.01); | 691 EXPECT_NEAR(expected_components[0], color_components[0], 0.01); |
700 EXPECT_NEAR(expected_components[1], color_components[1], 0.01); | 692 EXPECT_NEAR(expected_components[1], color_components[1], 0.01); |
701 EXPECT_NEAR(expected_components[2], color_components[2], 0.01); | 693 EXPECT_NEAR(expected_components[2], color_components[2], 0.01); |
702 } | 694 } |
703 | 695 |
704 INSTANTIATE_TEST_CASE_P(NativeAppWindowCocoaBrowserTestInstance, | 696 INSTANTIATE_TEST_CASE_P(NativeAppWindowCocoaBrowserTestInstance, |
705 NativeAppWindowCocoaBrowserTest, | 697 NativeAppWindowCocoaBrowserTest, |
706 ::testing::Bool()); | 698 ::testing::Bool()); |
OLD | NEW |