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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/bind_helpers.h" | 6 #include "base/bind_helpers.h" |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "chrome/browser/ui/browser.h" | 10 #include "chrome/browser/ui/browser.h" |
11 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" | 11 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" |
12 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 12 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
13 #include "chrome/test/base/interactive_test_utils.h" | 13 #include "chrome/test/base/interactive_test_utils.h" |
14 #include "chrome/test/ppapi/ppapi_test.h" | 14 #include "chrome/test/ppapi/ppapi_test.h" |
15 #include "content/public/browser/render_widget_host.h" | 15 #include "content/public/browser/render_widget_host.h" |
16 #include "content/public/browser/render_widget_host_view.h" | 16 #include "content/public/browser/render_widget_host_view.h" |
17 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
18 #include "content/public/test/test_utils.h" | 18 #include "content/public/test/test_utils.h" |
19 #include "third_party/skia/include/core/SkColor.h" | 19 #include "third_party/skia/include/core/SkColor.h" |
20 | 20 |
21 namespace { | 21 namespace { |
22 | 22 |
23 #if defined(OS_MACOSX) | 23 #if defined(OS_MACOSX) |
24 const bool kIsMacUI = true; | 24 const bool kIsMacUI = true; |
25 #else | 25 #else |
26 const bool kIsMacUI = false; | 26 const bool kIsMacUI = false; |
27 #endif | 27 #endif |
28 | 28 |
29 // Runs the current MessageLoop until |condition| is true or timeout. | |
30 bool RunLoopUntil(const base::Callback<bool()>& condition) { | |
31 const base::TimeTicks start_time = base::TimeTicks::Now(); | |
32 while (!condition.Run()) { | |
33 const base::TimeTicks current_time = base::TimeTicks::Now(); | |
34 if (current_time - start_time > base::TimeDelta::FromSeconds(10)) { | |
35 ADD_FAILURE() << "Condition not met within ten seconds."; | |
36 return false; | |
37 } | |
38 | |
39 base::MessageLoop::current()->task_runner()->PostDelayedTask( | |
40 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), | |
41 base::TimeDelta::FromMilliseconds(20)); | |
42 content::RunMessageLoop(); | |
43 } | |
44 return true; | |
45 } | |
46 | |
47 } // namespace | 29 } // namespace |
48 | 30 |
49 // A BrowserTest that opens a test page that launches a simulated fullscreen | 31 // A BrowserTest that opens a test page that launches a simulated fullscreen |
50 // Flash plugin. The plugin responds to mouse clicks and key presses by | 32 // Flash plugin. The plugin responds to mouse clicks and key presses by |
51 // changing color. Once launched, the browser UI can be tested to confirm the | 33 // changing color. Once launched, the browser UI can be tested to confirm the |
52 // desired interactive behaviors. | 34 // desired interactive behaviors. |
53 class FlashFullscreenInteractiveBrowserTest : public OutOfProcessPPAPITest { | 35 class FlashFullscreenInteractiveBrowserTest : public OutOfProcessPPAPITest { |
54 public: | 36 public: |
55 FlashFullscreenInteractiveBrowserTest() {} | 37 FlashFullscreenInteractiveBrowserTest() {} |
56 ~FlashFullscreenInteractiveBrowserTest() override {} | 38 ~FlashFullscreenInteractiveBrowserTest() override {} |
(...skipping 24 matching lines...) Expand all Loading... |
81 | 63 |
82 EXPECT_TRUE(ObserveTabIsInFullscreen(true)); | 64 EXPECT_TRUE(ObserveTabIsInFullscreen(true)); |
83 | 65 |
84 return !::testing::Test::HasFailure(); | 66 return !::testing::Test::HasFailure(); |
85 } | 67 } |
86 | 68 |
87 void UseAcceleratorToOpenNewTab() { | 69 void UseAcceleratorToOpenNewTab() { |
88 content::WebContents* const old_tab_contents = GetActiveWebContents(); | 70 content::WebContents* const old_tab_contents = GetActiveWebContents(); |
89 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 71 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
90 browser(), ui::VKEY_T, !kIsMacUI, false, false, kIsMacUI)); | 72 browser(), ui::VKEY_T, !kIsMacUI, false, false, kIsMacUI)); |
91 EXPECT_TRUE(RunLoopUntil(base::Bind( | 73 EXPECT_TRUE(ui_test_utils::RunLoopUntil(base::Bind( |
92 &FlashFullscreenInteractiveBrowserTest::IsObservingActiveWebContents, | 74 &FlashFullscreenInteractiveBrowserTest::IsObservingActiveWebContents, |
93 base::Unretained(this), | 75 base::Unretained(this), old_tab_contents, false))); |
94 old_tab_contents, | |
95 false))); | |
96 } | 76 } |
97 | 77 |
98 void UseAcceleratorToSwitchToTab(int tab_index) { | 78 void UseAcceleratorToSwitchToTab(int tab_index) { |
99 content::WebContents* const old_tab_contents = GetActiveWebContents(); | 79 content::WebContents* const old_tab_contents = GetActiveWebContents(); |
100 const ui::KeyboardCode key_code = | 80 const ui::KeyboardCode key_code = |
101 static_cast<ui::KeyboardCode>(ui::VKEY_1 + tab_index); | 81 static_cast<ui::KeyboardCode>(ui::VKEY_1 + tab_index); |
102 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 82 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
103 browser(), key_code, !kIsMacUI, false, false, kIsMacUI)); | 83 browser(), key_code, !kIsMacUI, false, false, kIsMacUI)); |
104 EXPECT_TRUE(RunLoopUntil(base::Bind( | 84 EXPECT_TRUE(ui_test_utils::RunLoopUntil(base::Bind( |
105 &FlashFullscreenInteractiveBrowserTest::IsObservingActiveWebContents, | 85 &FlashFullscreenInteractiveBrowserTest::IsObservingActiveWebContents, |
106 base::Unretained(this), | 86 base::Unretained(this), old_tab_contents, false))); |
107 old_tab_contents, | |
108 false))); | |
109 } | 87 } |
110 | 88 |
111 void PressEscape() { | 89 void PressEscape() { |
112 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 90 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
113 browser(), ui::VKEY_ESCAPE, false, false, false, false)); | 91 browser(), ui::VKEY_ESCAPE, false, false, false, false)); |
114 } | 92 } |
115 | 93 |
116 void PressSpacebar() { | 94 void PressSpacebar() { |
117 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( | 95 EXPECT_TRUE(ui_test_utils::SendKeyPressSync( |
118 browser(), ui::VKEY_SPACE, false, false, false, false)); | 96 browser(), ui::VKEY_SPACE, false, false, false, false)); |
119 } | 97 } |
120 | 98 |
121 void SpamSpacebar() { | 99 void SpamSpacebar() { |
122 for (int i = 0; i < 11; ++i) | 100 for (int i = 0; i < 11; ++i) |
123 PressSpacebar(); | 101 PressSpacebar(); |
124 } | 102 } |
125 | 103 |
126 void ClickOnTabContainer() { | 104 void ClickOnTabContainer() { |
127 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); | 105 ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER); |
128 } | 106 } |
129 | 107 |
130 void ClickOnOmnibox() { | 108 void ClickOnOmnibox() { |
131 ui_test_utils::ClickOnView(browser(), VIEW_ID_OMNIBOX); | 109 ui_test_utils::ClickOnView(browser(), VIEW_ID_OMNIBOX); |
132 } | 110 } |
133 | 111 |
134 bool ObserveTabIsInFullscreen(bool expected_in_fullscreen) const { | 112 bool ObserveTabIsInFullscreen(bool expected_in_fullscreen) const { |
135 if (!RunLoopUntil(base::Bind( | 113 if (!ui_test_utils::RunLoopUntil(base::Bind( |
136 &FlashFullscreenInteractiveBrowserTest::IsObservingTabInFullscreen, | 114 &FlashFullscreenInteractiveBrowserTest::IsObservingTabInFullscreen, |
137 base::Unretained(this), | 115 base::Unretained(this), GetActiveWebContents(), |
138 GetActiveWebContents(), | |
139 expected_in_fullscreen))) | 116 expected_in_fullscreen))) |
140 return false; | 117 return false; |
141 | 118 |
142 if (expected_in_fullscreen) { | 119 if (expected_in_fullscreen) { |
143 if (!GetActiveWebContents()->GetFullscreenRenderWidgetHostView()) { | 120 if (!GetActiveWebContents()->GetFullscreenRenderWidgetHostView()) { |
144 ADD_FAILURE() | 121 ADD_FAILURE() |
145 << "WebContents should have a fullscreen RenderWidgetHostView."; | 122 << "WebContents should have a fullscreen RenderWidgetHostView."; |
146 return false; | 123 return false; |
147 } | 124 } |
148 EXPECT_EQ(GetActiveWebContents()->GetCapturerCount() > 0, | 125 EXPECT_EQ(GetActiveWebContents()->GetCapturerCount() > 0, |
149 !browser() | 126 !browser() |
150 ->exclusive_access_manager() | 127 ->exclusive_access_manager() |
151 ->fullscreen_controller() | 128 ->fullscreen_controller() |
152 ->IsWindowFullscreenForTabOrPending()); | 129 ->IsWindowFullscreenForTabOrPending()); |
153 } | 130 } |
154 | 131 |
155 return true; | 132 return true; |
156 } | 133 } |
157 | 134 |
158 bool ObserveFlashHasFocus(content::WebContents* contents, | 135 bool ObserveFlashHasFocus(content::WebContents* contents, |
159 bool expected_to_have_focus) const { | 136 bool expected_to_have_focus) const { |
160 if (!RunLoopUntil(base::Bind( | 137 if (!ui_test_utils::RunLoopUntil(base::Bind( |
161 &FlashFullscreenInteractiveBrowserTest::IsObservingFlashHasFocus, | 138 &FlashFullscreenInteractiveBrowserTest::IsObservingFlashHasFocus, |
162 base::Unretained(this), | 139 base::Unretained(this), contents, expected_to_have_focus))) |
163 contents, | |
164 expected_to_have_focus))) | |
165 return false; | 140 return false; |
166 | 141 |
167 if (expected_to_have_focus) { | 142 if (expected_to_have_focus) { |
168 content::RenderWidgetHostView* const web_page_view = | 143 content::RenderWidgetHostView* const web_page_view = |
169 contents->GetRenderWidgetHostView(); | 144 contents->GetRenderWidgetHostView(); |
170 EXPECT_FALSE(web_page_view && web_page_view->HasFocus()) | 145 EXPECT_FALSE(web_page_view && web_page_view->HasFocus()) |
171 << "Both RenderWidgetHostViews cannot have focus at the same time."; | 146 << "Both RenderWidgetHostViews cannot have focus at the same time."; |
172 | 147 |
173 if (contents == GetActiveWebContents()) | 148 if (contents == GetActiveWebContents()) |
174 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), | 149 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), |
175 VIEW_ID_TAB_CONTAINER)); | 150 VIEW_ID_TAB_CONTAINER)); |
176 } | 151 } |
177 | 152 |
178 return true; | 153 return true; |
179 } | 154 } |
180 | 155 |
181 bool ObserveFlashFillColor(SkColor expected_color) const { | 156 bool ObserveFlashFillColor(SkColor expected_color) const { |
182 return RunLoopUntil(base::Bind( | 157 return ui_test_utils::RunLoopUntil(base::Bind( |
183 &FlashFullscreenInteractiveBrowserTest::IsObservingFlashFillColor, | 158 &FlashFullscreenInteractiveBrowserTest::IsObservingFlashFillColor, |
184 base::Unretained(this), | 159 base::Unretained(this), expected_color)); |
185 expected_color)); | |
186 } | 160 } |
187 | 161 |
188 private: | 162 private: |
189 bool IsObservingTabInFullscreen(content::WebContents* contents, | 163 bool IsObservingTabInFullscreen(content::WebContents* contents, |
190 bool expected_in_fullscreen) const { | 164 bool expected_in_fullscreen) const { |
191 return expected_in_fullscreen == | 165 return expected_in_fullscreen == |
192 browser() | 166 browser() |
193 ->exclusive_access_manager() | 167 ->exclusive_access_manager() |
194 ->fullscreen_controller() | 168 ->fullscreen_controller() |
195 ->IsFullscreenForTabOrPending(contents); | 169 ->IsFullscreenForTabOrPending(contents); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 ASSERT_TRUE(ObserveFlashFillColor(SK_ColorRED)); | 317 ASSERT_TRUE(ObserveFlashFillColor(SK_ColorRED)); |
344 PressSpacebar(); | 318 PressSpacebar(); |
345 ASSERT_TRUE(ObserveFlashFillColor(SK_ColorBLUE)); | 319 ASSERT_TRUE(ObserveFlashFillColor(SK_ColorBLUE)); |
346 | 320 |
347 // Test that the Escape key is handled as an exit fullscreen command while the | 321 // Test that the Escape key is handled as an exit fullscreen command while the |
348 // Flash widget has the focus. | 322 // Flash widget has the focus. |
349 EXPECT_TRUE(ObserveFlashHasFocus(first_tab_contents, true)); | 323 EXPECT_TRUE(ObserveFlashHasFocus(first_tab_contents, true)); |
350 PressEscape(); | 324 PressEscape(); |
351 EXPECT_TRUE(ObserveTabIsInFullscreen(false)); | 325 EXPECT_TRUE(ObserveTabIsInFullscreen(false)); |
352 } | 326 } |
OLD | NEW |