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