accelerator_commands_browsertest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1// Copyright 2013 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 "ash/accelerators/accelerator_commands.h" 6 7#include "apps/app_window.h" 8#include "apps/ui/native_app_window.h" 9#include "ash/ash_switches.h" 10#include "ash/shell.h" 11#include "ash/wm/window_state.h" 12#include "base/command_line.h" 13#include "chrome/browser/apps/app_browsertest_util.h" 14#include "chrome/browser/ui/browser.h" 15#include "chrome/browser/ui/browser_commands.h" 16#include "chrome/browser/ui/browser_finder.h" 17#include "chrome/browser/ui/browser_window.h" 18#include "chrome/common/chrome_switches.h" 19#include "chrome/test/base/in_process_browser_test.h" 20#include "chrome/test/base/test_switches.h" 21#include "ui/aura/client/aura_constants.h" 22#include "ui/views/widget/widget.h" 23#include "ui/views/widget/widget_delegate.h" 24 25using testing::Combine; 26using testing::Values; 27using testing::WithParamInterface; 28 29namespace { 30 31// WidgetDelegateView which allows the widget to be maximized. 32class MaximizableWidgetDelegate : public views::WidgetDelegateView { 33 public: 34 MaximizableWidgetDelegate() { 35 } 36 virtual ~MaximizableWidgetDelegate() { 37 } 38 39 virtual bool CanMaximize() const OVERRIDE { 40 return true; 41 } 42 43 private: 44 DISALLOW_COPY_AND_ASSIGN(MaximizableWidgetDelegate); 45}; 46 47// Returns true if |window_state|'s window is in immersive fullscreen. Infer 48// whether the window is in immersive fullscreen based on whether the shelf is 49// hidden when the window is fullscreen. (This is not quite right because the 50// shelf is hidden if a window is in both immersive fullscreen and tab 51// fullscreen.) 52bool IsInImmersiveFullscreen(ash::wm::WindowState* window_state) { 53 return window_state->IsFullscreen() && 54 !window_state->hide_shelf_when_fullscreen(); 55} 56 57} // namespace 58 59typedef InProcessBrowserTest AcceleratorCommandsBrowserTest; 60 61// Confirm that toggling window miximized works properly 62IN_PROC_BROWSER_TEST_F(AcceleratorCommandsBrowserTest, ToggleMaximized) { 63#if defined(OS_WIN) 64 // Run the test on Win Ash only. 65 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 66 return; 67#endif 68 69 ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance"; 70 ash::wm::WindowState* window_state = ash::wm::GetActiveWindowState(); 71 ASSERT_TRUE(window_state); 72 73 // When not in fullscreen, accelerators::ToggleMaximized toggles Maximized. 74 EXPECT_FALSE(window_state->IsMaximized()); 75 ash::accelerators::ToggleMaximized(); 76 EXPECT_TRUE(window_state->IsMaximized()); 77 ash::accelerators::ToggleMaximized(); 78 EXPECT_FALSE(window_state->IsMaximized()); 79 80 // When in fullscreen accelerators::ToggleMaximized gets out of fullscreen. 81 EXPECT_FALSE(window_state->IsFullscreen()); 82 Browser* browser = chrome::FindBrowserWithWindow(window_state->window()); 83 ASSERT_TRUE(browser); 84 chrome::ToggleFullscreenMode(browser); 85 EXPECT_TRUE(window_state->IsFullscreen()); 86 ash::accelerators::ToggleMaximized(); 87 EXPECT_FALSE(window_state->IsFullscreen()); 88 EXPECT_FALSE(window_state->IsMaximized()); 89 ash::accelerators::ToggleMaximized(); 90 EXPECT_FALSE(window_state->IsFullscreen()); 91 EXPECT_TRUE(window_state->IsMaximized()); 92} 93 94class AcceleratorCommandsFullscreenBrowserTest 95 : public WithParamInterface<ui::WindowShowState>, 96 public InProcessBrowserTest { 97 public: 98 AcceleratorCommandsFullscreenBrowserTest() 99#if defined(OS_CHROMEOS) 100 : put_window_in_immersive_(true), 101#else 102 : put_window_in_immersive_(false), 103#endif 104 initial_show_state_(GetParam()) { 105 } 106 virtual ~AcceleratorCommandsFullscreenBrowserTest() { 107 } 108 109 // Sets |window_state|'s show state to |initial_show_state_|. 110 void SetToInitialShowState(ash::wm::WindowState* window_state) { 111 if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED) 112 window_state->Maximize(); 113 else 114 window_state->Restore(); 115 } 116 117 // Returns true if |window_state|'s show state is |initial_show_state_|. 118 bool IsInitialShowState(const ash::wm::WindowState* window_state) const { 119 if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED) 120 return window_state->IsMaximized(); 121 else 122 return window_state->IsNormalStateType(); 123 } 124 125 bool put_window_in_immersive() const { 126 return put_window_in_immersive_; 127 } 128 129 private: 130 bool put_window_in_immersive_; 131 ui::WindowShowState initial_show_state_; 132 133 DISALLOW_COPY_AND_ASSIGN(AcceleratorCommandsFullscreenBrowserTest); 134}; 135 136// Test that toggling window fullscreen works properly. 137IN_PROC_BROWSER_TEST_P(AcceleratorCommandsFullscreenBrowserTest, 138 ToggleFullscreen) { 139#if defined(OS_WIN) 140 // Run the test on Win Ash only. 141 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 142 return; 143#endif 144 145 ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance"; 146 147 // 1) Browser windows. 148 ASSERT_TRUE(browser()->is_type_tabbed()); 149 ash::wm::WindowState* window_state = 150 ash::wm::GetWindowState(browser()->window()->GetNativeWindow()); 151 ASSERT_TRUE(window_state->IsActive()); 152 SetToInitialShowState(window_state); 153 EXPECT_TRUE(IsInitialShowState(window_state)); 154 155 ash::accelerators::ToggleFullscreen(); 156 EXPECT_TRUE(window_state->IsFullscreen()); 157 EXPECT_EQ(put_window_in_immersive(), IsInImmersiveFullscreen(window_state)); 158 159 ash::accelerators::ToggleFullscreen(); 160 EXPECT_TRUE(IsInitialShowState(window_state)); 161 162 // 2) ToggleFullscreen() should have no effect on windows which cannot be 163 // maximized. 164 window_state->window()->SetProperty(aura::client::kCanMaximizeKey, false); 165 ash::accelerators::ToggleFullscreen(); 166 EXPECT_TRUE(IsInitialShowState(window_state)); 167 168 // 3) Hosted apps. 169 Browser::CreateParams browser_create_params(Browser::TYPE_POPUP, 170 browser()->profile(), chrome::HOST_DESKTOP_TYPE_ASH); 171 browser_create_params.app_name = "Test"; 172 173 Browser* app_host_browser = new Browser(browser_create_params); 174 ASSERT_TRUE(app_host_browser->is_app()); 175 AddBlankTabAndShow(app_host_browser); 176 window_state = 177 ash::wm::GetWindowState(app_host_browser->window()->GetNativeWindow()); 178 ASSERT_TRUE(window_state->IsActive()); 179 SetToInitialShowState(window_state); 180 EXPECT_TRUE(IsInitialShowState(window_state)); 181 182 ash::accelerators::ToggleFullscreen(); 183 EXPECT_TRUE(window_state->IsFullscreen()); 184 EXPECT_EQ(put_window_in_immersive(), IsInImmersiveFullscreen(window_state)); 185 186 ash::accelerators::ToggleFullscreen(); 187 EXPECT_TRUE(IsInitialShowState(window_state)); 188 189 // 4) Popup browser windows. 190 browser_create_params.app_name = ""; 191 Browser* popup_browser = new Browser(browser_create_params); 192 ASSERT_TRUE(popup_browser->is_type_popup()); 193 ASSERT_FALSE(popup_browser->is_app()); 194 AddBlankTabAndShow(popup_browser); 195 window_state = 196 ash::wm::GetWindowState(popup_browser->window()->GetNativeWindow()); 197 ASSERT_TRUE(window_state->IsActive()); 198 SetToInitialShowState(window_state); 199 EXPECT_TRUE(IsInitialShowState(window_state)); 200 201 ash::accelerators::ToggleFullscreen(); 202 EXPECT_TRUE(window_state->IsFullscreen()); 203 EXPECT_EQ(put_window_in_immersive(), IsInImmersiveFullscreen(window_state)); 204 205 ash::accelerators::ToggleFullscreen(); 206 EXPECT_TRUE(IsInitialShowState(window_state)); 207 208 // 5) Miscellaneous windows (e.g. task manager). 209 views::Widget::InitParams params; 210 params.delegate = new MaximizableWidgetDelegate(); 211 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 212 scoped_ptr<views::Widget> widget(new views::Widget); 213 widget->Init(params); 214 widget->Show(); 215 216 window_state = ash::wm::GetWindowState(widget->GetNativeWindow()); 217 ASSERT_TRUE(window_state->IsActive()); 218 SetToInitialShowState(window_state); 219 EXPECT_TRUE(IsInitialShowState(window_state)); 220 221 ash::accelerators::ToggleFullscreen(); 222 EXPECT_TRUE(window_state->IsFullscreen()); 223 EXPECT_EQ(put_window_in_immersive(), IsInImmersiveFullscreen(window_state)); 224 225 // TODO(pkotwicz|oshima): Make toggling fullscreen restore the window to its 226 // show state prior to entering fullscreen. 227 ash::accelerators::ToggleFullscreen(); 228 EXPECT_FALSE(window_state->IsFullscreen()); 229} 230 231INSTANTIATE_TEST_CASE_P(InitiallyRestored, 232 AcceleratorCommandsFullscreenBrowserTest, 233 Values(ui::SHOW_STATE_NORMAL)); 234INSTANTIATE_TEST_CASE_P(InitiallyMaximized, 235 AcceleratorCommandsFullscreenBrowserTest, 236 Values(ui::SHOW_STATE_MAXIMIZED)); 237 238class AcceleratorCommandsPlatformAppFullscreenBrowserTest 239 : public WithParamInterface<ui::WindowShowState>, 240 public extensions::PlatformAppBrowserTest { 241 public: 242 AcceleratorCommandsPlatformAppFullscreenBrowserTest() 243#if defined(OS_CHROMEOS) 244 : put_window_in_immersive_(true), 245#else 246 : put_window_in_immersive_(false), 247#endif 248 initial_show_state_(GetParam()) { 249 } 250 virtual ~AcceleratorCommandsPlatformAppFullscreenBrowserTest() { 251 } 252 253 // Sets |app_window|'s show state to |initial_show_state_|. 254 void SetToInitialShowState(apps::AppWindow* app_window) { 255 if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED) 256 app_window->Maximize(); 257 else 258 app_window->Restore(); 259 } 260 261 // Returns true if |app_window|'s show state is |initial_show_state_|. 262 bool IsInitialShowState(apps::AppWindow* app_window) const { 263 if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED) 264 return app_window->GetBaseWindow()->IsMaximized(); 265 else 266 return ui::BaseWindow::IsRestored(*app_window->GetBaseWindow()); 267 } 268 269 bool put_window_in_immersive() const { 270 return put_window_in_immersive_; 271 } 272 273 private: 274 bool put_window_in_immersive_; 275 ui::WindowShowState initial_show_state_; 276 277 DISALLOW_COPY_AND_ASSIGN(AcceleratorCommandsPlatformAppFullscreenBrowserTest); 278}; 279 280// Test the behavior of platform apps when ToggleFullscreen() is called. 281IN_PROC_BROWSER_TEST_P(AcceleratorCommandsPlatformAppFullscreenBrowserTest, 282 ToggleFullscreen) { 283#if defined(OS_WIN) 284 // Run the test on Win Ash only. 285 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests)) 286 return; 287#endif 288 289 ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance"; 290 const extensions::Extension* extension = LoadAndLaunchPlatformApp("minimal"); 291 292 { 293 // Test that ToggleFullscreen() toggles a platform's app's fullscreen 294 // state and that it additionally puts the app into immersive fullscreen 295 // if put_all_windows_in_immersive() returns true. 296 apps::AppWindow::CreateParams params; 297 params.frame = apps::AppWindow::FRAME_CHROME; 298 apps::AppWindow* app_window = CreateAppWindowFromParams(extension, params); 299 apps::NativeAppWindow* native_app_window = app_window->GetBaseWindow(); 300 SetToInitialShowState(app_window); 301 ASSERT_TRUE(app_window->GetBaseWindow()->IsActive()); 302 EXPECT_TRUE(IsInitialShowState(app_window)); 303 304 ash::accelerators::ToggleFullscreen(); 305 EXPECT_TRUE(native_app_window->IsFullscreen()); 306 ash::wm::WindowState* window_state = 307 ash::wm::GetWindowState(native_app_window->GetNativeWindow()); 308 EXPECT_EQ(put_window_in_immersive(), 309 IsInImmersiveFullscreen(window_state)); 310 311 ash::accelerators::ToggleFullscreen(); 312 EXPECT_TRUE(IsInitialShowState(app_window)); 313 314 CloseAppWindow(app_window); 315 } 316 317 { 318 // Repeat the test, but make sure that frameless platform apps are never put 319 // into immersive fullscreen. 320 apps::AppWindow::CreateParams params; 321 params.frame = apps::AppWindow::FRAME_NONE; 322 apps::AppWindow* app_window = CreateAppWindowFromParams(extension, params); 323 apps::NativeAppWindow* native_app_window = app_window->GetBaseWindow(); 324 ASSERT_TRUE(app_window->GetBaseWindow()->IsActive()); 325 SetToInitialShowState(app_window); 326 EXPECT_TRUE(IsInitialShowState(app_window)); 327 328 ash::accelerators::ToggleFullscreen(); 329 EXPECT_TRUE(native_app_window->IsFullscreen()); 330 ash::wm::WindowState* window_state = 331 ash::wm::GetWindowState(native_app_window->GetNativeWindow()); 332 EXPECT_FALSE(IsInImmersiveFullscreen(window_state)); 333 334 ash::accelerators::ToggleFullscreen(); 335 EXPECT_TRUE(IsInitialShowState(app_window)); 336 337 CloseAppWindow(app_window); 338 } 339} 340 341INSTANTIATE_TEST_CASE_P(InitiallyRestored, 342 AcceleratorCommandsPlatformAppFullscreenBrowserTest, 343 Values(ui::SHOW_STATE_NORMAL)); 344INSTANTIATE_TEST_CASE_P(InitiallyMaximized, 345 AcceleratorCommandsPlatformAppFullscreenBrowserTest, 346 Values(ui::SHOW_STATE_MAXIMIZED)); 347