blob: e2f57d0c8d34650939553084426d54e77565e30a [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
#include "base/mac/mac_util.h"
#include "base/mac/scoped_nsobject.h"
#include "base/macros.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_menubar_tracker.h"
#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_animation_controller.h"
#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller.h"
#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.h"
#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_visibility_lock_controller.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#include "ui/base/cocoa/appkit_utils.h"
//////////////////////////////////////////////////////////////////
// MockFullscreenMenubarTracker
// Mocks the state of the menubar.
@interface MockFullscreenMenubarTracker : FullscreenMenubarTracker {
CGFloat menubarFraction_;
FullscreenMenubarState menubarState_;
}
- (CGFloat)menubarFraction;
- (FullscreenMenubarState)state;
- (void)setMenubarProgress:(CGFloat)progress;
@end
@implementation MockFullscreenMenubarTracker
- (CGFloat)menubarFraction {
return menubarFraction_;
}
- (FullscreenMenubarState)state {
return menubarState_;
}
- (void)setMenubarProgress:(CGFloat)progress {
if (ui::IsCGFloatEqual(progress, 1.0))
menubarState_ = FullscreenMenubarState::SHOWN;
else if (ui::IsCGFloatEqual(progress, 0.0))
menubarState_ = FullscreenMenubarState::HIDDEN;
else if (progress < menubarFraction_)
menubarState_ = FullscreenMenubarState::HIDING;
else if (progress > menubarFraction_)
menubarState_ = FullscreenMenubarState::SHOWING;
menubarFraction_ = progress;
}
@end
#define CHECK_LAYOUT(TOOLBAR_FRACTION, MENUBAR_FRACTION) \
{ \
FullscreenToolbarLayout layout = [controller_ computeLayout]; \
EXPECT_EQ(TOOLBAR_FRACTION, layout.toolbarFraction); \
EXPECT_EQ(MENUBAR_FRACTION * -[bwc_ menubarHeight], layout.menubarOffset); \
}
namespace {
class FullscreenToolbarControllerTest : public testing::Test {
public:
FullscreenToolbarControllerTest() {}
void SetUp() override {
BOOL yes = YES;
BOOL no = NO;
CGFloat menubarHeight = 22;
bwc_ = [OCMockObject mockForClass:[BrowserWindowController class]];
[[[bwc_ stub] andReturnValue:OCMOCK_VALUE(yes)]
isKindOfClass:[BrowserWindowController class]];
[[[bwc_ stub] andReturnValue:OCMOCK_VALUE(yes)] isInAppKitFullscreen];
[[[bwc_ stub] andReturnValue:OCMOCK_VALUE(no)] isInImmersiveFullscreen];
[[[bwc_ stub] andReturnValue:OCMOCK_VALUE(menubarHeight)] menubarHeight];
[[bwc_ stub] layoutSubviews];
controller_.reset(
[[FullscreenToolbarController alloc] initWithBrowserController:bwc_]);
SetToolbarStyle(FullscreenToolbarStyle::TOOLBAR_HIDDEN);
menubar_tracker_.reset([[MockFullscreenMenubarTracker alloc]
initWithFullscreenToolbarController:nil]);
[menubar_tracker_ setMenubarProgress:0.0];
[controller_ setMenubarTracker:menubar_tracker_];
mouse_tracker_ =
[OCMockObject mockForClass:[FullscreenToolbarMouseTracker class]];
[[mouse_tracker_ stub] updateTrackingArea];
[controller_ setMouseTracker:mouse_tracker_];
[controller_ animationController]->SetAnimationDuration(0.0);
[controller_ setTestFullscreenMode:YES];
}
void TearDown() override { [controller_ setTestFullscreenMode:NO]; }
void SetToolbarStyle(FullscreenToolbarStyle style) {
[controller_ setToolbarStyle:style];
}
// A mock BrowserWindowController object.
id bwc_;
// A mock FullscreenToolbarMouseTracker object.
id mouse_tracker_;
// The FullscreenToolbarController object being tested.
base::scoped_nsobject<FullscreenToolbarController> controller_;
// Mocks the state of the menubar.
base::scoped_nsobject<MockFullscreenMenubarTracker> menubar_tracker_;
private:
DISALLOW_COPY_AND_ASSIGN(FullscreenToolbarControllerTest);
};
// Tests the toolbar fraction for the TOOLBAR_NONE and TOOLBAR_PRESENT
// styles.
TEST_F(FullscreenToolbarControllerTest, TestPresentAndNoneToolbarStyle) {
CHECK_LAYOUT(0, 0);
[controller_ setToolbarStyle:FullscreenToolbarStyle::TOOLBAR_NONE];
CHECK_LAYOUT(0, 0);
[controller_ setToolbarStyle:FullscreenToolbarStyle::TOOLBAR_PRESENT];
CHECK_LAYOUT(1, 0);
}
// Basic test that checks if the toolbar fraction for different menubar values.
// This test simulates the showing and hiding the menubar.
TEST_F(FullscreenToolbarControllerTest, TestHiddenToolbarWithMenubar) {
CHECK_LAYOUT(0, 0);
[menubar_tracker_ setMenubarProgress:0.5];
CHECK_LAYOUT(0.5, 0.5);
[menubar_tracker_ setMenubarProgress:1];
CHECK_LAYOUT(1, 1);
[menubar_tracker_ setMenubarProgress:0.5];
CHECK_LAYOUT(0.5, 0.5);
[menubar_tracker_ setMenubarProgress:0];
CHECK_LAYOUT(0, 0);
}
// Test that checks the visibility lock functions and the toolbar fraction.
TEST_F(FullscreenToolbarControllerTest, TestHiddenToolbarWithVisibilityLocks) {
FullscreenToolbarVisibilityLockController* locks =
[controller_ visibilityLockController];
base::scoped_nsobject<NSObject> owner([[NSObject alloc] init]);
base::scoped_nsobject<NSObject> alt_owner([[NSObject alloc] init]);
[menubar_tracker_ setMenubarProgress:0];
CHECK_LAYOUT(0, 0);
// Lock the toolbar visibility. Toolbar should be fully visible.
[locks lockToolbarVisibilityForOwner:owner.get() withAnimation:NO];
EXPECT_TRUE([locks isToolbarVisibilityLocked]);
EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:owner.get()]);
EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:alt_owner.get()]);
CHECK_LAYOUT(1, 0);
// Show the menubar.
[menubar_tracker_ setMenubarProgress:1];
CHECK_LAYOUT(1, 1);
// Hide the menubar. The toolbar should still be fully visible.
[menubar_tracker_ setMenubarProgress:0.5];
CHECK_LAYOUT(1, 0.5);
[menubar_tracker_ setMenubarProgress:0];
CHECK_LAYOUT(1, 0);
// Release the lock. Toolbar should now be hidden.
[locks releaseToolbarVisibilityForOwner:owner.get() withAnimation:NO];
EXPECT_TRUE(![locks isToolbarVisibilityLocked]);
EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:owner.get()]);
CHECK_LAYOUT(0, 0);
// Lock and release the toolbar visibility with multiple owners.
[locks lockToolbarVisibilityForOwner:owner.get() withAnimation:NO];
[locks lockToolbarVisibilityForOwner:alt_owner.get() withAnimation:NO];
EXPECT_TRUE([locks isToolbarVisibilityLocked]);
EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:owner.get()]);
EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:alt_owner.get()]);
CHECK_LAYOUT(1, 0);
[locks releaseToolbarVisibilityForOwner:owner.get() withAnimation:NO];
EXPECT_TRUE([locks isToolbarVisibilityLocked]);
EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:owner.get()]);
EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:alt_owner.get()]);
CHECK_LAYOUT(1, 0);
[locks releaseToolbarVisibilityForOwner:alt_owner.get() withAnimation:NO];
EXPECT_TRUE(![locks isToolbarVisibilityLocked]);
EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:alt_owner.get()]);
CHECK_LAYOUT(0, 0);
}
} // namespace