1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/webui_screen_locker.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_controller.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_observer.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_shutdown.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/helper.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_display.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/capture_client.h" 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/x/x11_util.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/keyboard/keyboard_controller.h" 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/keyboard/keyboard_util.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/webview/webview.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL which corresponds to the login WebUI. 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kLoginURL[] = "chrome://oobe/lock"; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Disables virtual keyboard overscroll. Login UI will scroll user pods 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// into view on JS side when virtual keyboard is shown. 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DisableKeyboardOverscroll() { 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::SetKeyboardOverscrollOverride( 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KEYBOARD_OVERSCROLL_OVERRIDE_DISABLED); 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ResetKeyboardOverscrollOverride() { 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::SetKeyboardOverscrollOverride( 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KEYBOARD_OVERSCROLL_OVERRIDE_NONE); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUIScreenLocker implementation. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIScreenLocker::WebUIScreenLocker(ScreenLocker* screen_locker) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ScreenLockerDelegate(screen_locker), 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_ready_(false), 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webui_ready_(false), 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch network_state_helper_(new login::NetworkStateHelper), 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_observing_keyboard_(false), 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_should_emit_login_prompt_visible(false); 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::Shell::GetInstance()->lock_state_controller()->AddObserver(this); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (keyboard::KeyboardController::GetInstance()) { 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KeyboardController::GetInstance()->AddObserver(this); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_observing_keyboard_ = true; 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::Shell::GetInstance()->delegate()->AddVirtualKeyboardStateObserver(this); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebUIScreenLocker::LockScreen() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(ash::Shell::GetScreen()->GetPrimaryDisplay().bounds()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_time_ = base::TimeTicks::Now(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockWindow* lock_window = LockWindow::Create(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_window->set_observer(this); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch lock_window->set_initially_focused_view(this); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_window_ = lock_window->GetWidget(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_window_->AddObserver(this); 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebUILoginView::Init(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_window_->SetContentsView(this); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_window_->Show(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadURL(GURL(kLoginURL)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_window->Grab(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_display_.reset(new WebUILoginDisplay(this)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_display_->set_background_bounds(bounds); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_display_->set_parent_window(GetNativeWindow()); 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) login_display_->Init(screen_locker()->users(), false, true, false); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->ShowSigninScreen( 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LoginScreenContext(), login_display_.get(), login_display_.get()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DisableKeyboardOverscroll(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::ScreenLockReady() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("LockScreen.LockReady", 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks::Now() - lock_time_); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLockerDelegate::ScreenLockReady(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetInputEnabled(true); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::OnAuthenticate() { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::SetInputEnabled(bool enabled) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_display_->SetUIEnabled(enabled); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::ShowErrorMessage( 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_msg_id, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HelpAppLauncher::HelpTopic help_topic_id) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_display_->ShowError(error_msg_id, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 /* login_attempts */, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help_topic_id); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::AnimateAuthenticationSuccess() { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.animateAuthenticationSuccess"); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::ClearErrors() { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.clearErrors"); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebUIScreenLocker::GetNativeWindow() const { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return lock_window_->GetNativeWindow(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebUI* WebUIScreenLocker::GetAssociatedWebUI() { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetWebUI(); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::FocusUserPod() { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!webui_ready_) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webui_login_->RequestFocus(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.forceLockedUserPodFocus"); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIScreenLocker::~WebUIScreenLocker() { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this); 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::Shell::GetInstance()-> 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) lock_state_controller()->RemoveObserver(this); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In case of shutdown, lock_window_ may be deleted before WebUIScreenLocker. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lock_window_) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_window_->RemoveObserver(this); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_window_->Close(); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If LockScreen() was called, we need to clear the signin screen handler 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delegate set in ShowSigninScreen so that it no longer points to us. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (login_display_.get()) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<OobeUI*>(GetWebUI()->GetController())-> 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSigninScreenHandlerDelegate(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (keyboard::KeyboardController::GetInstance() && is_observing_keyboard_) { 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KeyboardController::GetInstance()->RemoveObserver(this); 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_observing_keyboard_ = false; 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ash::Shell::GetInstance()->delegate()-> 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RemoveVirtualKeyboardStateObserver(this); 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResetKeyboardOverscrollOverride(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebUIScreenLocker::OnLockWebUIReady() { 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VLOG(1) << "WebUI ready; lock window is " 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) << (lock_ready_ ? "too" : "not"); 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) webui_ready_ = true; 1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (lock_ready_) 1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ScreenLockReady(); 1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebUIScreenLocker::OnLockBackgroundDisplayed() { 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_TIMES("LockScreen.BackgroundReady", 1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeTicks::Now() - lock_time_); 1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)OobeUI* WebUIScreenLocker::GetOobeUI() { 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<OobeUI*>(GetWebUI()->GetController()); 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUIScreenLocker, content::NotificationObserver implementation: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::Observe( 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_LOGIN_USER_IMAGE_CHANGED: { 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const user_manager::User& user = 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *content::Details<user_manager::User>(details).ptr(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_display_->OnUserImageChanged(user); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUILoginView::Observe(type, source, details); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUIScreenLocker, LoginDisplay::Delegate implementation: 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::CancelPasswordChangedFlow() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::CreateAccount() { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebUIScreenLocker::CompleteLogin(const UserContext& user_context) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 WebUIScreenLocker::GetConnectedNetworkName() { 237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return network_state_helper_->GetCurrentNetworkName(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 240a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool WebUIScreenLocker::IsSigninInProgress() const { 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The way how screen locker is implemented right now there's no 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // GAIA sign in in progress in any case. 243a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 244a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 245a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebUIScreenLocker::Login(const UserContext& user_context, 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const SigninSpecifics& specifics) { 248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) chromeos::ScreenLocker::default_screen_locker()->Authenticate(user_context); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::MigrateUserData(const std::string& old_password) { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::OnSigninScreenReady() { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::OnStartEnterpriseEnrollment() { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebUIScreenLocker::OnStartKioskEnableScreen() { 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED(); 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebUIScreenLocker::OnStartKioskAutolaunchScreen() { 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED(); 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::ShowWrongHWIDScreen() { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::ResetPublicSessionAutoLoginTimer() { 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::ResyncUserData() { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::SetDisplayEmail(const std::string& email) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::Signout() { 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::ScreenLocker::default_screen_locker()->Signout(); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LockWindow::Observer implementation: 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIScreenLocker::OnLockWindowReady() { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Lock window ready; WebUI is " << (webui_ready_ ? "too" : "not"); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_ready_ = true; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (webui_ready_) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLockReady(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// SessionLockStateObserver override. 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebUIScreenLocker::OnLockStateEvent( 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ash::LockStateObserver::EventType event) { 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (event == ash::LockStateObserver::EVENT_LOCK_ANIMATION_FINISHED) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release capture if any. 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetCaptureClient(GetNativeWindow()->GetRootWindow())-> 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCapture(NULL); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWebUI()->CallJavascriptFunction("cr.ui.Oobe.animateOnceFullyDisplayed"); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WidgetObserver override. 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::OnWidgetDestroying(views::Widget* widget) { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_window_->RemoveObserver(this); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_window_ = NULL; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PowerManagerClient::Observer overrides. 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebUIScreenLocker::LidEventReceived(bool open, 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeTicks& time) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::PostTask( 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::UI, 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebUIScreenLocker::FocusUserPod, weak_factory_.GetWeakPtr())); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid WebUIScreenLocker::SuspendDone(const base::TimeDelta& sleep_duration) { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::PostTask( 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::UI, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WebUIScreenLocker::FocusUserPod, weak_factory_.GetWeakPtr())); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebUIScreenLocker::RenderProcessGone(base::TerminationStatus status) { 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (browser_shutdown::GetShutdownType() == browser_shutdown::NOT_VALID && 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status != base::TERMINATION_STATUS_NORMAL_TERMINATION) { 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << "Renderer crash on lock screen"; 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Signout(); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// ash::KeyboardStateObserver overrides. 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebUIScreenLocker::OnVirtualKeyboardStateChanged(bool activated) { 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (keyboard::KeyboardController::GetInstance()) { 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (activated) { 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!is_observing_keyboard_) { 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KeyboardController::GetInstance()->AddObserver(this); 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_observing_keyboard_ = true; 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard::KeyboardController::GetInstance()->RemoveObserver(this); 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_observing_keyboard_ = false; 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// keyboard::KeyboardControllerObserver overrides. 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebUIScreenLocker::OnKeyboardBoundsChanging( 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const gfx::Rect& new_bounds) { 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (new_bounds.IsEmpty() && !keyboard_bounds_.IsEmpty()) { 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Keyboard has been hidden. 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetOobeUI()) { 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->ShowControlBar(true); 372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->SetKeyboardState(false, new_bounds); 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (!new_bounds.IsEmpty() && keyboard_bounds_.IsEmpty()) { 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Keyboard has been shown. 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetOobeUI()) { 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->ShowControlBar(false); 379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (login::LoginScrollIntoViewEnabled()) 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetOobeUI()->GetCoreOobeActor()->SetKeyboardState(true, new_bounds); 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) keyboard_bounds_ = new_bounds; 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 388