OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ash/wm/video_detector.h" | 5 #include "ash/wm/video_detector.h" |
6 | 6 |
| 7 #include <memory> |
| 8 |
7 #include "ash/shell.h" | 9 #include "ash/shell.h" |
8 #include "ash/test/ash_test_base.h" | 10 #include "ash/test/ash_test_base.h" |
9 #include "ash/wm/window_state.h" | 11 #include "ash/wm/window_state.h" |
10 #include "ash/wm/wm_event.h" | 12 #include "ash/wm/wm_event.h" |
11 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
12 #include "base/memory/scoped_ptr.h" | |
13 #include "base/time/time.h" | 14 #include "base/time/time.h" |
14 #include "third_party/skia/include/core/SkColor.h" | 15 #include "third_party/skia/include/core/SkColor.h" |
15 #include "ui/aura/client/aura_constants.h" | 16 #include "ui/aura/client/aura_constants.h" |
16 #include "ui/aura/test/test_windows.h" | 17 #include "ui/aura/test/test_windows.h" |
17 #include "ui/aura/window.h" | 18 #include "ui/aura/window.h" |
18 #include "ui/aura/window_event_dispatcher.h" | 19 #include "ui/aura/window_event_dispatcher.h" |
19 #include "ui/gfx/geometry/rect.h" | 20 #include "ui/gfx/geometry/rect.h" |
20 #include "ui/wm/public/window_types.h" | 21 #include "ui/wm/public/window_types.h" |
21 | 22 |
22 namespace ash { | 23 namespace ash { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 | 84 |
84 protected: | 85 protected: |
85 // Move |detector_|'s idea of the current time forward by |delta|. | 86 // Move |detector_|'s idea of the current time forward by |delta|. |
86 void AdvanceTime(base::TimeDelta delta) { | 87 void AdvanceTime(base::TimeDelta delta) { |
87 now_ += delta; | 88 now_ += delta; |
88 detector_->set_now_for_test(now_); | 89 detector_->set_now_for_test(now_); |
89 } | 90 } |
90 | 91 |
91 VideoDetector* detector_; // not owned | 92 VideoDetector* detector_; // not owned |
92 | 93 |
93 scoped_ptr<TestVideoDetectorObserver> observer_; | 94 std::unique_ptr<TestVideoDetectorObserver> observer_; |
94 | 95 |
95 base::TimeTicks now_; | 96 base::TimeTicks now_; |
96 | 97 |
97 private: | 98 private: |
98 DISALLOW_COPY_AND_ASSIGN(VideoDetectorTest); | 99 DISALLOW_COPY_AND_ASSIGN(VideoDetectorTest); |
99 }; | 100 }; |
100 | 101 |
101 TEST_F(VideoDetectorTest, Basic) { | 102 TEST_F(VideoDetectorTest, Basic) { |
102 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); | 103 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); |
103 scoped_ptr<aura::Window> window( | 104 std::unique_ptr<aura::Window> window( |
104 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); | 105 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); |
105 | 106 |
106 // Send enough updates, but make them be too small to trigger detection. | 107 // Send enough updates, but make them be too small to trigger detection. |
107 gfx::Rect update_region( | 108 gfx::Rect update_region( |
108 gfx::Point(), | 109 gfx::Point(), |
109 gfx::Size(VideoDetector::kMinUpdateWidth - 1, | 110 gfx::Size(VideoDetector::kMinUpdateWidth - 1, |
110 VideoDetector::kMinUpdateHeight)); | 111 VideoDetector::kMinUpdateHeight)); |
111 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 112 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
112 detector_->OnDelegatedFrameDamage(window.get(), update_region); | 113 detector_->OnDelegatedFrameDamage(window.get(), update_region); |
113 EXPECT_EQ(0, observer_->num_invocations()); | 114 EXPECT_EQ(0, observer_->num_invocations()); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 1000 / (VideoDetector::kMinFramesPerSecond - 2)); | 163 1000 / (VideoDetector::kMinFramesPerSecond - 2)); |
163 for (int i = 0; i < kNumFrames; ++i) { | 164 for (int i = 0; i < kNumFrames; ++i) { |
164 AdvanceTime(kSlowInterval); | 165 AdvanceTime(kSlowInterval); |
165 detector_->OnDelegatedFrameDamage(window.get(), update_region); | 166 detector_->OnDelegatedFrameDamage(window.get(), update_region); |
166 } | 167 } |
167 EXPECT_EQ(2, observer_->num_invocations()); | 168 EXPECT_EQ(2, observer_->num_invocations()); |
168 } | 169 } |
169 | 170 |
170 TEST_F(VideoDetectorTest, Shutdown) { | 171 TEST_F(VideoDetectorTest, Shutdown) { |
171 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); | 172 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); |
172 scoped_ptr<aura::Window> window( | 173 std::unique_ptr<aura::Window> window( |
173 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); | 174 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); |
174 gfx::Rect update_region( | 175 gfx::Rect update_region( |
175 gfx::Point(), | 176 gfx::Point(), |
176 gfx::Size(VideoDetector::kMinUpdateWidth, | 177 gfx::Size(VideoDetector::kMinUpdateWidth, |
177 VideoDetector::kMinUpdateHeight)); | 178 VideoDetector::kMinUpdateHeight)); |
178 | 179 |
179 // It should not detect video during the shutdown. | 180 // It should not detect video during the shutdown. |
180 Shell::GetInstance()->OnAppTerminating(); | 181 Shell::GetInstance()->OnAppTerminating(); |
181 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 182 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
182 detector_->OnDelegatedFrameDamage(window.get(), update_region); | 183 detector_->OnDelegatedFrameDamage(window.get(), update_region); |
183 EXPECT_EQ(0, observer_->num_invocations()); | 184 EXPECT_EQ(0, observer_->num_invocations()); |
184 } | 185 } |
185 | 186 |
186 TEST_F(VideoDetectorTest, WindowNotVisible) { | 187 TEST_F(VideoDetectorTest, WindowNotVisible) { |
187 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); | 188 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); |
188 scoped_ptr<aura::Window> window( | 189 std::unique_ptr<aura::Window> window( |
189 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); | 190 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); |
190 | 191 |
191 // Reparent the window to the root to make sure that visibility changes aren't | 192 // Reparent the window to the root to make sure that visibility changes aren't |
192 // animated. | 193 // animated. |
193 Shell::GetPrimaryRootWindow()->AddChild(window.get()); | 194 Shell::GetPrimaryRootWindow()->AddChild(window.get()); |
194 | 195 |
195 // We shouldn't report video that's played in a hidden window. | 196 // We shouldn't report video that's played in a hidden window. |
196 window->Hide(); | 197 window->Hide(); |
197 gfx::Rect update_region( | 198 gfx::Rect update_region( |
198 gfx::Point(), | 199 gfx::Point(), |
(...skipping 22 matching lines...) Expand all Loading... |
221 window->SetBounds(offscreen_bounds); | 222 window->SetBounds(offscreen_bounds); |
222 ASSERT_EQ(offscreen_bounds, window->bounds()); | 223 ASSERT_EQ(offscreen_bounds, window->bounds()); |
223 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 224 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
224 detector_->OnDelegatedFrameDamage(window.get(), update_region); | 225 detector_->OnDelegatedFrameDamage(window.get(), update_region); |
225 EXPECT_EQ(0, observer_->num_invocations()); | 226 EXPECT_EQ(0, observer_->num_invocations()); |
226 } | 227 } |
227 | 228 |
228 TEST_F(VideoDetectorTest, MultipleWindows) { | 229 TEST_F(VideoDetectorTest, MultipleWindows) { |
229 // Create two windows. | 230 // Create two windows. |
230 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); | 231 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); |
231 scoped_ptr<aura::Window> window1( | 232 std::unique_ptr<aura::Window> window1( |
232 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); | 233 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); |
233 scoped_ptr<aura::Window> window2( | 234 std::unique_ptr<aura::Window> window2( |
234 CreateTestWindowInShell(SK_ColorBLUE, 23456, window_bounds)); | 235 CreateTestWindowInShell(SK_ColorBLUE, 23456, window_bounds)); |
235 | 236 |
236 // Even if there's video playing in both, the observer should only receive a | 237 // Even if there's video playing in both, the observer should only receive a |
237 // single notification. | 238 // single notification. |
238 gfx::Rect update_region( | 239 gfx::Rect update_region( |
239 gfx::Point(), | 240 gfx::Point(), |
240 gfx::Size(VideoDetector::kMinUpdateWidth, | 241 gfx::Size(VideoDetector::kMinUpdateWidth, |
241 VideoDetector::kMinUpdateHeight)); | 242 VideoDetector::kMinUpdateHeight)); |
242 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 243 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
243 detector_->OnDelegatedFrameDamage(window1.get(), update_region); | 244 detector_->OnDelegatedFrameDamage(window1.get(), update_region); |
244 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 245 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
245 detector_->OnDelegatedFrameDamage(window2.get(), update_region); | 246 detector_->OnDelegatedFrameDamage(window2.get(), update_region); |
246 EXPECT_EQ(1, observer_->num_invocations()); | 247 EXPECT_EQ(1, observer_->num_invocations()); |
247 EXPECT_EQ(0, observer_->num_fullscreens()); | 248 EXPECT_EQ(0, observer_->num_fullscreens()); |
248 EXPECT_EQ(1, observer_->num_not_fullscreens()); | 249 EXPECT_EQ(1, observer_->num_not_fullscreens()); |
249 } | 250 } |
250 | 251 |
251 // Test that the observer receives repeated notifications. | 252 // Test that the observer receives repeated notifications. |
252 TEST_F(VideoDetectorTest, RepeatedNotifications) { | 253 TEST_F(VideoDetectorTest, RepeatedNotifications) { |
253 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); | 254 gfx::Rect window_bounds(gfx::Point(), gfx::Size(1024, 768)); |
254 scoped_ptr<aura::Window> window( | 255 std::unique_ptr<aura::Window> window( |
255 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); | 256 CreateTestWindowInShell(SK_ColorRED, 12345, window_bounds)); |
256 | 257 |
257 gfx::Rect update_region( | 258 gfx::Rect update_region( |
258 gfx::Point(), | 259 gfx::Point(), |
259 gfx::Size(VideoDetector::kMinUpdateWidth, | 260 gfx::Size(VideoDetector::kMinUpdateWidth, |
260 VideoDetector::kMinUpdateHeight)); | 261 VideoDetector::kMinUpdateHeight)); |
261 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 262 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
262 detector_->OnDelegatedFrameDamage(window.get(), update_region); | 263 detector_->OnDelegatedFrameDamage(window.get(), update_region); |
263 EXPECT_EQ(1, observer_->num_invocations()); | 264 EXPECT_EQ(1, observer_->num_invocations()); |
264 EXPECT_EQ(0, observer_->num_fullscreens()); | 265 EXPECT_EQ(0, observer_->num_fullscreens()); |
(...skipping 10 matching lines...) Expand all Loading... |
275 } | 276 } |
276 | 277 |
277 // Test that the observer receives a true value when the window is fullscreen. | 278 // Test that the observer receives a true value when the window is fullscreen. |
278 TEST_F(VideoDetectorTest, FullscreenWindow) { | 279 TEST_F(VideoDetectorTest, FullscreenWindow) { |
279 if (!SupportsMultipleDisplays()) | 280 if (!SupportsMultipleDisplays()) |
280 return; | 281 return; |
281 | 282 |
282 UpdateDisplay("1024x768,1024x768"); | 283 UpdateDisplay("1024x768,1024x768"); |
283 | 284 |
284 const gfx::Rect kLeftBounds(gfx::Point(), gfx::Size(1024, 768)); | 285 const gfx::Rect kLeftBounds(gfx::Point(), gfx::Size(1024, 768)); |
285 scoped_ptr<aura::Window> window( | 286 std::unique_ptr<aura::Window> window( |
286 CreateTestWindowInShell(SK_ColorRED, 12345, kLeftBounds)); | 287 CreateTestWindowInShell(SK_ColorRED, 12345, kLeftBounds)); |
287 wm::WindowState* window_state = wm::GetWindowState(window.get()); | 288 wm::WindowState* window_state = wm::GetWindowState(window.get()); |
288 const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN); | 289 const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN); |
289 window_state->OnWMEvent(&toggle_fullscreen_event); | 290 window_state->OnWMEvent(&toggle_fullscreen_event); |
290 ASSERT_TRUE(window_state->IsFullscreen()); | 291 ASSERT_TRUE(window_state->IsFullscreen()); |
291 window->Focus(); | 292 window->Focus(); |
292 const gfx::Rect kUpdateRegion( | 293 const gfx::Rect kUpdateRegion( |
293 gfx::Point(), | 294 gfx::Point(), |
294 gfx::Size(VideoDetector::kMinUpdateWidth, | 295 gfx::Size(VideoDetector::kMinUpdateWidth, |
295 VideoDetector::kMinUpdateHeight)); | 296 VideoDetector::kMinUpdateHeight)); |
296 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 297 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
297 detector_->OnDelegatedFrameDamage(window.get(), kUpdateRegion); | 298 detector_->OnDelegatedFrameDamage(window.get(), kUpdateRegion); |
298 EXPECT_EQ(1, observer_->num_invocations()); | 299 EXPECT_EQ(1, observer_->num_invocations()); |
299 EXPECT_EQ(1, observer_->num_fullscreens()); | 300 EXPECT_EQ(1, observer_->num_fullscreens()); |
300 EXPECT_EQ(0, observer_->num_not_fullscreens()); | 301 EXPECT_EQ(0, observer_->num_not_fullscreens()); |
301 | 302 |
302 // Make the first window non-fullscreen and open a second fullscreen window on | 303 // Make the first window non-fullscreen and open a second fullscreen window on |
303 // a different desktop. | 304 // a different desktop. |
304 window_state->OnWMEvent(&toggle_fullscreen_event); | 305 window_state->OnWMEvent(&toggle_fullscreen_event); |
305 ASSERT_FALSE(window_state->IsFullscreen()); | 306 ASSERT_FALSE(window_state->IsFullscreen()); |
306 const gfx::Rect kRightBounds(gfx::Point(1024, 0), gfx::Size(1024, 768)); | 307 const gfx::Rect kRightBounds(gfx::Point(1024, 0), gfx::Size(1024, 768)); |
307 scoped_ptr<aura::Window> other_window( | 308 std::unique_ptr<aura::Window> other_window( |
308 CreateTestWindowInShell(SK_ColorBLUE, 6789, kRightBounds)); | 309 CreateTestWindowInShell(SK_ColorBLUE, 6789, kRightBounds)); |
309 wm::WindowState* other_window_state = wm::GetWindowState(other_window.get()); | 310 wm::WindowState* other_window_state = wm::GetWindowState(other_window.get()); |
310 other_window_state->OnWMEvent(&toggle_fullscreen_event); | 311 other_window_state->OnWMEvent(&toggle_fullscreen_event); |
311 ASSERT_TRUE(other_window_state->IsFullscreen()); | 312 ASSERT_TRUE(other_window_state->IsFullscreen()); |
312 | 313 |
313 // When video is detected in the first (now non-fullscreen) window, fullscreen | 314 // When video is detected in the first (now non-fullscreen) window, fullscreen |
314 // video should still be reported due to the second window being fullscreen. | 315 // video should still be reported due to the second window being fullscreen. |
315 // This avoids situations where non-fullscreen video could be reported when | 316 // This avoids situations where non-fullscreen video could be reported when |
316 // multiple videos are playing in fullscreen and non-fullscreen windows. | 317 // multiple videos are playing in fullscreen and non-fullscreen windows. |
317 observer_->reset_stats(); | 318 observer_->reset_stats(); |
(...skipping 12 matching lines...) Expand all Loading... |
330 AdvanceTime(base::TimeDelta::FromSeconds(2)); | 331 AdvanceTime(base::TimeDelta::FromSeconds(2)); |
331 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) | 332 for (int i = 0; i < VideoDetector::kMinFramesPerSecond; ++i) |
332 detector_->OnDelegatedFrameDamage(window.get(), kUpdateRegion); | 333 detector_->OnDelegatedFrameDamage(window.get(), kUpdateRegion); |
333 EXPECT_EQ(1, observer_->num_invocations()); | 334 EXPECT_EQ(1, observer_->num_invocations()); |
334 EXPECT_EQ(0, observer_->num_fullscreens()); | 335 EXPECT_EQ(0, observer_->num_fullscreens()); |
335 EXPECT_EQ(1, observer_->num_not_fullscreens()); | 336 EXPECT_EQ(1, observer_->num_not_fullscreens()); |
336 } | 337 } |
337 | 338 |
338 } // namespace test | 339 } // namespace test |
339 } // namespace ash | 340 } // namespace ash |
OLD | NEW |