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