// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "apps/ui/native_app_window.h" #include "chrome/browser/apps/app_browsertest_util.h" using extensions::PlatformAppBrowserTest; using extensions::Extension; namespace apps { namespace { class AppWindowTest : public PlatformAppBrowserTest { protected: void CheckAlwaysOnTopToFullscreen(AppWindow* window) { ASSERT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); // The always-on-top property should be temporarily disabled when the window // enters fullscreen. window->Fullscreen(); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); // From the API's point of view, the always-on-top property is enabled. EXPECT_TRUE(window->IsAlwaysOnTop()); // The always-on-top property is restored when the window exits fullscreen. window->Restore(); EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); } void CheckNormalToFullscreen(AppWindow* window) { // If the always-on-top property is false, it should remain this way when // entering and exiting fullscreen mode. ASSERT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); window->Fullscreen(); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); window->Restore(); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); } void CheckFullscreenToAlwaysOnTop(AppWindow* window) { ASSERT_TRUE(window->GetBaseWindow()->IsFullscreenOrPending()); // Now enable always-on-top at runtime and ensure the property does not get // applied immediately because the window is in fullscreen mode. window->SetAlwaysOnTop(true); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); // From the API's point of view, the always-on-top property is enabled. EXPECT_TRUE(window->IsAlwaysOnTop()); // Ensure the always-on-top property is applied when exiting fullscreen. window->Restore(); EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); } }; } // namespace // Tests are flaky on Mac as transitioning to fullscreen is not instantaneous // and throws errors when entering/exiting fullscreen too quickly. #if defined(OS_MACOSX) #define MAYBE_InitAlwaysOnTopToFullscreen DISABLED_InitAlwaysOnTopToFullscreen #else #define MAYBE_InitAlwaysOnTopToFullscreen InitAlwaysOnTopToFullscreen #endif // Tests a window created with always-on-top enabled and ensures that the // property is temporarily switched off when entering fullscreen mode. IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_InitAlwaysOnTopToFullscreen) { AppWindow* window = CreateTestAppWindow("{ \"alwaysOnTop\": true }"); ASSERT_TRUE(window); CheckAlwaysOnTopToFullscreen(window); window->SetAlwaysOnTop(false); CheckNormalToFullscreen(window); CloseAppWindow(window); } #if defined(OS_MACOSX) #define MAYBE_RuntimeAlwaysOnTopToFullscreen \ DISABLED_RuntimeAlwaysOnTopToFullscreen #else #define MAYBE_RuntimeAlwaysOnTopToFullscreen RuntimeAlwaysOnTopToFullscreen #endif // Tests a window with always-on-top enabled at runtime and ensures that the // property is temporarily switched off when entering fullscreen mode. IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_RuntimeAlwaysOnTopToFullscreen) { AppWindow* window = CreateTestAppWindow("{}"); ASSERT_TRUE(window); CheckNormalToFullscreen(window); window->SetAlwaysOnTop(true); CheckAlwaysOnTopToFullscreen(window); CloseAppWindow(window); } #if defined(OS_MACOSX) #define MAYBE_InitFullscreenToAlwaysOnTop DISABLED_InitFullscreenToAlwaysOnTop #else #define MAYBE_InitFullscreenToAlwaysOnTop InitFullscreenToAlwaysOnTop #endif // Tests a window created initially in fullscreen mode and ensures that the // always-on-top property does not get applied until it exits fullscreen. IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_InitFullscreenToAlwaysOnTop) { AppWindow* window = CreateTestAppWindow("{ \"state\": \"fullscreen\" }"); ASSERT_TRUE(window); CheckFullscreenToAlwaysOnTop(window); CloseAppWindow(window); } #if defined(OS_MACOSX) #define MAYBE_RuntimeFullscreenToAlwaysOnTop \ DISABLED_RuntimeFullscreenToAlwaysOnTop #else #define MAYBE_RuntimeFullscreenToAlwaysOnTop RuntimeFullscreenToAlwaysOnTop #endif // Tests a window that enters fullscreen mode at runtime and ensures that the // always-on-top property does not get applied until it exits fullscreen. IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_RuntimeFullscreenToAlwaysOnTop) { AppWindow* window = CreateTestAppWindow("{}"); ASSERT_TRUE(window); window->Fullscreen(); CheckFullscreenToAlwaysOnTop(window); CloseAppWindow(window); } #if defined(OS_MACOSX) #define MAYBE_InitFullscreenAndAlwaysOnTop DISABLED_InitFullscreenAndAlwaysOnTop #else #define MAYBE_InitFullscreenAndAlwaysOnTop InitFullscreenAndAlwaysOnTop #endif // Tests a window created with both fullscreen and always-on-top enabled. Ensure // that always-on-top is only applied when the window exits fullscreen. IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_InitFullscreenAndAlwaysOnTop) { AppWindow* window = CreateTestAppWindow( "{ \"alwaysOnTop\": true, \"state\": \"fullscreen\" }"); ASSERT_TRUE(window); EXPECT_TRUE(window->GetBaseWindow()->IsFullscreenOrPending()); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); // From the API's point of view, the always-on-top property is enabled. EXPECT_TRUE(window->IsAlwaysOnTop()); window->Restore(); EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); CloseAppWindow(window); } #if defined(OS_MACOSX) #define MAYBE_DisableAlwaysOnTopInFullscreen \ DISABLED_DisableAlwaysOnTopInFullscreen #else #define MAYBE_DisableAlwaysOnTopInFullscreen DisableAlwaysOnTopInFullscreen #endif // Tests a window created with always-on-top enabled, but then disabled while // in fullscreen mode. After exiting fullscreen, always-on-top should remain // disabled. IN_PROC_BROWSER_TEST_F(AppWindowTest, MAYBE_DisableAlwaysOnTopInFullscreen) { AppWindow* window = CreateTestAppWindow("{ \"alwaysOnTop\": true }"); ASSERT_TRUE(window); // Disable always-on-top while in fullscreen mode. window->Fullscreen(); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); window->SetAlwaysOnTop(false); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); // Ensure that always-on-top remains disabled. window->Restore(); EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); CloseAppWindow(window); } } // namespace apps