Battery Status API: add UMA logging for Linux.
[chromium-blink-merge.git] / content / browser / screen_orientation / screen_orientation_browsertest.cc
blobf76f48b545cfcca868d3a5e8c0f74e1a5859f5e8
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.
5 #include <stdlib.h>
7 #include "base/command_line.h"
8 #include "content/browser/renderer_host/render_widget_host_impl.h"
9 #include "content/common/view_messages.h"
10 #include "content/public/browser/render_widget_host.h"
11 #include "content/public/browser/render_widget_host_view.h"
12 #include "content/public/browser/web_contents.h"
13 #include "content/public/common/content_switches.h"
14 #include "content/public/test/browser_test_utils.h"
15 #include "content/public/test/content_browser_test.h"
16 #include "content/public/test/content_browser_test_utils.h"
17 #include "content/public/test/test_navigation_observer.h"
18 #include "content/public/test/test_utils.h"
19 #include "content/shell/browser/shell.h"
20 #include "content/shell/common/shell_switches.h"
21 #include "third_party/WebKit/public/platform/WebScreenInfo.h"
22 #include "ui/compositor/compositor_switches.h"
24 #if defined(OS_WIN)
25 #include "base/win/windows_version.h"
26 #endif // OS_WIN
28 namespace content {
30 class ScreenOrientationBrowserTest : public ContentBrowserTest {
31 public:
32 ScreenOrientationBrowserTest() {
35 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
36 command_line->AppendSwitch(
37 switches::kEnableExperimentalWebPlatformFeatures);
40 virtual void SetUp() OVERRIDE {
41 // Painting has to happen otherwise the Resize messages will be added on top
42 // of each other without properly ack-painting which will fail and crash.
43 UseSoftwareCompositing();
45 ContentBrowserTest::SetUp();
48 protected:
49 void SendFakeScreenOrientation(unsigned angle, const std::string& strType) {
50 RenderWidgetHost* rwh = shell()->web_contents()->GetRenderWidgetHostView()
51 ->GetRenderWidgetHost();
52 blink::WebScreenInfo screen_info;
53 rwh->GetWebScreenInfo(&screen_info);
54 screen_info.orientationAngle = angle;
56 blink::WebScreenOrientationType type = blink::WebScreenOrientationUndefined;
57 if (strType == "portrait-primary") {
58 type = blink::WebScreenOrientationPortraitPrimary;
59 } else if (strType == "portrait-secondary") {
60 type = blink::WebScreenOrientationPortraitSecondary;
61 } else if (strType == "landscape-primary") {
62 type = blink::WebScreenOrientationLandscapePrimary;
63 } else if (strType == "landscape-secondary") {
64 type = blink::WebScreenOrientationLandscapeSecondary;
66 ASSERT_NE(blink::WebScreenOrientationUndefined, type);
67 screen_info.orientationType = type;
69 ViewMsg_Resize_Params params;
70 params.screen_info = screen_info;
71 params.new_size = gfx::Size(0, 0);
72 params.physical_backing_size = gfx::Size(300, 300);
73 params.top_controls_layout_height = 0.f;
74 params.resizer_rect = gfx::Rect();
75 params.is_fullscreen = false;
76 rwh->Send(new ViewMsg_Resize(rwh->GetRoutingID(), params));
79 int GetOrientationAngle() {
80 int angle;
81 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
82 "screen.orientation.angle")->GetAsInteger(&angle);
83 return angle;
86 std::string GetOrientationType() {
87 std::string type;
88 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
89 "screen.orientation.type")->GetAsString(&type);
90 return type;
93 bool ScreenOrientationSupported() {
94 bool support;
95 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
96 "'orientation' in screen")->GetAsBoolean(&support);
97 return support;
100 bool WindowOrientationSupported() {
101 bool support;
102 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
103 "'orientation' in window")->GetAsBoolean(&support);
104 return support;
107 int GetWindowOrientationAngle() {
108 int angle;
109 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(),
110 "window.orientation")->GetAsInteger(&angle);
111 return angle;
114 private:
115 DISALLOW_COPY_AND_ASSIGN(ScreenOrientationBrowserTest);
118 // This test doesn't work on MacOS X but the reason is mostly because it is not
119 // used Aura. It could be set as !defined(OS_MACOSX) but the rule below will
120 // actually support MacOS X if and when it switches to Aura.
121 #if defined(USE_AURA) || defined(OS_ANDROID)
122 IN_PROC_BROWSER_TEST_F(ScreenOrientationBrowserTest, ScreenOrientationChange) {
123 std::string types[] = { "portrait-primary",
124 "portrait-secondary",
125 "landscape-primary",
126 "landscape-secondary" };
127 GURL test_url = GetTestUrl("screen_orientation",
128 "screen_orientation_screenorientationchange.html");
130 TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
131 shell()->LoadURL(test_url);
132 navigation_observer.Wait();
133 #if USE_AURA
134 WaitForResizeComplete(shell()->web_contents());
135 #endif // USE_AURA
137 #if defined(OS_WIN)
138 // Screen Orientation is currently disabled on Windows 8.
139 // This test will break, requiring an update when the API will be enabled.
140 if (base::win::OSInfo::GetInstance()->version() >= base::win::VERSION_WIN8) {
141 EXPECT_EQ(false, ScreenOrientationSupported());
142 return;
144 #endif // defined(OS_WIN)
146 int angle = GetOrientationAngle();
148 for (int i = 0; i < 4; ++i) {
149 angle = (angle + 90) % 360;
150 SendFakeScreenOrientation(angle, types[i]);
152 TestNavigationObserver navigation_observer(shell()->web_contents());
153 navigation_observer.Wait();
154 EXPECT_EQ(angle, GetOrientationAngle());
155 EXPECT_EQ(types[i], GetOrientationType());
158 #endif // defined(USE_AURA) || defined(OS_ANDROID)
160 IN_PROC_BROWSER_TEST_F(ScreenOrientationBrowserTest, WindowOrientationChange) {
161 GURL test_url = GetTestUrl("screen_orientation",
162 "screen_orientation_windoworientationchange.html");
164 TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
165 shell()->LoadURL(test_url);
166 navigation_observer.Wait();
167 #if USE_AURA
168 WaitForResizeComplete(shell()->web_contents());
169 #endif // USE_AURA
171 if (!WindowOrientationSupported())
172 return;
174 int angle = GetWindowOrientationAngle();
176 for (int i = 0; i < 4; ++i) {
177 angle = (angle + 90) % 360;
178 SendFakeScreenOrientation(angle, "portrait-primary");
180 TestNavigationObserver navigation_observer(shell()->web_contents(), 1);
181 navigation_observer.Wait();
182 EXPECT_EQ(angle == 270 ? -90 : angle, GetWindowOrientationAngle());
186 // Chromium Android does not support fullscreen
187 IN_PROC_BROWSER_TEST_F(ScreenOrientationBrowserTest, LockSmoke) {
188 GURL test_url = GetTestUrl("screen_orientation",
189 "screen_orientation_lock_smoke.html");
191 TestNavigationObserver navigation_observer(shell()->web_contents(), 2);
192 shell()->LoadURL(test_url);
194 #if defined(OS_WIN)
195 // Screen Orientation is currently disabled on Windows 8.
196 // This test will break, requiring an update when the API will be enabled.
197 if (base::win::OSInfo::GetInstance()->version() >= base::win::VERSION_WIN8) {
198 EXPECT_EQ(false, ScreenOrientationSupported());
199 return;
201 #endif // defined(OS_WIN)
203 navigation_observer.Wait();
204 #if USE_AURA
205 WaitForResizeComplete(shell()->web_contents());
206 #endif // USE_AURA
208 std::string expected =
209 #if defined(OS_ANDROID)
210 "SecurityError"; // WebContents need to be fullscreen.
211 #else
212 "NotSupportedError"; // Locking isn't supported.
213 #endif
215 EXPECT_EQ(expected, shell()->web_contents()->GetLastCommittedURL().ref());
218 } // namespace content