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 "apps/app_window.h" | 7 #include "apps/app_window.h" |
8 #include "apps/app_window_registry.h" | 8 #include "apps/app_window_registry.h" |
9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
10 #include "ash/desktop_background/user_wallpaper_delegate.h" | |
11 #include "ash/multi_profile_uma.h" | 10 #include "ash/multi_profile_uma.h" |
12 #include "ash/root_window_controller.h" | 11 #include "ash/root_window_controller.h" |
13 #include "ash/session_state_delegate.h" | 12 #include "ash/session_state_delegate.h" |
14 #include "ash/shelf/shelf.h" | 13 #include "ash/shelf/shelf.h" |
15 #include "ash/shelf/shelf_layout_manager.h" | |
16 #include "ash/shell.h" | 14 #include "ash/shell.h" |
17 #include "ash/shell_delegate.h" | 15 #include "ash/shell_delegate.h" |
18 #include "ash/shell_window_ids.h" | 16 #include "ash/shell_window_ids.h" |
19 #include "ash/wm/mru_window_tracker.h" | |
20 #include "ash/wm/window_positioner.h" | |
21 #include "ash/wm/window_state.h" | 17 #include "ash/wm/window_state.h" |
22 #include "base/auto_reset.h" | 18 #include "base/auto_reset.h" |
23 #include "base/message_loop/message_loop.h" | 19 #include "base/message_loop/message_loop.h" |
24 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
25 #include "chrome/browser/browser_process.h" | 21 #include "chrome/browser/browser_process.h" |
26 #include "chrome/browser/chrome_notification_types.h" | 22 #include "chrome/browser/chrome_notification_types.h" |
27 #include "chrome/browser/chromeos/login/user_manager.h" | 23 #include "chrome/browser/chromeos/login/user_manager.h" |
28 #include "chrome/browser/chromeos/login/wallpaper_manager.h" | |
29 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
30 #include "chrome/browser/profiles/profile_manager.h" | 25 #include "chrome/browser/profiles/profile_manager.h" |
31 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" | |
32 #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" |
33 #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" |
34 #include "chrome/browser/ui/browser.h" | 29 #include "chrome/browser/ui/browser.h" |
35 #include "chrome/browser/ui/browser_finder.h" | 30 #include "chrome/browser/ui/browser_finder.h" |
36 #include "chrome/browser/ui/browser_list.h" | 31 #include "chrome/browser/ui/browser_list.h" |
37 #include "chrome/browser/ui/browser_window.h" | 32 #include "chrome/browser/ui/browser_window.h" |
38 #include "content/public/browser/notification_service.h" | 33 #include "content/public/browser/notification_service.h" |
39 #include "google_apis/gaia/gaia_auth_util.h" | 34 #include "google_apis/gaia/gaia_auth_util.h" |
40 #include "ui/aura/client/aura_constants.h" | 35 #include "ui/aura/client/aura_constants.h" |
41 #include "ui/aura/window.h" | 36 #include "ui/aura/window.h" |
42 #include "ui/aura/window_event_dispatcher.h" | 37 #include "ui/aura/window_event_dispatcher.h" |
43 #include "ui/base/ui_base_types.h" | 38 #include "ui/base/ui_base_types.h" |
44 #include "ui/events/event.h" | 39 #include "ui/events/event.h" |
45 #include "ui/message_center/message_center.h" | 40 #include "ui/message_center/message_center.h" |
46 #include "ui/wm/core/transient_window_manager.h" | 41 #include "ui/wm/core/transient_window_manager.h" |
47 #include "ui/wm/core/window_animations.h" | 42 #include "ui/wm/core/window_animations.h" |
48 #include "ui/wm/core/window_util.h" | 43 #include "ui/wm/core/window_util.h" |
49 #include "ui/wm/public/activation_client.h" | |
50 | 44 |
51 namespace { | 45 namespace { |
52 | 46 |
53 // The animation time in milliseconds for a single window which is fading | 47 // The animation time in milliseconds for a single window which is fading |
54 // in / out. | 48 // in / out. |
55 static int kAnimationTimeMS = 100; | 49 const int kAnimationTimeMS = 100; |
56 | |
57 // The animation time in millseconds for the fade in and / or out when switching | |
58 // users. | |
59 static int kUserFadeTimeMS = 110; | |
60 | 50 |
61 // The animation time in ms for a window which get teleported to another screen. | 51 // The animation time in ms for a window which get teleported to another screen. |
62 static int kTeleportAnimationTimeMS = 300; | 52 const int kTeleportAnimationTimeMS = 300; |
63 | 53 |
64 // Checks if a given event is a user event. | 54 // Checks if a given event is a user event. |
65 bool IsUserEvent(ui::Event* e) { | 55 bool IsUserEvent(const ui::Event* e) { |
66 if (e) { | 56 if (e) { |
67 ui::EventType type = e->type(); | 57 ui::EventType type = e->type(); |
68 if (type != ui::ET_CANCEL_MODE && | 58 if (type != ui::ET_CANCEL_MODE && |
69 type != ui::ET_UMA_DATA && | 59 type != ui::ET_UMA_DATA && |
70 type != ui::ET_UNKNOWN) | 60 type != ui::ET_UNKNOWN) |
71 return true; | 61 return true; |
72 } | 62 } |
73 return false; | 63 return false; |
74 } | 64 } |
75 | 65 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 | 170 |
181 // Previous animation type. | 171 // Previous animation type. |
182 const int previous_animation_type_; | 172 const int previous_animation_type_; |
183 | 173 |
184 // Previous animation time. | 174 // Previous animation time. |
185 const base::TimeDelta previous_animation_time_; | 175 const base::TimeDelta previous_animation_time_; |
186 | 176 |
187 DISALLOW_COPY_AND_ASSIGN(AnimationSetter); | 177 DISALLOW_COPY_AND_ASSIGN(AnimationSetter); |
188 }; | 178 }; |
189 | 179 |
190 // logic while the user gets switched. | |
191 class UserChangeActionDisabler { | |
192 public: | |
193 UserChangeActionDisabler() { | |
194 ash::WindowPositioner::DisableAutoPositioning(true); | |
195 ash::Shell::GetInstance()->mru_window_tracker()->SetIgnoreActivations(true); | |
196 } | |
197 | |
198 ~UserChangeActionDisabler() { | |
199 ash::WindowPositioner::DisableAutoPositioning(false); | |
200 ash::Shell::GetInstance()->mru_window_tracker()->SetIgnoreActivations( | |
201 false); | |
202 } | |
203 private: | |
204 | |
205 DISALLOW_COPY_AND_ASSIGN(UserChangeActionDisabler); | |
206 }; | |
207 | |
208 // This class keeps track of all applications which were started for a user. | 180 // This class keeps track of all applications which were started for a user. |
209 // When an app gets created, the window will be tagged for that user. Note | 181 // When an app gets created, the window will be tagged for that user. Note |
210 // that the destruction does not need to be tracked here since the universal | 182 // that the destruction does not need to be tracked here since the universal |
211 // window observer will take care of that. | 183 // window observer will take care of that. |
212 class AppObserver : public apps::AppWindowRegistry::Observer { | 184 class AppObserver : public apps::AppWindowRegistry::Observer { |
213 public: | 185 public: |
214 explicit AppObserver(const std::string& user_id) : user_id_(user_id) {} | 186 explicit AppObserver(const std::string& user_id) : user_id_(user_id) {} |
215 virtual ~AppObserver() {} | 187 virtual ~AppObserver() {} |
216 | 188 |
217 // AppWindowRegistry::Observer overrides: | 189 // AppWindowRegistry::Observer overrides: |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 observers_.AddObserver(observer); | 376 observers_.AddObserver(observer); |
405 } | 377 } |
406 | 378 |
407 void MultiUserWindowManagerChromeOS::RemoveObserver(Observer* observer) { | 379 void MultiUserWindowManagerChromeOS::RemoveObserver(Observer* observer) { |
408 observers_.RemoveObserver(observer); | 380 observers_.RemoveObserver(observer); |
409 } | 381 } |
410 | 382 |
411 void MultiUserWindowManagerChromeOS::ActiveUserChanged( | 383 void MultiUserWindowManagerChromeOS::ActiveUserChanged( |
412 const std::string& user_id) { | 384 const std::string& user_id) { |
413 DCHECK(user_id != current_user_id_); | 385 DCHECK(user_id != current_user_id_); |
| 386 // This needs to be set before the animation starts. |
414 current_user_id_ = user_id; | 387 current_user_id_ = user_id; |
415 // If there is an animation in progress finish the pending switch which also | |
416 // kills the timer (if there is one). | |
417 if (user_changed_animation_timer_.get()) | |
418 TransitionUser(SHOW_NEW_USER); | |
419 | 388 |
420 // Start the animation by hiding the old user. | 389 animation_.reset( |
421 TransitionUser(HIDE_OLD_USER); | 390 new UserSwichAnimatorChromeOS(this, user_id, animations_disabled_)); |
422 | |
423 // If animations are disabled we immediately switch to the new user, otherwise | |
424 // we create a timer which will fade in the new user once the other user has | |
425 // been faded away. | |
426 if (animations_disabled_) { | |
427 TransitionUser(SHOW_NEW_USER); | |
428 } else { | |
429 user_changed_animation_timer_.reset(new base::Timer( | |
430 FROM_HERE, | |
431 base::TimeDelta::FromMilliseconds(kUserFadeTimeMS), | |
432 base::Bind(&MultiUserWindowManagerChromeOS::TransitionUser, | |
433 base::Unretained(this), | |
434 SHOW_NEW_USER), | |
435 false)); | |
436 user_changed_animation_timer_->Reset(); | |
437 } | |
438 } | 391 } |
439 | 392 |
440 void MultiUserWindowManagerChromeOS::OnWindowDestroyed(aura::Window* window) { | 393 void MultiUserWindowManagerChromeOS::OnWindowDestroyed(aura::Window* window) { |
441 if (GetWindowOwner(window).empty()) { | 394 if (GetWindowOwner(window).empty()) { |
442 // This must be a window in the transient chain - remove it and its | 395 // This must be a window in the transient chain - remove it and its |
443 // children from the owner. | 396 // children from the owner. |
444 RemoveTransientOwnerRecursive(window); | 397 RemoveTransientOwnerRecursive(window); |
445 return; | 398 return; |
446 } | 399 } |
447 wm::TransientWindowManager::Get(window)->RemoveObserver(this); | 400 wm::TransientWindowManager::Get(window)->RemoveObserver(this); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 const content::NotificationDetails& details) { | 477 const content::NotificationDetails& details) { |
525 if (type == NOTIFICATION_BROWSER_WINDOW_READY) | 478 if (type == NOTIFICATION_BROWSER_WINDOW_READY) |
526 AddBrowserWindow(content::Source<Browser>(source).ptr()); | 479 AddBrowserWindow(content::Source<Browser>(source).ptr()); |
527 } | 480 } |
528 | 481 |
529 void MultiUserWindowManagerChromeOS::SetAnimationsForTest(bool disable) { | 482 void MultiUserWindowManagerChromeOS::SetAnimationsForTest(bool disable) { |
530 animations_disabled_ = disable; | 483 animations_disabled_ = disable; |
531 } | 484 } |
532 | 485 |
533 bool MultiUserWindowManagerChromeOS::IsAnimationRunningForTest() { | 486 bool MultiUserWindowManagerChromeOS::IsAnimationRunningForTest() { |
534 return user_changed_animation_timer_.get() != NULL; | 487 return animation_.get() != NULL && !animation_->IsAnimationFinished(); |
535 } | 488 } |
536 | 489 |
537 const std::string& MultiUserWindowManagerChromeOS::GetCurrentUserForTest() { | 490 const std::string& MultiUserWindowManagerChromeOS::GetCurrentUserForTest() { |
538 return current_user_id_; | 491 return current_user_id_; |
539 } | 492 } |
540 | 493 |
541 bool MultiUserWindowManagerChromeOS::ShowWindowForUserIntern( | 494 bool MultiUserWindowManagerChromeOS::ShowWindowForUserIntern( |
542 aura::Window* window, | 495 aura::Window* window, |
543 const std::string& user_id) { | 496 const std::string& user_id) { |
544 // If there is either no owner, or the owner is the current user, no action | 497 // If there is either no owner, or the owner is the current user, no action |
(...skipping 28 matching lines...) Expand all Loading... |
573 SetWindowVisibility(window, true, kTeleportAnimationTimeMS); | 526 SetWindowVisibility(window, true, kTeleportAnimationTimeMS); |
574 } else { | 527 } else { |
575 SetWindowVisibility(window, false, kTeleportAnimationTimeMS); | 528 SetWindowVisibility(window, false, kTeleportAnimationTimeMS); |
576 } | 529 } |
577 | 530 |
578 // Notify entry change. | 531 // Notify entry change. |
579 FOR_EACH_OBSERVER(Observer, observers_, OnOwnerEntryChanged(window)); | 532 FOR_EACH_OBSERVER(Observer, observers_, OnOwnerEntryChanged(window)); |
580 return true; | 533 return true; |
581 } | 534 } |
582 | 535 |
583 void MultiUserWindowManagerChromeOS::TransitionUser( | |
584 MultiUserWindowManagerChromeOS::AnimationStep animation_step) { | |
585 TransitionWallpaper(animation_step); | |
586 TransitionUserShelf(animation_step); | |
587 | |
588 // Disable the window position manager and the MRU window tracker temporarily. | |
589 scoped_ptr<UserChangeActionDisabler> disabler(new UserChangeActionDisabler); | |
590 | |
591 // We need to show/hide the windows in the same order as they were created in | |
592 // their parent window(s) to keep the layer / window hierarchy in sync. To | |
593 // achieve that we first collect all parent windows and then enumerate all | |
594 // windows in those parent windows and show or hide them accordingly. | |
595 | |
596 // Create a list of all parent windows we have to check and their parents. | |
597 std::set<aura::Window*> parent_list; | |
598 for (WindowToEntryMap::iterator it = window_to_entry_.begin(); | |
599 it != window_to_entry_.end(); ++it) { | |
600 aura::Window* parent = it->first->parent(); | |
601 if (parent_list.find(parent) == parent_list.end()) | |
602 parent_list.insert(parent); | |
603 } | |
604 | |
605 // Traverse the found parent windows to handle their child windows in order of | |
606 // their appearance. | |
607 for (std::set<aura::Window*>::iterator it_parents = parent_list.begin(); | |
608 it_parents != parent_list.end(); ++it_parents) { | |
609 const aura::Window::Windows window_list = (*it_parents)->children(); | |
610 for (aura::Window::Windows::const_iterator it_window = window_list.begin(); | |
611 it_window != window_list.end(); ++it_window) { | |
612 aura::Window* window = *it_window; | |
613 WindowToEntryMap::iterator it_map = window_to_entry_.find(window); | |
614 if (it_map != window_to_entry_.end()) { | |
615 bool should_be_visible = | |
616 it_map->second->show_for_user() == current_user_id_ && | |
617 it_map->second->show(); | |
618 bool is_visible = window->IsVisible(); | |
619 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window); | |
620 if (animation_step == SHOW_NEW_USER && | |
621 it_map->second->owner() == current_user_id_ && | |
622 it_map->second->show_for_user() != current_user_id_ && | |
623 window_state->IsMinimized()) { | |
624 // Pull back minimized visiting windows to the owners desktop. | |
625 ShowWindowForUserIntern(window, current_user_id_); | |
626 window_state->Unminimize(); | |
627 } else if (should_be_visible != is_visible && | |
628 should_be_visible == (animation_step == SHOW_NEW_USER)) { | |
629 SetWindowVisibility(window, should_be_visible, kUserFadeTimeMS); | |
630 } | |
631 } | |
632 } | |
633 } | |
634 | |
635 // Activation and real switch are happening after the other user gets shown. | |
636 if (animation_step == SHOW_NEW_USER) { | |
637 // Finally we need to restore the previously active window. | |
638 ash::MruWindowTracker::WindowList mru_list = | |
639 ash::Shell::GetInstance()->mru_window_tracker()->BuildMruWindowList(); | |
640 if (mru_list.size()) { | |
641 aura::Window* window = mru_list[0]; | |
642 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window); | |
643 if (IsWindowOnDesktopOfUser(window, current_user_id_) && | |
644 !window_state->IsMinimized()) { | |
645 aura::client::ActivationClient* client = | |
646 aura::client::GetActivationClient(window->GetRootWindow()); | |
647 // Several unit tests come here without an activation client. | |
648 if (client) | |
649 client->ActivateWindow(window); | |
650 } | |
651 } | |
652 | |
653 // This is called directly here to make sure notification_blocker will see | |
654 // the new window status. | |
655 notification_blocker_->ActiveUserChanged(current_user_id_); | |
656 | |
657 // We can reset the timer at this point. | |
658 // Note: The timer can be destroyed while it is performing its task. | |
659 user_changed_animation_timer_.reset(); | |
660 } | |
661 } | |
662 | |
663 void MultiUserWindowManagerChromeOS::TransitionWallpaper( | |
664 MultiUserWindowManagerChromeOS::AnimationStep animation_step) { | |
665 // Handle the wallpaper switch. | |
666 ash::UserWallpaperDelegate* wallpaper_delegate = | |
667 ash::Shell::GetInstance()->user_wallpaper_delegate(); | |
668 if (animation_step == HIDE_OLD_USER) { | |
669 // Set the wallpaper cross dissolve animation duration to our complete | |
670 // animation cycle for a fade in and fade out. | |
671 wallpaper_delegate->SetAnimationDurationOverride(2 * kUserFadeTimeMS); | |
672 chromeos::WallpaperManager::Get()->SetUserWallpaperDelayed( | |
673 current_user_id_); | |
674 } else { | |
675 // Revert the wallpaper cross dissolve animation duration back to the | |
676 // default. | |
677 wallpaper_delegate->SetAnimationDurationOverride(0); | |
678 } | |
679 } | |
680 | |
681 void MultiUserWindowManagerChromeOS::TransitionUserShelf( | |
682 MultiUserWindowManagerChromeOS::AnimationStep animation_step) { | |
683 // The shelf animation duration override. | |
684 int duration_override = kUserFadeTimeMS; | |
685 // Handle the shelf order of items. This is done once the old user is hidden. | |
686 if (animation_step == SHOW_NEW_USER) { | |
687 // Some unit tests have no ChromeLauncherController. | |
688 if (ChromeLauncherController::instance()) | |
689 ChromeLauncherController::instance()->ActiveUserChanged(current_user_id_); | |
690 // We kicked off the shelf animation in the command above. As such we can | |
691 // disable the override now again. | |
692 duration_override = 0; | |
693 } | |
694 | |
695 if (animations_disabled_) | |
696 return; | |
697 | |
698 ash::Shell::RootWindowControllerList controller = | |
699 ash::Shell::GetInstance()->GetAllRootWindowControllers(); | |
700 for (ash::Shell::RootWindowControllerList::iterator it1 = controller.begin(); | |
701 it1 != controller.end(); ++it1) { | |
702 (*it1)->GetShelfLayoutManager()->SetAnimationDurationOverride( | |
703 duration_override); | |
704 } | |
705 | |
706 // For each root window hide the shelf. | |
707 if (animation_step == HIDE_OLD_USER) { | |
708 aura::Window::Windows root_windows = ash::Shell::GetAllRootWindows(); | |
709 for (aura::Window::Windows::const_iterator iter = root_windows.begin(); | |
710 iter != root_windows.end(); ++iter) { | |
711 ash::Shell::GetInstance()->SetShelfAutoHideBehavior( | |
712 ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN, *iter); | |
713 } | |
714 } | |
715 } | |
716 | |
717 void MultiUserWindowManagerChromeOS::AddBrowserWindow(Browser* browser) { | |
718 // A unit test (e.g. CrashRestoreComplexTest.RestoreSessionForThreeUsers) can | |
719 // come here with no valid window. | |
720 if (!browser->window() || !browser->window()->GetNativeWindow()) | |
721 return; | |
722 SetWindowOwner(browser->window()->GetNativeWindow(), | |
723 multi_user_util::GetUserIDFromProfile(browser->profile())); | |
724 } | |
725 | |
726 void MultiUserWindowManagerChromeOS::SetWindowVisibility( | 536 void MultiUserWindowManagerChromeOS::SetWindowVisibility( |
727 aura::Window* window, bool visible, int animation_time_in_ms) { | 537 aura::Window* window, bool visible, int animation_time_in_ms) { |
728 if (window->IsVisible() == visible) | 538 if (window->IsVisible() == visible) |
729 return; | 539 return; |
730 | 540 |
731 // Hiding a system modal dialog should not be allowed. Instead we switch to | 541 // Hiding a system modal dialog should not be allowed. Instead we switch to |
732 // the user which is showing the system modal window. | 542 // the user which is showing the system modal window. |
733 // Note that in some cases (e.g. unit test) windows might not have a root | 543 // Note that in some cases (e.g. unit test) windows might not have a root |
734 // window. | 544 // window. |
735 if (!visible && window->GetRootWindow()) { | 545 if (!visible && window->GetRootWindow()) { |
(...skipping 23 matching lines...) Expand all Loading... |
759 | 569 |
760 if (visible) { | 570 if (visible) { |
761 ShowWithTransientChildrenRecursive(window, animation_time_in_ms); | 571 ShowWithTransientChildrenRecursive(window, animation_time_in_ms); |
762 } else { | 572 } else { |
763 if (window->HasFocus()) | 573 if (window->HasFocus()) |
764 window->Blur(); | 574 window->Blur(); |
765 SetWindowVisible(window, false, animation_time_in_ms); | 575 SetWindowVisible(window, false, animation_time_in_ms); |
766 } | 576 } |
767 } | 577 } |
768 | 578 |
| 579 void MultiUserWindowManagerChromeOS::AddBrowserWindow(Browser* browser) { |
| 580 // A unit test (e.g. CrashRestoreComplexTest.RestoreSessionForThreeUsers) can |
| 581 // come here with no valid window. |
| 582 if (!browser->window() || !browser->window()->GetNativeWindow()) |
| 583 return; |
| 584 SetWindowOwner(browser->window()->GetNativeWindow(), |
| 585 multi_user_util::GetUserIDFromProfile(browser->profile())); |
| 586 } |
| 587 |
769 void MultiUserWindowManagerChromeOS::ShowWithTransientChildrenRecursive( | 588 void MultiUserWindowManagerChromeOS::ShowWithTransientChildrenRecursive( |
770 aura::Window* window, int animation_time_in_ms) { | 589 aura::Window* window, int animation_time_in_ms) { |
771 aura::Window::Windows::const_iterator it = | 590 aura::Window::Windows::const_iterator it = |
772 wm::GetTransientChildren(window).begin(); | 591 wm::GetTransientChildren(window).begin(); |
773 for (; it != wm::GetTransientChildren(window).end(); ++it) | 592 for (; it != wm::GetTransientChildren(window).end(); ++it) |
774 ShowWithTransientChildrenRecursive(*it, animation_time_in_ms); | 593 ShowWithTransientChildrenRecursive(*it, animation_time_in_ms); |
775 | 594 |
776 // We show all children which were not explicitly hidden. | 595 // We show all children which were not explicitly hidden. |
777 TransientWindowToVisibility::iterator it2 = | 596 TransientWindowToVisibility::iterator it2 = |
778 transient_window_to_visibility_.find(window); | 597 transient_window_to_visibility_.find(window); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 window->Show(); | 682 window->Show(); |
864 else | 683 else |
865 window->Hide(); | 684 window->Hide(); |
866 | 685 |
867 // Make sure that animations have no influence on the window state after the | 686 // Make sure that animations have no influence on the window state after the |
868 // call. | 687 // call. |
869 DCHECK_EQ(visible, window->IsVisible()); | 688 DCHECK_EQ(visible, window->IsVisible()); |
870 } | 689 } |
871 | 690 |
872 } // namespace chrome | 691 } // namespace chrome |
OLD | NEW |