| Index: chrome/browser/chromeos/login/screen_locker.cc
|
| diff --git a/chrome/browser/chromeos/login/screen_locker.cc b/chrome/browser/chromeos/login/screen_locker.cc
|
| index 8424a419f5fffa09b2e997702a37d19e976a0e22..1ccd74d4fad87e9291b9c2ec351c74264032b0d5 100644
|
| --- a/chrome/browser/chromeos/login/screen_locker.cc
|
| +++ b/chrome/browser/chromeos/login/screen_locker.cc
|
| @@ -69,56 +69,46 @@ namespace {
|
| // unlock happens even if animations are broken.
|
| const int kUnlockGuardTimeoutMs = 400;
|
|
|
| -// Observer to start ScreenLocker when the screen lock
|
| -class ScreenLockObserver : public SessionManagerClient::Observer,
|
| +// Observer to start ScreenLocker when locking the screen is requested.
|
| +class ScreenLockObserver : public SessionManagerClient::StubDelegate,
|
| public content::NotificationObserver,
|
| public UserAddingScreen::Observer {
|
| public:
|
| ScreenLockObserver() : session_started_(false) {
|
| registrar_.Add(this,
|
| - chrome::NOTIFICATION_LOGIN_USER_CHANGED,
|
| - content::NotificationService::AllSources());
|
| - registrar_.Add(this,
|
| chrome::NOTIFICATION_SESSION_STARTED,
|
| content::NotificationService::AllSources());
|
| + DBusThreadManager::Get()->GetSessionManagerClient()->SetStubDelegate(this);
|
| + }
|
| +
|
| + virtual ~ScreenLockObserver() {
|
| + if (DBusThreadManager::IsInitialized()) {
|
| + DBusThreadManager::Get()->GetSessionManagerClient()->SetStubDelegate(
|
| + NULL);
|
| + }
|
| }
|
|
|
| bool session_started() const { return session_started_; }
|
|
|
| + // SessionManagerClient::StubDelegate overrides:
|
| + virtual void LockScreenForStub() OVERRIDE {
|
| + ScreenLocker::HandleLockScreenRequest();
|
| + }
|
| +
|
| // NotificationObserver overrides:
|
| virtual void Observe(int type,
|
| const content::NotificationSource& source,
|
| const content::NotificationDetails& details) OVERRIDE {
|
| - switch (type) {
|
| - case chrome::NOTIFICATION_LOGIN_USER_CHANGED: {
|
| - // Register Screen Lock only after a user has logged in.
|
| - SessionManagerClient* session_manager =
|
| - DBusThreadManager::Get()->GetSessionManagerClient();
|
| - if (!session_manager->HasObserver(this))
|
| - session_manager->AddObserver(this);
|
| - break;
|
| - }
|
| -
|
| - case chrome::NOTIFICATION_SESSION_STARTED: {
|
| - session_started_ = true;
|
| - break;
|
| - }
|
| -
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - }
|
| -
|
| - // TODO(derat): Remove this once the session manager is calling the LockScreen
|
| - // method instead of emitting a signal.
|
| - virtual void LockScreen() OVERRIDE {
|
| - VLOG(1) << "Received LockScreen D-Bus signal from session manager";
|
| - ScreenLocker::HandleLockScreenRequest();
|
| + if (type == chrome::NOTIFICATION_SESSION_STARTED)
|
| + session_started_ = true;
|
| + else
|
| + NOTREACHED() << "Unexpected notification " << type;
|
| }
|
|
|
| + // UserAddingScreen::Observer overrides:
|
| virtual void OnUserAddingFinished() OVERRIDE {
|
| UserAddingScreen::Get()->RemoveObserver(this);
|
| - LockScreen();
|
| + ScreenLocker::HandleLockScreenRequest();
|
| }
|
|
|
| private:
|
| @@ -128,8 +118,7 @@ class ScreenLockObserver : public SessionManagerClient::Observer,
|
| DISALLOW_COPY_AND_ASSIGN(ScreenLockObserver);
|
| };
|
|
|
| -static base::LazyInstance<ScreenLockObserver> g_screen_lock_observer =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| +ScreenLockObserver* g_screen_lock_observer = NULL;
|
|
|
| } // namespace
|
|
|
| @@ -375,21 +364,31 @@ void ScreenLocker::SetLoginStatusConsumer(
|
|
|
| // static
|
| void ScreenLocker::InitClass() {
|
| - g_screen_lock_observer.Get();
|
| + DCHECK(!g_screen_lock_observer);
|
| + g_screen_lock_observer = new ScreenLockObserver;
|
| +}
|
| +
|
| +// static
|
| +void ScreenLocker::ShutDownClass() {
|
| + DCHECK(g_screen_lock_observer);
|
| + delete g_screen_lock_observer;
|
| + g_screen_lock_observer = NULL;
|
| }
|
|
|
| // static
|
| void ScreenLocker::HandleLockScreenRequest() {
|
| VLOG(1) << "Received LockScreen request from session manager";
|
| + DCHECK(g_screen_lock_observer);
|
| if (UserAddingScreen::Get()->IsRunning()) {
|
| VLOG(1) << "Waiting for user adding screen to stop";
|
| - UserAddingScreen::Get()->AddObserver(g_screen_lock_observer.Pointer());
|
| + UserAddingScreen::Get()->AddObserver(g_screen_lock_observer);
|
| UserAddingScreen::Get()->Cancel();
|
| return;
|
| }
|
| - if (g_screen_lock_observer.Get().session_started() &&
|
| + if (g_screen_lock_observer->session_started() &&
|
| UserManager::Get()->CanCurrentUserLock()) {
|
| ScreenLocker::Show();
|
| + ash::Shell::GetInstance()->lock_state_controller()->OnStartingLock();
|
| } else {
|
| // If the current user's session cannot be locked or the user has not
|
| // completed all sign-in steps yet, log out instead. The latter is done to
|
| @@ -492,6 +491,7 @@ ScreenLocker::~ScreenLocker() {
|
| content::Source<ScreenLocker>(this),
|
| content::Details<bool>(&state));
|
| VLOG(1) << "Calling session manager's HandleLockScreenDismissed D-Bus method";
|
| +
|
| DBusThreadManager::Get()->GetSessionManagerClient()->
|
| NotifyLockScreenDismissed();
|
| }
|
|
|