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