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