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