blob: fd802640f582424cbe2b9f2c7e5697d54a23296e [file] [log] [blame]
// Copyright 2013 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"
#include "chrome/browser/extensions/extension_test_message_listener.h"
#include "chrome/test/base/interactive_test_utils.h"
using namespace apps;
// Helper class that has to be created in the stack to check if the fullscreen
// setting of a NativeWindow has changed since the creation of the object.
class FullscreenChangeWaiter {
public:
explicit FullscreenChangeWaiter(NativeAppWindow* window)
: window_(window),
initial_fullscreen_state_(window_->IsFullscreen()) {}
void Wait() {
while (initial_fullscreen_state_ != window_->IsFullscreen())
content::RunAllPendingInMessageLoop();
}
private:
NativeAppWindow* window_;
bool initial_fullscreen_state_;
DISALLOW_COPY_AND_ASSIGN(FullscreenChangeWaiter);
};
class AppWindowInteractiveTest : public extensions::PlatformAppBrowserTest {
public:
bool RunAppWindowInteractiveTest(const char* testName) {
ExtensionTestMessageListener launched_listener("Launched", true);
LoadAndLaunchPlatformApp("window_api_interactive");
if (!launched_listener.WaitUntilSatisfied()) {
message_ = "Did not get the 'Launched' message.";
return false;
}
ResultCatcher catcher;
launched_listener.Reply(testName);
if (!catcher.GetNextResult()) {
message_ = catcher.message();
return false;
}
return true;
}
bool SimulateKeyPress(ui::KeyboardCode key) {
return ui_test_utils::SendKeyPressToWindowSync(
GetFirstShellWindow()->GetNativeWindow(),
key,
false,
false,
false,
false);
}
};
#if defined(OS_LINUX) && defined(USE_AURA)
// These tests do not work on Linux Aura because when the window is raised, the
// content is not focused thus do not get the key events.
// See http://crbug.com/324346
#define MAYBE_ESCDoesNotLeaveFullscreenWindow \
DISABLED_ESCDoesNotLeaveFullscreenWindow
#define MAYBE_ESCDoesNotLeaveFullscreenDOM DISABLED_ESCDoesNotLeaveFullscreenDOM
// These tests are failing on Linux Aura for unknown reasons.
#define MAYBE_ESCLeavesFullscreenWindow DISABLED_ESCLeavesFullscreenWindow
#define MAYBE_ESCLeavesFullscreenDOM DISABLED_ESCLeavesFullscreenDOM
#elif defined(OS_MACOSX)
// These tests are highly flaky on MacOS.
#define MAYBE_ESCLeavesFullscreenWindow DISABLED_ESCLeavesFullscreenWindow
#define MAYBE_ESCLeavesFullscreenDOM DISABLED_ESCLeavesFullscreenDOM
#define MAYBE_ESCDoesNotLeaveFullscreenWindow \
DISABLED_ESCDoesNotLeaveFullscreenWindow
#define MAYBE_ESCDoesNotLeaveFullscreenDOM DISABLED_ESCDoesNotLeaveFullscreenDOM
#else
#define MAYBE_ESCLeavesFullscreenWindow ESCLeavesFullscreenWindow
#define MAYBE_ESCLeavesFullscreenDOM ESCLeavesFullscreenDOM
#define MAYBE_ESCDoesNotLeaveFullscreenWindow ESCDoesNotLeaveFullscreenWindow
#define MAYBE_ESCDoesNotLeaveFullscreenDOM ESCDoesNotLeaveFullscreenDOM
#endif
IN_PROC_BROWSER_TEST_F(AppWindowInteractiveTest,
MAYBE_ESCLeavesFullscreenWindow) {
ExtensionTestMessageListener launched_listener("Launched", true);
LoadAndLaunchPlatformApp("leave_fullscreen");
ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
// When receiving the reply, the application will try to go fullscreen using
// the Window API but there is no synchronous way to know if that actually
// succeeded. Also, failure will not be notified. A failure case will only be
// known with a timeout.
{
FullscreenChangeWaiter fs_changed(GetFirstShellWindow()->GetBaseWindow());
launched_listener.Reply("window");
fs_changed.Wait();
}
// Same idea as above but for leaving fullscreen. Fullscreen mode should be
// left when ESC is received.
{
FullscreenChangeWaiter fs_changed(GetFirstShellWindow()->GetBaseWindow());
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_ESCAPE));
fs_changed.Wait();
}
}
IN_PROC_BROWSER_TEST_F(AppWindowInteractiveTest, MAYBE_ESCLeavesFullscreenDOM) {
ExtensionTestMessageListener launched_listener("Launched", true);
LoadAndLaunchPlatformApp("leave_fullscreen");
ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
launched_listener.Reply("dom");
// Because the DOM way to go fullscreen requires user gesture, we simulate a
// key event to get the window entering in fullscreen mode. The reply will
// make the window listen for the key event. The reply will be sent to the
// renderer process before the keypress and should be received in that order.
// When receiving the key event, the application will try to go fullscreen
// using the Window API but there is no synchronous way to know if that
// actually succeeded. Also, failure will not be notified. A failure case will
// only be known with a timeout.
{
FullscreenChangeWaiter fs_changed(GetFirstShellWindow()->GetBaseWindow());
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_A));
fs_changed.Wait();
}
// Same idea as above but for leaving fullscreen. Fullscreen mode should be
// left when ESC is received.
{
FullscreenChangeWaiter fs_changed(GetFirstShellWindow()->GetBaseWindow());
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_ESCAPE));
fs_changed.Wait();
}
}
IN_PROC_BROWSER_TEST_F(AppWindowInteractiveTest,
MAYBE_ESCDoesNotLeaveFullscreenWindow) {
ExtensionTestMessageListener launched_listener("Launched", true);
LoadAndLaunchPlatformApp("prevent_leave_fullscreen");
ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
// When receiving the reply, the application will try to go fullscreen using
// the Window API but there is no synchronous way to know if that actually
// succeeded. Also, failure will not be notified. A failure case will only be
// known with a timeout.
{
FullscreenChangeWaiter fs_changed(GetFirstShellWindow()->GetBaseWindow());
launched_listener.Reply("window");
fs_changed.Wait();
}
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_ESCAPE));
ExtensionTestMessageListener second_key_listener("B_KEY_RECEIVED", false);
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_B));
ASSERT_TRUE(second_key_listener.WaitUntilSatisfied());
// We assume that at that point, if we had to leave fullscreen, we should be.
// However, by nature, we can not guarantee that and given that we do test
// that nothing happens, we might end up with random-success when the feature
// is broken.
EXPECT_TRUE(GetFirstShellWindow()->GetBaseWindow()->IsFullscreen());
}
IN_PROC_BROWSER_TEST_F(AppWindowInteractiveTest,
MAYBE_ESCDoesNotLeaveFullscreenDOM) {
ExtensionTestMessageListener launched_listener("Launched", true);
LoadAndLaunchPlatformApp("prevent_leave_fullscreen");
ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
launched_listener.Reply("dom");
// Because the DOM way to go fullscreen requires user gesture, we simulate a
// key event to get the window entering in fullscreen mode. The reply will
// make the window listen for the key event. The reply will be sent to the
// renderer process before the keypress and should be received in that order.
// When receiving the key event, the application will try to go fullscreen
// using the Window API but there is no synchronous way to know if that
// actually succeeded. Also, failure will not be notified. A failure case will
// only be known with a timeout.
{
FullscreenChangeWaiter fs_changed(GetFirstShellWindow()->GetBaseWindow());
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_A));
fs_changed.Wait();
}
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_ESCAPE));
ExtensionTestMessageListener second_key_listener("B_KEY_RECEIVED", false);
ASSERT_TRUE(SimulateKeyPress(ui::VKEY_B));
ASSERT_TRUE(second_key_listener.WaitUntilSatisfied());
// We assume that at that point, if we had to leave fullscreen, we should be.
// However, by nature, we can not guarantee that and given that we do test
// that nothing happens, we might end up with random-success when the feature
// is broken.
EXPECT_TRUE(GetFirstShellWindow()->GetBaseWindow()->IsFullscreen());
}
// This test does not work on Linux Aura because ShowInactive() is not
// implemented. See http://crbug.com/325142
// It also does not work on Windows because of the document being focused even
// though the window is not activated. See http://crbug.com/326986
// It also does not work on MacOS because ::ShowInactive() ends up behaving like
// ::Show() because of Cocoa conventions. See http://crbug.com/326987
#if (defined(OS_LINUX) && defined(USE_AURA)) || \
defined(OS_WIN) || defined(OS_MACOSX)
#define MAYBE_TestCreate DISABLED_TestCreate
#else
#define MAYBE_TestCreate TestCreate
#endif
IN_PROC_BROWSER_TEST_F(AppWindowInteractiveTest, MAYBE_TestCreate) {
ASSERT_TRUE(RunAppWindowInteractiveTest("testCreate")) << message_;
}