| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h" | 5 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h" |
| 6 | 6 |
| 7 #include "ash/common/ash_constants.h" | 7 #include "ash/common/ash_constants.h" |
| 8 #include "ash/common/frame/caption_buttons/frame_caption_button_container_view.h
" | 8 #include "ash/common/frame/caption_buttons/frame_caption_button_container_view.h
" |
| 9 #include "ash/common/frame/header_painter.h" | 9 #include "ash/common/frame/header_painter.h" |
| 10 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" | 10 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" |
| 11 #include "ash/common/wm_shell.h" | 11 #include "ash/common/wm_shell.h" |
| 12 #include "ash/shell.h" | 12 #include "ash/shell.h" |
| 13 #include "ash/test/immersive_fullscreen_controller_test_api.h" |
| 13 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 14 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 16 #include "chrome/browser/profiles/profile_avatar_icon_util.h" |
| 17 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" |
| 18 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_test.h" |
| 15 #include "chrome/browser/ui/browser.h" | 19 #include "chrome/browser/ui/browser.h" |
| 16 #include "chrome/browser/ui/browser_commands.h" | 20 #include "chrome/browser/ui/browser_commands.h" |
| 17 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" | 21 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" |
| 18 #include "chrome/browser/ui/exclusive_access/fullscreen_controller_test.h" | 22 #include "chrome/browser/ui/exclusive_access/fullscreen_controller_test.h" |
| 19 #include "chrome/browser/ui/views/frame/browser_view.h" | 23 #include "chrome/browser/ui/views/frame/browser_view.h" |
| 20 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" | 24 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" |
| 25 #include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h" |
| 26 #include "chrome/browser/ui/views/profiles/profile_indicator_icon.h" |
| 21 #include "chrome/browser/ui/views/tabs/tab.h" | 27 #include "chrome/browser/ui/views/tabs/tab.h" |
| 22 #include "chrome/test/base/in_process_browser_test.h" | 28 #include "chrome/test/base/in_process_browser_test.h" |
| 29 #include "components/signin/core/account_id/account_id.h" |
| 23 #include "ui/base/hit_test.h" | 30 #include "ui/base/hit_test.h" |
| 24 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 31 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
| 25 #include "ui/views/widget/widget.h" | 32 #include "ui/views/widget/widget.h" |
| 26 | 33 |
| 27 #if defined(OS_CHROMEOS) | |
| 28 #include "ash/test/immersive_fullscreen_controller_test_api.h" | |
| 29 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | |
| 30 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" | |
| 31 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_test.h" | |
| 32 #include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h" | |
| 33 #include "chrome/browser/ui/views/profiles/profile_indicator_icon.h" | |
| 34 #include "components/signin/core/account_id/account_id.h" | |
| 35 #endif // defined(OS_CHROMEOS) | |
| 36 | |
| 37 using views::Widget; | 34 using views::Widget; |
| 38 | 35 |
| 39 typedef InProcessBrowserTest BrowserNonClientFrameViewAshTest; | 36 typedef InProcessBrowserTest BrowserNonClientFrameViewAshTest; |
| 40 | 37 |
| 41 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, NonClientHitTest) { | 38 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, NonClientHitTest) { |
| 42 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); | 39 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); |
| 43 Widget* widget = browser_view->GetWidget(); | 40 Widget* widget = browser_view->GetWidget(); |
| 44 // We know we're using Ash, so static cast. | 41 // We know we're using Ash, so static cast. |
| 45 BrowserNonClientFrameViewAsh* frame_view = | 42 BrowserNonClientFrameViewAsh* frame_view = |
| 46 static_cast<BrowserNonClientFrameViewAsh*>( | 43 static_cast<BrowserNonClientFrameViewAsh*>( |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 { | 98 { |
| 102 std::unique_ptr<FullscreenNotificationObserver> waiter( | 99 std::unique_ptr<FullscreenNotificationObserver> waiter( |
| 103 new FullscreenNotificationObserver()); | 100 new FullscreenNotificationObserver()); |
| 104 chrome::ToggleFullscreenMode(browser()); | 101 chrome::ToggleFullscreenMode(browser()); |
| 105 waiter->Wait(); | 102 waiter->Wait(); |
| 106 } | 103 } |
| 107 EXPECT_TRUE(frame_view->ShouldPaint()); | 104 EXPECT_TRUE(frame_view->ShouldPaint()); |
| 108 EXPECT_TRUE(frame_view->caption_button_container_->visible()); | 105 EXPECT_TRUE(frame_view->caption_button_container_->visible()); |
| 109 } | 106 } |
| 110 | 107 |
| 111 #if defined(OS_CHROMEOS) | |
| 112 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, ImmersiveFullscreen) { | 108 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, ImmersiveFullscreen) { |
| 113 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); | 109 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); |
| 114 content::WebContents* web_contents = browser_view->GetActiveWebContents(); | 110 content::WebContents* web_contents = browser_view->GetActiveWebContents(); |
| 115 Widget* widget = browser_view->GetWidget(); | 111 Widget* widget = browser_view->GetWidget(); |
| 116 // We know we're using Ash, so static cast. | 112 // We know we're using Ash, so static cast. |
| 117 BrowserNonClientFrameViewAsh* frame_view = | 113 BrowserNonClientFrameViewAsh* frame_view = |
| 118 static_cast<BrowserNonClientFrameViewAsh*>( | 114 static_cast<BrowserNonClientFrameViewAsh*>( |
| 119 widget->non_client_view()->frame_view()); | 115 widget->non_client_view()->frame_view()); |
| 120 | 116 |
| 121 ImmersiveModeController* immersive_mode_controller = | 117 ImmersiveModeController* immersive_mode_controller = |
| 122 browser_view->immersive_mode_controller(); | 118 browser_view->immersive_mode_controller(); |
| 123 ASSERT_EQ(ImmersiveModeController::Type::ASH, | 119 ASSERT_EQ(ImmersiveModeController::Type::ASH, |
| 124 immersive_mode_controller->type()); | 120 immersive_mode_controller->type()); |
| 125 | 121 |
| 126 ash::ImmersiveFullscreenControllerTestApi( | 122 ash::ImmersiveFullscreenControllerTestApi( |
| 127 static_cast<ImmersiveModeControllerAsh*>(immersive_mode_controller) | 123 static_cast<ImmersiveModeControllerAsh*>(immersive_mode_controller) |
| 128 ->controller()) | 124 ->controller()) |
| 129 .SetupForTest(); | 125 .SetupForTest(); |
| 130 | 126 |
| 131 // Immersive fullscreen starts disabled. | 127 // Immersive fullscreen starts disabled. |
| 132 ASSERT_FALSE(widget->IsFullscreen()); | 128 ASSERT_FALSE(widget->IsFullscreen()); |
| 133 EXPECT_FALSE(immersive_mode_controller->IsEnabled()); | 129 EXPECT_FALSE(immersive_mode_controller->IsEnabled()); |
| 134 | 130 |
| 135 // Frame paints by default. | 131 // Frame paints by default. |
| 136 EXPECT_TRUE(frame_view->ShouldPaint()); | 132 EXPECT_TRUE(frame_view->ShouldPaint()); |
| 137 EXPECT_LT(Tab::GetImmersiveHeight(), | 133 EXPECT_LT(0, frame_view->header_painter_->GetHeaderHeightForPainting()); |
| 138 frame_view->header_painter_->GetHeaderHeightForPainting()); | |
| 139 | 134 |
| 140 // Enter both browser fullscreen and tab fullscreen. Entering browser | 135 // Enter both browser fullscreen and tab fullscreen. Entering browser |
| 141 // fullscreen should enable immersive fullscreen. | 136 // fullscreen should enable immersive fullscreen. |
| 142 { | 137 { |
| 143 // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously. | 138 // NOTIFICATION_FULLSCREEN_CHANGED is sent asynchronously. |
| 144 std::unique_ptr<FullscreenNotificationObserver> waiter( | 139 std::unique_ptr<FullscreenNotificationObserver> waiter( |
| 145 new FullscreenNotificationObserver()); | 140 new FullscreenNotificationObserver()); |
| 146 chrome::ToggleFullscreenMode(browser()); | 141 chrome::ToggleFullscreenMode(browser()); |
| 147 waiter->Wait(); | 142 waiter->Wait(); |
| 148 } | 143 } |
| 149 { | 144 { |
| 150 std::unique_ptr<FullscreenNotificationObserver> waiter( | 145 std::unique_ptr<FullscreenNotificationObserver> waiter( |
| 151 new FullscreenNotificationObserver()); | 146 new FullscreenNotificationObserver()); |
| 152 browser() | 147 browser() |
| 153 ->exclusive_access_manager() | 148 ->exclusive_access_manager() |
| 154 ->fullscreen_controller() | 149 ->fullscreen_controller() |
| 155 ->EnterFullscreenModeForTab(web_contents, GURL()); | 150 ->EnterFullscreenModeForTab(web_contents, GURL()); |
| 156 waiter->Wait(); | 151 waiter->Wait(); |
| 157 } | 152 } |
| 158 EXPECT_TRUE(immersive_mode_controller->IsEnabled()); | 153 EXPECT_TRUE(immersive_mode_controller->IsEnabled()); |
| 159 | 154 |
| 160 // An immersive reveal shows the buttons and the top of the frame. | 155 // An immersive reveal shows the buttons and the top of the frame. |
| 161 std::unique_ptr<ImmersiveRevealedLock> revealed_lock( | 156 std::unique_ptr<ImmersiveRevealedLock> revealed_lock( |
| 162 immersive_mode_controller->GetRevealedLock( | 157 immersive_mode_controller->GetRevealedLock( |
| 163 ImmersiveModeController::ANIMATE_REVEAL_NO)); | 158 ImmersiveModeController::ANIMATE_REVEAL_NO)); |
| 164 EXPECT_TRUE(immersive_mode_controller->IsRevealed()); | 159 EXPECT_TRUE(immersive_mode_controller->IsRevealed()); |
| 165 EXPECT_TRUE(frame_view->ShouldPaint()); | 160 EXPECT_TRUE(frame_view->ShouldPaint()); |
| 166 EXPECT_TRUE(frame_view->caption_button_container_->visible()); | 161 EXPECT_TRUE(frame_view->caption_button_container_->visible()); |
| 167 EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle()); | |
| 168 | 162 |
| 169 // End the reveal. When in both immersive browser fullscreen and tab | 163 // End the reveal. When in both immersive browser fullscreen and tab |
| 170 // fullscreen, the tab lightbars should not be painted. | 164 // fullscreen. |
| 171 revealed_lock.reset(); | 165 revealed_lock.reset(); |
| 172 EXPECT_FALSE(immersive_mode_controller->IsRevealed()); | 166 EXPECT_FALSE(immersive_mode_controller->IsRevealed()); |
| 173 EXPECT_FALSE(frame_view->ShouldPaint()); | 167 EXPECT_FALSE(frame_view->ShouldPaint()); |
| 174 EXPECT_EQ(0, frame_view->header_painter_->GetHeaderHeightForPainting()); | 168 EXPECT_EQ(0, frame_view->header_painter_->GetHeaderHeightForPainting()); |
| 175 | 169 |
| 176 // Repeat test but without tab fullscreen. The tab lightbars should now show | 170 // Repeat test but without tab fullscreen. |
| 177 // when the top-of-window views are not revealed. | |
| 178 { | 171 { |
| 179 std::unique_ptr<FullscreenNotificationObserver> waiter( | 172 std::unique_ptr<FullscreenNotificationObserver> waiter( |
| 180 new FullscreenNotificationObserver()); | 173 new FullscreenNotificationObserver()); |
| 181 browser() | 174 browser() |
| 182 ->exclusive_access_manager() | 175 ->exclusive_access_manager() |
| 183 ->fullscreen_controller() | 176 ->fullscreen_controller() |
| 184 ->ExitFullscreenModeForTab(web_contents); | 177 ->ExitFullscreenModeForTab(web_contents); |
| 185 waiter->Wait(); | 178 waiter->Wait(); |
| 186 } | 179 } |
| 187 | 180 |
| 188 // Immersive reveal should have same behavior as before. | 181 // Immersive reveal should have same behavior as before. |
| 189 revealed_lock.reset(immersive_mode_controller->GetRevealedLock( | 182 revealed_lock.reset(immersive_mode_controller->GetRevealedLock( |
| 190 ImmersiveModeController::ANIMATE_REVEAL_NO)); | 183 ImmersiveModeController::ANIMATE_REVEAL_NO)); |
| 191 EXPECT_TRUE(immersive_mode_controller->IsRevealed()); | 184 EXPECT_TRUE(immersive_mode_controller->IsRevealed()); |
| 192 EXPECT_TRUE(frame_view->ShouldPaint()); | 185 EXPECT_TRUE(frame_view->ShouldPaint()); |
| 193 EXPECT_TRUE(frame_view->caption_button_container_->visible()); | 186 EXPECT_TRUE(frame_view->caption_button_container_->visible()); |
| 194 EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle()); | 187 EXPECT_LT(0, frame_view->header_painter_->GetHeaderHeightForPainting()); |
| 195 EXPECT_LT(Tab::GetImmersiveHeight(), | |
| 196 frame_view->header_painter_->GetHeaderHeightForPainting()); | |
| 197 | 188 |
| 198 // Ending the reveal. Immersive browser should have the same behavior as full | 189 // Ending the reveal. Immersive browser should have the same behavior as full |
| 199 // screen, i.e., no light bar and having an origin of (0,0). | 190 // screen, i.e., having an origin of (0,0). |
| 200 revealed_lock.reset(); | 191 revealed_lock.reset(); |
| 201 EXPECT_FALSE(frame_view->ShouldPaint()); | 192 EXPECT_FALSE(frame_view->ShouldPaint()); |
| 202 EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle()); | |
| 203 EXPECT_EQ(0, frame_view->header_painter_->GetHeaderHeightForPainting()); | 193 EXPECT_EQ(0, frame_view->header_painter_->GetHeaderHeightForPainting()); |
| 204 | 194 |
| 205 // Exiting immersive fullscreen should make the caption buttons and the frame | 195 // Exiting immersive fullscreen should make the caption buttons and the frame |
| 206 // visible again. | 196 // visible again. |
| 207 { | 197 { |
| 208 std::unique_ptr<FullscreenNotificationObserver> waiter( | 198 std::unique_ptr<FullscreenNotificationObserver> waiter( |
| 209 new FullscreenNotificationObserver()); | 199 new FullscreenNotificationObserver()); |
| 210 browser_view->ExitFullscreen(); | 200 browser_view->ExitFullscreen(); |
| 211 waiter->Wait(); | 201 waiter->Wait(); |
| 212 } | 202 } |
| 213 EXPECT_FALSE(immersive_mode_controller->IsEnabled()); | 203 EXPECT_FALSE(immersive_mode_controller->IsEnabled()); |
| 214 EXPECT_TRUE(frame_view->ShouldPaint()); | 204 EXPECT_TRUE(frame_view->ShouldPaint()); |
| 215 EXPECT_TRUE(frame_view->caption_button_container_->visible()); | 205 EXPECT_TRUE(frame_view->caption_button_container_->visible()); |
| 216 EXPECT_FALSE(frame_view->UseImmersiveLightbarHeaderStyle()); | 206 EXPECT_LT(0, frame_view->header_painter_->GetHeaderHeightForPainting()); |
| 217 EXPECT_LT(Tab::GetImmersiveHeight(), | |
| 218 frame_view->header_painter_->GetHeaderHeightForPainting()); | |
| 219 } | 207 } |
| 220 | 208 |
| 221 // Tests that Avatar icon should show on the top left corner of the teleported | 209 // Tests that Avatar icon should show on the top left corner of the teleported |
| 222 // browser window on ChromeOS. | 210 // browser window on ChromeOS. |
| 223 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, | 211 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, |
| 224 AvatarDisplayOnTeleportedWindow) { | 212 AvatarDisplayOnTeleportedWindow) { |
| 225 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); | 213 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); |
| 226 Widget* widget = browser_view->GetWidget(); | 214 Widget* widget = browser_view->GetWidget(); |
| 227 // We know we're using Ash, so static cast. | 215 // We know we're using Ash, so static cast. |
| 228 BrowserNonClientFrameViewAsh* frame_view = | 216 BrowserNonClientFrameViewAsh* frame_view = |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 | 256 |
| 269 // Teleport the window to another desktop. | 257 // Teleport the window to another desktop. |
| 270 const AccountId account_id2(AccountId::FromUserEmail("user2")); | 258 const AccountId account_id2(AccountId::FromUserEmail("user2")); |
| 271 manager->ShowWindowForUser(browser()->window()->GetNativeWindow(), | 259 manager->ShowWindowForUser(browser()->window()->GetNativeWindow(), |
| 272 account_id2); | 260 account_id2); |
| 273 // Clicking on the avatar icon should have same behaviour like clicking on | 261 // Clicking on the avatar icon should have same behaviour like clicking on |
| 274 // the caption area, i.e., allow the user to drag the browser window around. | 262 // the caption area, i.e., allow the user to drag the browser window around. |
| 275 EXPECT_EQ(HTCAPTION, frame_view->NonClientHitTest(avatar_center)); | 263 EXPECT_EQ(HTCAPTION, frame_view->NonClientHitTest(avatar_center)); |
| 276 } | 264 } |
| 277 | 265 |
| 278 #endif // defined(OS_CHROMEOS) | |
| 279 | |
| 280 // Tests that FrameCaptionButtonContainer has been relaid out in response to | 266 // Tests that FrameCaptionButtonContainer has been relaid out in response to |
| 281 // maximize mode being toggled. | 267 // maximize mode being toggled. |
| 282 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, | 268 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, |
| 283 ToggleMaximizeModeRelayout) { | 269 ToggleMaximizeModeRelayout) { |
| 284 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); | 270 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); |
| 285 Widget* widget = browser_view->GetWidget(); | 271 Widget* widget = browser_view->GetWidget(); |
| 286 // We know we're using Ash, so static cast. | 272 // We know we're using Ash, so static cast. |
| 287 BrowserNonClientFrameViewAsh* frame_view = | 273 BrowserNonClientFrameViewAsh* frame_view = |
| 288 static_cast<BrowserNonClientFrameViewAsh*>( | 274 static_cast<BrowserNonClientFrameViewAsh*>( |
| 289 widget->non_client_view()->frame_view()); | 275 widget->non_client_view()->frame_view()); |
| 290 | 276 |
| 291 const gfx::Rect initial = frame_view->caption_button_container_->bounds(); | 277 const gfx::Rect initial = frame_view->caption_button_container_->bounds(); |
| 292 ash::WmShell::Get() | 278 ash::WmShell::Get() |
| 293 ->maximize_mode_controller() | 279 ->maximize_mode_controller() |
| 294 ->EnableMaximizeModeWindowManager(true); | 280 ->EnableMaximizeModeWindowManager(true); |
| 295 ash::FrameCaptionButtonContainerView::TestApi test(frame_view-> | 281 ash::FrameCaptionButtonContainerView::TestApi test(frame_view-> |
| 296 caption_button_container_); | 282 caption_button_container_); |
| 297 test.EndAnimations(); | 283 test.EndAnimations(); |
| 298 const gfx::Rect during_maximize = frame_view->caption_button_container_-> | 284 const gfx::Rect during_maximize = frame_view->caption_button_container_-> |
| 299 bounds(); | 285 bounds(); |
| 300 EXPECT_GT(initial.width(), during_maximize.width()); | 286 EXPECT_GT(initial.width(), during_maximize.width()); |
| 301 ash::WmShell::Get() | 287 ash::WmShell::Get() |
| 302 ->maximize_mode_controller() | 288 ->maximize_mode_controller() |
| 303 ->EnableMaximizeModeWindowManager(false); | 289 ->EnableMaximizeModeWindowManager(false); |
| 304 test.EndAnimations(); | 290 test.EndAnimations(); |
| 305 const gfx::Rect after_restore = frame_view->caption_button_container_-> | 291 const gfx::Rect after_restore = frame_view->caption_button_container_-> |
| 306 bounds(); | 292 bounds(); |
| 307 EXPECT_EQ(initial, after_restore); | 293 EXPECT_EQ(initial, after_restore); |
| 308 } | 294 } |
| OLD | NEW |