|  | // Copyright 2014 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "build/build_config.h" | 
|  | #include "chrome/browser/apps/platform_apps/app_browsertest_util.h" | 
|  | #include "content/public/test/browser_test.h" | 
|  | #include "extensions/browser/app_window/native_app_window.h" | 
|  |  | 
|  | namespace extensions { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class AppWindowTest : public PlatformAppBrowserTest { | 
|  | protected: | 
|  | void CheckAlwaysOnTopToFullscreen(AppWindow* window) { | 
|  | ASSERT_EQ(ui::ZOrderLevel::kFloatingWindow, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  |  | 
|  | // The always-on-top property should be temporarily disabled when the window | 
|  | // enters fullscreen. | 
|  | window->Fullscreen(); | 
|  | EXPECT_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  |  | 
|  | // 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_EQ(ui::ZOrderLevel::kFloatingWindow, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  | } | 
|  |  | 
|  | void CheckNormalToFullscreen(AppWindow* window) { | 
|  | // If the always-on-top property is false, it should remain this way when | 
|  | // entering and exiting fullscreen mode. | 
|  | ASSERT_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  | window->Fullscreen(); | 
|  | EXPECT_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  | window->Restore(); | 
|  | EXPECT_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  | } | 
|  |  | 
|  | 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_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  |  | 
|  | // 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_EQ(ui::ZOrderLevel::kFloatingWindow, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | // Tests are flaky on Mac as transitioning to fullscreen is not instantaneous | 
|  | // and throws errors when entering/exiting fullscreen too quickly. | 
|  | #if BUILDFLAG(IS_MAC) | 
|  | #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 BUILDFLAG(IS_MAC) | 
|  | #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 BUILDFLAG(IS_MAC) | 
|  | #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 BUILDFLAG(IS_MAC) | 
|  | #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 BUILDFLAG(IS_MAC) | 
|  | #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_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  |  | 
|  | // From the API's point of view, the always-on-top property is enabled. | 
|  | EXPECT_TRUE(window->IsAlwaysOnTop()); | 
|  |  | 
|  | window->Restore(); | 
|  | EXPECT_EQ(ui::ZOrderLevel::kFloatingWindow, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  |  | 
|  | CloseAppWindow(window); | 
|  | } | 
|  |  | 
|  | #if BUILDFLAG(IS_MAC) | 
|  | #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_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  | window->SetAlwaysOnTop(false); | 
|  | EXPECT_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  |  | 
|  | // Ensure that always-on-top remains disabled. | 
|  | window->Restore(); | 
|  | EXPECT_EQ(ui::ZOrderLevel::kNormal, | 
|  | window->GetBaseWindow()->GetZOrderLevel()); | 
|  |  | 
|  | CloseAppWindow(window); | 
|  | } | 
|  |  | 
|  | // Tests a window created with showInShelf property enabled is indeed marked | 
|  | // as shown in shelf in AppWindow. | 
|  | IN_PROC_BROWSER_TEST_F(AppWindowTest, InitShowInShelf) { | 
|  | AppWindow* window = | 
|  | CreateTestAppWindow("{ \"showInShelf\": true , \"id\": \"window\" }"); | 
|  | ASSERT_TRUE(window); | 
|  |  | 
|  | // Ensure that the window created is marked as shown in shelf. | 
|  | EXPECT_TRUE(window->show_in_shelf()); | 
|  |  | 
|  | CloseAppWindow(window); | 
|  | } | 
|  |  | 
|  | }  // namespace extensions |