| Index: chrome/browser/ui/cocoa/presentation_mode_controller_unittest.mm
|
| diff --git a/chrome/browser/ui/cocoa/presentation_mode_controller_unittest.mm b/chrome/browser/ui/cocoa/presentation_mode_controller_unittest.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6ffa8f666772f4f760a0576e7491d89c0ff7e09b
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/cocoa/presentation_mode_controller_unittest.mm
|
| @@ -0,0 +1,220 @@
|
| +// Copyright 2014 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 "chrome/browser/ui/cocoa/browser_window_controller.h"
|
| +#import "chrome/browser/ui/cocoa/browser_window_controller_private.h"
|
| +#include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
|
| +#import "chrome/browser/ui/cocoa/fast_resize_view.h"
|
| +#import "chrome/browser/ui/cocoa/presentation_mode_controller.h"
|
| +#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
|
| +
|
| +namespace {
|
| +
|
| +// The height of the AppKit menu bar.
|
| +const CGFloat kMenuBarHeight = 22;
|
| +
|
| +// Returns the frame of the view in window coordinates.
|
| +NSRect FrameInWindow(NSView* view) {
|
| + return [view convertRect:[view bounds] toView:nil];
|
| +}
|
| +
|
| +// Returns the min Y of the view in window coordinates.
|
| +CGFloat MinYInWindow(NSView* view) {
|
| + return NSMinY(FrameInWindow(view));
|
| +}
|
| +
|
| +// Returns the max Y of the view in window coordinates.
|
| +CGFloat MaxYInWindow(NSView* view) {
|
| + return NSMaxY(FrameInWindow(view));
|
| +}
|
| +
|
| +// Returns the view positioned highest in the toolbar area.
|
| +NSView* HighestViewInToolbarArea(BrowserWindowController* controller) {
|
| + return [controller tabStripView];
|
| +}
|
| +
|
| +// Returns the view positioned lowest in the toolbar area.
|
| +NSView* LowestViewInToolbarArea(BrowserWindowController* controller) {
|
| + return [[controller bookmarkBarController] view];
|
| +}
|
| +
|
| +// Check the layout of the views in the toolbar area when none of them overlap.
|
| +void CheckToolbarLayoutNoOverlap(BrowserWindowController* controller) {
|
| + EXPECT_EQ(MinYInWindow([controller tabStripView]),
|
| + MaxYInWindow([[controller toolbarController] view]));
|
| + EXPECT_EQ(MinYInWindow([[controller toolbarController] view]),
|
| + MaxYInWindow([[controller bookmarkBarController] view]));
|
| +}
|
| +
|
| +// Check the layout of all of the views when none of them overlap.
|
| +void CheckLayoutNoOverlap(BrowserWindowController* controller) {
|
| + CheckToolbarLayoutNoOverlap(controller);
|
| + EXPECT_EQ(MinYInWindow([[controller bookmarkBarController] view]),
|
| + MaxYInWindow([[controller infoBarContainerController] view]));
|
| + EXPECT_EQ(MinYInWindow([[controller infoBarContainerController] view]),
|
| + MaxYInWindow([controller tabContentArea]));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// -------------------MockPresentationModeController----------------------------
|
| +// Mock of PresentationModeController that eliminates dependencies on AppKit.
|
| +@interface MockPresentationModeController : PresentationModeController
|
| +@end
|
| +
|
| +@implementation MockPresentationModeController
|
| +
|
| +- (void)setSystemFullscreenModeTo:(base::mac::FullScreenMode)mode {
|
| +}
|
| +
|
| +- (CGFloat)floatingBarVerticalOffset {
|
| + return kMenuBarHeight;
|
| +}
|
| +
|
| +@end
|
| +
|
| +// -------------------MockBrowserWindowController-------------------------------
|
| +// Mock of BrowserWindowController that eliminates dependencies on AppKit.
|
| +@interface MockBrowserWindowController : BrowserWindowController {
|
| + @public
|
| + MockPresentationModeController* presentationController_;
|
| + BOOL isInAppKitFullscreen_;
|
| +}
|
| +@end
|
| +
|
| +@implementation MockBrowserWindowController
|
| +
|
| +// Use the mock presentation controller.
|
| +// Superclass override.
|
| +- (PresentationModeController*)newPresentationModeControllerWithStyle:
|
| + (fullscreen_mac::SlidingStyle)style {
|
| + presentationController_ =
|
| + [[MockPresentationModeController alloc] initWithBrowserController:self
|
| + style:style];
|
| + return presentationController_;
|
| +}
|
| +
|
| +// Manually control whether the floating bar (omnibox, tabstrip, etc.) has
|
| +// focus.
|
| +// Superclass override.
|
| +- (BOOL)floatingBarHasFocus {
|
| + return NO;
|
| +}
|
| +
|
| +// Superclass override.
|
| +- (BOOL)isInAppKitFullscreen {
|
| + return isInAppKitFullscreen_;
|
| +}
|
| +
|
| +// Superclass override.
|
| +- (BOOL)placeBookmarkBarBelowInfoBar {
|
| + return NO;
|
| +}
|
| +@end
|
| +
|
| +// -------------------PresentationModeControllerTest----------------------------
|
| +class PresentationModeControllerTest : public CocoaProfileTest {
|
| + public:
|
| + virtual void SetUp() OVERRIDE {
|
| + CocoaProfileTest::SetUp();
|
| + ASSERT_TRUE(browser());
|
| +
|
| + controller_ = [[MockBrowserWindowController alloc] initWithBrowser:browser()
|
| + takeOwnership:NO];
|
| + [[controller_ bookmarkBarController]
|
| + updateState:BookmarkBar::SHOW
|
| + changeType:BookmarkBar::DONT_ANIMATE_STATE_CHANGE];
|
| + }
|
| +
|
| + virtual void TearDown() OVERRIDE {
|
| + [controller_ close];
|
| + CocoaProfileTest::TearDown();
|
| + }
|
| +
|
| + public:
|
| + MockBrowserWindowController* controller_;
|
| +};
|
| +
|
| +// Tests the layout of views in Canonical Fullscreen (emulating AppKit
|
| +// Fullscreen API).
|
| +TEST_F(PresentationModeControllerTest, CanonicalFullscreenAppKitLayout) {
|
| + // Check initial layout.
|
| + CGFloat windowHeight = NSHeight([[controller_ window] frame]);
|
| + EXPECT_EQ(windowHeight, MaxYInWindow([controller_ tabStripView]));
|
| + CheckLayoutNoOverlap(controller_);
|
| +
|
| + // No change after adjusting UI for Canonical Fullscreen.
|
| + controller_->isInAppKitFullscreen_ = YES;
|
| + [controller_
|
| + adjustUIForSlidingFullscreenStyle:fullscreen_mac::OMNIBOX_TABS_PRESENT];
|
| + EXPECT_EQ(windowHeight, MaxYInWindow([controller_ tabStripView]));
|
| + CheckLayoutNoOverlap(controller_);
|
| +
|
| + // The menu bar is starting to animate in. All views should slide down by a
|
| + // small amount.
|
| + [controller_->presentationController_ setMenuBarRevealProgress:0.3];
|
| + EXPECT_LT(MaxYInWindow([controller_ tabStripView]), windowHeight - 1);
|
| + EXPECT_GT(MaxYInWindow([controller_ tabStripView]),
|
| + windowHeight - kMenuBarHeight + 1);
|
| + CheckLayoutNoOverlap(controller_);
|
| +
|
| + // The menu bar is fully visible. All views should slide down by the size of
|
| + // the menu bar.
|
| + [controller_->presentationController_ setMenuBarRevealProgress:1];
|
| + EXPECT_FLOAT_EQ(windowHeight - kMenuBarHeight,
|
| + MaxYInWindow([controller_ tabStripView]));
|
| + CheckLayoutNoOverlap(controller_);
|
| +
|
| + // The menu bar has disappeared. All views should return to normal.
|
| + [controller_->presentationController_ setMenuBarRevealProgress:0];
|
| + EXPECT_EQ(windowHeight, MaxYInWindow([controller_ tabStripView]));
|
| + CheckLayoutNoOverlap(controller_);
|
| +}
|
| +
|
| +// Tests the layout of views in Presentation Mode (emulating AppKit Fullscreen
|
| +// API).
|
| +TEST_F(PresentationModeControllerTest, PresentationModeAppKitLayout) {
|
| + // Check initial layout.
|
| + CGFloat windowHeight = NSHeight([[controller_ window] frame]);
|
| + EXPECT_EQ(windowHeight, MaxYInWindow([controller_ tabStripView]));
|
| + CheckLayoutNoOverlap(controller_);
|
| +
|
| + // Adjust UI for Presentation Mode.
|
| + controller_->isInAppKitFullscreen_ = YES;
|
| + [controller_
|
| + adjustUIForSlidingFullscreenStyle:fullscreen_mac::OMNIBOX_TABS_HIDDEN];
|
| +
|
| + // In AppKit Fullscreen, the titlebar disappears. This test can't remove the
|
| + // titlebar without non-trivially changing the view hierarchy. Instead, it
|
| + // adjusts the expectations to sometimes use contentHeight instead of
|
| + // windowHeight (the two should be the same in AppKit Fullscreen).
|
| + CGFloat contentHeight = NSHeight([[[controller_ window] contentView] bounds]);
|
| + CheckToolbarLayoutNoOverlap(controller_);
|
| + EXPECT_EQ(windowHeight, MinYInWindow(LowestViewInToolbarArea(controller_)));
|
| + EXPECT_EQ(contentHeight, MaxYInWindow([controller_ tabContentArea]));
|
| +
|
| + // The menu bar is starting to animate in. All views except the content view
|
| + // should slide down by a small amount.
|
| + [controller_->presentationController_ setMenuBarRevealProgress:0.3];
|
| + [controller_->presentationController_ changeToolbarFraction:0.3];
|
| + CheckToolbarLayoutNoOverlap(controller_);
|
| + EXPECT_LT(MinYInWindow(LowestViewInToolbarArea(controller_)), contentHeight);
|
| + EXPECT_GT(MaxYInWindow(HighestViewInToolbarArea(controller_)), contentHeight);
|
| + EXPECT_EQ(contentHeight, MaxYInWindow([controller_ tabContentArea]));
|
| +
|
| + // The menu bar is fully visible. All views should slide down by the size of
|
| + // the menu bar.
|
| + [controller_->presentationController_ setMenuBarRevealProgress:1];
|
| + [controller_->presentationController_ changeToolbarFraction:1];
|
| + CheckToolbarLayoutNoOverlap(controller_);
|
| + EXPECT_EQ(contentHeight, MaxYInWindow(HighestViewInToolbarArea(controller_)));
|
| + EXPECT_EQ(contentHeight, MaxYInWindow([controller_ tabContentArea]));
|
| +
|
| + // The menu bar has disappeared. All views should return to normal.
|
| + [controller_->presentationController_ setMenuBarRevealProgress:0];
|
| + [controller_->presentationController_ changeToolbarFraction:0];
|
| + CheckToolbarLayoutNoOverlap(controller_);
|
| + EXPECT_EQ(windowHeight, MinYInWindow(LowestViewInToolbarArea(controller_)));
|
| + EXPECT_EQ(contentHeight, MaxYInWindow([controller_ tabContentArea]));
|
| +}
|
|
|