| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/chromeos/login/lock/webui_screen_locker.h" | 5 #include "chrome/browser/chromeos/login/lock/webui_screen_locker.h" |
| 6 | 6 |
| 7 #include "ash/common/wm_shell.h" | 7 #include "ash/common/wm_shell.h" |
| 8 #include "ash/shell.h" | 8 #include "ash/shell.h" |
| 9 #include "ash/system/chromeos/power/power_event_observer.h" | 9 #include "ash/system/chromeos/power/power_event_observer.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 } | 54 } |
| 55 | 55 |
| 56 } // namespace | 56 } // namespace |
| 57 | 57 |
| 58 namespace chromeos { | 58 namespace chromeos { |
| 59 | 59 |
| 60 //////////////////////////////////////////////////////////////////////////////// | 60 //////////////////////////////////////////////////////////////////////////////// |
| 61 // WebUIScreenLocker implementation. | 61 // WebUIScreenLocker implementation. |
| 62 | 62 |
| 63 WebUIScreenLocker::WebUIScreenLocker(ScreenLocker* screen_locker) | 63 WebUIScreenLocker::WebUIScreenLocker(ScreenLocker* screen_locker) |
| 64 : ScreenLockerDelegate(screen_locker), | 64 : screen_locker_(screen_locker), |
| 65 network_state_helper_(new login::NetworkStateHelper), | 65 network_state_helper_(new login::NetworkStateHelper), |
| 66 weak_factory_(this) { | 66 weak_factory_(this) { |
| 67 set_should_emit_login_prompt_visible(false); | 67 set_should_emit_login_prompt_visible(false); |
| 68 ash::WmShell::Get()->AddLockStateObserver(this); | 68 ash::WmShell::Get()->AddLockStateObserver(this); |
| 69 ash::WmShell::Get()->AddShellObserver(this); | 69 ash::WmShell::Get()->AddShellObserver(this); |
| 70 display::Screen::GetScreen()->AddObserver(this); | 70 display::Screen::GetScreen()->AddObserver(this); |
| 71 DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); | 71 DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); |
| 72 | 72 |
| 73 if (keyboard::KeyboardController::GetInstance()) { | 73 if (keyboard::KeyboardController::GetInstance()) { |
| 74 keyboard::KeyboardController::GetInstance()->AddObserver(this); | 74 keyboard::KeyboardController::GetInstance()->AddObserver(this); |
| 75 is_observing_keyboard_ = true; | 75 is_observing_keyboard_ = true; |
| 76 } | 76 } |
| 77 } | 77 } |
| 78 | 78 |
| 79 WebUIScreenLocker::~WebUIScreenLocker() { |
| 80 DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this); |
| 81 display::Screen::GetScreen()->RemoveObserver(this); |
| 82 ash::WmShell::Get()->RemoveLockStateObserver(this); |
| 83 ash::WmShell::Get()->RemoveShellObserver(this); |
| 84 // In case of shutdown, lock_window_ may be deleted before WebUIScreenLocker. |
| 85 if (lock_window_) { |
| 86 lock_window_->RemoveObserver(this); |
| 87 lock_window_->Close(); |
| 88 } |
| 89 // If LockScreen() was called, we need to clear the signin screen handler |
| 90 // delegate set in ShowSigninScreen so that it no longer points to us. |
| 91 if (login_display_.get()) |
| 92 GetOobeUI()->ResetSigninScreenHandlerDelegate(); |
| 93 |
| 94 if (keyboard::KeyboardController::GetInstance() && is_observing_keyboard_) { |
| 95 keyboard::KeyboardController::GetInstance()->RemoveObserver(this); |
| 96 is_observing_keyboard_ = false; |
| 97 } |
| 98 |
| 99 ResetKeyboardOverscrollOverride(); |
| 100 } |
| 101 |
| 79 void WebUIScreenLocker::LockScreen() { | 102 void WebUIScreenLocker::LockScreen() { |
| 80 gfx::Rect bounds = display::Screen::GetScreen()->GetPrimaryDisplay().bounds(); | 103 gfx::Rect bounds = display::Screen::GetScreen()->GetPrimaryDisplay().bounds(); |
| 81 | 104 |
| 82 lock_time_ = base::TimeTicks::Now(); | 105 lock_time_ = base::TimeTicks::Now(); |
| 83 auto* lock_window = new LockWindow(); | 106 lock_window_ = new LockWindow(); |
| 84 lock_window->set_observer(this); | 107 lock_window_->set_initially_focused_view(this); |
| 85 lock_window->set_initially_focused_view(this); | |
| 86 lock_window_ = lock_window->GetWidget(); | |
| 87 lock_window_->AddObserver(this); | 108 lock_window_->AddObserver(this); |
| 88 WebUILoginView::Init(); | 109 |
| 110 Init(); |
| 89 content::WebContentsObserver::Observe(webui_login_->GetWebContents()); | 111 content::WebContentsObserver::Observe(webui_login_->GetWebContents()); |
| 112 |
| 90 lock_window_->SetContentsView(this); | 113 lock_window_->SetContentsView(this); |
| 91 lock_window_->SetBounds(bounds); | 114 lock_window_->SetBounds(bounds); |
| 92 lock_window_->Show(); | 115 lock_window_->Show(); |
| 93 LoadURL(GURL(kLoginURL)); | 116 LoadURL(GURL(kLoginURL)); |
| 94 lock_window->Grab(); | 117 OnLockWindowReady(); |
| 95 | 118 |
| 96 signin_screen_controller_.reset( | 119 signin_screen_controller_.reset( |
| 97 new SignInScreenController(GetOobeUI(), this)); | 120 new SignInScreenController(GetOobeUI(), this)); |
| 98 | 121 |
| 99 login_display_.reset(new WebUILoginDisplay(this)); | 122 login_display_.reset(new WebUILoginDisplay(this)); |
| 100 login_display_->set_background_bounds(bounds); | 123 login_display_->set_background_bounds(bounds); |
| 101 login_display_->set_parent_window(GetNativeWindow()); | 124 login_display_->set_parent_window(GetNativeWindow()); |
| 102 login_display_->Init(screen_locker()->users(), false, true, false); | 125 login_display_->Init(screen_locker_->users(), false, true, false); |
| 103 | 126 |
| 104 GetOobeUI()->ShowSigninScreen( | 127 GetOobeUI()->ShowSigninScreen( |
| 105 LoginScreenContext(), login_display_.get(), login_display_.get()); | 128 LoginScreenContext(), login_display_.get(), login_display_.get()); |
| 106 | 129 |
| 107 DisableKeyboardOverscroll(); | 130 DisableKeyboardOverscroll(); |
| 108 } | 131 } |
| 109 | 132 |
| 110 void WebUIScreenLocker::ScreenLockReady() { | |
| 111 UMA_HISTOGRAM_TIMES("LockScreen.LockReady", | |
| 112 base::TimeTicks::Now() - lock_time_); | |
| 113 ScreenLockerDelegate::ScreenLockReady(); | |
| 114 SetInputEnabled(true); | |
| 115 } | |
| 116 | |
| 117 void WebUIScreenLocker::OnAuthenticate() { | |
| 118 } | |
| 119 | |
| 120 void WebUIScreenLocker::SetInputEnabled(bool enabled) { | 133 void WebUIScreenLocker::SetInputEnabled(bool enabled) { |
| 121 login_display_->SetUIEnabled(enabled); | 134 login_display_->SetUIEnabled(enabled); |
| 122 } | 135 } |
| 123 | 136 |
| 124 void WebUIScreenLocker::ShowErrorMessage( | 137 void WebUIScreenLocker::ShowErrorMessage( |
| 125 int error_msg_id, | 138 int error_msg_id, |
| 126 HelpAppLauncher::HelpTopic help_topic_id) { | 139 HelpAppLauncher::HelpTopic help_topic_id) { |
| 127 login_display_->ShowError(error_msg_id, | 140 login_display_->ShowError(error_msg_id, |
| 128 0 /* login_attempts */, | 141 0 /* login_attempts */, |
| 129 help_topic_id); | 142 help_topic_id); |
| 130 } | 143 } |
| 131 | 144 |
| 132 void WebUIScreenLocker::AnimateAuthenticationSuccess() { | 145 void WebUIScreenLocker::AnimateAuthenticationSuccess() { |
| 133 GetWebUI()->CallJavascriptFunctionUnsafe( | 146 GetWebUI()->CallJavascriptFunctionUnsafe( |
| 134 "cr.ui.Oobe.animateAuthenticationSuccess"); | 147 "cr.ui.Oobe.animateAuthenticationSuccess"); |
| 135 } | 148 } |
| 136 | 149 |
| 137 void WebUIScreenLocker::ClearErrors() { | 150 void WebUIScreenLocker::ClearErrors() { |
| 138 GetWebUI()->CallJavascriptFunctionUnsafe("cr.ui.Oobe.clearErrors"); | 151 GetWebUI()->CallJavascriptFunctionUnsafe("cr.ui.Oobe.clearErrors"); |
| 139 } | 152 } |
| 140 | 153 |
| 154 void WebUIScreenLocker::ScreenLockReady() { |
| 155 UMA_HISTOGRAM_TIMES("LockScreen.LockReady", |
| 156 base::TimeTicks::Now() - lock_time_); |
| 157 screen_locker_->ScreenLockReady(); |
| 158 SetInputEnabled(true); |
| 159 } |
| 160 |
| 161 void WebUIScreenLocker::OnLockWindowReady() { |
| 162 VLOG(1) << "Lock window ready; WebUI is " << (webui_ready_ ? "too" : "not"); |
| 163 lock_ready_ = true; |
| 164 if (webui_ready_) |
| 165 ScreenLockReady(); |
| 166 } |
| 167 |
| 141 gfx::NativeWindow WebUIScreenLocker::GetNativeWindow() const { | 168 gfx::NativeWindow WebUIScreenLocker::GetNativeWindow() const { |
| 142 return lock_window_->GetNativeWindow(); | 169 return lock_window_->GetNativeWindow(); |
| 143 } | 170 } |
| 144 | 171 |
| 145 content::WebUI* WebUIScreenLocker::GetAssociatedWebUI() { | |
| 146 return GetWebUI(); | |
| 147 } | |
| 148 | |
| 149 void WebUIScreenLocker::FocusUserPod() { | 172 void WebUIScreenLocker::FocusUserPod() { |
| 150 if (!webui_ready_) | 173 if (!webui_ready_) |
| 151 return; | 174 return; |
| 152 webui_login_->RequestFocus(); | 175 webui_login_->RequestFocus(); |
| 153 GetWebUI()->CallJavascriptFunctionUnsafe( | 176 GetWebUI()->CallJavascriptFunctionUnsafe( |
| 154 "cr.ui.Oobe.forceLockedUserPodFocus"); | 177 "cr.ui.Oobe.forceLockedUserPodFocus"); |
| 155 } | 178 } |
| 156 | 179 |
| 157 void WebUIScreenLocker::ResetAndFocusUserPod() { | 180 void WebUIScreenLocker::ResetAndFocusUserPod() { |
| 158 if (!webui_ready_) | 181 if (!webui_ready_) |
| 159 return; | 182 return; |
| 160 GetWebUI()->CallJavascriptFunctionUnsafe("cr.ui.Oobe.clearUserPodPassword"); | 183 GetWebUI()->CallJavascriptFunctionUnsafe("cr.ui.Oobe.clearUserPodPassword"); |
| 161 FocusUserPod(); | 184 FocusUserPod(); |
| 162 } | 185 } |
| 163 | 186 |
| 164 WebUIScreenLocker::~WebUIScreenLocker() { | |
| 165 DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this); | |
| 166 display::Screen::GetScreen()->RemoveObserver(this); | |
| 167 ash::WmShell::Get()->RemoveLockStateObserver(this); | |
| 168 ash::WmShell::Get()->RemoveShellObserver(this); | |
| 169 // In case of shutdown, lock_window_ may be deleted before WebUIScreenLocker. | |
| 170 if (lock_window_) { | |
| 171 lock_window_->RemoveObserver(this); | |
| 172 lock_window_->Close(); | |
| 173 } | |
| 174 // If LockScreen() was called, we need to clear the signin screen handler | |
| 175 // delegate set in ShowSigninScreen so that it no longer points to us. | |
| 176 if (login_display_.get()) { | |
| 177 static_cast<OobeUI*>(GetWebUI()->GetController())-> | |
| 178 ResetSigninScreenHandlerDelegate(); | |
| 179 } | |
| 180 | |
| 181 if (keyboard::KeyboardController::GetInstance() && is_observing_keyboard_) { | |
| 182 keyboard::KeyboardController::GetInstance()->RemoveObserver(this); | |
| 183 is_observing_keyboard_ = false; | |
| 184 } | |
| 185 | |
| 186 ResetKeyboardOverscrollOverride(); | |
| 187 } | |
| 188 | |
| 189 void WebUIScreenLocker::OnLockWebUIReady() { | 187 void WebUIScreenLocker::OnLockWebUIReady() { |
| 190 VLOG(1) << "WebUI ready; lock window is " | 188 VLOG(1) << "WebUI ready; lock window is " |
| 191 << (lock_ready_ ? "too" : "not"); | 189 << (lock_ready_ ? "too" : "not"); |
| 192 webui_ready_ = true; | 190 webui_ready_ = true; |
| 193 if (lock_ready_) | 191 if (lock_ready_) |
| 194 ScreenLockReady(); | 192 ScreenLockReady(); |
| 195 } | 193 } |
| 196 | 194 |
| 197 void WebUIScreenLocker::OnLockBackgroundDisplayed() { | 195 void WebUIScreenLocker::OnLockBackgroundDisplayed() { |
| 198 UMA_HISTOGRAM_TIMES("LockScreen.BackgroundReady", | 196 UMA_HISTOGRAM_TIMES("LockScreen.BackgroundReady", |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 } | 273 } |
| 276 | 274 |
| 277 void WebUIScreenLocker::Signout() { | 275 void WebUIScreenLocker::Signout() { |
| 278 chromeos::ScreenLocker::default_screen_locker()->Signout(); | 276 chromeos::ScreenLocker::default_screen_locker()->Signout(); |
| 279 } | 277 } |
| 280 | 278 |
| 281 bool WebUIScreenLocker::IsUserWhitelisted(const AccountId& account_id) { | 279 bool WebUIScreenLocker::IsUserWhitelisted(const AccountId& account_id) { |
| 282 NOTREACHED(); | 280 NOTREACHED(); |
| 283 return true; | 281 return true; |
| 284 } | 282 } |
| 285 //////////////////////////////////////////////////////////////////////////////// | |
| 286 // LockWindow::Observer: | |
| 287 | |
| 288 void WebUIScreenLocker::OnLockWindowReady() { | |
| 289 VLOG(1) << "Lock window ready; WebUI is " << (webui_ready_ ? "too" : "not"); | |
| 290 lock_ready_ = true; | |
| 291 if (webui_ready_) | |
| 292 ScreenLockReady(); | |
| 293 } | |
| 294 | 283 |
| 295 //////////////////////////////////////////////////////////////////////////////// | 284 //////////////////////////////////////////////////////////////////////////////// |
| 296 // SessionLockStateObserver: | 285 // SessionLockStateObserver: |
| 297 | 286 |
| 298 void WebUIScreenLocker::OnLockStateEvent( | 287 void WebUIScreenLocker::OnLockStateEvent( |
| 299 ash::LockStateObserver::EventType event) { | 288 ash::LockStateObserver::EventType event) { |
| 300 if (event == ash::LockStateObserver::EVENT_LOCK_ANIMATION_FINISHED) { | 289 if (event == ash::LockStateObserver::EVENT_LOCK_ANIMATION_FINISHED) { |
| 301 // Release capture if any. | 290 // Release capture if any. |
| 302 aura::client::GetCaptureClient(GetNativeWindow()->GetRootWindow())-> | 291 aura::client::GetCaptureClient(GetNativeWindow()->GetRootWindow())-> |
| 303 SetCapture(NULL); | 292 SetCapture(NULL); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 } | 394 } |
| 406 | 395 |
| 407 if (GetOobeUI()) { | 396 if (GetOobeUI()) { |
| 408 const gfx::Size& size = primary_display.size(); | 397 const gfx::Size& size = primary_display.size(); |
| 409 GetOobeUI()->GetCoreOobeActor()->SetClientAreaSize(size.width(), | 398 GetOobeUI()->GetCoreOobeActor()->SetClientAreaSize(size.width(), |
| 410 size.height()); | 399 size.height()); |
| 411 } | 400 } |
| 412 } | 401 } |
| 413 | 402 |
| 414 } // namespace chromeos | 403 } // namespace chromeos |
| OLD | NEW |