| 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 "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h" | 5 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h" |
| 6 | 6 |
| 7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
| 8 #include "ash/multi_profile_uma.h" | 8 #include "ash/multi_profile_uma.h" |
| 9 #include "ash/root_window_controller.h" | 9 #include "ash/root_window_controller.h" |
| 10 #include "ash/session/session_state_delegate.h" | 10 #include "ash/session/session_state_delegate.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "chrome/browser/chromeos/login/session/user_session_manager.h" | 23 #include "chrome/browser/chromeos/login/session/user_session_manager.h" |
| 24 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
| 25 #include "chrome/browser/profiles/profile_manager.h" | 25 #include "chrome/browser/profiles/profile_manager.h" |
| 26 #include "chrome/browser/ui/ash/multi_user/multi_user_notification_blocker_chrom
eos.h" | 26 #include "chrome/browser/ui/ash/multi_user/multi_user_notification_blocker_chrom
eos.h" |
| 27 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" | 27 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" |
| 28 #include "chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h" | 28 #include "chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h" |
| 29 #include "chrome/browser/ui/browser.h" | 29 #include "chrome/browser/ui/browser.h" |
| 30 #include "chrome/browser/ui/browser_finder.h" | 30 #include "chrome/browser/ui/browser_finder.h" |
| 31 #include "chrome/browser/ui/browser_list.h" | 31 #include "chrome/browser/ui/browser_list.h" |
| 32 #include "chrome/browser/ui/browser_window.h" | 32 #include "chrome/browser/ui/browser_window.h" |
| 33 #include "components/user_manager/user_id.h" |
| 33 #include "content/public/browser/notification_service.h" | 34 #include "content/public/browser/notification_service.h" |
| 34 #include "extensions/browser/app_window/app_window.h" | 35 #include "extensions/browser/app_window/app_window.h" |
| 35 #include "extensions/browser/app_window/app_window_registry.h" | 36 #include "extensions/browser/app_window/app_window_registry.h" |
| 36 #include "google_apis/gaia/gaia_auth_util.h" | 37 #include "google_apis/gaia/gaia_auth_util.h" |
| 37 #include "ui/aura/client/aura_constants.h" | 38 #include "ui/aura/client/aura_constants.h" |
| 38 #include "ui/aura/window.h" | 39 #include "ui/aura/window.h" |
| 39 #include "ui/aura/window_event_dispatcher.h" | 40 #include "ui/aura/window_event_dispatcher.h" |
| 40 #include "ui/base/ui_base_types.h" | 41 #include "ui/base/ui_base_types.h" |
| 41 #include "ui/events/event.h" | 42 #include "ui/events/event.h" |
| 42 #include "ui/message_center/message_center.h" | 43 #include "ui/message_center/message_center.h" |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 | 185 |
| 185 DISALLOW_COPY_AND_ASSIGN(AnimationSetter); | 186 DISALLOW_COPY_AND_ASSIGN(AnimationSetter); |
| 186 }; | 187 }; |
| 187 | 188 |
| 188 // This class keeps track of all applications which were started for a user. | 189 // This class keeps track of all applications which were started for a user. |
| 189 // When an app gets created, the window will be tagged for that user. Note | 190 // When an app gets created, the window will be tagged for that user. Note |
| 190 // that the destruction does not need to be tracked here since the universal | 191 // that the destruction does not need to be tracked here since the universal |
| 191 // window observer will take care of that. | 192 // window observer will take care of that. |
| 192 class AppObserver : public extensions::AppWindowRegistry::Observer { | 193 class AppObserver : public extensions::AppWindowRegistry::Observer { |
| 193 public: | 194 public: |
| 194 explicit AppObserver(const std::string& user_id) : user_id_(user_id) {} | 195 explicit AppObserver(const user_manager::UserID& user_id) : user_id_(user_id)
{} |
| 195 ~AppObserver() override {} | 196 ~AppObserver() override {} |
| 196 | 197 |
| 197 // AppWindowRegistry::Observer overrides: | 198 // AppWindowRegistry::Observer overrides: |
| 198 void OnAppWindowAdded(extensions::AppWindow* app_window) override { | 199 void OnAppWindowAdded(extensions::AppWindow* app_window) override { |
| 199 aura::Window* window = app_window->GetNativeWindow(); | 200 aura::Window* window = app_window->GetNativeWindow(); |
| 200 DCHECK(window); | 201 DCHECK(window); |
| 201 MultiUserWindowManagerChromeOS::GetInstance()->SetWindowOwner(window, | 202 MultiUserWindowManagerChromeOS::GetInstance()->SetWindowOwner(window, |
| 202 user_id_); | 203 user_id_); |
| 203 } | 204 } |
| 204 | 205 |
| 205 private: | 206 private: |
| 206 std::string user_id_; | 207 const user_manager::UserID user_id_; |
| 207 | 208 |
| 208 DISALLOW_COPY_AND_ASSIGN(AppObserver); | 209 DISALLOW_COPY_AND_ASSIGN(AppObserver); |
| 209 }; | 210 }; |
| 210 | 211 |
| 211 MultiUserWindowManagerChromeOS::MultiUserWindowManagerChromeOS( | 212 MultiUserWindowManagerChromeOS::MultiUserWindowManagerChromeOS( |
| 212 const std::string& current_user_id) | 213 const user_manager::UserID& current_user_id) |
| 213 : current_user_id_(current_user_id), | 214 : current_user_id_(current_user_id), |
| 215 null_user_id_(std::string(), std::string()), |
| 214 notification_blocker_(new MultiUserNotificationBlockerChromeOS( | 216 notification_blocker_(new MultiUserNotificationBlockerChromeOS( |
| 215 message_center::MessageCenter::Get(), current_user_id)), | 217 message_center::MessageCenter::Get(), current_user_id)), |
| 216 suppress_visibility_changes_(false), | 218 suppress_visibility_changes_(false), |
| 217 animation_speed_(ANIMATION_SPEED_NORMAL) { | 219 animation_speed_(ANIMATION_SPEED_NORMAL) { |
| 218 } | 220 } |
| 219 | 221 |
| 220 MultiUserWindowManagerChromeOS::~MultiUserWindowManagerChromeOS() { | 222 MultiUserWindowManagerChromeOS::~MultiUserWindowManagerChromeOS() { |
| 221 // When the MultiUserWindowManager gets destroyed, ash::Shell is mostly gone. | 223 // When the MultiUserWindowManager gets destroyed, ash::Shell is mostly gone. |
| 222 // As such we should not try to finalize any outstanding user animations. | 224 // As such we should not try to finalize any outstanding user animations. |
| 223 // Note that the destruction of the object can be done later. | 225 // Note that the destruction of the object can be done later. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 content::NotificationService::AllSources()); | 270 content::NotificationService::AllSources()); |
| 269 | 271 |
| 270 // Add an app window observer & all already running apps. | 272 // Add an app window observer & all already running apps. |
| 271 Profile* profile = multi_user_util::GetProfileFromUserID(current_user_id_); | 273 Profile* profile = multi_user_util::GetProfileFromUserID(current_user_id_); |
| 272 if (profile) | 274 if (profile) |
| 273 AddUser(profile); | 275 AddUser(profile); |
| 274 } | 276 } |
| 275 | 277 |
| 276 void MultiUserWindowManagerChromeOS::SetWindowOwner( | 278 void MultiUserWindowManagerChromeOS::SetWindowOwner( |
| 277 aura::Window* window, | 279 aura::Window* window, |
| 278 const std::string& user_id) { | 280 const user_manager::UserID& user_id) { |
| 279 // Make sure the window is valid and there was no owner yet. | 281 // Make sure the window is valid and there was no owner yet. |
| 280 DCHECK(window); | 282 DCHECK(window); |
| 281 DCHECK(!user_id.empty()); | 283 DCHECK(!user_id.empty()); |
| 282 if (GetWindowOwner(window) == user_id) | 284 if (GetWindowOwner(window) == user_id) |
| 283 return; | 285 return; |
| 284 DCHECK(GetWindowOwner(window).empty()); | 286 DCHECK(GetWindowOwner(window).empty()); |
| 285 window_to_entry_[window] = new WindowEntry(user_id); | 287 window_to_entry_[window] = new WindowEntry(user_id); |
| 286 | 288 |
| 287 // Remember the initial visibility of the window. | 289 // Remember the initial visibility of the window. |
| 288 window_to_entry_[window]->set_show(window->IsVisible()); | 290 window_to_entry_[window]->set_show(window->IsVisible()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 300 // will add the children but not the owner to the transient children map. | 302 // will add the children but not the owner to the transient children map. |
| 301 AddTransientOwnerRecursive(window, window); | 303 AddTransientOwnerRecursive(window, window); |
| 302 | 304 |
| 303 // Notify entry adding. | 305 // Notify entry adding. |
| 304 FOR_EACH_OBSERVER(Observer, observers_, OnOwnerEntryAdded(window)); | 306 FOR_EACH_OBSERVER(Observer, observers_, OnOwnerEntryAdded(window)); |
| 305 | 307 |
| 306 if (!IsWindowOnDesktopOfUser(window, current_user_id_)) | 308 if (!IsWindowOnDesktopOfUser(window, current_user_id_)) |
| 307 SetWindowVisibility(window, false, 0); | 309 SetWindowVisibility(window, false, 0); |
| 308 } | 310 } |
| 309 | 311 |
| 310 const std::string& MultiUserWindowManagerChromeOS::GetWindowOwner( | 312 const user_manager::UserID& MultiUserWindowManagerChromeOS::GetWindowOwner( |
| 311 aura::Window* window) const { | 313 aura::Window* window) const { |
| 312 WindowToEntryMap::const_iterator it = window_to_entry_.find(window); | 314 WindowToEntryMap::const_iterator it = window_to_entry_.find(window); |
| 313 return it != window_to_entry_.end() ? it->second->owner() | 315 return it != window_to_entry_.end() ? it->second->owner() |
| 314 : base::EmptyString(); | 316 : user_manager::EmptyUserID(); |
| 315 } | 317 } |
| 316 | 318 |
| 317 void MultiUserWindowManagerChromeOS::ShowWindowForUser( | 319 void MultiUserWindowManagerChromeOS::ShowWindowForUser( |
| 318 aura::Window* window, | 320 aura::Window* window, |
| 319 const std::string& user_id) { | 321 const user_manager::UserID& user_id) { |
| 320 std::string previous_owner(GetUserPresentingWindow(window)); | 322 user_manager::UserID previous_owner(GetUserPresentingWindow(window)); |
| 321 if (!ShowWindowForUserIntern(window, user_id)) | 323 if (!ShowWindowForUserIntern(window, user_id)) |
| 322 return; | 324 return; |
| 323 // The window switched to a new desktop and we have to switch to that desktop, | 325 // The window switched to a new desktop and we have to switch to that desktop, |
| 324 // but only when it was on the visible desktop and the the target is not the | 326 // but only when it was on the visible desktop and the the target is not the |
| 325 // visible desktop. | 327 // visible desktop. |
| 326 if (user_id == current_user_id_ || previous_owner != current_user_id_) | 328 if (user_id == current_user_id_ || previous_owner != current_user_id_) |
| 327 return; | 329 return; |
| 328 | 330 |
| 329 ash::Shell::GetInstance()->session_state_delegate()->SwitchActiveUser( | 331 ash::Shell::GetInstance()->session_state_delegate()->SwitchActiveUser( |
| 330 user_id); | 332 user_id); |
| 331 } | 333 } |
| 332 | 334 |
| 333 bool MultiUserWindowManagerChromeOS::AreWindowsSharedAmongUsers() const { | 335 bool MultiUserWindowManagerChromeOS::AreWindowsSharedAmongUsers() const { |
| 334 WindowToEntryMap::const_iterator it = window_to_entry_.begin(); | 336 WindowToEntryMap::const_iterator it = window_to_entry_.begin(); |
| 335 for (; it != window_to_entry_.end(); ++it) { | 337 for (; it != window_to_entry_.end(); ++it) { |
| 336 if (it->second->owner() != it->second->show_for_user()) | 338 if (it->second->owner() != it->second->show_for_user()) |
| 337 return true; | 339 return true; |
| 338 } | 340 } |
| 339 return false; | 341 return false; |
| 340 } | 342 } |
| 341 | 343 |
| 342 void MultiUserWindowManagerChromeOS::GetOwnersOfVisibleWindows( | 344 void MultiUserWindowManagerChromeOS::GetOwnersOfVisibleWindows( |
| 343 std::set<std::string>* user_ids) const { | 345 std::set<user_manager::UserID>* user_ids) const { |
| 344 for (WindowToEntryMap::const_iterator it = window_to_entry_.begin(); | 346 for (WindowToEntryMap::const_iterator it = window_to_entry_.begin(); |
| 345 it != window_to_entry_.end(); | 347 it != window_to_entry_.end(); |
| 346 ++it) { | 348 ++it) { |
| 347 if (it->first->IsVisible()) | 349 if (it->first->IsVisible()) |
| 348 user_ids->insert(it->second->owner()); | 350 user_ids->insert(it->second->owner()); |
| 349 } | 351 } |
| 350 } | 352 } |
| 351 | 353 |
| 352 bool MultiUserWindowManagerChromeOS::IsWindowOnDesktopOfUser( | 354 bool MultiUserWindowManagerChromeOS::IsWindowOnDesktopOfUser( |
| 353 aura::Window* window, | 355 aura::Window* window, |
| 354 const std::string& user_id) const { | 356 const user_manager::UserID& user_id) const { |
| 355 const std::string& presenting_user = GetUserPresentingWindow(window); | 357 const user_manager::UserID& presenting_user = GetUserPresentingWindow(window); |
| 356 return presenting_user.empty() || presenting_user == user_id; | 358 return presenting_user.empty() || presenting_user == user_id; |
| 357 } | 359 } |
| 358 | 360 |
| 359 const std::string& MultiUserWindowManagerChromeOS::GetUserPresentingWindow( | 361 const user_manager::UserID& MultiUserWindowManagerChromeOS::GetUserPresentingWin
dow( |
| 360 aura::Window* window) const { | 362 aura::Window* window) const { |
| 361 WindowToEntryMap::const_iterator it = window_to_entry_.find(window); | 363 WindowToEntryMap::const_iterator it = window_to_entry_.find(window); |
| 362 // If the window is not owned by anyone it is shown on all desktops and we | 364 // If the window is not owned by anyone it is shown on all desktops and we |
| 363 // return the empty string. | 365 // return the empty string. |
| 364 if (it == window_to_entry_.end()) | 366 if (it == window_to_entry_.end()) |
| 365 return base::EmptyString(); | 367 return user_manager::EmptyUserID(); |
| 368 |
| 366 // Otherwise we ask the object for its desktop. | 369 // Otherwise we ask the object for its desktop. |
| 367 return it->second->show_for_user(); | 370 return it->second->show_for_user(); |
| 368 } | 371 } |
| 369 | 372 |
| 370 void MultiUserWindowManagerChromeOS::AddUser(content::BrowserContext* context) { | 373 void MultiUserWindowManagerChromeOS::AddUser(content::BrowserContext* context) { |
| 371 Profile* profile = Profile::FromBrowserContext(context); | 374 Profile* profile = Profile::FromBrowserContext(context); |
| 372 const std::string& user_id = multi_user_util::GetUserIDFromProfile(profile); | 375 const user_manager::UserID& user_id = multi_user_util::GetUserIDFromProfile(pr
ofile); |
| 373 if (user_id_to_app_observer_.find(user_id) != user_id_to_app_observer_.end()) | 376 if (user_id_to_app_observer_.find(user_id) != user_id_to_app_observer_.end()) |
| 374 return; | 377 return; |
| 375 | 378 |
| 376 user_id_to_app_observer_[user_id] = new AppObserver(user_id); | 379 user_id_to_app_observer_[user_id] = new AppObserver(user_id); |
| 377 extensions::AppWindowRegistry::Get(profile) | 380 extensions::AppWindowRegistry::Get(profile) |
| 378 ->AddObserver(user_id_to_app_observer_[user_id]); | 381 ->AddObserver(user_id_to_app_observer_[user_id]); |
| 379 | 382 |
| 380 // Account all existing application windows of this user accordingly. | 383 // Account all existing application windows of this user accordingly. |
| 381 const extensions::AppWindowRegistry::AppWindowList& app_windows = | 384 const extensions::AppWindowRegistry::AppWindowList& app_windows = |
| 382 extensions::AppWindowRegistry::Get(profile)->app_windows(); | 385 extensions::AppWindowRegistry::Get(profile)->app_windows(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 410 | 413 |
| 411 void MultiUserWindowManagerChromeOS::AddObserver(Observer* observer) { | 414 void MultiUserWindowManagerChromeOS::AddObserver(Observer* observer) { |
| 412 observers_.AddObserver(observer); | 415 observers_.AddObserver(observer); |
| 413 } | 416 } |
| 414 | 417 |
| 415 void MultiUserWindowManagerChromeOS::RemoveObserver(Observer* observer) { | 418 void MultiUserWindowManagerChromeOS::RemoveObserver(Observer* observer) { |
| 416 observers_.RemoveObserver(observer); | 419 observers_.RemoveObserver(observer); |
| 417 } | 420 } |
| 418 | 421 |
| 419 void MultiUserWindowManagerChromeOS::ActiveUserChanged( | 422 void MultiUserWindowManagerChromeOS::ActiveUserChanged( |
| 420 const std::string& user_id) { | 423 const user_manager::UserID& user_id) { |
| 421 // This needs to be set before the animation starts. | 424 // This needs to be set before the animation starts. |
| 422 current_user_id_ = user_id; | 425 current_user_id_ = user_id; |
| 423 | 426 |
| 424 // Here to avoid a very nasty race condition, we must destruct any previously | 427 // Here to avoid a very nasty race condition, we must destruct any previously |
| 425 // created animation before creating a new one. Otherwise, the newly | 428 // created animation before creating a new one. Otherwise, the newly |
| 426 // constructed will hide all windows of the old user in the first step of the | 429 // constructed will hide all windows of the old user in the first step of the |
| 427 // animation only to be reshown again by the destructor of the old animation. | 430 // animation only to be reshown again by the destructor of the old animation. |
| 428 animation_.reset(); | 431 animation_.reset(); |
| 429 animation_.reset( | 432 animation_.reset( |
| 430 new UserSwitchAnimatorChromeOS( | 433 new UserSwitchAnimatorChromeOS( |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 | 530 |
| 528 void MultiUserWindowManagerChromeOS::SetAnimationSpeedForTest( | 531 void MultiUserWindowManagerChromeOS::SetAnimationSpeedForTest( |
| 529 MultiUserWindowManagerChromeOS::AnimationSpeed speed) { | 532 MultiUserWindowManagerChromeOS::AnimationSpeed speed) { |
| 530 animation_speed_ = speed; | 533 animation_speed_ = speed; |
| 531 } | 534 } |
| 532 | 535 |
| 533 bool MultiUserWindowManagerChromeOS::IsAnimationRunningForTest() { | 536 bool MultiUserWindowManagerChromeOS::IsAnimationRunningForTest() { |
| 534 return animation_.get() != NULL && !animation_->IsAnimationFinished(); | 537 return animation_.get() != NULL && !animation_->IsAnimationFinished(); |
| 535 } | 538 } |
| 536 | 539 |
| 537 const std::string& MultiUserWindowManagerChromeOS::GetCurrentUserForTest() | 540 const user_manager::UserID& MultiUserWindowManagerChromeOS::GetCurrentUserForTes
t() |
| 538 const { | 541 const { |
| 539 return current_user_id_; | 542 return current_user_id_; |
| 540 } | 543 } |
| 541 | 544 |
| 542 bool MultiUserWindowManagerChromeOS::ShowWindowForUserIntern( | 545 bool MultiUserWindowManagerChromeOS::ShowWindowForUserIntern( |
| 543 aura::Window* window, | 546 aura::Window* window, |
| 544 const std::string& user_id) { | 547 const user_manager::UserID& user_id) { |
| 545 // If there is either no owner, or the owner is the current user, no action | 548 // If there is either no owner, or the owner is the current user, no action |
| 546 // is required. | 549 // is required. |
| 547 const std::string& owner = GetWindowOwner(window); | 550 const user_manager::UserID& owner = GetWindowOwner(window); |
| 548 if (owner.empty() || | 551 if (owner.empty() || |
| 549 (owner == user_id && IsWindowOnDesktopOfUser(window, user_id))) | 552 (owner == user_id && IsWindowOnDesktopOfUser(window, user_id))) |
| 550 return false; | 553 return false; |
| 551 | 554 |
| 552 bool minimized = ash::wm::GetWindowState(window)->IsMinimized(); | 555 bool minimized = ash::wm::GetWindowState(window)->IsMinimized(); |
| 553 // Check that we are not trying to transfer ownership of a minimized window. | 556 // Check that we are not trying to transfer ownership of a minimized window. |
| 554 if (user_id != owner && minimized) | 557 if (user_id != owner && minimized) |
| 555 return false; | 558 return false; |
| 556 | 559 |
| 557 if (minimized) { | 560 if (minimized) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 // Note that in some cases (e.g. unit test) windows might not have a root | 594 // Note that in some cases (e.g. unit test) windows might not have a root |
| 592 // window. | 595 // window. |
| 593 if (!visible && window->GetRootWindow()) { | 596 if (!visible && window->GetRootWindow()) { |
| 594 // Get the system modal container for the window's root window. | 597 // Get the system modal container for the window's root window. |
| 595 aura::Window* system_modal_container = | 598 aura::Window* system_modal_container = |
| 596 window->GetRootWindow()->GetChildById( | 599 window->GetRootWindow()->GetChildById( |
| 597 ash::kShellWindowId_SystemModalContainer); | 600 ash::kShellWindowId_SystemModalContainer); |
| 598 if (window->parent() == system_modal_container) { | 601 if (window->parent() == system_modal_container) { |
| 599 // The window is system modal and we need to find the parent which owns | 602 // The window is system modal and we need to find the parent which owns |
| 600 // it so that we can switch to the desktop accordingly. | 603 // it so that we can switch to the desktop accordingly. |
| 601 std::string user_id = GetUserPresentingWindow(window); | 604 user_manager::UserID user_id = GetUserPresentingWindow(window); |
| 602 if (user_id.empty()) { | 605 if (user_id.empty()) { |
| 603 aura::Window* owning_window = GetOwningWindowInTransientChain(window); | 606 aura::Window* owning_window = GetOwningWindowInTransientChain(window); |
| 604 DCHECK(owning_window); | 607 DCHECK(owning_window); |
| 605 user_id = GetUserPresentingWindow(owning_window); | 608 user_id = GetUserPresentingWindow(owning_window); |
| 606 DCHECK(!user_id.empty()); | 609 DCHECK(!user_id.empty()); |
| 607 } | 610 } |
| 608 ash::Shell::GetInstance()->session_state_delegate()->SwitchActiveUser( | 611 ash::Shell::GetInstance()->session_state_delegate()->SwitchActiveUser( |
| 609 user_id); | 612 user_id); |
| 610 return; | 613 return; |
| 611 } | 614 } |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 DCHECK_EQ(visible, window->IsVisible()); | 743 DCHECK_EQ(visible, window->IsVisible()); |
| 741 } | 744 } |
| 742 | 745 |
| 743 int MultiUserWindowManagerChromeOS::GetAdjustedAnimationTimeInMS( | 746 int MultiUserWindowManagerChromeOS::GetAdjustedAnimationTimeInMS( |
| 744 int default_time_in_ms) const { | 747 int default_time_in_ms) const { |
| 745 return animation_speed_ == ANIMATION_SPEED_NORMAL ? default_time_in_ms : | 748 return animation_speed_ == ANIMATION_SPEED_NORMAL ? default_time_in_ms : |
| 746 (animation_speed_ == ANIMATION_SPEED_FAST ? 10 : 0); | 749 (animation_speed_ == ANIMATION_SPEED_FAST ? 10 : 0); |
| 747 } | 750 } |
| 748 | 751 |
| 749 } // namespace chrome | 752 } // namespace chrome |
| OLD | NEW |