| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #import <Cocoa/Cocoa.h> |
| 6 |
| 7 #include "base/mac/mac_util.h" |
| 8 #include "base/mac/scoped_nsobject.h" |
| 9 #include "base/macros.h" |
| 10 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
| 11 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_menubar_tracker.h" |
| 12 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_animation_control
ler.h" |
| 13 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller.h" |
| 14 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.h" |
| 15 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_visibility_lock_c
ontroller.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #import "testing/gtest_mac.h" |
| 18 #import "third_party/ocmock/OCMock/OCMock.h" |
| 19 #include "ui/base/cocoa/appkit_utils.h" |
| 20 |
| 21 ////////////////////////////////////////////////////////////////// |
| 22 // MockFullscreenToolbarMouseTracker |
| 23 // Mocks the mouse interactions with the toolbar. |
| 24 |
| 25 @interface MockFullscreenToolbarMouseTracker : FullscreenToolbarMouseTracker |
| 26 |
| 27 @property(nonatomic, assign) BOOL mouseInside; |
| 28 |
| 29 // Overridden to prevent a tracking area from being created. |
| 30 - (void)updateTrackingArea; |
| 31 |
| 32 - (BOOL)mouseInsideTrackingArea; |
| 33 |
| 34 @end |
| 35 |
| 36 @implementation MockFullscreenToolbarMouseTracker |
| 37 |
| 38 @synthesize mouseInside = mouseInside_; |
| 39 |
| 40 - (void)updateTrackingArea { |
| 41 } |
| 42 |
| 43 - (BOOL)mouseInsideTrackingArea { |
| 44 return mouseInside_; |
| 45 } |
| 46 |
| 47 @end |
| 48 |
| 49 ////////////////////////////////////////////////////////////////// |
| 50 // MockFullscreenMenubarTracker |
| 51 // Mocks the state of the menubar. |
| 52 |
| 53 @interface MockFullscreenMenubarTracker : FullscreenMenubarTracker { |
| 54 CGFloat menubarFraction_; |
| 55 FullscreenMenubarState menubarState_; |
| 56 } |
| 57 |
| 58 - (CGFloat)menubarFraction; |
| 59 - (FullscreenMenubarState)state; |
| 60 - (void)setMenubarProgress:(CGFloat)progress; |
| 61 |
| 62 @end |
| 63 |
| 64 @implementation MockFullscreenMenubarTracker |
| 65 |
| 66 - (CGFloat)menubarFraction { |
| 67 return menubarFraction_; |
| 68 } |
| 69 |
| 70 - (FullscreenMenubarState)state { |
| 71 return menubarState_; |
| 72 } |
| 73 |
| 74 - (void)setMenubarProgress:(CGFloat)progress { |
| 75 if (ui::IsCGFloatEqual(progress, 1.0)) |
| 76 menubarState_ = FullscreenMenubarState::SHOWN; |
| 77 else if (ui::IsCGFloatEqual(progress, 0.0)) |
| 78 menubarState_ = FullscreenMenubarState::HIDDEN; |
| 79 else if (progress < menubarFraction_) |
| 80 menubarState_ = FullscreenMenubarState::HIDING; |
| 81 else if (progress > menubarFraction_) |
| 82 menubarState_ = FullscreenMenubarState::SHOWING; |
| 83 menubarFraction_ = progress; |
| 84 } |
| 85 |
| 86 @end |
| 87 |
| 88 namespace { |
| 89 |
| 90 class FullscreenToolbarControllerTest : public testing::Test { |
| 91 public: |
| 92 FullscreenToolbarControllerTest() {} |
| 93 void SetUp() override { |
| 94 BOOL yes = YES; |
| 95 BOOL no = NO; |
| 96 |
| 97 bwc_ = [OCMockObject mockForClass:[BrowserWindowController class]]; |
| 98 [[[bwc_ stub] andReturnValue:OCMOCK_VALUE(yes)] |
| 99 isKindOfClass:[BrowserWindowController class]]; |
| 100 [[[bwc_ stub] andReturnValue:OCMOCK_VALUE(yes)] isInAppKitFullscreen]; |
| 101 [[[bwc_ stub] andReturnValue:OCMOCK_VALUE(no)] isInImmersiveFullscreen]; |
| 102 [[bwc_ stub] layoutSubviews]; |
| 103 |
| 104 controller_.reset( |
| 105 [[FullscreenToolbarController alloc] initWithBrowserController:bwc_]); |
| 106 SetToolbarStyle(FullscreenToolbarStyle::TOOLBAR_HIDDEN); |
| 107 |
| 108 menubar_tracker_.reset([[MockFullscreenMenubarTracker alloc] |
| 109 initWithFullscreenToolbarController:nil]); |
| 110 [menubar_tracker_ setMenubarProgress:0.0]; |
| 111 [controller_ setMenubarTracker:menubar_tracker_]; |
| 112 |
| 113 mouse_tracker_.reset([[MockFullscreenToolbarMouseTracker alloc] init]); |
| 114 [controller_ setMouseTracker:mouse_tracker_]; |
| 115 |
| 116 [controller_ animationController]->SetAnimationDuration(0.0); |
| 117 |
| 118 [controller_ setTestFullscreenMode:YES]; |
| 119 } |
| 120 |
| 121 void TearDown() override { [controller_ setTestFullscreenMode:NO]; } |
| 122 |
| 123 void SetToolbarStyle(FullscreenToolbarStyle style) { |
| 124 [controller_ setToolbarStyle:style]; |
| 125 } |
| 126 |
| 127 void CheckLayout(CGFloat toolbarFraction, CGFloat menubarFraction) { |
| 128 FullscreenToolbarLayout layout = [controller_ computeLayout]; |
| 129 EXPECT_EQ(toolbarFraction, layout.toolbarFraction); |
| 130 EXPECT_EQ(menubarFraction * [controller_ toolbarVerticalOffset], |
| 131 layout.menubarOffset); |
| 132 } |
| 133 |
| 134 // A mock BrowserWindowController object. |
| 135 id bwc_; |
| 136 |
| 137 // The FullscreenToolbarController object being tested. |
| 138 base::scoped_nsobject<FullscreenToolbarController> controller_; |
| 139 |
| 140 // Mocks the state of the menubar. |
| 141 base::scoped_nsobject<MockFullscreenMenubarTracker> menubar_tracker_; |
| 142 |
| 143 // Mocks the mouse interactions with the toolbar. |
| 144 base::scoped_nsobject<MockFullscreenToolbarMouseTracker> mouse_tracker_; |
| 145 |
| 146 private: |
| 147 DISALLOW_COPY_AND_ASSIGN(FullscreenToolbarControllerTest); |
| 148 }; |
| 149 |
| 150 // Tests the toolbar fraction for the TOOLBAR_NONE and TOOLBAR_PRESENT |
| 151 // styles. |
| 152 TEST_F(FullscreenToolbarControllerTest, TestPresentAndNoneToolbarStyle) { |
| 153 CheckLayout(0, 0); |
| 154 |
| 155 [controller_ setToolbarStyle:FullscreenToolbarStyle::TOOLBAR_NONE]; |
| 156 CheckLayout(0, 0); |
| 157 |
| 158 [controller_ setToolbarStyle:FullscreenToolbarStyle::TOOLBAR_PRESENT]; |
| 159 CheckLayout(1, 0); |
| 160 } |
| 161 |
| 162 // Basic test that checks if the toolbar fraction for different menubar values. |
| 163 // This test simulates the showing and hiding the menubar. |
| 164 TEST_F(FullscreenToolbarControllerTest, TestHiddenToolbarWithMenubar) { |
| 165 CheckLayout(0, 0); |
| 166 |
| 167 [menubar_tracker_ setMenubarProgress:0.5]; |
| 168 CheckLayout(0.5, 0.5); |
| 169 |
| 170 [menubar_tracker_ setMenubarProgress:1]; |
| 171 CheckLayout(1, 1); |
| 172 |
| 173 [menubar_tracker_ setMenubarProgress:0.5]; |
| 174 CheckLayout(0.5, 0.5); |
| 175 |
| 176 [menubar_tracker_ setMenubarProgress:0]; |
| 177 CheckLayout(0, 0); |
| 178 } |
| 179 |
| 180 // Test that checks the visibility lock functions and the toolbar fraction. |
| 181 TEST_F(FullscreenToolbarControllerTest, TestHiddenToolbarWithVisibilityLocks) { |
| 182 FullscreenToolbarVisibilityLockController* locks = |
| 183 [controller_ visibilityLockController]; |
| 184 base::scoped_nsobject<NSObject> owner([[NSObject alloc] init]); |
| 185 base::scoped_nsobject<NSObject> alt_owner([[NSObject alloc] init]); |
| 186 |
| 187 [menubar_tracker_ setMenubarProgress:0]; |
| 188 CheckLayout(0, 0); |
| 189 |
| 190 // Lock the toolbar visibility. Toolbar should be fully visible. |
| 191 [locks lockToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 192 EXPECT_TRUE([locks isToolbarVisibilityLocked]); |
| 193 EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:owner.get()]); |
| 194 EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:alt_owner.get()]); |
| 195 CheckLayout(1, 0); |
| 196 |
| 197 // Show the menubar. |
| 198 [menubar_tracker_ setMenubarProgress:1]; |
| 199 CheckLayout(1, 1); |
| 200 |
| 201 // Hide the menubar. The toolbar should still be fully visible. |
| 202 [menubar_tracker_ setMenubarProgress:0.5]; |
| 203 CheckLayout(1, 0.5); |
| 204 [menubar_tracker_ setMenubarProgress:0]; |
| 205 CheckLayout(1, 0); |
| 206 |
| 207 // Release the lock. Toolbar should now be hidden. |
| 208 [locks releaseToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 209 EXPECT_TRUE(![locks isToolbarVisibilityLocked]); |
| 210 EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:owner.get()]); |
| 211 CheckLayout(0, 0); |
| 212 |
| 213 // Lock and release the toolbar visibility with multiple owners. |
| 214 [locks lockToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 215 [locks lockToolbarVisibilityForOwner:alt_owner.get() withAnimation:NO]; |
| 216 EXPECT_TRUE([locks isToolbarVisibilityLocked]); |
| 217 EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:owner.get()]); |
| 218 EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:alt_owner.get()]); |
| 219 CheckLayout(1, 0); |
| 220 |
| 221 [locks releaseToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 222 EXPECT_TRUE([locks isToolbarVisibilityLocked]); |
| 223 EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:owner.get()]); |
| 224 EXPECT_TRUE([locks isToolbarVisibilityLockedForOwner:alt_owner.get()]); |
| 225 CheckLayout(1, 0); |
| 226 |
| 227 [locks releaseToolbarVisibilityForOwner:alt_owner.get() withAnimation:NO]; |
| 228 EXPECT_TRUE(![locks isToolbarVisibilityLocked]); |
| 229 EXPECT_TRUE(![locks isToolbarVisibilityLockedForOwner:alt_owner.get()]); |
| 230 CheckLayout(0, 0); |
| 231 } |
| 232 |
| 233 // Basic test that checks the toolbar fraction for different mouse tracking |
| 234 // values. |
| 235 TEST_F(FullscreenToolbarControllerTest, TestHiddenToolbarWithMouseTracking) { |
| 236 CheckLayout(0, 0); |
| 237 |
| 238 [mouse_tracker_ setMouseInside:YES]; |
| 239 CheckLayout(1, 0); |
| 240 |
| 241 [menubar_tracker_ setMenubarProgress:1]; |
| 242 CheckLayout(1, 1); |
| 243 |
| 244 [menubar_tracker_ setMenubarProgress:0]; |
| 245 CheckLayout(1, 0); |
| 246 |
| 247 [mouse_tracker_ setMouseInside:NO]; |
| 248 CheckLayout(0, 0); |
| 249 } |
| 250 |
| 251 // Test that checks the toolbar fraction with mouse tracking, menubar fraction, |
| 252 // and visibility locks. |
| 253 TEST_F(FullscreenToolbarControllerTest, TestHiddenToolbarWithMultipleFactors) { |
| 254 FullscreenToolbarVisibilityLockController* locks = |
| 255 [controller_ visibilityLockController]; |
| 256 base::scoped_nsobject<NSObject> owner([[NSObject alloc] init]); |
| 257 CheckLayout(0, 0); |
| 258 |
| 259 // Toolbar should be shown with the menubar. |
| 260 [menubar_tracker_ setMenubarProgress:1]; |
| 261 CheckLayout(1, 1); |
| 262 |
| 263 // Move the mouse to the toolbar and start hiding the menubar. Toolbar |
| 264 // should be fully visible. |
| 265 [mouse_tracker_ setMouseInside:YES]; |
| 266 CheckLayout(1, 1); |
| 267 [menubar_tracker_ setMenubarProgress:0.5]; |
| 268 CheckLayout(1, 0.5); |
| 269 |
| 270 // Lock the toolbar's visibility. |
| 271 [locks lockToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 272 CheckLayout(1, 0.5); |
| 273 |
| 274 // Hide the menubar. Toolbar should be fully visible. |
| 275 [menubar_tracker_ setMenubarProgress:0]; |
| 276 CheckLayout(1, 0); |
| 277 |
| 278 // Lock the toolbar's visibility. Toolbar should be fully visible. |
| 279 [locks releaseToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 280 CheckLayout(1, 0); |
| 281 |
| 282 // Move the mouse away from the toolbar. Toolbar should hide. |
| 283 [mouse_tracker_ setMouseInside:NO]; |
| 284 CheckLayout(0, 0); |
| 285 |
| 286 // Lock the toolbar and move the mouse to it. |
| 287 [locks lockToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 288 [mouse_tracker_ setMouseInside:YES]; |
| 289 CheckLayout(1, 0); |
| 290 |
| 291 // Move the mouse away from the toolbar. Toolbar should be fully visible. |
| 292 [mouse_tracker_ setMouseInside:NO]; |
| 293 CheckLayout(1, 0); |
| 294 |
| 295 // Release the toolbar. Toolbar should be hidden. |
| 296 [locks releaseToolbarVisibilityForOwner:owner.get() withAnimation:NO]; |
| 297 } |
| 298 |
| 299 } // namespace |
| OLD | NEW |