accelerator_commands_browsertest.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/accelerators/accelerator_commands.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "apps/app_window.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "apps/ui/native_app_window.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/ash_switches.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/apps/app_browsertest_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser_window.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/aura/client/aura_constants.h"
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/widget/widget.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using testing::Combine;
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using testing::Values;
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)using testing::WithParamInterface;
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// WidgetDelegateView which allows the widget to be maximized.
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class MaximizableWidgetDelegate : public views::WidgetDelegateView {
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MaximizableWidgetDelegate() {
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~MaximizableWidgetDelegate() {
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual bool CanMaximize() const OVERRIDE {
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return true;
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MaximizableWidgetDelegate);
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Returns true if |window_state|'s window is in immersive fullscreen. Infer
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// whether the window is in immersive fullscreen based on whether the shelf is
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// hidden when the window is fullscreen. (This is not quite right because the
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// shelf is hidden if a window is in both immersive fullscreen and tab
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// fullscreen.)
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsInImmersiveFullscreen(ash::wm::WindowState* window_state) {
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return window_state->IsFullscreen() &&
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      !window_state->hide_shelf_when_fullscreen();
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)typedef InProcessBrowserTest AcceleratorCommandsBrowserTest;
608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that toggling window miximized works properly
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AcceleratorCommandsBrowserTest, ToggleMaximized) {
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Run the test on Win Ash only.
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance";
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ash::wm::WindowState* window_state = ash::wm::GetActiveWindowState();
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(window_state);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // When not in fullscreen, accelerators::ToggleMaximized toggles Maximized.
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsMaximized());
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMaximized());
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsMaximized());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // When in fullscreen accelerators::ToggleMaximized gets out of fullscreen.
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsFullscreen());
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Browser* browser = chrome::FindBrowserWithWindow(window_state->window());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ToggleFullscreenMode(browser);
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsFullscreen());
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsMaximized());
898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ash::accelerators::ToggleMaximized();
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(window_state->IsFullscreen());
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(window_state->IsMaximized());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class AcceleratorCommandsFullscreenBrowserTest
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public WithParamInterface<ui::WindowShowState>,
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      public InProcessBrowserTest {
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AcceleratorCommandsFullscreenBrowserTest()
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      : initial_show_state_(GetParam()) {
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~AcceleratorCommandsFullscreenBrowserTest() {
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Sets |window_state|'s show state to |initial_show_state_|.
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SetToInitialShowState(ash::wm::WindowState* window_state) {
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED)
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      window_state->Maximize();
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      window_state->Restore();
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns true if |window_state|'s show state is |initial_show_state_|.
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool IsInitialShowState(const ash::wm::WindowState* window_state) const {
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED)
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return window_state->IsMaximized();
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return window_state->IsNormalStateType();
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ui::WindowShowState initial_show_state_;
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AcceleratorCommandsFullscreenBrowserTest);
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test that toggling window fullscreen works properly.
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(AcceleratorCommandsFullscreenBrowserTest,
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       ToggleFullscreen) {
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Run the test on Win Ash only.
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance";
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // 1) Browser windows.
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(browser()->is_type_tabbed());
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ash::wm::WindowState* window_state =
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ash::wm::GetWindowState(browser()->window()->GetNativeWindow());
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(window_state->IsActive());
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetToInitialShowState(window_state);
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(IsInImmersiveFullscreen(window_state));
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // 2) ToggleFullscreen() should have no effect on windows which cannot be
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // maximized.
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window_state->window()->SetProperty(aura::client::kCanMaximizeKey, false);
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // 3) Hosted apps.
159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Browser::CreateParams browser_create_params(
160a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      Browser::CreateParams::CreateForApp("Test",
161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                          true /* trusted_source */,
162a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                          gfx::Rect(),
163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                          browser()->profile(),
164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                          chrome::HOST_DESKTOP_TYPE_ASH));
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Browser* app_host_browser = new Browser(browser_create_params);
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(app_host_browser->is_app());
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddBlankTabAndShow(app_host_browser);
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window_state =
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ash::wm::GetWindowState(app_host_browser->window()->GetNativeWindow());
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(window_state->IsActive());
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetToInitialShowState(window_state);
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(IsInImmersiveFullscreen(window_state));
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // 4) Popup browser windows.
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  browser_create_params = Browser::CreateParams(
184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      Browser::TYPE_POPUP, browser()->profile(), chrome::HOST_DESKTOP_TYPE_ASH);
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Browser* popup_browser = new Browser(browser_create_params);
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(popup_browser->is_type_popup());
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_FALSE(popup_browser->is_app());
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddBlankTabAndShow(popup_browser);
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window_state =
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ash::wm::GetWindowState(popup_browser->window()->GetNativeWindow());
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(window_state->IsActive());
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetToInitialShowState(window_state);
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
197a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(IsInImmersiveFullscreen(window_state));
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // 5) Miscellaneous windows (e.g. task manager).
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  views::Widget::InitParams params;
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  params.delegate = new MaximizableWidgetDelegate();
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget);
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  widget->Init(params);
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  widget->Show();
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  window_state = ash::wm::GetWindowState(widget->GetNativeWindow());
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(window_state->IsActive());
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetToInitialShowState(window_state);
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(IsInitialShowState(window_state));
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(window_state->IsFullscreen());
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(IsInImmersiveFullscreen(window_state));
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(pkotwicz|oshima): Make toggling fullscreen restore the window to its
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // show state prior to entering fullscreen.
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ash::accelerators::ToggleFullscreen();
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(window_state->IsFullscreen());
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(InitiallyRestored,
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        AcceleratorCommandsFullscreenBrowserTest,
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Values(ui::SHOW_STATE_NORMAL));
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(InitiallyMaximized,
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        AcceleratorCommandsFullscreenBrowserTest,
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Values(ui::SHOW_STATE_MAXIMIZED));
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class AcceleratorCommandsPlatformAppFullscreenBrowserTest
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public WithParamInterface<ui::WindowShowState>,
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      public extensions::PlatformAppBrowserTest {
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AcceleratorCommandsPlatformAppFullscreenBrowserTest()
237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      : initial_show_state_(GetParam()) {
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~AcceleratorCommandsPlatformAppFullscreenBrowserTest() {
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sets |app_window|'s show state to |initial_show_state_|.
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetToInitialShowState(apps::AppWindow* app_window) {
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED)
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      app_window->Maximize();
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      app_window->Restore();
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns true if |app_window|'s show state is |initial_show_state_|.
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool IsInitialShowState(apps::AppWindow* app_window) const {
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (initial_show_state_ == ui::SHOW_STATE_MAXIMIZED)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return app_window->GetBaseWindow()->IsMaximized();
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return ui::BaseWindow::IsRestored(*app_window->GetBaseWindow());
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ui::WindowShowState initial_show_state_;
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AcceleratorCommandsPlatformAppFullscreenBrowserTest);
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Test the behavior of platform apps when ToggleFullscreen() is called.
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(AcceleratorCommandsPlatformAppFullscreenBrowserTest,
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       ToggleFullscreen) {
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Run the test on Win Ash only.
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(ash::Shell::HasInstance()) << "No Instance";
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const extensions::Extension* extension = LoadAndLaunchPlatformApp("minimal");
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Test that ToggleFullscreen() toggles a platform's app's fullscreen
278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // state and that it additionally puts the app into immersive fullscreen
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // if put_all_windows_in_immersive() returns true.
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    apps::AppWindow::CreateParams params;
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.frame = apps::AppWindow::FRAME_CHROME;
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    apps::AppWindow* app_window = CreateAppWindowFromParams(extension, params);
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    apps::NativeAppWindow* native_app_window = app_window->GetBaseWindow();
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetToInitialShowState(app_window);
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(app_window->GetBaseWindow()->IsActive());
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(IsInitialShowState(app_window));
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::accelerators::ToggleFullscreen();
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(native_app_window->IsFullscreen());
290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::wm::WindowState* window_state =
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::wm::GetWindowState(native_app_window->GetNativeWindow());
292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    EXPECT_TRUE(IsInImmersiveFullscreen(window_state));
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::accelerators::ToggleFullscreen();
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(IsInitialShowState(app_window));
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CloseAppWindow(app_window);
298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Repeat the test, but make sure that frameless platform apps are never put
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // into immersive fullscreen.
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    apps::AppWindow::CreateParams params;
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.frame = apps::AppWindow::FRAME_NONE;
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    apps::AppWindow* app_window = CreateAppWindowFromParams(extension, params);
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    apps::NativeAppWindow* native_app_window = app_window->GetBaseWindow();
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(app_window->GetBaseWindow()->IsActive());
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetToInitialShowState(app_window);
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(IsInitialShowState(app_window));
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::accelerators::ToggleFullscreen();
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(native_app_window->IsFullscreen());
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::wm::WindowState* window_state =
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ash::wm::GetWindowState(native_app_window->GetNativeWindow());
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(IsInImmersiveFullscreen(window_state));
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ash::accelerators::ToggleFullscreen();
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(IsInitialShowState(app_window));
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CloseAppWindow(app_window);
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(InitiallyRestored,
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        AcceleratorCommandsPlatformAppFullscreenBrowserTest,
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Values(ui::SHOW_STATE_NORMAL));
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(InitiallyMaximized,
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        AcceleratorCommandsPlatformAppFullscreenBrowserTest,
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        Values(ui::SHOW_STATE_MAXIMIZED));
330