1 // Copyright 2013 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 "apps/ui/native_app_window.h" 6 #include "chrome/browser/apps/app_browsertest_util.h" 7 #include "chrome/browser/extensions/extension_test_message_listener.h" 8 9 using extensions::PlatformAppBrowserTest; 10 using extensions::Extension; 11 12 namespace apps { 13 14 namespace { 15 16 const char kDefaultTestApp[] = "shell_window/generic"; 17 18 class ShellWindowTest : public PlatformAppBrowserTest { 19 protected: 20 // Load the test app and create a window. The window must be closed by the 21 // caller in order to terminate the test. 22 // |app_path| is the name of the test. 23 // |window_create_options| are the options that will be passed to 24 // chrome.app.window.create() in the test app. 25 ShellWindow* OpenWindow(const char* app_path, 26 const char* window_create_options) { 27 ExtensionTestMessageListener launched_listener("launched", true); 28 ExtensionTestMessageListener loaded_listener("window_loaded", false); 29 30 // Load and launch the test app. 31 const Extension* extension = LoadAndLaunchPlatformApp(app_path); 32 EXPECT_TRUE(extension); 33 EXPECT_TRUE(launched_listener.WaitUntilSatisfied()); 34 35 // Send the options for window creation. 36 launched_listener.Reply(window_create_options); 37 38 // Wait for the window to be opened and loaded. 39 EXPECT_TRUE(loaded_listener.WaitUntilSatisfied()); 40 41 EXPECT_EQ(1U, GetShellWindowCount()); 42 ShellWindow* shell_window = GetFirstShellWindow(); 43 return shell_window; 44 } 45 46 void CheckAlwaysOnTopToFullscreen(ShellWindow* window) { 47 ASSERT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 48 49 // The always-on-top property should be temporarily disabled when the window 50 // enters fullscreen. 51 window->Fullscreen(); 52 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 53 54 // From the API's point of view, the always-on-top property is enabled. 55 EXPECT_TRUE(window->IsAlwaysOnTop()); 56 57 // The always-on-top property is restored when the window exits fullscreen. 58 window->Restore(); 59 EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 60 } 61 62 void CheckNormalToFullscreen(ShellWindow* window) { 63 // If the always-on-top property is false, it should remain this way when 64 // entering and exiting fullscreen mode. 65 ASSERT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 66 window->Fullscreen(); 67 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 68 window->Restore(); 69 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 70 } 71 72 void CheckFullscreenToAlwaysOnTop(ShellWindow* window) { 73 ASSERT_TRUE(window->GetBaseWindow()->IsFullscreenOrPending()); 74 75 // Now enable always-on-top at runtime and ensure the property does not get 76 // applied immediately because the window is in fullscreen mode. 77 window->SetAlwaysOnTop(true); 78 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 79 80 // From the API's point of view, the always-on-top property is enabled. 81 EXPECT_TRUE(window->IsAlwaysOnTop()); 82 83 // Ensure the always-on-top property is applied when exiting fullscreen. 84 window->Restore(); 85 EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 86 } 87 }; 88 89 } // namespace 90 91 // Tests are flaky on Mac as transitioning to fullscreen is not instantaneous 92 // and throws errors when entering/exiting fullscreen too quickly. 93 #if defined(OS_MACOSX) 94 #define MAYBE_InitAlwaysOnTopToFullscreen DISABLED_InitAlwaysOnTopToFullscreen 95 #else 96 #define MAYBE_InitAlwaysOnTopToFullscreen InitAlwaysOnTopToFullscreen 97 #endif 98 99 // Tests a window created with always-on-top enabled and ensures that the 100 // property is temporarily switched off when entering fullscreen mode. 101 IN_PROC_BROWSER_TEST_F(ShellWindowTest, MAYBE_InitAlwaysOnTopToFullscreen) { 102 ShellWindow* window = OpenWindow( 103 kDefaultTestApp, "{ \"alwaysOnTop\": true }"); 104 ASSERT_TRUE(window); 105 CheckAlwaysOnTopToFullscreen(window); 106 107 window->SetAlwaysOnTop(false); 108 CheckNormalToFullscreen(window); 109 110 CloseShellWindow(window); 111 } 112 113 #if defined(OS_MACOSX) 114 #define MAYBE_RuntimeAlwaysOnTopToFullscreen DISABLED_RuntimeAlwaysOnTopToFullscreen 115 #else 116 #define MAYBE_RuntimeAlwaysOnTopToFullscreen RuntimeAlwaysOnTopToFullscreen 117 #endif 118 119 // Tests a window with always-on-top enabled at runtime and ensures that the 120 // property is temporarily switched off when entering fullscreen mode. 121 IN_PROC_BROWSER_TEST_F(ShellWindowTest, MAYBE_RuntimeAlwaysOnTopToFullscreen) { 122 ShellWindow* window = OpenWindow( 123 kDefaultTestApp, "{}"); 124 ASSERT_TRUE(window); 125 CheckNormalToFullscreen(window); 126 127 window->SetAlwaysOnTop(true); 128 CheckAlwaysOnTopToFullscreen(window); 129 130 CloseShellWindow(window); 131 } 132 133 #if defined(OS_MACOSX) 134 #define MAYBE_InitFullscreenToAlwaysOnTop DISABLED_InitFullscreenToAlwaysOnTop 135 #else 136 #define MAYBE_InitFullscreenToAlwaysOnTop InitFullscreenToAlwaysOnTop 137 #endif 138 139 // Tests a window created initially in fullscreen mode and ensures that the 140 // always-on-top property does not get applied until it exits fullscreen. 141 IN_PROC_BROWSER_TEST_F(ShellWindowTest, MAYBE_InitFullscreenToAlwaysOnTop) { 142 ShellWindow* window = OpenWindow( 143 kDefaultTestApp, "{ \"state\": \"fullscreen\" }"); 144 ASSERT_TRUE(window); 145 CheckFullscreenToAlwaysOnTop(window); 146 147 CloseShellWindow(window); 148 } 149 150 #if defined(OS_MACOSX) 151 #define MAYBE_RuntimeFullscreenToAlwaysOnTop DISABLED_RuntimeFullscreenToAlwaysOnTop 152 #else 153 #define MAYBE_RuntimeFullscreenToAlwaysOnTop RuntimeFullscreenToAlwaysOnTop 154 #endif 155 156 // Tests a window that enters fullscreen mode at runtime and ensures that the 157 // always-on-top property does not get applied until it exits fullscreen. 158 IN_PROC_BROWSER_TEST_F(ShellWindowTest, MAYBE_RuntimeFullscreenToAlwaysOnTop) { 159 ShellWindow* window = OpenWindow( 160 kDefaultTestApp, "{}"); 161 ASSERT_TRUE(window); 162 163 window->Fullscreen(); 164 CheckFullscreenToAlwaysOnTop(window); 165 166 CloseShellWindow(window); 167 } 168 169 #if defined(OS_MACOSX) 170 #define MAYBE_InitFullscreenAndAlwaysOnTop DISABLED_InitFullscreenAndAlwaysOnTop 171 #else 172 #define MAYBE_InitFullscreenAndAlwaysOnTop InitFullscreenAndAlwaysOnTop 173 #endif 174 175 // Tests a window created with both fullscreen and always-on-top enabled. Ensure 176 // that always-on-top is only applied when the window exits fullscreen. 177 IN_PROC_BROWSER_TEST_F(ShellWindowTest, MAYBE_InitFullscreenAndAlwaysOnTop) { 178 ShellWindow* window = OpenWindow( 179 kDefaultTestApp, "{ \"alwaysOnTop\": true, \"state\": \"fullscreen\" }"); 180 ASSERT_TRUE(window); 181 182 EXPECT_TRUE(window->GetBaseWindow()->IsFullscreenOrPending()); 183 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 184 185 // From the API's point of view, the always-on-top property is enabled. 186 EXPECT_TRUE(window->IsAlwaysOnTop()); 187 188 window->Restore(); 189 EXPECT_TRUE(window->GetBaseWindow()->IsAlwaysOnTop()); 190 191 CloseShellWindow(window); 192 } 193 194 #if defined(OS_MACOSX) 195 #define MAYBE_DisableAlwaysOnTopInFullscreen DISABLED_DisableAlwaysOnTopInFullscreen 196 #else 197 #define MAYBE_DisableAlwaysOnTopInFullscreen DisableAlwaysOnTopInFullscreen 198 #endif 199 200 // Tests a window created with always-on-top enabled, but then disabled while 201 // in fullscreen mode. After exiting fullscreen, always-on-top should remain 202 // disabled. 203 IN_PROC_BROWSER_TEST_F(ShellWindowTest, MAYBE_DisableAlwaysOnTopInFullscreen) { 204 ShellWindow* window = OpenWindow( 205 kDefaultTestApp, "{ \"alwaysOnTop\": true }"); 206 ASSERT_TRUE(window); 207 208 // Disable always-on-top while in fullscreen mode. 209 window->Fullscreen(); 210 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 211 window->SetAlwaysOnTop(false); 212 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 213 214 // Ensure that always-on-top remains disabled. 215 window->Restore(); 216 EXPECT_FALSE(window->GetBaseWindow()->IsAlwaysOnTop()); 217 218 CloseShellWindow(window); 219 } 220 221 } // namespace apps 222