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 |