| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/lock_state_controller.h" | 5 #include "ash/wm/lock_state_controller.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "ash/session/session_state_delegate.h" | 10 #include "ash/session/session_state_delegate.h" |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 void SystemUnlocks() { | 324 void SystemUnlocks() { |
| 325 lock_state_controller_->OnLockStateChanged(false); | 325 lock_state_controller_->OnLockStateChanged(false); |
| 326 session_state_delegate_->UnlockScreen(); | 326 session_state_delegate_->UnlockScreen(); |
| 327 } | 327 } |
| 328 | 328 |
| 329 void EnableMaximizeMode(bool enable) { | 329 void EnableMaximizeMode(bool enable) { |
| 330 Shell::GetInstance()->maximize_mode_controller()-> | 330 Shell::GetInstance()->maximize_mode_controller()-> |
| 331 EnableMaximizeModeWindowManager(enable); | 331 EnableMaximizeModeWindowManager(enable); |
| 332 } | 332 } |
| 333 | 333 |
| 334 void Initialize(bool legacy_button, user::LoginStatus status) { | 334 void Initialize(bool legacy_button, LoginStatus status) { |
| 335 power_button_controller_->set_has_legacy_power_button_for_test( | 335 power_button_controller_->set_has_legacy_power_button_for_test( |
| 336 legacy_button); | 336 legacy_button); |
| 337 lock_state_controller_->OnLoginStateChanged(status); | 337 lock_state_controller_->OnLoginStateChanged(status); |
| 338 SetUserLoggedIn(status != user::LOGGED_IN_NONE); | 338 SetUserLoggedIn(status != LoginStatus::NOT_LOGGED_IN); |
| 339 if (status == user::LOGGED_IN_GUEST) | 339 if (status == LoginStatus::GUEST) |
| 340 SetCanLockScreen(false); | 340 SetCanLockScreen(false); |
| 341 lock_state_controller_->OnLockStateChanged(false); | 341 lock_state_controller_->OnLockStateChanged(false); |
| 342 } | 342 } |
| 343 | 343 |
| 344 PowerButtonController* power_button_controller_; // not owned | 344 PowerButtonController* power_button_controller_; // not owned |
| 345 LockStateController* lock_state_controller_; // not owned | 345 LockStateController* lock_state_controller_; // not owned |
| 346 TestLockStateControllerDelegate* | 346 TestLockStateControllerDelegate* |
| 347 lock_state_controller_delegate_; // not owned | 347 lock_state_controller_delegate_; // not owned |
| 348 TestSessionStateAnimator* test_animator_; // not owned | 348 TestSessionStateAnimator* test_animator_; // not owned |
| 349 SessionStateDelegate* session_state_delegate_; // not owned | 349 SessionStateDelegate* session_state_delegate_; // not owned |
| 350 std::unique_ptr<LockStateController::TestApi> test_api_; | 350 std::unique_ptr<LockStateController::TestApi> test_api_; |
| 351 TestShellDelegate* shell_delegate_; // not owned | 351 TestShellDelegate* shell_delegate_; // not owned |
| 352 | 352 |
| 353 private: | 353 private: |
| 354 DISALLOW_COPY_AND_ASSIGN(LockStateControllerTest); | 354 DISALLOW_COPY_AND_ASSIGN(LockStateControllerTest); |
| 355 }; | 355 }; |
| 356 | 356 |
| 357 // Test the lock-to-shutdown flow for non-Chrome-OS hardware that doesn't | 357 // Test the lock-to-shutdown flow for non-Chrome-OS hardware that doesn't |
| 358 // correctly report power button releases. We should lock immediately the first | 358 // correctly report power button releases. We should lock immediately the first |
| 359 // time the button is pressed and shut down when it's pressed from the locked | 359 // time the button is pressed and shut down when it's pressed from the locked |
| 360 // state. | 360 // state. |
| 361 TEST_F(LockStateControllerTest, LegacyLockAndShutDown) { | 361 TEST_F(LockStateControllerTest, LegacyLockAndShutDown) { |
| 362 Initialize(true, user::LOGGED_IN_USER); | 362 Initialize(true, LoginStatus::USER); |
| 363 | 363 |
| 364 ExpectUnlockedState(); | 364 ExpectUnlockedState(); |
| 365 | 365 |
| 366 // We should request that the screen be locked immediately after seeing the | 366 // We should request that the screen be locked immediately after seeing the |
| 367 // power button get pressed. | 367 // power button get pressed. |
| 368 PressPowerButton(); | 368 PressPowerButton(); |
| 369 | 369 |
| 370 EXPECT_FALSE(test_api_->is_lock_cancellable()); | 370 EXPECT_FALSE(test_api_->is_lock_cancellable()); |
| 371 | 371 |
| 372 ExpectPreLockAnimationStarted(); | 372 ExpectPreLockAnimationStarted(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 402 EXPECT_FALSE(cursor_visible()); | 402 EXPECT_FALSE(cursor_visible()); |
| 403 | 403 |
| 404 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); | 404 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); |
| 405 test_api_->trigger_real_shutdown_timeout(); | 405 test_api_->trigger_real_shutdown_timeout(); |
| 406 EXPECT_EQ(1, NumShutdownRequests()); | 406 EXPECT_EQ(1, NumShutdownRequests()); |
| 407 } | 407 } |
| 408 | 408 |
| 409 // Test that we start shutting down immediately if the power button is pressed | 409 // Test that we start shutting down immediately if the power button is pressed |
| 410 // while we're not logged in on an unofficial system. | 410 // while we're not logged in on an unofficial system. |
| 411 TEST_F(LockStateControllerTest, LegacyNotLoggedIn) { | 411 TEST_F(LockStateControllerTest, LegacyNotLoggedIn) { |
| 412 Initialize(true, user::LOGGED_IN_NONE); | 412 Initialize(true, LoginStatus::NOT_LOGGED_IN); |
| 413 | 413 |
| 414 PressPowerButton(); | 414 PressPowerButton(); |
| 415 ExpectShutdownAnimationStarted(); | 415 ExpectShutdownAnimationStarted(); |
| 416 | 416 |
| 417 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); | 417 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); |
| 418 } | 418 } |
| 419 | 419 |
| 420 // Test that we start shutting down immediately if the power button is pressed | 420 // Test that we start shutting down immediately if the power button is pressed |
| 421 // while we're logged in as a guest on an unofficial system. | 421 // while we're logged in as a guest on an unofficial system. |
| 422 TEST_F(LockStateControllerTest, LegacyGuest) { | 422 TEST_F(LockStateControllerTest, LegacyGuest) { |
| 423 Initialize(true, user::LOGGED_IN_GUEST); | 423 Initialize(true, LoginStatus::GUEST); |
| 424 | 424 |
| 425 PressPowerButton(); | 425 PressPowerButton(); |
| 426 ExpectShutdownAnimationStarted(); | 426 ExpectShutdownAnimationStarted(); |
| 427 | 427 |
| 428 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); | 428 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); |
| 429 } | 429 } |
| 430 | 430 |
| 431 // When we hold the power button while the user isn't logged in, we should shut | 431 // When we hold the power button while the user isn't logged in, we should shut |
| 432 // down the machine directly. | 432 // down the machine directly. |
| 433 TEST_F(LockStateControllerTest, ShutdownWhenNotLoggedIn) { | 433 TEST_F(LockStateControllerTest, ShutdownWhenNotLoggedIn) { |
| 434 Initialize(false, user::LOGGED_IN_NONE); | 434 Initialize(false, LoginStatus::NOT_LOGGED_IN); |
| 435 | 435 |
| 436 // Press the power button and check that we start the shutdown timer. | 436 // Press the power button and check that we start the shutdown timer. |
| 437 PressPowerButton(); | 437 PressPowerButton(); |
| 438 EXPECT_FALSE(test_api_->is_animating_lock()); | 438 EXPECT_FALSE(test_api_->is_animating_lock()); |
| 439 EXPECT_TRUE(test_api_->shutdown_timer_is_running()); | 439 EXPECT_TRUE(test_api_->shutdown_timer_is_running()); |
| 440 ExpectShutdownAnimationStarted(); | 440 ExpectShutdownAnimationStarted(); |
| 441 | 441 |
| 442 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN, 0.5f); | 442 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN, 0.5f); |
| 443 | 443 |
| 444 // Release the power button before the shutdown timer fires. | 444 // Release the power button before the shutdown timer fires. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 463 EXPECT_EQ(0, NumShutdownRequests()); | 463 EXPECT_EQ(0, NumShutdownRequests()); |
| 464 | 464 |
| 465 // When the timout fires, we should request a shutdown. | 465 // When the timout fires, we should request a shutdown. |
| 466 test_api_->trigger_real_shutdown_timeout(); | 466 test_api_->trigger_real_shutdown_timeout(); |
| 467 | 467 |
| 468 EXPECT_EQ(1, NumShutdownRequests()); | 468 EXPECT_EQ(1, NumShutdownRequests()); |
| 469 } | 469 } |
| 470 | 470 |
| 471 // Test that we lock the screen and deal with unlocking correctly. | 471 // Test that we lock the screen and deal with unlocking correctly. |
| 472 TEST_F(LockStateControllerTest, LockAndUnlock) { | 472 TEST_F(LockStateControllerTest, LockAndUnlock) { |
| 473 Initialize(false, user::LOGGED_IN_USER); | 473 Initialize(false, LoginStatus::USER); |
| 474 | 474 |
| 475 ExpectUnlockedState(); | 475 ExpectUnlockedState(); |
| 476 | 476 |
| 477 // Press the power button and check that the lock timer is started and that we | 477 // Press the power button and check that the lock timer is started and that we |
| 478 // start lifting the non-screen-locker containers. | 478 // start lifting the non-screen-locker containers. |
| 479 PressPowerButton(); | 479 PressPowerButton(); |
| 480 | 480 |
| 481 ExpectPreLockAnimationStarted(); | 481 ExpectPreLockAnimationStarted(); |
| 482 EXPECT_TRUE(test_api_->is_lock_cancellable()); | 482 EXPECT_TRUE(test_api_->is_lock_cancellable()); |
| 483 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); | 483 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 | 522 |
| 523 ExpectUnlockAfterUIDestroyedAnimationStarted(); | 523 ExpectUnlockAfterUIDestroyedAnimationStarted(); |
| 524 test_animator_->CompleteAllAnimations(true); | 524 test_animator_->CompleteAllAnimations(true); |
| 525 ExpectUnlockAfterUIDestroyedAnimationFinished(); | 525 ExpectUnlockAfterUIDestroyedAnimationFinished(); |
| 526 | 526 |
| 527 ExpectUnlockedState(); | 527 ExpectUnlockedState(); |
| 528 } | 528 } |
| 529 | 529 |
| 530 // Test that we deal with cancelling lock correctly. | 530 // Test that we deal with cancelling lock correctly. |
| 531 TEST_F(LockStateControllerTest, LockAndCancel) { | 531 TEST_F(LockStateControllerTest, LockAndCancel) { |
| 532 Initialize(false, user::LOGGED_IN_USER); | 532 Initialize(false, LoginStatus::USER); |
| 533 | 533 |
| 534 ExpectUnlockedState(); | 534 ExpectUnlockedState(); |
| 535 | 535 |
| 536 // Press the power button and check that the lock timer is started and that we | 536 // Press the power button and check that the lock timer is started and that we |
| 537 // start lifting the non-screen-locker containers. | 537 // start lifting the non-screen-locker containers. |
| 538 PressPowerButton(); | 538 PressPowerButton(); |
| 539 | 539 |
| 540 ExpectPreLockAnimationStarted(); | 540 ExpectPreLockAnimationStarted(); |
| 541 EXPECT_TRUE(test_api_->is_lock_cancellable()); | 541 EXPECT_TRUE(test_api_->is_lock_cancellable()); |
| 542 | 542 |
| 543 // forward only half way through | 543 // forward only half way through |
| 544 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.5f); | 544 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.5f); |
| 545 | 545 |
| 546 // Release the button before the lock timer fires. | 546 // Release the button before the lock timer fires. |
| 547 ReleasePowerButton(); | 547 ReleasePowerButton(); |
| 548 | 548 |
| 549 ExpectPreLockAnimationCancel(); | 549 ExpectPreLockAnimationCancel(); |
| 550 | 550 |
| 551 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); | 551 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); |
| 552 ExpectUnlockedState(); | 552 ExpectUnlockedState(); |
| 553 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); | 553 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); |
| 554 } | 554 } |
| 555 | 555 |
| 556 // Test that we deal with cancelling lock correctly. | 556 // Test that we deal with cancelling lock correctly. |
| 557 TEST_F(LockStateControllerTest, LockAndCancelAndLockAgain) { | 557 TEST_F(LockStateControllerTest, LockAndCancelAndLockAgain) { |
| 558 Initialize(false, user::LOGGED_IN_USER); | 558 Initialize(false, LoginStatus::USER); |
| 559 | 559 |
| 560 ExpectUnlockedState(); | 560 ExpectUnlockedState(); |
| 561 | 561 |
| 562 // Press the power button and check that the lock timer is started and that we | 562 // Press the power button and check that the lock timer is started and that we |
| 563 // start lifting the non-screen-locker containers. | 563 // start lifting the non-screen-locker containers. |
| 564 PressPowerButton(); | 564 PressPowerButton(); |
| 565 | 565 |
| 566 ExpectPreLockAnimationStarted(); | 566 ExpectPreLockAnimationStarted(); |
| 567 EXPECT_TRUE(test_api_->is_lock_cancellable()); | 567 EXPECT_TRUE(test_api_->is_lock_cancellable()); |
| 568 | 568 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 584 | 584 |
| 585 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); | 585 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); |
| 586 | 586 |
| 587 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.6f); | 587 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.6f); |
| 588 ExpectPreLockAnimationFinished(); | 588 ExpectPreLockAnimationFinished(); |
| 589 EXPECT_EQ(1, lock_state_controller_delegate_->num_lock_requests()); | 589 EXPECT_EQ(1, lock_state_controller_delegate_->num_lock_requests()); |
| 590 } | 590 } |
| 591 | 591 |
| 592 // Hold the power button down from the unlocked state to eventual shutdown. | 592 // Hold the power button down from the unlocked state to eventual shutdown. |
| 593 TEST_F(LockStateControllerTest, LockToShutdown) { | 593 TEST_F(LockStateControllerTest, LockToShutdown) { |
| 594 Initialize(false, user::LOGGED_IN_USER); | 594 Initialize(false, LoginStatus::USER); |
| 595 | 595 |
| 596 // Hold the power button and lock the screen. | 596 // Hold the power button and lock the screen. |
| 597 PressPowerButton(); | 597 PressPowerButton(); |
| 598 EXPECT_TRUE(test_api_->is_animating_lock()); | 598 EXPECT_TRUE(test_api_->is_animating_lock()); |
| 599 | 599 |
| 600 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); | 600 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); |
| 601 SystemLocks(); | 601 SystemLocks(); |
| 602 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); | 602 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); |
| 603 | 603 |
| 604 // When the lock-to-shutdown timeout fires, we should start the shutdown | 604 // When the lock-to-shutdown timeout fires, we should start the shutdown |
| (...skipping 12 matching lines...) Expand all Loading... |
| 617 | 617 |
| 618 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); | 618 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); |
| 619 EXPECT_EQ(0, NumShutdownRequests()); | 619 EXPECT_EQ(0, NumShutdownRequests()); |
| 620 test_api_->trigger_real_shutdown_timeout(); | 620 test_api_->trigger_real_shutdown_timeout(); |
| 621 EXPECT_EQ(1, NumShutdownRequests()); | 621 EXPECT_EQ(1, NumShutdownRequests()); |
| 622 } | 622 } |
| 623 | 623 |
| 624 // Hold the power button down from the unlocked state to eventual shutdown, | 624 // Hold the power button down from the unlocked state to eventual shutdown, |
| 625 // then release the button while system does locking. | 625 // then release the button while system does locking. |
| 626 TEST_F(LockStateControllerTest, CancelLockToShutdown) { | 626 TEST_F(LockStateControllerTest, CancelLockToShutdown) { |
| 627 Initialize(false, user::LOGGED_IN_USER); | 627 Initialize(false, LoginStatus::USER); |
| 628 | 628 |
| 629 PressPowerButton(); | 629 PressPowerButton(); |
| 630 | 630 |
| 631 // Hold the power button and lock the screen. | 631 // Hold the power button and lock the screen. |
| 632 EXPECT_TRUE(test_api_->is_animating_lock()); | 632 EXPECT_TRUE(test_api_->is_animating_lock()); |
| 633 | 633 |
| 634 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); | 634 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); |
| 635 SystemLocks(); | 635 SystemLocks(); |
| 636 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS, 0.5f); | 636 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS, 0.5f); |
| 637 | 637 |
| 638 // Power button is released while system attempts to lock. | 638 // Power button is released while system attempts to lock. |
| 639 ReleasePowerButton(); | 639 ReleasePowerButton(); |
| 640 | 640 |
| 641 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); | 641 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); |
| 642 | 642 |
| 643 EXPECT_FALSE(lock_state_controller_->ShutdownRequested()); | 643 EXPECT_FALSE(lock_state_controller_->ShutdownRequested()); |
| 644 EXPECT_FALSE(test_api_->lock_to_shutdown_timer_is_running()); | 644 EXPECT_FALSE(test_api_->lock_to_shutdown_timer_is_running()); |
| 645 EXPECT_FALSE(test_api_->shutdown_timer_is_running()); | 645 EXPECT_FALSE(test_api_->shutdown_timer_is_running()); |
| 646 } | 646 } |
| 647 | 647 |
| 648 // TODO(bruthig): Investigate why this hangs on Windows 8 and whether it can be | 648 // TODO(bruthig): Investigate why this hangs on Windows 8 and whether it can be |
| 649 // safely enabled on OS_WIN. | 649 // safely enabled on OS_WIN. |
| 650 #ifndef OS_WIN | 650 #ifndef OS_WIN |
| 651 // Test that we handle the case where lock requests are ignored. | 651 // Test that we handle the case where lock requests are ignored. |
| 652 TEST_F(LockStateControllerTest, Lock) { | 652 TEST_F(LockStateControllerTest, Lock) { |
| 653 Initialize(false, user::LOGGED_IN_USER); | 653 Initialize(false, LoginStatus::USER); |
| 654 | 654 |
| 655 // Hold the power button and lock the screen. | 655 // Hold the power button and lock the screen. |
| 656 PressPowerButton(); | 656 PressPowerButton(); |
| 657 ExpectPreLockAnimationStarted(); | 657 ExpectPreLockAnimationStarted(); |
| 658 | 658 |
| 659 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); | 659 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); |
| 660 | 660 |
| 661 EXPECT_EQ(1, lock_state_controller_delegate_->num_lock_requests()); | 661 EXPECT_EQ(1, lock_state_controller_delegate_->num_lock_requests()); |
| 662 EXPECT_TRUE(test_api_->lock_fail_timer_is_running()); | 662 EXPECT_TRUE(test_api_->lock_fail_timer_is_running()); |
| 663 // We shouldn't start the lock-to-shutdown timer until the screen has actually | 663 // We shouldn't start the lock-to-shutdown timer until the screen has actually |
| 664 // been locked and this was animated. | 664 // been locked and this was animated. |
| 665 EXPECT_FALSE(test_api_->lock_to_shutdown_timer_is_running()); | 665 EXPECT_FALSE(test_api_->lock_to_shutdown_timer_is_running()); |
| 666 | 666 |
| 667 // Act as if the request timed out. | 667 // Act as if the request timed out. |
| 668 EXPECT_DEATH(test_api_->trigger_lock_fail_timeout(), ""); | 668 EXPECT_DEATH(test_api_->trigger_lock_fail_timeout(), ""); |
| 669 } | 669 } |
| 670 #endif | 670 #endif |
| 671 | 671 |
| 672 // Test the basic operation of the lock button (not logged in). | 672 // Test the basic operation of the lock button (not logged in). |
| 673 TEST_F(LockStateControllerTest, LockButtonBasicNotLoggedIn) { | 673 TEST_F(LockStateControllerTest, LockButtonBasicNotLoggedIn) { |
| 674 // The lock button shouldn't do anything if we aren't logged in. | 674 // The lock button shouldn't do anything if we aren't logged in. |
| 675 Initialize(false, user::LOGGED_IN_NONE); | 675 Initialize(false, LoginStatus::NOT_LOGGED_IN); |
| 676 | 676 |
| 677 PressLockButton(); | 677 PressLockButton(); |
| 678 EXPECT_FALSE(test_api_->is_animating_lock()); | 678 EXPECT_FALSE(test_api_->is_animating_lock()); |
| 679 ReleaseLockButton(); | 679 ReleaseLockButton(); |
| 680 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); | 680 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); |
| 681 } | 681 } |
| 682 | 682 |
| 683 // Test the basic operation of the lock button (guest). | 683 // Test the basic operation of the lock button (guest). |
| 684 TEST_F(LockStateControllerTest, LockButtonBasicGuest) { | 684 TEST_F(LockStateControllerTest, LockButtonBasicGuest) { |
| 685 // The lock button shouldn't do anything when we're logged in as a guest. | 685 // The lock button shouldn't do anything when we're logged in as a guest. |
| 686 Initialize(false, user::LOGGED_IN_GUEST); | 686 Initialize(false, LoginStatus::GUEST); |
| 687 | 687 |
| 688 PressLockButton(); | 688 PressLockButton(); |
| 689 EXPECT_FALSE(test_api_->is_animating_lock()); | 689 EXPECT_FALSE(test_api_->is_animating_lock()); |
| 690 ReleaseLockButton(); | 690 ReleaseLockButton(); |
| 691 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); | 691 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); |
| 692 } | 692 } |
| 693 | 693 |
| 694 // Test the basic operation of the lock button. | 694 // Test the basic operation of the lock button. |
| 695 TEST_F(LockStateControllerTest, LockButtonBasic) { | 695 TEST_F(LockStateControllerTest, LockButtonBasic) { |
| 696 // If we're logged in as a regular user, we should start the lock timer and | 696 // If we're logged in as a regular user, we should start the lock timer and |
| 697 // the pre-lock animation. | 697 // the pre-lock animation. |
| 698 Initialize(false, user::LOGGED_IN_USER); | 698 Initialize(false, LoginStatus::USER); |
| 699 | 699 |
| 700 PressLockButton(); | 700 PressLockButton(); |
| 701 ExpectPreLockAnimationStarted(); | 701 ExpectPreLockAnimationStarted(); |
| 702 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.5f); | 702 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.5f); |
| 703 | 703 |
| 704 // If the button is released immediately, we shouldn't lock the screen. | 704 // If the button is released immediately, we shouldn't lock the screen. |
| 705 ReleaseLockButton(); | 705 ReleaseLockButton(); |
| 706 ExpectPreLockAnimationCancel(); | 706 ExpectPreLockAnimationCancel(); |
| 707 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); | 707 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); |
| 708 | 708 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 734 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); | 734 Advance(SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); |
| 735 ExpectPostLockAnimationFinished(); | 735 ExpectPostLockAnimationFinished(); |
| 736 | 736 |
| 737 PressLockButton(); | 737 PressLockButton(); |
| 738 ReleaseLockButton(); | 738 ReleaseLockButton(); |
| 739 ExpectPostLockAnimationFinished(); | 739 ExpectPostLockAnimationFinished(); |
| 740 } | 740 } |
| 741 | 741 |
| 742 // Test that the power button takes priority over the lock button. | 742 // Test that the power button takes priority over the lock button. |
| 743 TEST_F(LockStateControllerTest, PowerButtonPreemptsLockButton) { | 743 TEST_F(LockStateControllerTest, PowerButtonPreemptsLockButton) { |
| 744 Initialize(false, user::LOGGED_IN_USER); | 744 Initialize(false, LoginStatus::USER); |
| 745 | 745 |
| 746 // While the lock button is down, hold the power button. | 746 // While the lock button is down, hold the power button. |
| 747 PressLockButton(); | 747 PressLockButton(); |
| 748 ExpectPreLockAnimationStarted(); | 748 ExpectPreLockAnimationStarted(); |
| 749 | 749 |
| 750 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.1f); | 750 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.1f); |
| 751 ExpectPreLockAnimationRunning(); | 751 ExpectPreLockAnimationRunning(); |
| 752 | 752 |
| 753 PressPowerButton(); | 753 PressPowerButton(); |
| 754 ExpectPreLockAnimationRunning(); | 754 ExpectPreLockAnimationRunning(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 784 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.1f); | 784 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.1f); |
| 785 | 785 |
| 786 ReleaseLockButton(); | 786 ReleaseLockButton(); |
| 787 ExpectPreLockAnimationCancel(); | 787 ExpectPreLockAnimationCancel(); |
| 788 } | 788 } |
| 789 | 789 |
| 790 // When the screen is locked without going through the usual power-button | 790 // When the screen is locked without going through the usual power-button |
| 791 // slow-close path (e.g. via the wrench menu), test that we still show the | 791 // slow-close path (e.g. via the wrench menu), test that we still show the |
| 792 // fast-close animation. | 792 // fast-close animation. |
| 793 TEST_F(LockStateControllerTest, LockWithoutButton) { | 793 TEST_F(LockStateControllerTest, LockWithoutButton) { |
| 794 Initialize(false, user::LOGGED_IN_USER); | 794 Initialize(false, LoginStatus::USER); |
| 795 lock_state_controller_->OnStartingLock(); | 795 lock_state_controller_->OnStartingLock(); |
| 796 | 796 |
| 797 ExpectPreLockAnimationStarted(); | 797 ExpectPreLockAnimationStarted(); |
| 798 EXPECT_FALSE(test_api_->is_lock_cancellable()); | 798 EXPECT_FALSE(test_api_->is_lock_cancellable()); |
| 799 EXPECT_LT(0u, test_animator_->GetAnimationCount()); | 799 EXPECT_LT(0u, test_animator_->GetAnimationCount()); |
| 800 | 800 |
| 801 test_animator_->CompleteAllAnimations(true); | 801 test_animator_->CompleteAllAnimations(true); |
| 802 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); | 802 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); |
| 803 } | 803 } |
| 804 | 804 |
| 805 // When we hear that the process is exiting but we haven't had a chance to | 805 // When we hear that the process is exiting but we haven't had a chance to |
| 806 // display an animation, we should just blank the screen. | 806 // display an animation, we should just blank the screen. |
| 807 TEST_F(LockStateControllerTest, ShutdownWithoutButton) { | 807 TEST_F(LockStateControllerTest, ShutdownWithoutButton) { |
| 808 Initialize(false, user::LOGGED_IN_USER); | 808 Initialize(false, LoginStatus::USER); |
| 809 lock_state_controller_->OnAppTerminating(); | 809 lock_state_controller_->OnAppTerminating(); |
| 810 | 810 |
| 811 EXPECT_TRUE( | 811 EXPECT_TRUE( |
| 812 test_animator_->AreContainersAnimated( | 812 test_animator_->AreContainersAnimated( |
| 813 SessionStateAnimator::kAllNonRootContainersMask, | 813 SessionStateAnimator::kAllNonRootContainersMask, |
| 814 SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY)); | 814 SessionStateAnimator::ANIMATION_HIDE_IMMEDIATELY)); |
| 815 GenerateMouseMoveEvent(); | 815 GenerateMouseMoveEvent(); |
| 816 EXPECT_FALSE(cursor_visible()); | 816 EXPECT_FALSE(cursor_visible()); |
| 817 } | 817 } |
| 818 | 818 |
| 819 // Test that we display the fast-close animation and shut down when we get an | 819 // Test that we display the fast-close animation and shut down when we get an |
| 820 // outside request to shut down (e.g. from the login or lock screen). | 820 // outside request to shut down (e.g. from the login or lock screen). |
| 821 TEST_F(LockStateControllerTest, RequestShutdownFromLoginScreen) { | 821 TEST_F(LockStateControllerTest, RequestShutdownFromLoginScreen) { |
| 822 Initialize(false, user::LOGGED_IN_NONE); | 822 Initialize(false, LoginStatus::NOT_LOGGED_IN); |
| 823 | 823 |
| 824 lock_state_controller_->RequestShutdown(); | 824 lock_state_controller_->RequestShutdown(); |
| 825 | 825 |
| 826 ExpectShutdownAnimationStarted(); | 826 ExpectShutdownAnimationStarted(); |
| 827 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); | 827 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); |
| 828 | 828 |
| 829 GenerateMouseMoveEvent(); | 829 GenerateMouseMoveEvent(); |
| 830 EXPECT_FALSE(cursor_visible()); | 830 EXPECT_FALSE(cursor_visible()); |
| 831 | 831 |
| 832 EXPECT_EQ(0, NumShutdownRequests()); | 832 EXPECT_EQ(0, NumShutdownRequests()); |
| 833 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); | 833 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); |
| 834 test_api_->trigger_real_shutdown_timeout(); | 834 test_api_->trigger_real_shutdown_timeout(); |
| 835 EXPECT_EQ(1, NumShutdownRequests()); | 835 EXPECT_EQ(1, NumShutdownRequests()); |
| 836 } | 836 } |
| 837 | 837 |
| 838 TEST_F(LockStateControllerTest, RequestShutdownFromLockScreen) { | 838 TEST_F(LockStateControllerTest, RequestShutdownFromLockScreen) { |
| 839 Initialize(false, user::LOGGED_IN_USER); | 839 Initialize(false, LoginStatus::USER); |
| 840 | 840 |
| 841 SystemLocks(); | 841 SystemLocks(); |
| 842 | 842 |
| 843 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); | 843 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); |
| 844 ExpectPostLockAnimationFinished(); | 844 ExpectPostLockAnimationFinished(); |
| 845 | 845 |
| 846 lock_state_controller_->RequestShutdown(); | 846 lock_state_controller_->RequestShutdown(); |
| 847 | 847 |
| 848 ExpectShutdownAnimationStarted(); | 848 ExpectShutdownAnimationStarted(); |
| 849 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); | 849 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); |
| 850 | 850 |
| 851 GenerateMouseMoveEvent(); | 851 GenerateMouseMoveEvent(); |
| 852 EXPECT_FALSE(cursor_visible()); | 852 EXPECT_FALSE(cursor_visible()); |
| 853 | 853 |
| 854 EXPECT_EQ(0, NumShutdownRequests()); | 854 EXPECT_EQ(0, NumShutdownRequests()); |
| 855 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); | 855 EXPECT_TRUE(test_api_->real_shutdown_timer_is_running()); |
| 856 test_api_->trigger_real_shutdown_timeout(); | 856 test_api_->trigger_real_shutdown_timeout(); |
| 857 EXPECT_EQ(1, NumShutdownRequests()); | 857 EXPECT_EQ(1, NumShutdownRequests()); |
| 858 } | 858 } |
| 859 | 859 |
| 860 TEST_F(LockStateControllerTest, RequestAndCancelShutdownFromLockScreen) { | 860 TEST_F(LockStateControllerTest, RequestAndCancelShutdownFromLockScreen) { |
| 861 Initialize(false, user::LOGGED_IN_USER); | 861 Initialize(false, LoginStatus::USER); |
| 862 | 862 |
| 863 SystemLocks(); | 863 SystemLocks(); |
| 864 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); | 864 Advance(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN); |
| 865 ExpectLockedState(); | 865 ExpectLockedState(); |
| 866 | 866 |
| 867 // Press the power button and check that we start the shutdown timer. | 867 // Press the power button and check that we start the shutdown timer. |
| 868 PressPowerButton(); | 868 PressPowerButton(); |
| 869 EXPECT_FALSE(test_api_->is_animating_lock()); | 869 EXPECT_FALSE(test_api_->is_animating_lock()); |
| 870 EXPECT_TRUE(test_api_->shutdown_timer_is_running()); | 870 EXPECT_TRUE(test_api_->shutdown_timer_is_running()); |
| 871 | 871 |
| 872 ExpectShutdownAnimationStarted(); | 872 ExpectShutdownAnimationStarted(); |
| 873 | 873 |
| 874 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN, 0.5f); | 874 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_SHUTDOWN, 0.5f); |
| 875 | 875 |
| 876 // Release the power button before the shutdown timer fires. | 876 // Release the power button before the shutdown timer fires. |
| 877 ReleasePowerButton(); | 877 ReleasePowerButton(); |
| 878 | 878 |
| 879 EXPECT_FALSE(test_api_->shutdown_timer_is_running()); | 879 EXPECT_FALSE(test_api_->shutdown_timer_is_running()); |
| 880 | 880 |
| 881 ExpectShutdownAnimationCancel(); | 881 ExpectShutdownAnimationCancel(); |
| 882 | 882 |
| 883 Advance(SessionStateAnimator::ANIMATION_SPEED_REVERT_SHUTDOWN); | 883 Advance(SessionStateAnimator::ANIMATION_SPEED_REVERT_SHUTDOWN); |
| 884 ExpectLockedState(); | 884 ExpectLockedState(); |
| 885 } | 885 } |
| 886 | 886 |
| 887 // Test that we ignore power button presses when the screen is turned off. | 887 // Test that we ignore power button presses when the screen is turned off. |
| 888 TEST_F(LockStateControllerTest, IgnorePowerButtonIfScreenIsOff) { | 888 TEST_F(LockStateControllerTest, IgnorePowerButtonIfScreenIsOff) { |
| 889 Initialize(false, user::LOGGED_IN_USER); | 889 Initialize(false, LoginStatus::USER); |
| 890 | 890 |
| 891 // When the screen brightness is at 0%, we shouldn't do anything in response | 891 // When the screen brightness is at 0%, we shouldn't do anything in response |
| 892 // to power button presses. | 892 // to power button presses. |
| 893 power_button_controller_->OnScreenBrightnessChanged(0.0); | 893 power_button_controller_->OnScreenBrightnessChanged(0.0); |
| 894 PressPowerButton(); | 894 PressPowerButton(); |
| 895 EXPECT_FALSE(test_api_->is_animating_lock()); | 895 EXPECT_FALSE(test_api_->is_animating_lock()); |
| 896 ReleasePowerButton(); | 896 ReleasePowerButton(); |
| 897 | 897 |
| 898 // After increasing the brightness to 10%, we should start the timer like | 898 // After increasing the brightness to 10%, we should start the timer like |
| 899 // usual. | 899 // usual. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 940 external_display.set_current_mode(external_display.modes().back().get()); | 940 external_display.set_current_mode(external_display.modes().back().get()); |
| 941 power_button_controller_->OnDisplayModeChanged(outputs); | 941 power_button_controller_->OnDisplayModeChanged(outputs); |
| 942 PressPowerButton(); | 942 PressPowerButton(); |
| 943 EXPECT_TRUE(test_api_->is_animating_lock()); | 943 EXPECT_TRUE(test_api_->is_animating_lock()); |
| 944 ReleasePowerButton(); | 944 ReleasePowerButton(); |
| 945 } | 945 } |
| 946 #endif | 946 #endif |
| 947 | 947 |
| 948 // Test that hidden background appears and revers correctly on lock/cancel. | 948 // Test that hidden background appears and revers correctly on lock/cancel. |
| 949 TEST_F(LockStateControllerTest, TestHiddenBackgroundLockCancel) { | 949 TEST_F(LockStateControllerTest, TestHiddenBackgroundLockCancel) { |
| 950 Initialize(false, user::LOGGED_IN_USER); | 950 Initialize(false, LoginStatus::USER); |
| 951 HideBackground(); | 951 HideBackground(); |
| 952 | 952 |
| 953 ExpectUnlockedState(); | 953 ExpectUnlockedState(); |
| 954 PressPowerButton(); | 954 PressPowerButton(); |
| 955 | 955 |
| 956 ExpectPreLockAnimationStarted(); | 956 ExpectPreLockAnimationStarted(); |
| 957 ExpectBackgroundIsShowing(); | 957 ExpectBackgroundIsShowing(); |
| 958 | 958 |
| 959 // Forward only half way through. | 959 // Forward only half way through. |
| 960 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.5f); | 960 AdvancePartially(SessionStateAnimator::ANIMATION_SPEED_UNDOABLE, 0.5f); |
| 961 | 961 |
| 962 // Release the button before the lock timer fires. | 962 // Release the button before the lock timer fires. |
| 963 ReleasePowerButton(); | 963 ReleasePowerButton(); |
| 964 ExpectPreLockAnimationCancel(); | 964 ExpectPreLockAnimationCancel(); |
| 965 ExpectBackgroundIsHiding(); | 965 ExpectBackgroundIsHiding(); |
| 966 | 966 |
| 967 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS); | 967 Advance(SessionStateAnimator::ANIMATION_SPEED_UNDO_MOVE_WINDOWS); |
| 968 | 968 |
| 969 // When the CancelPrelockAnimation sequence finishes it queues up a | 969 // When the CancelPrelockAnimation sequence finishes it queues up a |
| 970 // restore background visibility sequence when the background is hidden. | 970 // restore background visibility sequence when the background is hidden. |
| 971 ExpectRestoringBackgroundVisibility(); | 971 ExpectRestoringBackgroundVisibility(); |
| 972 | 972 |
| 973 Advance(SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE); | 973 Advance(SessionStateAnimator::ANIMATION_SPEED_IMMEDIATE); |
| 974 | 974 |
| 975 ExpectUnlockedState(); | 975 ExpectUnlockedState(); |
| 976 } | 976 } |
| 977 | 977 |
| 978 // Test that hidden background appears and revers correctly on lock/unlock. | 978 // Test that hidden background appears and revers correctly on lock/unlock. |
| 979 TEST_F(LockStateControllerTest, TestHiddenBackgroundLockUnlock) { | 979 TEST_F(LockStateControllerTest, TestHiddenBackgroundLockUnlock) { |
| 980 Initialize(false, user::LOGGED_IN_USER); | 980 Initialize(false, LoginStatus::USER); |
| 981 HideBackground(); | 981 HideBackground(); |
| 982 | 982 |
| 983 ExpectUnlockedState(); | 983 ExpectUnlockedState(); |
| 984 | 984 |
| 985 // Press the power button and check that the lock timer is started and that we | 985 // Press the power button and check that the lock timer is started and that we |
| 986 // start lifting the non-screen-locker containers. | 986 // start lifting the non-screen-locker containers. |
| 987 PressPowerButton(); | 987 PressPowerButton(); |
| 988 | 988 |
| 989 ExpectPreLockAnimationStarted(); | 989 ExpectPreLockAnimationStarted(); |
| 990 ExpectBackgroundIsShowing(); | 990 ExpectBackgroundIsShowing(); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1069 PressVolumeDown(); | 1069 PressVolumeDown(); |
| 1070 PressPowerButton(); | 1070 PressPowerButton(); |
| 1071 ReleasePowerButton(); | 1071 ReleasePowerButton(); |
| 1072 ReleaseVolumeDown(); | 1072 ReleaseVolumeDown(); |
| 1073 EXPECT_EQ(1, delegate->handle_take_screenshot_count()); | 1073 EXPECT_EQ(1, delegate->handle_take_screenshot_count()); |
| 1074 } | 1074 } |
| 1075 | 1075 |
| 1076 // Tests that a lock action is cancellable when quick lock is turned on and | 1076 // Tests that a lock action is cancellable when quick lock is turned on and |
| 1077 // maximize mode is not active. | 1077 // maximize mode is not active. |
| 1078 TEST_F(LockStateControllerTest, QuickLockWhileNotInMaximizeMode) { | 1078 TEST_F(LockStateControllerTest, QuickLockWhileNotInMaximizeMode) { |
| 1079 Initialize(false, user::LOGGED_IN_USER); | 1079 Initialize(false, LoginStatus::USER); |
| 1080 power_button_controller_->set_enable_quick_lock_for_test(true); | 1080 power_button_controller_->set_enable_quick_lock_for_test(true); |
| 1081 EnableMaximizeMode(false); | 1081 EnableMaximizeMode(false); |
| 1082 | 1082 |
| 1083 PressPowerButton(); | 1083 PressPowerButton(); |
| 1084 | 1084 |
| 1085 ExpectPreLockAnimationStarted(); | 1085 ExpectPreLockAnimationStarted(); |
| 1086 EXPECT_TRUE(test_api_->is_animating_lock()); | 1086 EXPECT_TRUE(test_api_->is_animating_lock()); |
| 1087 EXPECT_TRUE(lock_state_controller_->CanCancelLockAnimation()); | 1087 EXPECT_TRUE(lock_state_controller_->CanCancelLockAnimation()); |
| 1088 | 1088 |
| 1089 ReleasePowerButton(); | 1089 ReleasePowerButton(); |
| 1090 | 1090 |
| 1091 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); | 1091 EXPECT_EQ(0, lock_state_controller_delegate_->num_lock_requests()); |
| 1092 } | 1092 } |
| 1093 | 1093 |
| 1094 // Tests that a lock action is not cancellable when quick lock is turned on and | 1094 // Tests that a lock action is not cancellable when quick lock is turned on and |
| 1095 // maximize mode is active. | 1095 // maximize mode is active. |
| 1096 TEST_F(LockStateControllerTest, QuickLockWhileInMaximizeMode) { | 1096 TEST_F(LockStateControllerTest, QuickLockWhileInMaximizeMode) { |
| 1097 Initialize(false, user::LOGGED_IN_USER); | 1097 Initialize(false, LoginStatus::USER); |
| 1098 power_button_controller_->set_enable_quick_lock_for_test(true); | 1098 power_button_controller_->set_enable_quick_lock_for_test(true); |
| 1099 EnableMaximizeMode(true); | 1099 EnableMaximizeMode(true); |
| 1100 | 1100 |
| 1101 PressPowerButton(); | 1101 PressPowerButton(); |
| 1102 | 1102 |
| 1103 ExpectPreLockAnimationStarted(); | 1103 ExpectPreLockAnimationStarted(); |
| 1104 EXPECT_TRUE(test_api_->is_animating_lock()); | 1104 EXPECT_TRUE(test_api_->is_animating_lock()); |
| 1105 EXPECT_FALSE(lock_state_controller_->CanCancelLockAnimation()); | 1105 EXPECT_FALSE(lock_state_controller_->CanCancelLockAnimation()); |
| 1106 | 1106 |
| 1107 ReleasePowerButton(); | 1107 ReleasePowerButton(); |
| 1108 | 1108 |
| 1109 ExpectPreLockAnimationStarted(); | 1109 ExpectPreLockAnimationStarted(); |
| 1110 | 1110 |
| 1111 test_animator_->CompleteAllAnimations(true); | 1111 test_animator_->CompleteAllAnimations(true); |
| 1112 EXPECT_EQ(1, lock_state_controller_delegate_->num_lock_requests()); | 1112 EXPECT_EQ(1, lock_state_controller_delegate_->num_lock_requests()); |
| 1113 } | 1113 } |
| 1114 | 1114 |
| 1115 } // namespace test | 1115 } // namespace test |
| 1116 } // namespace ash | 1116 } // namespace ash |
| OLD | NEW |