Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Unified Diff: chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc

Issue 223823004: Improving the user transition to add special cases for maximized windows and make the transition "m… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed preferences browser test [disabling animations] Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
index 1dae3a96f0ed8e8a667b32d48fa2d9855cbff88e..a8bfa50199c30cdaefd01b319b43aafa8ba1d0b4 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
@@ -8,6 +8,7 @@
#include "ash/test/test_session_state_delegate.h"
#include "ash/test/test_shell_delegate.h"
#include "ash/wm/window_state.h"
+#include "ash/wm/wm_event.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
@@ -15,6 +16,7 @@
#include "base/time/time.h"
#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h"
+#include "chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/testing_profile.h"
#include "ui/aura/client/aura_constants.h"
@@ -106,6 +108,27 @@ class MultiUserWindowManagerChromeOSTest : public AshTestBase {
return user;
}
+ // Initiate a user transition.
+ void StartUserTransitionAnimation(const std::string& user_id) {
+ multi_user_window_manager_->ActiveUserChanged(user_id);
+ }
+
+ // Call next animation step.
+ void AdvanceUserTransitionAnimation() {
+ multi_user_window_manager_->animation_->AdvanceUserTransitionAnimation();
+ }
+
+ // Return the user id of the wallpaper which is currently set.
+ const std::string& GetWallaperUserIdForTest() {
+ return multi_user_window_manager_->animation_->wallpaper_user_id_for_test();
+ }
+
+ // Returns true if the given window covers the screen.
+ bool CoversScreen(aura::Window* window) {
+ return chrome::UserSwichAnimatorChromeOS::CoversScreen(
+ window);
+ }
+
private:
// These get created for each session.
std::vector<aura::Window*> window_;
@@ -698,14 +721,214 @@ TEST_F(MultiUserWindowManagerChromeOSTest, FullUserSwitchAnimationTests) {
// Switch the user quickly to another user and before the animation is done
// switch back and see that this works.
multi_user_window_manager()->ActiveUserChanged("B");
- // Check that at this time we have nothing visible (in the middle of the
- // animation).
- EXPECT_EQ("H[A], H[B], H[C]", GetStatus());
+ // With the start of the animation B should become visible.
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
// Check that after switching to C, C is fully visible.
SwitchUserAndWaitForAnimation("C");
EXPECT_EQ("H[A], H[B], S[C]", GetStatus());
}
+// Test that using the full user switch, the animations are transitioning as
+// we expect them to in all animation steps.
+TEST_F(MultiUserWindowManagerChromeOSTest, AnimationSteps) {
+ SetUpForThisManyWindows(3);
+ // Turn the use of delays and animation on.
+ multi_user_window_manager()->SetAnimationsForTest(false);
+ // Set some owners and make sure we got what we asked for.
+ multi_user_window_manager()->SetWindowOwner(window(0), "A");
+ multi_user_window_manager()->SetWindowOwner(window(1), "B");
+ multi_user_window_manager()->SetWindowOwner(window(2), "C");
+ EXPECT_FALSE(CoversScreen(window(0)));
+ EXPECT_FALSE(CoversScreen(window(1)));
+ EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+ EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+ EXPECT_NE(ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN,
+ ash::Shell::GetInstance()->GetShelfAutoHideBehavior(
+ window(0)->GetRootWindow()));
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+
+ // Start the animation and see that the old window is becoming invisible, the
+ // new one visible, the background starts transitionining and the shelf hides.
+ StartUserTransitionAnimation("B");
+ EXPECT_EQ("->B", GetWallaperUserIdForTest());
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+ EXPECT_EQ(ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN,
+ ash::Shell::GetInstance()->GetShelfAutoHideBehavior(
+ window(0)->GetRootWindow()));
+
+ // Staring the next step should show the shelf again, but there are many
+ // subsystems missing (preferences system, ChromeLauncherController, ...)
+ // which should set the shelf to its users state. Since that isn't there we
+ // can only make sure that it stays where it is.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("->B", GetWallaperUserIdForTest());
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ(ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN,
+ ash::Shell::GetInstance()->GetShelfAutoHideBehavior(
+ window(0)->GetRootWindow()));
+
+ // After the finalize the animation of the wallpaper should be finished.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+}
+
+// Test that the screen coverage is properly determined.
+TEST_F(MultiUserWindowManagerChromeOSTest, AnimationStepsScreenCoverage) {
+ SetUpForThisManyWindows(3);
+ // Maximizing, fully covering the screen by bounds or fullscreen mode should
+ // make CoversScreen return true.
+ wm::GetWindowState(window(0))->Maximize();
+ window(1)->SetBounds(gfx::Rect(0, 0, 3000, 3000));
+
+ EXPECT_TRUE(CoversScreen(window(0)));
+ EXPECT_TRUE(CoversScreen(window(1)));
+ EXPECT_FALSE(CoversScreen(window(2)));
+
+ ash::wm::WMEvent event(ash::wm::WM_EVENT_FULLSCREEN);
+ wm::GetWindowState(window(2))->OnWMEvent(&event);
+ EXPECT_TRUE(CoversScreen(window(2)));
+}
+
+// Test that switching from a desktop which has a maximized window to a desktop
+// which has no maximized window will produce the proper animation.
+TEST_F(MultiUserWindowManagerChromeOSTest, AnimationStepsMaximizeToNormal) {
+ SetUpForThisManyWindows(3);
+ // Turn the use of delays and animation on.
+ multi_user_window_manager()->SetAnimationsForTest(false);
+ // Set some owners and make sure we got what we asked for.
+ multi_user_window_manager()->SetWindowOwner(window(0), "A");
+ wm::GetWindowState(window(0))->Maximize();
+ multi_user_window_manager()->SetWindowOwner(window(1), "B");
+ multi_user_window_manager()->SetWindowOwner(window(2), "C");
+ EXPECT_TRUE(CoversScreen(window(0)));
+ EXPECT_FALSE(CoversScreen(window(1)));
+ EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+ EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+
+ // Start the animation and see that the new background is immediately set.
+ StartUserTransitionAnimation("B");
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The next step will not change anything.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The final step will also not have any visible impact.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+}
+
+// Test that switching from a desktop which has a normal window to a desktop
+// which has a maximized window will produce the proper animation.
+TEST_F(MultiUserWindowManagerChromeOSTest, AnimationStepsNormalToMaximized) {
+ SetUpForThisManyWindows(3);
+ // Turn the use of delays and animation on.
+ multi_user_window_manager()->SetAnimationsForTest(false);
+ // Set some owners and make sure we got what we asked for.
+ multi_user_window_manager()->SetWindowOwner(window(0), "A");
+ multi_user_window_manager()->SetWindowOwner(window(1), "B");
+ wm::GetWindowState(window(1))->Maximize();
+ multi_user_window_manager()->SetWindowOwner(window(2), "C");
+ EXPECT_FALSE(CoversScreen(window(0)));
+ EXPECT_TRUE(CoversScreen(window(1)));
+ EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+ EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+
+ // Start the animation and see that the old window is becoming invisible, the
+ // new one visible and the background remains as is.
+ StartUserTransitionAnimation("B");
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ("", GetWallaperUserIdForTest());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The next step will not change anything.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("", GetWallaperUserIdForTest());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The final step however will switch the background.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+}
+
+// Test that switching from a desktop which has a maximized window to a desktop
+// which has a maximized window will produce the proper animation.
+TEST_F(MultiUserWindowManagerChromeOSTest, AnimationStepsMaximizedToMaximized) {
+ SetUpForThisManyWindows(3);
+ // Turn the use of delays and animation on.
+ multi_user_window_manager()->SetAnimationsForTest(false);
+ // Set some owners and make sure we got what we asked for.
+ multi_user_window_manager()->SetWindowOwner(window(0), "A");
+ wm::GetWindowState(window(0))->Maximize();
+ multi_user_window_manager()->SetWindowOwner(window(1), "B");
+ wm::GetWindowState(window(1))->Maximize();
+ multi_user_window_manager()->SetWindowOwner(window(2), "C");
+ EXPECT_TRUE(CoversScreen(window(0)));
+ EXPECT_TRUE(CoversScreen(window(1)));
+ EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+ EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+
+ // Start the animation and see that the old window is staying visible, the
+ // new one slowly visible and the background changes immediately.
+ StartUserTransitionAnimation("B");
+ EXPECT_EQ("S[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The next step will not change anything.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The final step however will hide the old window.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+ EXPECT_EQ("B", GetWallaperUserIdForTest());
+ EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
+
+ // Switching back will preserve the z-order by instantly showing the new
+ // window, hiding the layer above it and switching instantly the wallpaper.
+ StartUserTransitionAnimation("A");
+ EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+ EXPECT_EQ("A", GetWallaperUserIdForTest());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(0.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The next step will not change anything.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("A", GetWallaperUserIdForTest());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(0.0f, window(1)->layer()->GetTargetOpacity());
+
+ // The final step is also not changing anything to the status.
+ AdvanceUserTransitionAnimation();
+ EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+ EXPECT_EQ("A", GetWallaperUserIdForTest());
+ EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
+ EXPECT_EQ(0.0f, window(1)->layer()->GetTargetOpacity());
+}
+
// Test that showing a window for another user also switches the desktop.
TEST_F(MultiUserWindowManagerChromeOSTest, ShowForUserSwitchesDesktop) {
SetUpForThisManyWindows(3);

Powered by Google App Engine
This is Rietveld 408576698