OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdlib.h> | 5 #include <stdlib.h> |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
10 #include "content/browser/frame_host/frame_tree.h" | |
11 #include "content/browser/frame_host/render_frame_host_impl.h" | |
10 #include "content/browser/renderer_host/render_widget_host_impl.h" | 12 #include "content/browser/renderer_host/render_widget_host_impl.h" |
13 #include "content/browser/web_contents/web_contents_impl.h" | |
14 #include "content/common/page_messages.h" | |
11 #include "content/common/view_messages.h" | 15 #include "content/common/view_messages.h" |
12 #include "content/public/browser/render_widget_host.h" | 16 #include "content/public/browser/render_widget_host.h" |
13 #include "content/public/browser/render_widget_host_view.h" | 17 #include "content/public/browser/render_widget_host_view.h" |
14 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
15 #include "content/public/common/content_switches.h" | 19 #include "content/public/common/content_switches.h" |
16 #include "content/public/test/browser_test_utils.h" | 20 #include "content/public/test/browser_test_utils.h" |
17 #include "content/public/test/content_browser_test.h" | 21 #include "content/public/test/content_browser_test.h" |
18 #include "content/public/test/content_browser_test_utils.h" | 22 #include "content/public/test/content_browser_test_utils.h" |
19 #include "content/public/test/test_navigation_observer.h" | 23 #include "content/public/test/test_navigation_observer.h" |
20 #include "content/public/test/test_utils.h" | 24 #include "content/public/test/test_utils.h" |
21 #include "content/shell/browser/shell.h" | 25 #include "content/shell/browser/shell.h" |
22 #include "content/shell/common/shell_switches.h" | 26 #include "content/shell/common/shell_switches.h" |
27 #include "net/dns/mock_host_resolver.h" | |
23 #include "ui/compositor/compositor_switches.h" | 28 #include "ui/compositor/compositor_switches.h" |
29 #include "ui/display/screen.h" | |
24 | 30 |
25 namespace content { | 31 namespace content { |
26 | 32 |
27 class ScreenOrientationBrowserTest : public ContentBrowserTest { | 33 class ScreenOrientationBrowserTest : public ContentBrowserTest { |
28 public: | 34 public: |
29 ScreenOrientationBrowserTest() { | 35 ScreenOrientationBrowserTest() { |
30 } | 36 } |
31 | 37 |
38 WebContentsImpl* web_contents() { | |
39 return static_cast<WebContentsImpl*>(shell()->web_contents()); | |
40 } | |
41 | |
32 protected: | 42 protected: |
33 void SendFakeScreenOrientation(unsigned angle, const std::string& strType) { | 43 void SendFakeScreenOrientation(unsigned angle, const std::string& strType) { |
34 RenderWidgetHost* rwh = shell()->web_contents()->GetRenderWidgetHostView() | 44 RenderWidgetHost* main_frame_rwh = |
35 ->GetRenderWidgetHost(); | 45 web_contents()->GetMainFrame()->GetRenderWidgetHost(); |
36 ScreenInfo screen_info; | 46 ScreenInfo screen_info; |
37 rwh->GetScreenInfo(&screen_info); | 47 main_frame_rwh->GetScreenInfo(&screen_info); |
38 screen_info.orientation_angle = angle; | 48 screen_info.orientation_angle = angle; |
39 | 49 |
40 ScreenOrientationValues type = SCREEN_ORIENTATION_VALUES_DEFAULT; | 50 ScreenOrientationValues type = SCREEN_ORIENTATION_VALUES_DEFAULT; |
41 if (strType == "portrait-primary") { | 51 if (strType == "portrait-primary") { |
42 type = SCREEN_ORIENTATION_VALUES_PORTRAIT_PRIMARY; | 52 type = SCREEN_ORIENTATION_VALUES_PORTRAIT_PRIMARY; |
43 } else if (strType == "portrait-secondary") { | 53 } else if (strType == "portrait-secondary") { |
44 type = SCREEN_ORIENTATION_VALUES_PORTRAIT_SECONDARY; | 54 type = SCREEN_ORIENTATION_VALUES_PORTRAIT_SECONDARY; |
45 } else if (strType == "landscape-primary") { | 55 } else if (strType == "landscape-primary") { |
46 type = SCREEN_ORIENTATION_VALUES_LANDSCAPE_PRIMARY; | 56 type = SCREEN_ORIENTATION_VALUES_LANDSCAPE_PRIMARY; |
47 } else if (strType == "landscape-secondary") { | 57 } else if (strType == "landscape-secondary") { |
48 type = SCREEN_ORIENTATION_VALUES_LANDSCAPE_SECONDARY; | 58 type = SCREEN_ORIENTATION_VALUES_LANDSCAPE_SECONDARY; |
49 } | 59 } |
50 ASSERT_NE(SCREEN_ORIENTATION_VALUES_DEFAULT, type); | 60 ASSERT_NE(SCREEN_ORIENTATION_VALUES_DEFAULT, type); |
51 screen_info.orientation_type = type; | 61 screen_info.orientation_type = type; |
52 | 62 |
53 ResizeParams params; | 63 ResizeParams params; |
54 params.screen_info = screen_info; | 64 params.screen_info = screen_info; |
55 params.new_size = gfx::Size(0, 0); | 65 params.new_size = gfx::Size(0, 0); |
56 params.physical_backing_size = gfx::Size(300, 300); | 66 params.physical_backing_size = gfx::Size(300, 300); |
57 params.top_controls_height = 0.f; | 67 params.top_controls_height = 0.f; |
58 params.browser_controls_shrink_blink_size = false; | 68 params.browser_controls_shrink_blink_size = false; |
59 params.is_fullscreen_granted = false; | 69 params.is_fullscreen_granted = false; |
60 rwh->Send(new ViewMsg_Resize(rwh->GetRoutingID(), params)); | 70 |
71 std::set<RenderWidgetHost*> rwhs; | |
72 for (RenderFrameHost* rfh : web_contents()->GetAllFrames()) { | |
73 if (rfh == web_contents()->GetMainFrame()) | |
74 continue; | |
75 | |
76 rwhs.insert(static_cast<RenderFrameHostImpl*>(rfh) | |
77 ->frame_tree_node() | |
78 ->render_manager() | |
79 ->GetRenderWidgetHostView() | |
80 ->GetRenderWidgetHost()); | |
81 } | |
82 | |
83 main_frame_rwh->Send( | |
84 new ViewMsg_Resize(main_frame_rwh->GetRoutingID(), params)); | |
85 web_contents()->GetFrameTree()->root()->render_manager()->SendPageMessage( | |
86 new PageMsg_UpdateScreenInfo(MSG_ROUTING_NONE, screen_info), nullptr); | |
87 for (auto* rwh : rwhs) | |
88 rwh->Send(new ViewMsg_Resize(rwh->GetRoutingID(), params)); | |
nasko
2017/04/25 19:59:08
Do we actually iterate through RWHs in real code w
lfg
2017/04/25 20:08:18
Not exactly like this, the test is faking it. What
| |
61 } | 89 } |
62 | 90 |
63 int GetOrientationAngle() { | 91 int GetOrientationAngle() { |
64 int angle; | 92 int angle; |
65 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(), | 93 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(), |
66 "screen.orientation.angle")->GetAsInteger(&angle); | 94 "screen.orientation.angle")->GetAsInteger(&angle); |
67 return angle; | 95 return angle; |
68 } | 96 } |
69 | 97 |
70 std::string GetOrientationType() { | 98 std::string GetOrientationType() { |
(...skipping 21 matching lines...) Expand all Loading... | |
92 int angle; | 120 int angle; |
93 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(), | 121 ExecuteScriptAndGetValue(shell()->web_contents()->GetMainFrame(), |
94 "window.orientation")->GetAsInteger(&angle); | 122 "window.orientation")->GetAsInteger(&angle); |
95 return angle; | 123 return angle; |
96 } | 124 } |
97 | 125 |
98 private: | 126 private: |
99 DISALLOW_COPY_AND_ASSIGN(ScreenOrientationBrowserTest); | 127 DISALLOW_COPY_AND_ASSIGN(ScreenOrientationBrowserTest); |
100 }; | 128 }; |
101 | 129 |
130 class ScreenOrientationOOPIFBrowserTest : public ScreenOrientationBrowserTest { | |
131 public: | |
132 ScreenOrientationOOPIFBrowserTest() {} | |
133 | |
134 void SetUpCommandLine(base::CommandLine* command_line) override { | |
135 IsolateAllSitesForTesting(command_line); | |
136 } | |
137 | |
138 void SetUpOnMainThread() override { | |
139 host_resolver()->AddRule("*", "127.0.0.1"); | |
140 SetupCrossSiteRedirector(embedded_test_server()); | |
141 ASSERT_TRUE(embedded_test_server()->Start()); | |
142 } | |
143 | |
144 private: | |
145 DISALLOW_COPY_AND_ASSIGN(ScreenOrientationOOPIFBrowserTest); | |
146 }; | |
147 | |
102 // This test doesn't work on MacOS X but the reason is mostly because it is not | 148 // This test doesn't work on MacOS X but the reason is mostly because it is not |
103 // used Aura. It could be set as !defined(OS_MACOSX) but the rule below will | 149 // used Aura. It could be set as !defined(OS_MACOSX) but the rule below will |
104 // actually support MacOS X if and when it switches to Aura. | 150 // actually support MacOS X if and when it switches to Aura. |
105 #if defined(USE_AURA) || defined(OS_ANDROID) | 151 #if defined(USE_AURA) || defined(OS_ANDROID) |
106 // Flaky on Chrome OS: http://crbug.com/468259 | 152 // Flaky on Chrome OS: http://crbug.com/468259 |
107 #if defined(OS_CHROMEOS) | 153 #if defined(OS_CHROMEOS) |
108 #define MAYBE_ScreenOrientationChange DISABLED_ScreenOrientationChange | 154 #define MAYBE_ScreenOrientationChange DISABLED_ScreenOrientationChange |
109 #else | 155 #else |
110 #define MAYBE_ScreenOrientationChange ScreenOrientationChange | 156 #define MAYBE_ScreenOrientationChange ScreenOrientationChange |
111 #endif | 157 #endif |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
238 ASSERT_TRUE(ExecuteScript(shell(), "run();")); | 284 ASSERT_TRUE(ExecuteScript(shell(), "run();")); |
239 | 285 |
240 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 286 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
241 navigation_observer.Wait(); | 287 navigation_observer.Wait(); |
242 EXPECT_EQ("NotSupportedError", | 288 EXPECT_EQ("NotSupportedError", |
243 shell()->web_contents()->GetLastCommittedURL().ref()); | 289 shell()->web_contents()->GetLastCommittedURL().ref()); |
244 } | 290 } |
245 } | 291 } |
246 #endif // defined(OS_ANDROID) | 292 #endif // defined(OS_ANDROID) |
247 | 293 |
294 IN_PROC_BROWSER_TEST_F(ScreenOrientationOOPIFBrowserTest, ScreenOrientation) { | |
295 GURL main_url(embedded_test_server()->GetURL( | |
296 "a.com", "/cross_site_iframe_factory.html?a(b)")); | |
297 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | |
298 #if USE_AURA || defined(OS_ANDROID) | |
299 WaitForResizeComplete(shell()->web_contents()); | |
300 #endif // USE_AURA || defined(OS_ANDROID) | |
301 | |
302 std::string types[] = {"portrait-primary", "portrait-secondary", | |
303 "landscape-primary", "landscape-secondary"}; | |
304 | |
305 int angle = GetOrientationAngle(); | |
306 | |
307 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); | |
308 FrameTreeNode* child = root->child_at(0); | |
309 MainThreadFrameObserver root_observer( | |
310 root->current_frame_host()->GetRenderWidgetHost()); | |
311 MainThreadFrameObserver child_observer( | |
312 child->current_frame_host()->GetRenderWidgetHost()); | |
313 for (int i = 0; i < 4; ++i) { | |
314 angle = (angle + 90) % 360; | |
315 SendFakeScreenOrientation(angle, types[i]); | |
316 | |
317 root_observer.Wait(); | |
318 child_observer.Wait(); | |
319 | |
320 int orientation_angle; | |
321 std::string orientation_type; | |
322 | |
323 EXPECT_TRUE(ExecuteScriptAndExtractInt( | |
324 root->current_frame_host(), | |
325 "window.domAutomationController.send(screen.orientation.angle)", | |
326 &orientation_angle)); | |
327 EXPECT_EQ(angle, orientation_angle); | |
328 EXPECT_TRUE(ExecuteScriptAndExtractInt( | |
329 child->current_frame_host(), | |
330 "window.domAutomationController.send(screen.orientation.angle)", | |
331 &orientation_angle)); | |
332 EXPECT_EQ(angle, orientation_angle); | |
333 | |
334 EXPECT_TRUE(ExecuteScriptAndExtractString( | |
335 root->current_frame_host(), | |
336 "window.domAutomationController.send(screen.orientation.type)", | |
337 &orientation_type)); | |
338 EXPECT_EQ(types[i], orientation_type); | |
339 EXPECT_TRUE(ExecuteScriptAndExtractString( | |
340 child->current_frame_host(), | |
341 "window.domAutomationController.send(screen.orientation.type)", | |
342 &orientation_type)); | |
343 EXPECT_EQ(types[i], orientation_type); | |
344 } | |
345 } | |
346 | |
248 } // namespace content | 347 } // namespace content |
OLD | NEW |