Home | History | Annotate | Download | only in ash
      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 
     24 namespace {
     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).
     32 bool IsInImmersiveFullscreen(BrowserWindow* browser_window) {
     33   return browser_window->IsFullscreen() &&
     34       browser_window->GetNativeWindow()->GetProperty(
     35           ash::internal::kFullscreenUsesMinimalChromeKey);
     36 }
     37 
     38 }  // namespace
     39 
     40 typedef InProcessBrowserTest ChromeShellDelegateBrowserTest;
     41 
     42 // Confirm that toggling window miximized works properly
     43 IN_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.
     71 IN_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 
    167 typedef extensions::PlatformAppBrowserTest
    168     ChromeShellDelegatePlatformAppBrowserTest;
    169 
    170 // Test that ToggleFullscreen() toggles the platform app's fullscreen state.
    171 IN_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