diff options
author | antrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-21 14:02:09 +0000 |
---|---|---|
committer | antrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-21 14:02:09 +0000 |
commit | 83482fbfd131c230019694c77725c58b672ea444 (patch) | |
tree | f008c9419ab680878ef08aa422e2c0f46082dc8d | |
parent | d38ae9d947c2d0804af4747f34833c72ef897f81 (diff) | |
download | chromium_src-83482fbfd131c230019694c77725c58b672ea444.zip chromium_src-83482fbfd131c230019694c77725c58b672ea444.tar.gz chromium_src-83482fbfd131c230019694c77725c58b672ea444.tar.bz2 |
Introduce SessionStateObserver
Use this in tooltip managers (158027 : Lockscreen leaks information via tooltip),
Use this in launcher animation on full lock in new animations (138171).
BUG=158027,138171
Review URL: https://chromiumcodereview.appspot.com/11416037
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@169033 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ash/ash.gyp | 1 | ||||
-rw-r--r-- | ash/launcher/launcher_tooltip_manager.cc | 17 | ||||
-rw-r--r-- | ash/launcher/launcher_tooltip_manager.h | 8 | ||||
-rw-r--r-- | ash/root_window_controller.cc | 1 | ||||
-rw-r--r-- | ash/shell.cc | 21 | ||||
-rw-r--r-- | ash/tooltips/tooltip_controller.cc | 15 | ||||
-rw-r--r-- | ash/tooltips/tooltip_controller.h | 8 | ||||
-rw-r--r-- | ash/wm/session_state_controller.cc | 14 | ||||
-rw-r--r-- | ash/wm/session_state_controller.h | 8 | ||||
-rw-r--r-- | ash/wm/session_state_controller_impl.cc | 11 | ||||
-rw-r--r-- | ash/wm/session_state_controller_impl2.cc | 11 | ||||
-rw-r--r-- | ash/wm/session_state_observer.h | 28 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/screen_locker.cc | 11 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/screen_locker.h | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/screen_locker_delegate.h | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/webui_screen_locker.cc | 20 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/webui_screen_locker.h | 11 |
17 files changed, 152 insertions, 41 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index 1e9ef82e..a89f96b 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -340,6 +340,7 @@ 'wm/session_state_controller_impl.h', 'wm/session_state_controller_impl2.cc', 'wm/session_state_controller_impl2.h', + 'wm/session_state_observer.h', 'wm/shelf_layout_manager.cc', 'wm/shelf_layout_manager.h', 'wm/shelf_types.h', diff --git a/ash/launcher/launcher_tooltip_manager.cc b/ash/launcher/launcher_tooltip_manager.cc index 9768aa8..047aabf 100644 --- a/ash/launcher/launcher_tooltip_manager.cc +++ b/ash/launcher/launcher_tooltip_manager.cc @@ -7,6 +7,8 @@ #include "ash/launcher/launcher_view.h" #include "ash/shell.h" #include "ash/shell_window_ids.h" +#include "ash/wm/session_state_controller.h" +#include "ash/wm/session_state_observer.h" #include "ash/wm/window_animations.h" #include "base/bind.h" #include "base/message_loop.h" @@ -148,8 +150,10 @@ LauncherTooltipManager::LauncherTooltipManager( launcher_view_(launcher_view) { if (shelf_layout_manager) shelf_layout_manager->AddObserver(this); - if (Shell::HasInstance()) + if (Shell::HasInstance()) { Shell::GetInstance()->AddPreTargetHandler(this); + Shell::GetInstance()->session_state_controller()->AddObserver(this); + } } LauncherTooltipManager::~LauncherTooltipManager() { @@ -157,8 +161,10 @@ LauncherTooltipManager::~LauncherTooltipManager() { Close(); if (shelf_layout_manager_) shelf_layout_manager_->RemoveObserver(this); - if (Shell::HasInstance()) + if (Shell::HasInstance()) { Shell::GetInstance()->RemovePreTargetHandler(this); + Shell::GetInstance()->session_state_controller()->RemoveObserver(this); + } } void LauncherTooltipManager::ShowDelayed(views::View* anchor, @@ -307,6 +313,13 @@ ui::EventResult LauncherTooltipManager::OnGestureEvent( return ui::ER_UNHANDLED; } +void LauncherTooltipManager::OnSessionStateEvent( + SessionStateObserver::EventType event) { + if (event == SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED || + event == SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED) + Close(); +} + void LauncherTooltipManager::WillDeleteShelf() { shelf_layout_manager_ = NULL; } diff --git a/ash/launcher/launcher_tooltip_manager.h b/ash/launcher/launcher_tooltip_manager.h index 5adea3c..5bbab27 100644 --- a/ash/launcher/launcher_tooltip_manager.h +++ b/ash/launcher/launcher_tooltip_manager.h @@ -6,6 +6,7 @@ #define ASH_LAUNCHER_LAUNCHER_TOOLTIP_MANAGER_H_ #include "ash/ash_export.h" +#include "ash/wm/session_state_observer.h" #include "ash/wm/shelf_layout_manager.h" #include "ash/wm/shelf_types.h" #include "base/basictypes.h" @@ -36,7 +37,8 @@ class LauncherView; // LauncherTooltipManager manages the tooltip balloon poping up on launcher // items. class ASH_EXPORT LauncherTooltipManager : public ui::EventHandler, - public ShelfLayoutManager::Observer { + public ShelfLayoutManager::Observer, + public SessionStateObserver { public: LauncherTooltipManager(ShelfAlignment alignment, ShelfLayoutManager* shelf_layout_manager, @@ -75,6 +77,10 @@ protected: virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE; virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE; + // SessionStateObserver override: + virtual void OnSessionStateEvent(SessionStateObserver::EventType event) + OVERRIDE; + // ShelfLayoutManager::Observer overrides: virtual void WillDeleteShelf() OVERRIDE; virtual void WillChangeVisibilityState( diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc index 5a1b36e..e6c4bd9 100644 --- a/ash/root_window_controller.cc +++ b/ash/root_window_controller.cc @@ -407,6 +407,7 @@ void RootWindowController::CloseChildWindows() { delete child; } + launcher_.reset(); // All containers are deleted, so reset shelf_. shelf_ = NULL; } diff --git a/ash/shell.cc b/ash/shell.cc index 9ef82e9..c2460e2 100644 --- a/ash/shell.cc +++ b/ash/shell.cc @@ -275,8 +275,6 @@ Shell::~Shell() { drag_drop_controller_.reset(); magnification_controller_.reset(); partial_magnification_controller_.reset(); - power_button_controller_.reset(); - session_state_controller_.reset(); resize_shadow_controller_.reset(); shadow_controller_.reset(); tooltip_controller_.reset(); @@ -287,6 +285,9 @@ Shell::~Shell() { user_action_client_.reset(); visibility_controller_.reset(); + power_button_controller_.reset(); + session_state_controller_.reset(); + // This also deletes all RootWindows. display_controller_.reset(); screen_position_controller_.reset(); @@ -463,6 +464,14 @@ void Shell::Init() { CommandLine* command_line = CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(ash::switches::kAshNewLockAnimationsEnabled)) + session_state_controller_.reset(new SessionStateControllerImpl2); + else + session_state_controller_.reset(new SessionStateControllerImpl); + power_button_controller_.reset(new PowerButtonController( + session_state_controller_.get())); + AddShellObserver(session_state_controller_.get()); + if (command_line->HasSwitch(switches::kAshTouchHud)) { touch_observer_hud_.reset(new internal::TouchObserverHUD); AddPreTargetHandler(touch_observer_hud_.get()); @@ -542,14 +551,6 @@ void Shell::Init() { // the correct size. user_wallpaper_delegate_->InitializeWallpaper(); - if (command_line->HasSwitch(ash::switches::kAshNewLockAnimationsEnabled)) - session_state_controller_.reset(new SessionStateControllerImpl2); - else - session_state_controller_.reset(new SessionStateControllerImpl); - power_button_controller_.reset(new PowerButtonController( - session_state_controller_.get())); - AddShellObserver(session_state_controller_.get()); - if (initially_hide_cursor_) cursor_manager_.ShowCursor(false); cursor_manager_.SetCursor(ui::kCursorPointer); diff --git a/ash/tooltips/tooltip_controller.cc b/ash/tooltips/tooltip_controller.cc index c13bcdd..fb0d17f 100644 --- a/ash/tooltips/tooltip_controller.cc +++ b/ash/tooltips/tooltip_controller.cc @@ -10,6 +10,8 @@ #include "ash/shell.h" #include "ash/wm/coordinate_conversion.h" #include "ash/wm/cursor_manager.h" +#include "ash/wm/session_state_controller.h" +#include "ash/wm/session_state_observer.h" #include "base/command_line.h" #include "base/location.h" #include "base/string_split.h" @@ -216,11 +218,15 @@ TooltipController::TooltipController( base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs), this, &TooltipController::TooltipTimerFired); DCHECK(drag_drop_client_); + if (Shell::GetInstance()) + Shell::GetInstance()->session_state_controller()->AddObserver(this); } TooltipController::~TooltipController() { if (tooltip_window_) tooltip_window_->RemoveObserver(this); + if (Shell::GetInstance()) + Shell::GetInstance()->session_state_controller()->RemoveObserver(this); } void TooltipController::UpdateTooltip(aura::Window* target) { @@ -312,6 +318,15 @@ ui::EventResult TooltipController::OnTouchEvent(ui::TouchEvent* event) { return ui::ER_UNHANDLED; } +void TooltipController::OnSessionStateEvent( + SessionStateObserver::EventType event) { + if (event == SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED || + event == SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED) { + if (tooltip_.get() && tooltip_->IsVisible()) + tooltip_->Hide(); + } +} + void TooltipController::OnWindowDestroyed(aura::Window* window) { if (tooltip_window_ == window) { tooltip_window_->RemoveObserver(this); diff --git a/ash/tooltips/tooltip_controller.h b/ash/tooltips/tooltip_controller.h index 67c6f77..dc21527 100644 --- a/ash/tooltips/tooltip_controller.h +++ b/ash/tooltips/tooltip_controller.h @@ -6,6 +6,7 @@ #define ASH_TOOLTIPS_TOOLTIP_CONTROLLER_H_ #include "ash/ash_export.h" +#include "ash/wm/session_state_observer.h" #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "base/timer.h" @@ -32,7 +33,8 @@ namespace internal { // TooltipController provides tooltip functionality for aura shell. class ASH_EXPORT TooltipController : public aura::client::TooltipClient, public ui::EventHandler, - public aura::WindowObserver { + public aura::WindowObserver, + public SessionStateObserver { public: explicit TooltipController(aura::client::DragDropClient* drag_drop_client); virtual ~TooltipController(); @@ -46,6 +48,10 @@ class ASH_EXPORT TooltipController : public aura::client::TooltipClient, virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE; virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE; + // Overridden from SessionStateController. + virtual void OnSessionStateEvent(SessionStateObserver::EventType event) + OVERRIDE; + // Overridden from aura::WindowObserver. virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; diff --git a/ash/wm/session_state_controller.cc b/ash/wm/session_state_controller.cc index ea12b8d..0bcf31d 100644 --- a/ash/wm/session_state_controller.cc +++ b/ash/wm/session_state_controller.cc @@ -36,4 +36,18 @@ void SessionStateController::SetDelegate( SessionStateControllerDelegate* delegate) { delegate_.reset(delegate); } + +void SessionStateController::AddObserver(SessionStateObserver* observer) { + observers_.AddObserver(observer); +} + +void SessionStateController::RemoveObserver(SessionStateObserver* observer) { + observers_.RemoveObserver(observer); +} + +bool SessionStateController::HasObserver(SessionStateObserver* observer) { + return observers_.HasObserver(observer); +} + + } // namespace ash diff --git a/ash/wm/session_state_controller.h b/ash/wm/session_state_controller.h index 703a680..648e923 100644 --- a/ash/wm/session_state_controller.h +++ b/ash/wm/session_state_controller.h @@ -8,8 +8,10 @@ #include "ash/ash_export.h" #include "ash/shell_observer.h" #include "ash/wm/session_state_animator.h" +#include "ash/wm/session_state_observer.h" #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" +#include "base/observer_list.h" #include "base/time.h" #include "base/timer.h" #include "ui/aura/root_window_observer.h" @@ -120,6 +122,10 @@ class ASH_EXPORT SessionStateController : public aura::RootWindowObserver, // Callback is guaranteed to be called once and then discarded. virtual void SetLockScreenDisplayedCallback(base::Closure& callback) = 0; + virtual void AddObserver(SessionStateObserver* observer); + virtual void RemoveObserver(SessionStateObserver* observer); + virtual bool HasObserver(SessionStateObserver* observer); + protected: friend class test::PowerButtonControllerTest; @@ -127,6 +133,8 @@ class ASH_EXPORT SessionStateController : public aura::RootWindowObserver, scoped_ptr<SessionStateControllerDelegate> delegate_; + ObserverList<SessionStateObserver> observers_; + private: DISALLOW_COPY_AND_ASSIGN(SessionStateController); }; diff --git a/ash/wm/session_state_controller_impl.cc b/ash/wm/session_state_controller_impl.cc index 93b55ce..96b2788 100644 --- a/ash/wm/session_state_controller_impl.cc +++ b/ash/wm/session_state_controller_impl.cc @@ -71,6 +71,9 @@ void SessionStateControllerImpl::OnLockStateChanged(bool locked) { internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS, internal::SessionStateAnimator::ANIMATION_FADE_IN, internal::SessionStateAnimator::ANIMATION_SPEED_SHOW_LOCK_SCREEN); + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent( + SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED)); lock_timer_.Stop(); lock_fail_timer_.Stop(); @@ -102,6 +105,9 @@ void SessionStateControllerImpl::OnStartingLock() { internal::SessionStateAnimator::ANIMATION_FULL_CLOSE, internal::SessionStateAnimator::ANIMATION_SPEED_FAST); + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED)); + // Hide the screen locker containers so we can make them fade in later. animator_->StartAnimation( internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS, @@ -114,6 +120,8 @@ void SessionStateControllerImpl::StartLockAnimationAndLockImmediately() { internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, internal::SessionStateAnimator::ANIMATION_PARTIAL_CLOSE, internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED)); OnLockTimeout(); } @@ -124,6 +132,9 @@ void SessionStateControllerImpl::StartLockAnimation(bool shutdown_after_lock) { internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS, internal::SessionStateAnimator::ANIMATION_PARTIAL_CLOSE, internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent( + SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED)); StartLockTimer(); } diff --git a/ash/wm/session_state_controller_impl2.cc b/ash/wm/session_state_controller_impl2.cc index 0cacb44..ef1da5e 100644 --- a/ash/wm/session_state_controller_impl2.cc +++ b/ash/wm/session_state_controller_impl2.cc @@ -93,6 +93,9 @@ void SessionStateControllerImpl2::SetLockScreenDisplayedCallback( } void SessionStateControllerImpl2::OnLockScreenAnimationFinished() { + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent( + SessionStateObserver::EVENT_LOCK_ANIMATION_FINISHED)); if (!lock_screen_displayed_callback_.is_null()) { lock_screen_displayed_callback_.Run(); lock_screen_displayed_callback_.Reset(); @@ -112,7 +115,8 @@ void SessionStateControllerImpl2::OnStartingLock() { internal::SessionStateAnimator::LAUNCHER, internal::SessionStateAnimator::ANIMATION_LIFT, internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); - + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED)); // Hide the screen locker containers so we can raise them later. animator_->StartAnimation( internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS, @@ -126,6 +130,8 @@ void SessionStateControllerImpl2::StartLockAnimationAndLockImmediately() { internal::SessionStateAnimator::LAUNCHER, internal::SessionStateAnimator::ANIMATION_LIFT, internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS); + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED)); OnLockTimeout(); } @@ -137,6 +143,9 @@ void SessionStateControllerImpl2::StartLockAnimation(bool shutdown_after_lock) { internal::SessionStateAnimator::LAUNCHER, internal::SessionStateAnimator::ANIMATION_LIFT, internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE); + FOR_EACH_OBSERVER(SessionStateObserver, observers_, + OnSessionStateEvent( + SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED)); StartLockTimer(); } diff --git a/ash/wm/session_state_observer.h b/ash/wm/session_state_observer.h new file mode 100644 index 0000000..8df4018 --- /dev/null +++ b/ash/wm/session_state_observer.h @@ -0,0 +1,28 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_WM_SESSION_STATE_OBSERVER_H_ +#define ASH_WM_SESSION_STATE_OBSERVER_H_ + +#include "ash/ash_export.h" + +namespace ash { + +// Interface for classes that want to be notified by SessionStateController when +// session-related events occur. +class ASH_EXPORT SessionStateObserver { + public: + enum EventType { + EVENT_PRELOCK_ANIMATION_STARTED, + EVENT_LOCK_ANIMATION_STARTED, + EVENT_LOCK_ANIMATION_FINISHED, + }; + + virtual void OnSessionStateEvent(EventType event) = 0; + virtual ~SessionStateObserver() {}; +}; + +} // namespace ash + +#endif // ASH_WM_SESSION_STATE_CONTROLLER_H_ diff --git a/chrome/browser/chromeos/login/screen_locker.cc b/chrome/browser/chromeos/login/screen_locker.cc index f0439e2..6d0837f 100644 --- a/chrome/browser/chromeos/login/screen_locker.cc +++ b/chrome/browser/chromeos/login/screen_locker.cc @@ -154,13 +154,6 @@ void ScreenLocker::Init() { authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); delegate_.reset(new WebUIScreenLocker(this)); delegate_->LockScreen(unlock_on_input_); - CommandLine* command_line = CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(ash::switches::kAshNewLockAnimationsEnabled)) { - base::Closure callback = base::Bind(&ScreenLocker::OnFullyDisplayedCallback, - weak_factory_.GetWeakPtr()); - ash::Shell::GetInstance()->session_state_controller()-> - SetLockScreenDisplayedCallback(callback); - } } void ScreenLocker::OnLoginFailure(const LoginFailure& error) { @@ -429,10 +422,6 @@ void ScreenLocker::ScreenLockReady() { DBusThreadManager::Get()->GetSessionManagerClient()->NotifyLockScreenShown(); } -void ScreenLocker::OnFullyDisplayedCallback() { - delegate_->ProcessFullyDisplayedAnimations(); -} - content::WebUI* ScreenLocker::GetAssociatedWebUI() { return delegate_->GetAssociatedWebUI(); } diff --git a/chrome/browser/chromeos/login/screen_locker.h b/chrome/browser/chromeos/login/screen_locker.h index 2730a64..2e6e414 100644 --- a/chrome/browser/chromeos/login/screen_locker.h +++ b/chrome/browser/chromeos/login/screen_locker.h @@ -129,10 +129,6 @@ class ScreenLocker : public LoginStatusConsumer { // Called when the screen lock is ready. void ScreenLockReady(); - // Triggers visual effects that should happen once screen locker is fully - // visible. Called when screen lock appearance animation is finished. - void OnFullyDisplayedCallback(); - // Called when screen locker is safe to delete. static void ScheduleDeletion(); diff --git a/chrome/browser/chromeos/login/screen_locker_delegate.h b/chrome/browser/chromeos/login/screen_locker_delegate.h index 00ea081..7c5e725 100644 --- a/chrome/browser/chromeos/login/screen_locker_delegate.h +++ b/chrome/browser/chromeos/login/screen_locker_delegate.h @@ -53,10 +53,6 @@ class ScreenLockerDelegate { // Must call ScreenLocker::UnlockOnLoginSuccess() once all effects are done. virtual void AnimateAuthenticationSuccess() = 0; - // Allows to have visual effects once screen locker is fully displayed (after - // all window animations are done). - virtual void ProcessFullyDisplayedAnimations() = 0; - // Returns the native window displaying the lock screen. virtual gfx::NativeWindow GetNativeWindow() const = 0; diff --git a/chrome/browser/chromeos/login/webui_screen_locker.cc b/chrome/browser/chromeos/login/webui_screen_locker.cc index ead494a..4d143c0 100644 --- a/chrome/browser/chromeos/login/webui_screen_locker.cc +++ b/chrome/browser/chromeos/login/webui_screen_locker.cc @@ -5,6 +5,8 @@ #include "chrome/browser/chromeos/login/webui_screen_locker.h" #include "ash/shell.h" +#include "ash/wm/session_state_controller.h" +#include "ash/wm/session_state_observer.h" #include "base/command_line.h" #include "base/metrics/histogram.h" #include "base/utf_string_conversions.h" @@ -44,6 +46,8 @@ WebUIScreenLocker::WebUIScreenLocker(ScreenLocker* screen_locker) lock_ready_(false), webui_ready_(false) { set_should_emit_login_prompt_visible(false); + if (ash::Shell::GetInstance()) + ash::Shell::GetInstance()->session_state_controller()->AddObserver(this); } void WebUIScreenLocker::LockScreen(bool unlock_on_input) { @@ -107,10 +111,6 @@ void WebUIScreenLocker::AnimateAuthenticationSuccess() { GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.animateAuthenticationSuccess"); } -void WebUIScreenLocker::ProcessFullyDisplayedAnimations() { - GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.animateOnceFullyDisplayed"); -} - void WebUIScreenLocker::ClearErrors() { GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.clearErrors"); } @@ -124,6 +124,8 @@ content::WebUI* WebUIScreenLocker::GetAssociatedWebUI() { } WebUIScreenLocker::~WebUIScreenLocker() { + if (ash::Shell::GetInstance()) + ash::Shell::GetInstance()->session_state_controller()->RemoveObserver(this); DCHECK(lock_window_); lock_window_->Close(); // If LockScreen() was called, we need to clear the signin screen handler @@ -224,4 +226,14 @@ void WebUIScreenLocker::OnLockWindowReady() { ScreenLockReady(); } +//////////////////////////////////////////////////////////////////////////////// +// SessionStateObserver override. + +void WebUIScreenLocker::OnSessionStateEvent( + ash::SessionStateObserver::EventType event) { + if (event == ash::SessionStateObserver::EVENT_LOCK_ANIMATION_FINISHED) + GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.animateOnceFullyDisplayed"); +} + + } // namespace chromeos diff --git a/chrome/browser/chromeos/login/webui_screen_locker.h b/chrome/browser/chromeos/login/webui_screen_locker.h index 6ff145b..60e5966 100644 --- a/chrome/browser/chromeos/login/webui_screen_locker.h +++ b/chrome/browser/chromeos/login/webui_screen_locker.h @@ -7,6 +7,7 @@ #include <string> +#include "ash/wm/session_state_observer.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/time.h" @@ -36,11 +37,12 @@ class WebUIScreenLockerTester; class WebUIScreenLocker : public WebUILoginView, public LoginDisplay::Delegate, public ScreenLockerDelegate, - public LockWindow::Observer { + public LockWindow::Observer, + public ash::SessionStateObserver { public: explicit WebUIScreenLocker(ScreenLocker* screen_locker); - // ScreenLockerDelegate implementation: + // ScreenLockerDelegate implementation. virtual void LockScreen(bool unlock_on_input) OVERRIDE; virtual void ScreenLockReady() OVERRIDE; virtual void OnAuthenticate() OVERRIDE; @@ -50,7 +52,6 @@ class WebUIScreenLocker : public WebUILoginView, HelpAppLauncher::HelpTopic help_topic_id) OVERRIDE; virtual void ClearErrors() OVERRIDE; virtual void AnimateAuthenticationSuccess() OVERRIDE; - virtual void ProcessFullyDisplayedAnimations() OVERRIDE; virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE; virtual content::WebUI* GetAssociatedWebUI() OVERRIDE; @@ -77,6 +78,10 @@ class WebUIScreenLocker : public WebUILoginView, // LockWindow::Observer implementation. virtual void OnLockWindowReady() OVERRIDE; + // SessionStateObserver override. + virtual void OnSessionStateEvent(ash::SessionStateObserver::EventType event) + OVERRIDE; + private: friend class test::WebUIScreenLockerTester; |