OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/rotator/screen_rotation_animator.h" |
| 6 |
5 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
6 #include "ash/rotator/screen_rotation_animator.h" | |
7 #include "ash/rotator/screen_rotation_animator_observer.h" | 8 #include "ash/rotator/screen_rotation_animator_observer.h" |
8 #include "ash/rotator/test/screen_rotation_animator_test_api.h" | 9 #include "ash/rotator/test/screen_rotation_animator_test_api.h" |
9 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 11 #include "ash/shell_port.h" |
10 #include "ash/test/ash_test_base.h" | 12 #include "ash/test/ash_test_base.h" |
11 #include "ash/wm_shell.h" | |
12 #include "base/callback_forward.h" | 13 #include "base/callback_forward.h" |
13 #include "base/command_line.h" | 14 #include "base/command_line.h" |
14 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
15 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
16 #include "cc/output/copy_output_request.h" | 17 #include "cc/output/copy_output_request.h" |
17 #include "cc/output/copy_output_result.h" | 18 #include "cc/output/copy_output_result.h" |
18 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 19 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
19 #include "ui/display/display.h" | 20 #include "ui/display/display.h" |
20 #include "ui/display/manager/display_manager.h" | 21 #include "ui/display/manager/display_manager.h" |
21 #include "ui/display/screen.h" | 22 #include "ui/display/screen.h" |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 base::MakeUnique<test::ScreenRotationAnimatorTestApi>(animator_.get()); | 158 base::MakeUnique<test::ScreenRotationAnimatorTestApi>(animator_.get()); |
158 test_api()->DisableAnimationTimers(); | 159 test_api()->DisableAnimationTimers(); |
159 } | 160 } |
160 | 161 |
161 void ScreenRotationAnimatorTest::WaitForCopyCallback() { | 162 void ScreenRotationAnimatorTest::WaitForCopyCallback() { |
162 run_loop_->Run(); | 163 run_loop_->Run(); |
163 } | 164 } |
164 | 165 |
165 TEST_F(ScreenRotationAnimatorTest, ShouldNotifyObserver) { | 166 TEST_F(ScreenRotationAnimatorTest, ShouldNotifyObserver) { |
166 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 167 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
167 if (WmShell::Get()->IsRunningInMash()) { | 168 if (ShellPort::Get()->IsRunningInMash()) { |
168 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 169 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
169 display_id()); | 170 display_id()); |
170 return; | 171 return; |
171 } | 172 } |
172 | 173 |
173 SetDisplayRotation(display_id(), display::Display::ROTATE_0); | 174 SetDisplayRotation(display_id(), display::Display::ROTATE_0); |
174 AnimationObserver observer; | 175 AnimationObserver observer; |
175 animator()->AddScreenRotationAnimatorObserver(&observer); | 176 animator()->AddScreenRotationAnimatorObserver(&observer); |
176 EXPECT_FALSE(observer.notified()); | 177 EXPECT_FALSE(observer.notified()); |
177 | 178 |
178 animator()->Rotate(display::Display::ROTATE_90, | 179 animator()->Rotate(display::Display::ROTATE_90, |
179 display::Display::RotationSource::ROTATION_SOURCE_USER); | 180 display::Display::RotationSource::ROTATION_SOURCE_USER); |
180 EXPECT_FALSE(observer.notified()); | 181 EXPECT_FALSE(observer.notified()); |
181 | 182 |
182 test_api()->CompleteAnimations(); | 183 test_api()->CompleteAnimations(); |
183 EXPECT_TRUE(observer.notified()); | 184 EXPECT_TRUE(observer.notified()); |
184 EXPECT_FALSE(test_api()->HasActiveAnimations()); | 185 EXPECT_FALSE(test_api()->HasActiveAnimations()); |
185 animator()->RemoveScreenRotationAnimatorObserver(&observer); | 186 animator()->RemoveScreenRotationAnimatorObserver(&observer); |
186 } | 187 } |
187 | 188 |
188 TEST_F(ScreenRotationAnimatorTest, ShouldNotifyObserverOnce) { | 189 TEST_F(ScreenRotationAnimatorTest, ShouldNotifyObserverOnce) { |
189 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 190 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
190 if (WmShell::Get()->IsRunningInMash()) { | 191 if (ShellPort::Get()->IsRunningInMash()) { |
191 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 192 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
192 display_id()); | 193 display_id()); |
193 return; | 194 return; |
194 } | 195 } |
195 | 196 |
196 SetDisplayRotation(display_id(), display::Display::ROTATE_0); | 197 SetDisplayRotation(display_id(), display::Display::ROTATE_0); |
197 AnimationObserver observer; | 198 AnimationObserver observer; |
198 animator()->AddScreenRotationAnimatorObserver(&observer); | 199 animator()->AddScreenRotationAnimatorObserver(&observer); |
199 EXPECT_FALSE(observer.notified()); | 200 EXPECT_FALSE(observer.notified()); |
200 | 201 |
201 animator()->Rotate(display::Display::ROTATE_90, | 202 animator()->Rotate(display::Display::ROTATE_90, |
202 display::Display::RotationSource::ROTATION_SOURCE_USER); | 203 display::Display::RotationSource::ROTATION_SOURCE_USER); |
203 EXPECT_FALSE(observer.notified()); | 204 EXPECT_FALSE(observer.notified()); |
204 | 205 |
205 animator()->Rotate(display::Display::ROTATE_180, | 206 animator()->Rotate(display::Display::ROTATE_180, |
206 display::Display::RotationSource::ROTATION_SOURCE_USER); | 207 display::Display::RotationSource::ROTATION_SOURCE_USER); |
207 EXPECT_FALSE(observer.notified()); | 208 EXPECT_FALSE(observer.notified()); |
208 | 209 |
209 test_api()->CompleteAnimations(); | 210 test_api()->CompleteAnimations(); |
210 EXPECT_TRUE(observer.notified()); | 211 EXPECT_TRUE(observer.notified()); |
211 EXPECT_FALSE(test_api()->HasActiveAnimations()); | 212 EXPECT_FALSE(test_api()->HasActiveAnimations()); |
212 animator()->RemoveScreenRotationAnimatorObserver(&observer); | 213 animator()->RemoveScreenRotationAnimatorObserver(&observer); |
213 } | 214 } |
214 | 215 |
215 TEST_F(ScreenRotationAnimatorTest, RotatesToDifferentRotation) { | 216 TEST_F(ScreenRotationAnimatorTest, RotatesToDifferentRotation) { |
216 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 217 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
217 if (WmShell::Get()->IsRunningInMash()) { | 218 if (ShellPort::Get()->IsRunningInMash()) { |
218 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 219 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
219 display_id()); | 220 display_id()); |
220 return; | 221 return; |
221 } | 222 } |
222 | 223 |
223 SetDisplayRotation(display_id(), display::Display::ROTATE_0); | 224 SetDisplayRotation(display_id(), display::Display::ROTATE_0); |
224 animator()->Rotate(display::Display::ROTATE_90, | 225 animator()->Rotate(display::Display::ROTATE_90, |
225 display::Display::RotationSource::ROTATION_SOURCE_USER); | 226 display::Display::RotationSource::ROTATION_SOURCE_USER); |
226 EXPECT_TRUE(test_api()->HasActiveAnimations()); | 227 EXPECT_TRUE(test_api()->HasActiveAnimations()); |
227 | 228 |
228 test_api()->CompleteAnimations(); | 229 test_api()->CompleteAnimations(); |
229 EXPECT_FALSE(test_api()->HasActiveAnimations()); | 230 EXPECT_FALSE(test_api()->HasActiveAnimations()); |
230 } | 231 } |
231 | 232 |
232 TEST_F(ScreenRotationAnimatorTest, ShouldNotRotateTheSameRotation) { | 233 TEST_F(ScreenRotationAnimatorTest, ShouldNotRotateTheSameRotation) { |
233 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 234 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
234 if (WmShell::Get()->IsRunningInMash()) { | 235 if (ShellPort::Get()->IsRunningInMash()) { |
235 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 236 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
236 display_id()); | 237 display_id()); |
237 return; | 238 return; |
238 } | 239 } |
239 | 240 |
240 SetDisplayRotation(display_id(), display::Display::ROTATE_0); | 241 SetDisplayRotation(display_id(), display::Display::ROTATE_0); |
241 animator()->Rotate(display::Display::ROTATE_0, | 242 animator()->Rotate(display::Display::ROTATE_0, |
242 display::Display::RotationSource::ROTATION_SOURCE_USER); | 243 display::Display::RotationSource::ROTATION_SOURCE_USER); |
243 EXPECT_FALSE(test_api()->HasActiveAnimations()); | 244 EXPECT_FALSE(test_api()->HasActiveAnimations()); |
244 } | 245 } |
245 | 246 |
246 // Simulates the situation that if there is a new rotation request during | 247 // Simulates the situation that if there is a new rotation request during |
247 // animation, it should stop the animation immediately and add the new rotation | 248 // animation, it should stop the animation immediately and add the new rotation |
248 // request to the |last_pending_request_|. | 249 // request to the |last_pending_request_|. |
249 TEST_F(ScreenRotationAnimatorTest, RotatesDuringRotation) { | 250 TEST_F(ScreenRotationAnimatorTest, RotatesDuringRotation) { |
250 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 251 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
251 if (WmShell::Get()->IsRunningInMash()) { | 252 if (ShellPort::Get()->IsRunningInMash()) { |
252 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 253 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
253 display_id()); | 254 display_id()); |
254 return; | 255 return; |
255 } | 256 } |
256 | 257 |
257 SetDisplayRotation(display_id(), display::Display::ROTATE_0); | 258 SetDisplayRotation(display_id(), display::Display::ROTATE_0); |
258 animator()->Rotate(display::Display::ROTATE_90, | 259 animator()->Rotate(display::Display::ROTATE_90, |
259 display::Display::RotationSource::ROTATION_SOURCE_USER); | 260 display::Display::RotationSource::ROTATION_SOURCE_USER); |
260 animator()->Rotate(display::Display::ROTATE_180, | 261 animator()->Rotate(display::Display::ROTATE_180, |
261 display::Display::RotationSource::ROTATION_SOURCE_USER); | 262 display::Display::RotationSource::ROTATION_SOURCE_USER); |
262 EXPECT_TRUE(test_api()->HasActiveAnimations()); | 263 EXPECT_TRUE(test_api()->HasActiveAnimations()); |
263 | 264 |
264 test_api()->CompleteAnimations(); | 265 test_api()->CompleteAnimations(); |
265 EXPECT_FALSE(test_api()->HasActiveAnimations()); | 266 EXPECT_FALSE(test_api()->HasActiveAnimations()); |
266 EXPECT_EQ(display::Display::ROTATE_180, GetDisplayRotation(display_id())); | 267 EXPECT_EQ(display::Display::ROTATE_180, GetDisplayRotation(display_id())); |
267 } | 268 } |
268 | 269 |
269 // If there are multiple requests queued during animation, it should process the | 270 // If there are multiple requests queued during animation, it should process the |
270 // last request and finish the rotation animation. | 271 // last request and finish the rotation animation. |
271 TEST_F(ScreenRotationAnimatorTest, ShouldCompleteAnimations) { | 272 TEST_F(ScreenRotationAnimatorTest, ShouldCompleteAnimations) { |
272 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 273 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
273 if (WmShell::Get()->IsRunningInMash()) { | 274 if (ShellPort::Get()->IsRunningInMash()) { |
274 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 275 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
275 display_id()); | 276 display_id()); |
276 return; | 277 return; |
277 } | 278 } |
278 | 279 |
279 SetDisplayRotation(display_id(), display::Display::ROTATE_0); | 280 SetDisplayRotation(display_id(), display::Display::ROTATE_0); |
280 animator()->Rotate(display::Display::ROTATE_90, | 281 animator()->Rotate(display::Display::ROTATE_90, |
281 display::Display::RotationSource::ROTATION_SOURCE_USER); | 282 display::Display::RotationSource::ROTATION_SOURCE_USER); |
282 EXPECT_TRUE(test_api()->HasActiveAnimations()); | 283 EXPECT_TRUE(test_api()->HasActiveAnimations()); |
283 | 284 |
284 animator()->Rotate(display::Display::ROTATE_180, | 285 animator()->Rotate(display::Display::ROTATE_180, |
285 display::Display::RotationSource::ROTATION_SOURCE_USER); | 286 display::Display::RotationSource::ROTATION_SOURCE_USER); |
286 EXPECT_TRUE(test_api()->HasActiveAnimations()); | 287 EXPECT_TRUE(test_api()->HasActiveAnimations()); |
287 | 288 |
288 animator()->Rotate(display::Display::ROTATE_270, | 289 animator()->Rotate(display::Display::ROTATE_270, |
289 display::Display::RotationSource::ROTATION_SOURCE_USER); | 290 display::Display::RotationSource::ROTATION_SOURCE_USER); |
290 EXPECT_TRUE(test_api()->HasActiveAnimations()); | 291 EXPECT_TRUE(test_api()->HasActiveAnimations()); |
291 | 292 |
292 test_api()->CompleteAnimations(); | 293 test_api()->CompleteAnimations(); |
293 EXPECT_FALSE(test_api()->HasActiveAnimations()); | 294 EXPECT_FALSE(test_api()->HasActiveAnimations()); |
294 EXPECT_EQ(display::Display::ROTATE_270, GetDisplayRotation(display_id())); | 295 EXPECT_EQ(display::Display::ROTATE_270, GetDisplayRotation(display_id())); |
295 } | 296 } |
296 | 297 |
297 // Test enable smooth screen rotation code path. | 298 // Test enable smooth screen rotation code path. |
298 TEST_F(ScreenRotationAnimatorTest, RotatesToDifferentRotationWithCopyCallback) { | 299 TEST_F(ScreenRotationAnimatorTest, RotatesToDifferentRotationWithCopyCallback) { |
299 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 300 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
300 if (WmShell::Get()->IsRunningInMash()) { | 301 if (ShellPort::Get()->IsRunningInMash()) { |
301 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 302 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
302 display_id()); | 303 display_id()); |
303 return; | 304 return; |
304 } | 305 } |
305 | 306 |
306 SetDisplayRotation(display_id(), display::Display::ROTATE_0); | 307 SetDisplayRotation(display_id(), display::Display::ROTATE_0); |
307 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 308 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
308 switches::kAshEnableSmoothScreenRotation); | 309 switches::kAshEnableSmoothScreenRotation); |
309 animator()->Rotate(display::Display::ROTATE_90, | 310 animator()->Rotate(display::Display::ROTATE_90, |
310 display::Display::RotationSource::ROTATION_SOURCE_USER); | 311 display::Display::RotationSource::ROTATION_SOURCE_USER); |
311 WaitForCopyCallback(); | 312 WaitForCopyCallback(); |
312 EXPECT_TRUE(test_api()->HasActiveAnimations()); | 313 EXPECT_TRUE(test_api()->HasActiveAnimations()); |
313 | 314 |
314 test_api()->CompleteAnimations(); | 315 test_api()->CompleteAnimations(); |
315 EXPECT_FALSE(test_api()->HasActiveAnimations()); | 316 EXPECT_FALSE(test_api()->HasActiveAnimations()); |
316 } | 317 } |
317 | 318 |
318 // If the external display is removed, it should not crash. | 319 // If the external display is removed, it should not crash. |
319 TEST_F(ScreenRotationAnimatorTest, RemoveSecondaryDisplayAfterCopyCallback) { | 320 TEST_F(ScreenRotationAnimatorTest, RemoveSecondaryDisplayAfterCopyCallback) { |
320 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. | 321 // TODO(wutao): needs GetDisplayInfo http://crbug.com/622480. |
321 if (WmShell::Get()->IsRunningInMash()) { | 322 if (ShellPort::Get()->IsRunningInMash()) { |
322 ASSERT_TRUE(WmShell::Get()->GetDisplayInfo(display_id()).id() != | 323 ASSERT_TRUE(ShellPort::Get()->GetDisplayInfo(display_id()).id() != |
323 display_id()); | 324 display_id()); |
324 return; | 325 return; |
325 } | 326 } |
326 | 327 |
327 UpdateDisplay("640x480,800x600"); | 328 UpdateDisplay("640x480,800x600"); |
328 EXPECT_EQ(2U, display_manager()->GetNumDisplays()); | 329 EXPECT_EQ(2U, display_manager()->GetNumDisplays()); |
329 | 330 |
330 const unsigned int primary_display_id = | 331 const unsigned int primary_display_id = |
331 display_manager()->GetDisplayAt(0).id(); | 332 display_manager()->GetDisplayAt(0).id(); |
332 SetScreenRotationAnimator( | 333 SetScreenRotationAnimator( |
333 display_manager()->GetDisplayAt(1).id(), | 334 display_manager()->GetDisplayAt(1).id(), |
334 base::Bind(&ScreenRotationAnimatorTest::RemoveSecondaryDisplay, | 335 base::Bind(&ScreenRotationAnimatorTest::RemoveSecondaryDisplay, |
335 base::Unretained(this), "640x480")); | 336 base::Unretained(this), "640x480")); |
336 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 337 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
337 switches::kAshEnableSmoothScreenRotation); | 338 switches::kAshEnableSmoothScreenRotation); |
338 SetDisplayRotation(display_manager()->GetDisplayAt(1).id(), | 339 SetDisplayRotation(display_manager()->GetDisplayAt(1).id(), |
339 display::Display::ROTATE_0); | 340 display::Display::ROTATE_0); |
340 animator()->Rotate(display::Display::ROTATE_90, | 341 animator()->Rotate(display::Display::ROTATE_90, |
341 display::Display::RotationSource::ROTATION_SOURCE_USER); | 342 display::Display::RotationSource::ROTATION_SOURCE_USER); |
342 WaitForCopyCallback(); | 343 WaitForCopyCallback(); |
343 EXPECT_EQ(1U, display_manager()->GetNumDisplays()); | 344 EXPECT_EQ(1U, display_manager()->GetNumDisplays()); |
344 EXPECT_EQ(primary_display_id, display_manager()->GetDisplayAt(0).id()); | 345 EXPECT_EQ(primary_display_id, display_manager()->GetDisplayAt(0).id()); |
345 } | 346 } |
346 | 347 |
347 } // namespace ash | 348 } // namespace ash |
OLD | NEW |