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/ash/chrome_shell_delegate.h"
6
7#include "apps/native_app_window.h"
8#include "apps/shell_window.h"
9#include "ash/ash_switches.h"
10#include "ash/shell.h"
11#include "ash/shell_delegate.h"
12#include "ash/wm/window_properties.h"
13#include "ash/wm/window_util.h"
14#include "base/command_line.h"
15#include "chrome/browser/extensions/platform_app_browsertest_util.h"
16#include "chrome/browser/ui/browser.h"
17#include "chrome/browser/ui/browser_commands.h"
18#include "chrome/browser/ui/browser_finder.h"
19#include "chrome/browser/ui/browser_window.h"
20#include "chrome/browser/ui/immersive_fullscreen_configuration.h"
21#include "chrome/test/base/in_process_browser_test.h"
22#include "ui/aura/client/aura_constants.h"
23
24namespace {
25
26// Returns true if |window| is in immersive fullscreen. Infer whether |window|
27// is in immersive fullscreen based on whether kFullscreenUsesMinimalChromeKey
28// is set for |window| because DEPS does not allow the test to use BrowserView.
29// (This is not quite right because if a window is in both immersive browser
30// fullscreen and in tab fullscreen, kFullScreenUsesMinimalChromeKey will
31// not be set).
32bool IsInImmersiveFullscreen(BrowserWindow* browser_window) {
33  return browser_window->IsFullscreen() &&
34      browser_window->GetNativeWindow()->GetProperty(
35          ash::internal::kFullscreenUsesMinimalChromeKey);
36}
37
38}  // namespace
39
40typedef InProcessBrowserTest ChromeShellDelegateBrowserTest;
41
42// Confirm that toggling window miximized works properly
43IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleMaximized) {
44  ash::ShellDelegate* shell_delegate = ash::Shell::GetInstance()->delegate();
45  ASSERT_TRUE(shell_delegate);
46  aura::Window* window = ash::wm::GetActiveWindow();
47  ASSERT_TRUE(window);
48
49  // When not in fullscreen, ShellDelegate::ToggleMaximized toggles Maximized.
50  EXPECT_FALSE(ash::wm::IsWindowMaximized(window));
51  shell_delegate->ToggleMaximized();
52  EXPECT_TRUE(ash::wm::IsWindowMaximized(window));
53  shell_delegate->ToggleMaximized();
54  EXPECT_FALSE(ash::wm::IsWindowMaximized(window));
55
56  // When in fullscreen ShellDelegate::ToggleMaximized gets out of fullscreen.
57  EXPECT_FALSE(ash::wm::IsWindowFullscreen(window));
58  Browser* browser = chrome::FindBrowserWithWindow(window);
59  ASSERT_TRUE(browser);
60  chrome::ToggleFullscreenMode(browser);
61  EXPECT_TRUE(ash::wm::IsWindowFullscreen(window));
62  shell_delegate->ToggleMaximized();
63  EXPECT_FALSE(ash::wm::IsWindowFullscreen(window));
64  EXPECT_FALSE(ash::wm::IsWindowMaximized(window));
65  shell_delegate->ToggleMaximized();
66  EXPECT_FALSE(ash::wm::IsWindowFullscreen(window));
67  EXPECT_TRUE(ash::wm::IsWindowMaximized(window));
68}
69
70// Confirm that toggling window fullscren works properly.
71IN_PROC_BROWSER_TEST_F(ChromeShellDelegateBrowserTest, ToggleFullscreen) {
72  ash::ShellDelegate* shell_delegate = ash::Shell::GetInstance()->delegate();
73  ASSERT_TRUE(shell_delegate);
74
75  // 1) ToggleFullscreen() should toggle whether a tabbed browser window is in
76  // immersive fullscreen.
77  ASSERT_TRUE(browser()->is_type_tabbed());
78  BrowserWindow* browser_window = browser()->window();
79  ASSERT_TRUE(browser_window->IsActive());
80  EXPECT_FALSE(browser_window->IsMaximized());
81  EXPECT_FALSE(browser_window->IsFullscreen());
82
83  shell_delegate->ToggleFullscreen();
84  EXPECT_TRUE(browser_window->IsFullscreen());
85  EXPECT_EQ(IsInImmersiveFullscreen(browser_window),
86      ImmersiveFullscreenConfiguration::UseImmersiveFullscreen());
87
88  shell_delegate->ToggleFullscreen();
89  EXPECT_FALSE(browser_window->IsMaximized());
90  EXPECT_FALSE(browser_window->IsFullscreen());
91
92  // 2) ToggleFullscreen() should have no effect on windows which cannot be
93  // maximized.
94  browser_window->GetNativeWindow()->SetProperty(aura::client::kCanMaximizeKey,
95                                                 false);
96  shell_delegate->ToggleFullscreen();
97  EXPECT_FALSE(browser_window->IsMaximized());
98  EXPECT_FALSE(browser_window->IsFullscreen());
99
100  // 3) ToggleFullscreen() should maximize v1 app browser windows which use
101  // AppNonClientFrameViewAsh.
102  // TODO(pkotwicz): Figure out if we actually want this behavior.
103  Browser::CreateParams browser_create_params(Browser::TYPE_POPUP,
104      browser()->profile(), chrome::HOST_DESKTOP_TYPE_NATIVE);
105#if defined(OS_WIN)
106  browser_create_params.host_desktop_type = chrome::HOST_DESKTOP_TYPE_ASH;
107#endif  // OS_WIN
108  browser_create_params.app_name = "Test";
109  browser_create_params.app_type = Browser::APP_TYPE_HOST;
110
111  Browser* app_host_browser = new Browser(browser_create_params);
112  ASSERT_TRUE(app_host_browser->is_app());
113  AddBlankTabAndShow(app_host_browser);
114  browser_window = app_host_browser->window();
115  ASSERT_TRUE(browser_window->IsActive());
116  EXPECT_FALSE(browser_window->IsMaximized());
117  EXPECT_FALSE(browser_window->IsFullscreen());
118
119  shell_delegate->ToggleFullscreen();
120  EXPECT_TRUE(browser_window->IsMaximized());
121
122  shell_delegate->ToggleFullscreen();
123  EXPECT_FALSE(browser_window->IsMaximized());
124  EXPECT_FALSE(browser_window->IsFullscreen());
125
126  // 4) ToggleFullscreen() should put child windows of v1 apps into
127  // non-immersive fullscreen.
128  browser_create_params.host_desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE;
129  browser_create_params.app_type = Browser::APP_TYPE_CHILD;
130  Browser* app_child_browser = new Browser(browser_create_params);
131  ASSERT_TRUE(app_child_browser->is_app());
132  AddBlankTabAndShow(app_child_browser);
133  browser_window = app_child_browser->window();
134  ASSERT_TRUE(browser_window->IsActive());
135  EXPECT_FALSE(browser_window->IsMaximized());
136  EXPECT_FALSE(browser_window->IsFullscreen());
137
138  shell_delegate->ToggleFullscreen();
139  EXPECT_TRUE(browser_window->IsFullscreen());
140  EXPECT_FALSE(IsInImmersiveFullscreen(browser_window));
141
142  shell_delegate->ToggleFullscreen();
143  EXPECT_FALSE(browser_window->IsMaximized());
144  EXPECT_FALSE(browser_window->IsFullscreen());
145
146  // 5) ToggleFullscreen() should put popup browser windows into non-immersive
147  // fullscreen.
148  browser_create_params.app_name = "";
149  Browser* popup_browser = new Browser(browser_create_params);
150  ASSERT_TRUE(popup_browser->is_type_popup());
151  ASSERT_FALSE(popup_browser->is_app());
152  AddBlankTabAndShow(popup_browser);
153  browser_window = popup_browser->window();
154  ASSERT_TRUE(browser_window->IsActive());
155  EXPECT_FALSE(browser_window->IsMaximized());
156  EXPECT_FALSE(browser_window->IsFullscreen());
157
158  shell_delegate->ToggleFullscreen();
159  EXPECT_TRUE(browser_window->IsFullscreen());
160  EXPECT_FALSE(IsInImmersiveFullscreen(browser_window));
161
162  shell_delegate->ToggleFullscreen();
163  EXPECT_FALSE(browser_window->IsMaximized());
164  EXPECT_FALSE(browser_window->IsFullscreen());
165}
166
167typedef extensions::PlatformAppBrowserTest
168    ChromeShellDelegatePlatformAppBrowserTest;
169
170// Test that ToggleFullscreen() toggles the platform app's fullscreen state.
171IN_PROC_BROWSER_TEST_F(ChromeShellDelegatePlatformAppBrowserTest,
172                       ToggleFullscreenPlatformApp) {
173  ash::ShellDelegate* shell_delegate = ash::Shell::GetInstance()->delegate();
174  ASSERT_TRUE(shell_delegate);
175
176  const extensions::Extension* extension = LoadAndLaunchPlatformApp("minimal");
177  apps::ShellWindow* shell_window = CreateShellWindow(extension);
178  apps::NativeAppWindow* app_window = shell_window->GetBaseWindow();
179  ASSERT_TRUE(shell_window->GetBaseWindow()->IsActive());
180  EXPECT_FALSE(app_window->IsMaximized());
181  EXPECT_FALSE(app_window->IsFullscreen());
182
183  shell_delegate->ToggleFullscreen();
184  EXPECT_TRUE(app_window->IsFullscreen());
185
186  shell_delegate->ToggleFullscreen();
187  EXPECT_FALSE(app_window->IsMaximized());
188  EXPECT_FALSE(app_window->IsFullscreen());
189
190  CloseShellWindow(shell_window);
191}
192