blob: 69f5563f7f6b8c4f20c68eb779832f2746a50d16 [file] [log] [blame]
[email protected]007c1192013-11-25 23:32:511// 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
9using extensions::PlatformAppBrowserTest;
10using extensions::Extension;
11
12namespace apps {
13
14namespace {
15
16const char kDefaultTestApp[] = "shell_window/generic";
17
18class 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.
101IN_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.
121IN_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.
141IN_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.
158IN_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.
177IN_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.
203IN_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