blob: 2d7445c3af86cb83278910f7c6c0e7e05a10c676 [file] [log] [blame]
// Copyright 2014 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 <stdlib.h>
#include "base/command_line.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/common/view_messages.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/public/test/test_utils.h"
#include "content/shell/browser/shell.h"
#include "content/shell/common/shell_switches.h"
#include "third_party/WebKit/public/platform/WebScreenInfo.h"
#include "ui/compositor/compositor_switches.h"
#if defined(OS_WIN)
#include "base/win/windows_version.h"
#endif // OS_WIN
namespace content {
class ScreenOrientationBrowserTest : public ContentBrowserTest {
public:
ScreenOrientationBrowserTest() {
}
protected:
void SendFakeScreenOrientation(unsigned angle, const std::string& strType) {
RenderWidgetHost* rwh = shell()->web_contents()->GetRenderWidgetHostView()
->GetRenderWidgetHost();
blink::WebScreenInfo screen_info;
rwh->GetWebScreenInfo(&screen_info);
screen_info.orientationAngle = angle;
blink::WebScreenOrientationType type = blink::WebScreenOrientationUndefined;
if (strType == "portrait-primary") {
type = blink::WebScreenOrientationPortraitPrimary;
} else if (strType == "portrait-secondary") {
type = blink::WebScreenOrientationPortraitSecondary;
} else if (strType == "landscape-primary") {
type = blink::WebScreenOrientationLandscapePrimary;
} else if (strType == "landscape-secondary") {
type = blink::WebScreenOrientationLandscapeSecondary;
}
ASSERT_NE(blink::WebScreenOrientationUndefined, type);
screen_info.orientationType = type;
ViewMsg_Resize_Params params;
params.screen_info = screen_info;
params.new_size = gfx::Size(0, 0);
params.physical_backing_size = gfx::Size(300, 300);
params.top_controls_height = 0.f;
params.top_controls_shrink_blink_size = false;
params.resizer_rect = gfx::Rect();
params.is_fullscreen_granted = false;
rwh->Send(new ViewMsg_Resize(rwh->GetRoutingID(), params));
}
int GetOrientationAngle() {
int angle;
ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
"screen.orientation.angle")->GetAsInteger(&angle);
return angle;
}
std::string GetOrientationType() {
std::string type;
ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
"screen.orientation.type")->GetAsString(&type);
return type;
}
bool ScreenOrientationSupported() {
bool support;
ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
"'orientation' in screen")->GetAsBoolean(&support);
return support;
}
bool WindowOrientationSupported() {
bool support;
ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
"'orientation' in window")->GetAsBoolean(&support);
return support;
}
int GetWindowOrientationAngle() {
int angle;
ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
"window.orientation")->GetAsInteger(&angle);
return angle;
}
private:
DISALLOW_COPY_AND_ASSIGN(ScreenOrientationBrowserTest);
};
// This test doesn't work on MacOS X but the reason is mostly because it is not
// used Aura. It could be set as !defined(OS_MACOSX) but the rule below will
// actually support MacOS X if and when it switches to Aura.
#if defined(USE_AURA) || defined(OS_ANDROID)
// Flaky on Chrome OS: http://crbug.com/468259
#if defined(OS_CHROMEOS)
#define MAYBE_ScreenOrientationChange DISABLED_ScreenOrientationChange
#else
#define MAYBE_ScreenOrientationChange ScreenOrientationChange
#endif
IN_PROC_BROWSER_TEST_F(ScreenOrientationBrowserTest,
MAYBE_ScreenOrientationChange) {
std::string types[] = { "portrait-primary",
"portrait-secondary",
"landscape-primary",
"landscape-secondary" };
GURL test_url = GetTestUrl("screen_orientation",
"screen_orientation_screenorientationchange.html");
TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
shell()->LoadURL(test_url);
navigation_observer.Wait();
WaitForResizeComplete(shell()->web_contents());
#if defined(OS_WIN)
// Screen Orientation is currently disabled on Windows 8.
// This test will break, requiring an update when the API will be enabled.
if (base::win::OSInfo::GetInstance()->version() >= base::win::VERSION_WIN8) {
EXPECT_EQ(false, ScreenOrientationSupported());
return;
}
#endif // defined(OS_WIN)
int angle = GetOrientationAngle();
for (int i = 0; i < 4; ++i) {
angle = (angle + 90) % 360;
SendFakeScreenOrientation(angle, types[i]);
TestNavigationObserver navigation_observer(shell()->web_contents());
navigation_observer.Wait();
EXPECT_EQ(angle, GetOrientationAngle());
EXPECT_EQ(types[i], GetOrientationType());
}
}
#endif // defined(USE_AURA) || defined(OS_ANDROID)
// Flaky on Chrome OS: http://crbug.com/468259
#if defined(OS_CHROMEOS)
#define MAYBE_WindowOrientationChange DISABLED_WindowOrientationChange
#else
#define MAYBE_WindowOrientationChange WindowOrientationChange
#endif
IN_PROC_BROWSER_TEST_F(ScreenOrientationBrowserTest,
MAYBE_WindowOrientationChange) {
GURL test_url = GetTestUrl("screen_orientation",
"screen_orientation_windoworientationchange.html");
TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
shell()->LoadURL(test_url);
navigation_observer.Wait();
#if USE_AURA || defined(OS_ANDROID)
WaitForResizeComplete(shell()->web_contents());
#endif // USE_AURA || defined(OS_ANDROID)
if (!WindowOrientationSupported())
return;
int angle = GetWindowOrientationAngle();
for (int i = 0; i < 4; ++i) {
angle = (angle + 90) % 360;
SendFakeScreenOrientation(angle, "portrait-primary");
TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
navigation_observer.Wait();
EXPECT_EQ(angle == 270 ? -90 : angle, GetWindowOrientationAngle());
}
}
// LockSmoke test seems to have become flaky on all non-ChromeOS platforms.
// The cause is unfortunately unknown. See https://crbug.com/448876
// Chromium Android does not support fullscreen
IN_PROC_BROWSER_TEST_F(ScreenOrientationBrowserTest, DISABLED_LockSmoke) {
GURL test_url = GetTestUrl("screen_orientation",
"screen_orientation_lock_smoke.html");
TestNavigationObserver navigation_observer(shell()->web_contents(), 2);
shell()->LoadURL(test_url);
#if defined(OS_WIN)
// Screen Orientation is currently disabled on Windows 8.
// This test will break, requiring an update when the API will be enabled.
if (base::win::OSInfo::GetInstance()->version() >= base::win::VERSION_WIN8) {
EXPECT_EQ(false, ScreenOrientationSupported());
return;
}
#endif // defined(OS_WIN)
navigation_observer.Wait();
#if USE_AURA || defined(OS_ANDROID)
WaitForResizeComplete(shell()->web_contents());
#endif // USE_AURA || defined(OS_ANDROID)
std::string expected =
#if defined(OS_ANDROID)
"SecurityError"; // WebContents need to be fullscreen.
#else
"NotSupportedError"; // Locking isn't supported.
#endif
EXPECT_EQ(expected, shell()->web_contents()->GetLastCommittedURL().ref());
}
// Check that using screen orientation after a frame is detached doesn't crash
// the renderer process.
// This could be a LayoutTest if they were not using a mock screen orientation
// controller.
IN_PROC_BROWSER_TEST_F(ScreenOrientationBrowserTest, CrashTest_UseAfterDetach) {
GURL test_url = GetTestUrl("screen_orientation",
"screen_orientation_use_after_detach.html");
TestNavigationObserver navigation_observer(shell()->web_contents(), 2);
shell()->LoadURL(test_url);
#if defined(OS_WIN)
// Screen Orientation is currently disabled on Windows 8.
// When implemented, this test will break, requiring an update.
if (base::win::OSInfo::GetInstance()->version() >= base::win::VERSION_WIN8) {
EXPECT_EQ(false, ScreenOrientationSupported());
return;
}
#endif // defined(OS_WIN)
navigation_observer.Wait();
// This is a success if the renderer process did not crash, thus, we end up
// here.
}
#if defined(OS_ANDROID)
class ScreenOrientationLockDisabledBrowserTest : public ContentBrowserTest {
public:
ScreenOrientationLockDisabledBrowserTest() {}
~ScreenOrientationLockDisabledBrowserTest() override {}
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitch(switches::kDisableScreenOrientationLock);
}
};
// Check that when --disable-screen-orientation-lock is passed to the command
// line, screen.orientation.lock() correctly reports to not be supported.
// Flaky: https://crbug.com/498236
IN_PROC_BROWSER_TEST_F(ScreenOrientationLockDisabledBrowserTest,
DISABLED_NotSupported) {
GURL test_url = GetTestUrl("screen_orientation",
"screen_orientation_lock_disabled.html");
TestNavigationObserver navigation_observer(shell()->web_contents(), 2);
shell()->LoadURL(test_url);
navigation_observer.Wait();
EXPECT_EQ("NotSupportedError",
shell()->web_contents()->GetLastCommittedURL().ref());
}
#endif // defined(OS_ANDROID)
} // namespace content