1// Copyright 2014 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/apps/app_browsertest_util.h" 6#include "extensions/browser/app_window/native_app_window.h" 7 8namespace extensions { 9 10namespace { 11 12class AppWindowTest : public PlatformAppBrowserTest { 13 protected: 14 void CheckAlwaysOnTopToFullscreen(AppWindow* window) { 15 ASSERT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 16 17 // The always-on-top property should be temporarily disabled when the window 18 // enters fullscreen. 19 window->Fullscreen(); 20 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 21 22 // From the API's point of view, the always-on-top property is enabled. 23 EXPECT_TRUE(window->IsAlwaysOnTop()); 24 25 // The always-on-top property is restored when the window exits fullscreen. 26 window->Restore(); 27 EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 28 } 29 30 void CheckNormalToFullscreen(AppWindow* window) { 31 // If the always-on-top property is false, it should remain this way when 32 // entering and exiting fullscreen mode. 33 ASSERT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 34 window->Fullscreen(); 35 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 36 window->Restore(); 37 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 38 } 39 40 void CheckFullscreenToAlwaysOnTop(AppWindow* window) { 41 ASSERT_TRUE(window->GetBaseWindow()->IsFullscreenOrPending()); 42 43 // Now enable always-on-top at runtime and ensure the property does not get 44 // applied immediately because the window is in fullscreen mode. 45 window->SetAlwaysOnTop(true); 46 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 47 48 // From the API's point of view, the always-on-top property is enabled. 49 EXPECT_TRUE(window->IsAlwaysOnTop()); 50 51 // Ensure the always-on-top property is applied when exiting fullscreen. 52 window->Restore(); 53 EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 54 } 55}; 56 57} // namespace 58 59// Tests are flaky on Mac as transitioning to fullscreen is not instantaneous 60// and throws errors when entering/exiting fullscreen too quickly. 61#if defined(OS_MACOSX) 62#define MAYBE_InitAlwaysOnTopToFullscreen DISABLED_InitAlwaysOnTopToFullscreen 63#else 64#define MAYBE_InitAlwaysOnTopToFullscreen InitAlwaysOnTopToFullscreen 65#endif 66 67// Tests a window created with always-on-top enabled and ensures that the 68// property is temporarily switched off when entering fullscreen mode. 69IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_InitAlwaysOnTopToFullscreen) { 70 AppWindow* window = CreateTestAppWindow("{ \"alwaysOnTop\": true }"); 71 ASSERT_TRUE(window); 72 CheckAlwaysOnTopToFullscreen(window); 73 74 window->SetAlwaysOnTop(false); 75 CheckNormalToFullscreen(window); 76 77 CloseAppWindow(window); 78} 79 80#if defined(OS_MACOSX) 81#define MAYBE_RuntimeAlwaysOnTopToFullscreen \ 82 DISABLED_RuntimeAlwaysOnTopToFullscreen 83#else 84#define MAYBE_RuntimeAlwaysOnTopToFullscreen RuntimeAlwaysOnTopToFullscreen 85#endif 86 87// Tests a window with always-on-top enabled at runtime and ensures that the 88// property is temporarily switched off when entering fullscreen mode. 89IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_RuntimeAlwaysOnTopToFullscreen) { 90 AppWindow* window = CreateTestAppWindow("{}"); 91 ASSERT_TRUE(window); 92 CheckNormalToFullscreen(window); 93 94 window->SetAlwaysOnTop(true); 95 CheckAlwaysOnTopToFullscreen(window); 96 97 CloseAppWindow(window); 98} 99 100#if defined(OS_MACOSX) 101#define MAYBE_InitFullscreenToAlwaysOnTop DISABLED_InitFullscreenToAlwaysOnTop 102#else 103#define MAYBE_InitFullscreenToAlwaysOnTop InitFullscreenToAlwaysOnTop 104#endif 105 106// Tests a window created initially in fullscreen mode and ensures that the 107// always-on-top property does not get applied until it exits fullscreen. 108IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_InitFullscreenToAlwaysOnTop) { 109 AppWindow* window = CreateTestAppWindow("{ \"state\": \"fullscreen\" }"); 110 ASSERT_TRUE(window); 111 CheckFullscreenToAlwaysOnTop(window); 112 113 CloseAppWindow(window); 114} 115 116#if defined(OS_MACOSX) 117#define MAYBE_RuntimeFullscreenToAlwaysOnTop \ 118 DISABLED_RuntimeFullscreenToAlwaysOnTop 119#else 120#define MAYBE_RuntimeFullscreenToAlwaysOnTop RuntimeFullscreenToAlwaysOnTop 121#endif 122 123// Tests a window that enters fullscreen mode at runtime and ensures that the 124// always-on-top property does not get applied until it exits fullscreen. 125IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_RuntimeFullscreenToAlwaysOnTop) { 126 AppWindow* window = CreateTestAppWindow("{}"); 127 ASSERT_TRUE(window); 128 129 window->Fullscreen(); 130 CheckFullscreenToAlwaysOnTop(window); 131 132 CloseAppWindow(window); 133} 134 135#if defined(OS_MACOSX) 136#define MAYBE_InitFullscreenAndAlwaysOnTop DISABLED_InitFullscreenAndAlwaysOnTop 137#else 138#define MAYBE_InitFullscreenAndAlwaysOnTop InitFullscreenAndAlwaysOnTop 139#endif 140 141// Tests a window created with both fullscreen and always-on-top enabled. Ensure 142// that always-on-top is only applied when the window exits fullscreen. 143IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_InitFullscreenAndAlwaysOnTop) { 144 AppWindow* window = CreateTestAppWindow( 145 "{ \"alwaysOnTop\": true, \"state\": \"fullscreen\" }"); 146 ASSERT_TRUE(window); 147 148 EXPECT_TRUE(window->GetBaseWindow()->IsFullscreenOrPending()); 149 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 150 151 // From the API's point of view, the always-on-top property is enabled. 152 EXPECT_TRUE(window->IsAlwaysOnTop()); 153 154 window->Restore(); 155 EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 156 157 CloseAppWindow(window); 158} 159 160#if defined(OS_MACOSX) 161#define MAYBE_DisableAlwaysOnTopInFullscreen \ 162 DISABLED_DisableAlwaysOnTopInFullscreen 163#else 164#define MAYBE_DisableAlwaysOnTopInFullscreen DisableAlwaysOnTopInFullscreen 165#endif 166 167// Tests a window created with always-on-top enabled, but then disabled while 168// in fullscreen mode. After exiting fullscreen, always-on-top should remain 169// disabled. 170IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_DisableAlwaysOnTopInFullscreen) { 171 AppWindow* window = CreateTestAppWindow("{ \"alwaysOnTop\": true }"); 172 ASSERT_TRUE(window); 173 174 // Disable always-on-top while in fullscreen mode. 175 window->Fullscreen(); 176 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 177 window->SetAlwaysOnTop(false); 178 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 179 180 // Ensure that always-on-top remains disabled. 181 window->Restore(); 182 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 183 184 CloseAppWindow(window); 185} 186 187} // namespace extensions 188