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