browser_non_client_frame_view_ash_browsertest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2012 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#include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h" 6 7#include "ash/ash_constants.h" 8#include "ash/ash_switches.h" 9#include "base/command_line.h" 10#include "chrome/browser/ui/browser.h" 11#include "chrome/browser/ui/views/frame/browser_view.h" 12#include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h" 13#include "chrome/test/base/in_process_browser_test.h" 14#include "ui/base/hit_test.h" 15#include "ui/compositor/scoped_animation_duration_scale_mode.h" 16#include "ui/views/controls/button/image_button.h" 17#include "ui/views/widget/widget.h" 18 19using views::Widget; 20 21typedef InProcessBrowserTest BrowserNonClientFrameViewAshTest; 22 23IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, WindowHeader) { 24 // We know we're using Views, so static cast. 25 BrowserView* browser_view = static_cast<BrowserView*>(browser()->window()); 26 Widget* widget = browser_view->GetWidget(); 27 // We know we're using Ash, so static cast. 28 BrowserNonClientFrameViewAsh* frame_view = 29 static_cast<BrowserNonClientFrameViewAsh*>( 30 widget->non_client_view()->frame_view()); 31 32 // Restored window uses tall header. 33 const int kWindowWidth = 300; 34 const int kWindowHeight = 290; 35 widget->SetBounds(gfx::Rect(10, 10, kWindowWidth, kWindowHeight)); 36 EXPECT_FALSE(frame_view->UseShortHeader()); 37 38 // Click on the top edge of a window hits the top edge resize handle. 39 gfx::Point top_edge(kWindowWidth / 2, 0); 40 EXPECT_EQ(HTTOP, frame_view->NonClientHitTest(top_edge)); 41 42 // Click just below the resize handle hits the caption. 43 gfx::Point below_resize(kWindowWidth / 2, ash::kResizeInsideBoundsSize); 44 EXPECT_EQ(HTCAPTION, frame_view->NonClientHitTest(below_resize)); 45 46 // Window at top of screen uses normal header. 47 widget->SetBounds(gfx::Rect(10, 0, kWindowWidth, kWindowHeight)); 48 EXPECT_FALSE(frame_view->UseShortHeader()); 49 50 // Maximized window uses short header. 51 widget->Maximize(); 52 EXPECT_TRUE(frame_view->UseShortHeader()); 53 54 // Click in the top edge of a maximized window now hits the client area, 55 // because we want it to fall through to the tab strip and select a tab. 56 EXPECT_EQ(HTCLIENT, frame_view->NonClientHitTest(top_edge)); 57 58 // Popups tall header. 59 Browser* popup = CreateBrowserForPopup(browser()->profile()); 60 Widget* popup_widget = 61 static_cast<BrowserView*>(popup->window())->GetWidget(); 62 BrowserNonClientFrameViewAsh* popup_frame_view = 63 static_cast<BrowserNonClientFrameViewAsh*>( 64 popup_widget->non_client_view()->frame_view()); 65 popup_widget->SetBounds(gfx::Rect(5, 5, 200, 200)); 66 EXPECT_FALSE(popup_frame_view->UseShortHeader()); 67 68 // Apps use tall header. 69 Browser* app = CreateBrowserForApp("name", browser()->profile()); 70 Widget* app_widget = 71 static_cast<BrowserView*>(app->window())->GetWidget(); 72 BrowserNonClientFrameViewAsh* app_frame_view = 73 static_cast<BrowserNonClientFrameViewAsh*>( 74 app_widget->non_client_view()->frame_view()); 75 app_widget->SetBounds(gfx::Rect(15, 15, 250, 250)); 76 EXPECT_FALSE(app_frame_view->UseShortHeader()); 77} 78 79IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewAshTest, ImmersiveMode) { 80 if (!chrome::UseImmersiveFullscreen()) 81 return; 82 83 ui::ScopedAnimationDurationScaleMode zero_duration_mode( 84 ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); 85 86 // We know we're using Views, so static cast. 87 BrowserView* browser_view = static_cast<BrowserView*>(browser()->window()); 88 Widget* widget = browser_view->GetWidget(); 89 // We know we're using Ash, so static cast. 90 BrowserNonClientFrameViewAsh* frame_view = 91 static_cast<BrowserNonClientFrameViewAsh*>( 92 widget->non_client_view()->frame_view()); 93 ASSERT_FALSE(widget->IsFullscreen()); 94 95 ImmersiveModeControllerAsh* immersive_mode_controller = 96 static_cast<ImmersiveModeControllerAsh*>( 97 browser_view->immersive_mode_controller()); 98 99 // Immersive mode starts disabled. 100 EXPECT_FALSE(immersive_mode_controller->IsEnabled()); 101 102 // Frame paints by default. 103 EXPECT_TRUE(frame_view->ShouldPaint()); 104 105 // Going fullscreen enables immersive mode. 106 browser_view->EnterFullscreen(GURL(), FEB_TYPE_NONE); 107 EXPECT_TRUE(immersive_mode_controller->IsEnabled()); 108 109 // TODO(jamescook): When adding back the slide-out animation for immersive 110 // mode, this is a good place to test the button visibility. 111 112 // Frame abuts top of window. 113 EXPECT_EQ(0, frame_view->NonClientTopBorderHeight(false)); 114 115 // An immersive reveal shows the buttons and the top of the frame. 116 immersive_mode_controller->StartRevealForTest(true); 117 EXPECT_TRUE(frame_view->size_button_->visible()); 118 EXPECT_TRUE(frame_view->close_button_->visible()); 119 EXPECT_TRUE(frame_view->ShouldPaint()); 120 121 // Ending reveal hides them again. 122 immersive_mode_controller->SetMouseHoveredForTest(false); 123 EXPECT_FALSE(immersive_mode_controller->IsRevealed()); 124 EXPECT_FALSE(frame_view->size_button_->visible()); 125 EXPECT_FALSE(frame_view->close_button_->visible()); 126 EXPECT_FALSE(frame_view->ShouldPaint()); 127 128 // Exiting fullscreen exits immersive mode. 129 browser_view->ExitFullscreen(); 130 EXPECT_FALSE(immersive_mode_controller->IsEnabled()); 131 132 // Exiting immersive mode makes controls and frame visible again. 133 EXPECT_TRUE(frame_view->size_button_->visible()); 134 EXPECT_TRUE(frame_view->close_button_->visible()); 135 EXPECT_TRUE(frame_view->ShouldPaint()); 136} 137